You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
33692 lines
1.2 MiB
33692 lines
1.2 MiB
this["wp"] = this["wp"] || {}; this["wp"]["editor"] = |
|
/******/ (function(modules) { // webpackBootstrap |
|
/******/ // The module cache |
|
/******/ var installedModules = {}; |
|
/******/ |
|
/******/ // The require function |
|
/******/ function __webpack_require__(moduleId) { |
|
/******/ |
|
/******/ // Check if module is in cache |
|
/******/ if(installedModules[moduleId]) { |
|
/******/ return installedModules[moduleId].exports; |
|
/******/ } |
|
/******/ // Create a new module (and put it into the cache) |
|
/******/ var module = installedModules[moduleId] = { |
|
/******/ i: moduleId, |
|
/******/ l: false, |
|
/******/ exports: {} |
|
/******/ }; |
|
/******/ |
|
/******/ // Execute the module function |
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); |
|
/******/ |
|
/******/ // Flag the module as loaded |
|
/******/ module.l = true; |
|
/******/ |
|
/******/ // Return the exports of the module |
|
/******/ return module.exports; |
|
/******/ } |
|
/******/ |
|
/******/ |
|
/******/ // expose the modules object (__webpack_modules__) |
|
/******/ __webpack_require__.m = modules; |
|
/******/ |
|
/******/ // expose the module cache |
|
/******/ __webpack_require__.c = installedModules; |
|
/******/ |
|
/******/ // define getter function for harmony exports |
|
/******/ __webpack_require__.d = function(exports, name, getter) { |
|
/******/ if(!__webpack_require__.o(exports, name)) { |
|
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); |
|
/******/ } |
|
/******/ }; |
|
/******/ |
|
/******/ // define __esModule on exports |
|
/******/ __webpack_require__.r = function(exports) { |
|
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { |
|
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); |
|
/******/ } |
|
/******/ Object.defineProperty(exports, '__esModule', { value: true }); |
|
/******/ }; |
|
/******/ |
|
/******/ // create a fake namespace object |
|
/******/ // mode & 1: value is a module id, require it |
|
/******/ // mode & 2: merge all properties of value into the ns |
|
/******/ // mode & 4: return value when already ns object |
|
/******/ // mode & 8|1: behave like require |
|
/******/ __webpack_require__.t = function(value, mode) { |
|
/******/ if(mode & 1) value = __webpack_require__(value); |
|
/******/ if(mode & 8) return value; |
|
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; |
|
/******/ var ns = Object.create(null); |
|
/******/ __webpack_require__.r(ns); |
|
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); |
|
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); |
|
/******/ return ns; |
|
/******/ }; |
|
/******/ |
|
/******/ // getDefaultExport function for compatibility with non-harmony modules |
|
/******/ __webpack_require__.n = function(module) { |
|
/******/ var getter = module && module.__esModule ? |
|
/******/ function getDefault() { return module['default']; } : |
|
/******/ function getModuleExports() { return module; }; |
|
/******/ __webpack_require__.d(getter, 'a', getter); |
|
/******/ return getter; |
|
/******/ }; |
|
/******/ |
|
/******/ // Object.prototype.hasOwnProperty.call |
|
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; |
|
/******/ |
|
/******/ // __webpack_public_path__ |
|
/******/ __webpack_require__.p = ""; |
|
/******/ |
|
/******/ |
|
/******/ // Load entry module and return exports |
|
/******/ return __webpack_require__(__webpack_require__.s = 302); |
|
/******/ }) |
|
/************************************************************************/ |
|
/******/ ([ |
|
/* 0 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["element"]; }()); |
|
|
|
/***/ }), |
|
/* 1 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["i18n"]; }()); |
|
|
|
/***/ }), |
|
/* 2 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["lodash"]; }()); |
|
|
|
/***/ }), |
|
/* 3 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _assertThisInitialized; }); |
|
function _assertThisInitialized(self) { |
|
if (self === void 0) { |
|
throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); |
|
} |
|
|
|
return self; |
|
} |
|
|
|
/***/ }), |
|
/* 4 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["components"]; }()); |
|
|
|
/***/ }), |
|
/* 5 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["data"]; }()); |
|
|
|
/***/ }), |
|
/* 6 */, |
|
/* 7 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["compose"]; }()); |
|
|
|
/***/ }), |
|
/* 8 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _objectSpread; }); |
|
/* harmony import */ var _defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15); |
|
|
|
function _objectSpread(target) { |
|
for (var i = 1; i < arguments.length; i++) { |
|
var source = arguments[i] != null ? arguments[i] : {}; |
|
var ownKeys = Object.keys(source); |
|
|
|
if (typeof Object.getOwnPropertySymbols === 'function') { |
|
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { |
|
return Object.getOwnPropertyDescriptor(source, sym).enumerable; |
|
})); |
|
} |
|
|
|
ownKeys.forEach(function (key) { |
|
Object(_defineProperty__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(target, key, source[key]); |
|
}); |
|
} |
|
|
|
return target; |
|
} |
|
|
|
/***/ }), |
|
/* 9 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _createClass; }); |
|
function _defineProperties(target, props) { |
|
for (var i = 0; i < props.length; i++) { |
|
var descriptor = props[i]; |
|
descriptor.enumerable = descriptor.enumerable || false; |
|
descriptor.configurable = true; |
|
if ("value" in descriptor) descriptor.writable = true; |
|
Object.defineProperty(target, descriptor.key, descriptor); |
|
} |
|
} |
|
|
|
function _createClass(Constructor, protoProps, staticProps) { |
|
if (protoProps) _defineProperties(Constructor.prototype, protoProps); |
|
if (staticProps) _defineProperties(Constructor, staticProps); |
|
return Constructor; |
|
} |
|
|
|
/***/ }), |
|
/* 10 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _classCallCheck; }); |
|
function _classCallCheck(instance, Constructor) { |
|
if (!(instance instanceof Constructor)) { |
|
throw new TypeError("Cannot call a class as a function"); |
|
} |
|
} |
|
|
|
/***/ }), |
|
/* 11 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["blocks"]; }()); |
|
|
|
/***/ }), |
|
/* 12 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _possibleConstructorReturn; }); |
|
/* harmony import */ var _helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(28); |
|
/* harmony import */ var _assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3); |
|
|
|
|
|
function _possibleConstructorReturn(self, call) { |
|
if (call && (Object(_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(call) === "object" || typeof call === "function")) { |
|
return call; |
|
} |
|
|
|
return Object(_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"])(self); |
|
} |
|
|
|
/***/ }), |
|
/* 13 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _getPrototypeOf; }); |
|
function _getPrototypeOf(o) { |
|
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { |
|
return o.__proto__ || Object.getPrototypeOf(o); |
|
}; |
|
return _getPrototypeOf(o); |
|
} |
|
|
|
/***/ }), |
|
/* 14 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js |
|
function _setPrototypeOf(o, p) { |
|
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { |
|
o.__proto__ = p; |
|
return o; |
|
}; |
|
|
|
return _setPrototypeOf(o, p); |
|
} |
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/inherits.js |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _inherits; }); |
|
|
|
function _inherits(subClass, superClass) { |
|
if (typeof superClass !== "function" && superClass !== null) { |
|
throw new TypeError("Super expression must either be null or a function"); |
|
} |
|
|
|
subClass.prototype = Object.create(superClass && superClass.prototype, { |
|
constructor: { |
|
value: subClass, |
|
writable: true, |
|
configurable: true |
|
} |
|
}); |
|
if (superClass) _setPrototypeOf(subClass, superClass); |
|
} |
|
|
|
/***/ }), |
|
/* 15 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _defineProperty; }); |
|
function _defineProperty(obj, key, value) { |
|
if (key in obj) { |
|
Object.defineProperty(obj, key, { |
|
value: value, |
|
enumerable: true, |
|
configurable: true, |
|
writable: true |
|
}); |
|
} else { |
|
obj[key] = value; |
|
} |
|
|
|
return obj; |
|
} |
|
|
|
/***/ }), |
|
/* 16 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! |
|
Copyright (c) 2017 Jed Watson. |
|
Licensed under the MIT License (MIT), see |
|
http://jedwatson.github.io/classnames |
|
*/ |
|
/* global define */ |
|
|
|
(function () { |
|
'use strict'; |
|
|
|
var hasOwn = {}.hasOwnProperty; |
|
|
|
function classNames () { |
|
var classes = []; |
|
|
|
for (var i = 0; i < arguments.length; i++) { |
|
var arg = arguments[i]; |
|
if (!arg) continue; |
|
|
|
var argType = typeof arg; |
|
|
|
if (argType === 'string' || argType === 'number') { |
|
classes.push(arg); |
|
} else if (Array.isArray(arg) && arg.length) { |
|
var inner = classNames.apply(null, arg); |
|
if (inner) { |
|
classes.push(inner); |
|
} |
|
} else if (argType === 'object') { |
|
for (var key in arg) { |
|
if (hasOwn.call(arg, key) && arg[key]) { |
|
classes.push(key); |
|
} |
|
} |
|
} |
|
} |
|
|
|
return classes.join(' '); |
|
} |
|
|
|
if ( true && module.exports) { |
|
classNames.default = classNames; |
|
module.exports = classNames; |
|
} else if (true) { |
|
// register as 'classnames', consistent with npm package name |
|
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () { |
|
return classNames; |
|
}).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), |
|
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); |
|
} else {} |
|
}()); |
|
|
|
|
|
/***/ }), |
|
/* 17 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["keycodes"]; }()); |
|
|
|
/***/ }), |
|
/* 18 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _extends; }); |
|
function _extends() { |
|
_extends = Object.assign || function (target) { |
|
for (var i = 1; i < arguments.length; i++) { |
|
var source = arguments[i]; |
|
|
|
for (var key in source) { |
|
if (Object.prototype.hasOwnProperty.call(source, key)) { |
|
target[key] = source[key]; |
|
} |
|
} |
|
} |
|
|
|
return target; |
|
}; |
|
|
|
return _extends.apply(this, arguments); |
|
} |
|
|
|
/***/ }), |
|
/* 19 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js |
|
function _arrayWithoutHoles(arr) { |
|
if (Array.isArray(arr)) { |
|
for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { |
|
arr2[i] = arr[i]; |
|
} |
|
|
|
return arr2; |
|
} |
|
} |
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js |
|
var iterableToArray = __webpack_require__(33); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js |
|
function _nonIterableSpread() { |
|
throw new TypeError("Invalid attempt to spread non-iterable instance"); |
|
} |
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _toConsumableArray; }); |
|
|
|
|
|
|
|
function _toConsumableArray(arr) { |
|
return _arrayWithoutHoles(arr) || Object(iterableToArray["a" /* default */])(arr) || _nonIterableSpread(); |
|
} |
|
|
|
/***/ }), |
|
/* 20 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["richText"]; }()); |
|
|
|
/***/ }), |
|
/* 21 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js |
|
function _objectWithoutPropertiesLoose(source, excluded) { |
|
if (source == null) return {}; |
|
var target = {}; |
|
var sourceKeys = Object.keys(source); |
|
var key, i; |
|
|
|
for (i = 0; i < sourceKeys.length; i++) { |
|
key = sourceKeys[i]; |
|
if (excluded.indexOf(key) >= 0) continue; |
|
target[key] = source[key]; |
|
} |
|
|
|
return target; |
|
} |
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _objectWithoutProperties; }); |
|
|
|
function _objectWithoutProperties(source, excluded) { |
|
if (source == null) return {}; |
|
var target = _objectWithoutPropertiesLoose(source, excluded); |
|
var key, i; |
|
|
|
if (Object.getOwnPropertySymbols) { |
|
var sourceSymbolKeys = Object.getOwnPropertySymbols(source); |
|
|
|
for (i = 0; i < sourceSymbolKeys.length; i++) { |
|
key = sourceSymbolKeys[i]; |
|
if (excluded.indexOf(key) >= 0) continue; |
|
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; |
|
target[key] = source[key]; |
|
} |
|
} |
|
|
|
return target; |
|
} |
|
|
|
/***/ }), |
|
/* 22 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["dom"]; }()); |
|
|
|
/***/ }), |
|
/* 23 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["hooks"]; }()); |
|
|
|
/***/ }), |
|
/* 24 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["url"]; }()); |
|
|
|
/***/ }), |
|
/* 25 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js |
|
var arrayWithHoles = __webpack_require__(35); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js |
|
function _iterableToArrayLimit(arr, i) { |
|
var _arr = []; |
|
var _n = true; |
|
var _d = false; |
|
var _e = undefined; |
|
|
|
try { |
|
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { |
|
_arr.push(_s.value); |
|
|
|
if (i && _arr.length === i) break; |
|
} |
|
} catch (err) { |
|
_d = true; |
|
_e = err; |
|
} finally { |
|
try { |
|
if (!_n && _i["return"] != null) _i["return"](); |
|
} finally { |
|
if (_d) throw _e; |
|
} |
|
} |
|
|
|
return _arr; |
|
} |
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js |
|
var nonIterableRest = __webpack_require__(36); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _slicedToArray; }); |
|
|
|
|
|
|
|
function _slicedToArray(arr, i) { |
|
return Object(arrayWithHoles["a" /* default */])(arr) || _iterableToArrayLimit(arr, i) || Object(nonIterableRest["a" /* default */])(); |
|
} |
|
|
|
/***/ }), |
|
/* 26 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["React"]; }()); |
|
|
|
/***/ }), |
|
/* 27 */, |
|
/* 28 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _typeof; }); |
|
function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); } |
|
|
|
function _typeof(obj) { |
|
if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") { |
|
_typeof = function _typeof(obj) { |
|
return _typeof2(obj); |
|
}; |
|
} else { |
|
_typeof = function _typeof(obj) { |
|
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj); |
|
}; |
|
} |
|
|
|
return _typeof(obj); |
|
} |
|
|
|
/***/ }), |
|
/* 29 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/** |
|
* Copyright (c) 2013-present, Facebook, Inc. |
|
* |
|
* This source code is licensed under the MIT license found in the |
|
* LICENSE file in the root directory of this source tree. |
|
*/ |
|
|
|
if (false) { var throwOnDirectAccess, isValidElement, REACT_ELEMENT_TYPE; } else { |
|
// By explicitly using `prop-types` you are opting into new production behavior. |
|
// http://fb.me/prop-types-in-prod |
|
module.exports = __webpack_require__(109)(); |
|
} |
|
|
|
|
|
/***/ }), |
|
/* 30 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["apiFetch"]; }()); |
|
|
|
/***/ }), |
|
/* 31 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
|
|
var LEAF_KEY, hasWeakMap; |
|
|
|
/** |
|
* Arbitrary value used as key for referencing cache object in WeakMap tree. |
|
* |
|
* @type {Object} |
|
*/ |
|
LEAF_KEY = {}; |
|
|
|
/** |
|
* Whether environment supports WeakMap. |
|
* |
|
* @type {boolean} |
|
*/ |
|
hasWeakMap = typeof WeakMap !== 'undefined'; |
|
|
|
/** |
|
* Returns the first argument as the sole entry in an array. |
|
* |
|
* @param {*} value Value to return. |
|
* |
|
* @return {Array} Value returned as entry in array. |
|
*/ |
|
function arrayOf( value ) { |
|
return [ value ]; |
|
} |
|
|
|
/** |
|
* Returns true if the value passed is object-like, or false otherwise. A value |
|
* is object-like if it can support property assignment, e.g. object or array. |
|
* |
|
* @param {*} value Value to test. |
|
* |
|
* @return {boolean} Whether value is object-like. |
|
*/ |
|
function isObjectLike( value ) { |
|
return !! value && 'object' === typeof value; |
|
} |
|
|
|
/** |
|
* Creates and returns a new cache object. |
|
* |
|
* @return {Object} Cache object. |
|
*/ |
|
function createCache() { |
|
var cache = { |
|
clear: function() { |
|
cache.head = null; |
|
}, |
|
}; |
|
|
|
return cache; |
|
} |
|
|
|
/** |
|
* Returns true if entries within the two arrays are strictly equal by |
|
* reference from a starting index. |
|
* |
|
* @param {Array} a First array. |
|
* @param {Array} b Second array. |
|
* @param {number} fromIndex Index from which to start comparison. |
|
* |
|
* @return {boolean} Whether arrays are shallowly equal. |
|
*/ |
|
function isShallowEqual( a, b, fromIndex ) { |
|
var i; |
|
|
|
if ( a.length !== b.length ) { |
|
return false; |
|
} |
|
|
|
for ( i = fromIndex; i < a.length; i++ ) { |
|
if ( a[ i ] !== b[ i ] ) { |
|
return false; |
|
} |
|
} |
|
|
|
return true; |
|
} |
|
|
|
/** |
|
* Returns a memoized selector function. The getDependants function argument is |
|
* called before the memoized selector and is expected to return an immutable |
|
* reference or array of references on which the selector depends for computing |
|
* its own return value. The memoize cache is preserved only as long as those |
|
* dependant references remain the same. If getDependants returns a different |
|
* reference(s), the cache is cleared and the selector value regenerated. |
|
* |
|
* @param {Function} selector Selector function. |
|
* @param {Function} getDependants Dependant getter returning an immutable |
|
* reference or array of reference used in |
|
* cache bust consideration. |
|
* |
|
* @return {Function} Memoized selector. |
|
*/ |
|
/* harmony default export */ __webpack_exports__["a"] = (function( selector, getDependants ) { |
|
var rootCache, getCache; |
|
|
|
// Use object source as dependant if getter not provided |
|
if ( ! getDependants ) { |
|
getDependants = arrayOf; |
|
} |
|
|
|
/** |
|
* Returns the root cache. If WeakMap is supported, this is assigned to the |
|
* root WeakMap cache set, otherwise it is a shared instance of the default |
|
* cache object. |
|
* |
|
* @return {(WeakMap|Object)} Root cache object. |
|
*/ |
|
function getRootCache() { |
|
return rootCache; |
|
} |
|
|
|
/** |
|
* Returns the cache for a given dependants array. When possible, a WeakMap |
|
* will be used to create a unique cache for each set of dependants. This |
|
* is feasible due to the nature of WeakMap in allowing garbage collection |
|
* to occur on entries where the key object is no longer referenced. Since |
|
* WeakMap requires the key to be an object, this is only possible when the |
|
* dependant is object-like. The root cache is created as a hierarchy where |
|
* each top-level key is the first entry in a dependants set, the value a |
|
* WeakMap where each key is the next dependant, and so on. This continues |
|
* so long as the dependants are object-like. If no dependants are object- |
|
* like, then the cache is shared across all invocations. |
|
* |
|
* @see isObjectLike |
|
* |
|
* @param {Array} dependants Selector dependants. |
|
* |
|
* @return {Object} Cache object. |
|
*/ |
|
function getWeakMapCache( dependants ) { |
|
var caches = rootCache, |
|
isUniqueByDependants = true, |
|
i, dependant, map, cache; |
|
|
|
for ( i = 0; i < dependants.length; i++ ) { |
|
dependant = dependants[ i ]; |
|
|
|
// Can only compose WeakMap from object-like key. |
|
if ( ! isObjectLike( dependant ) ) { |
|
isUniqueByDependants = false; |
|
break; |
|
} |
|
|
|
// Does current segment of cache already have a WeakMap? |
|
if ( caches.has( dependant ) ) { |
|
// Traverse into nested WeakMap. |
|
caches = caches.get( dependant ); |
|
} else { |
|
// Create, set, and traverse into a new one. |
|
map = new WeakMap(); |
|
caches.set( dependant, map ); |
|
caches = map; |
|
} |
|
} |
|
|
|
// We use an arbitrary (but consistent) object as key for the last item |
|
// in the WeakMap to serve as our running cache. |
|
if ( ! caches.has( LEAF_KEY ) ) { |
|
cache = createCache(); |
|
cache.isUniqueByDependants = isUniqueByDependants; |
|
caches.set( LEAF_KEY, cache ); |
|
} |
|
|
|
return caches.get( LEAF_KEY ); |
|
} |
|
|
|
// Assign cache handler by availability of WeakMap |
|
getCache = hasWeakMap ? getWeakMapCache : getRootCache; |
|
|
|
/** |
|
* Resets root memoization cache. |
|
*/ |
|
function clear() { |
|
rootCache = hasWeakMap ? new WeakMap() : createCache(); |
|
} |
|
|
|
// eslint-disable-next-line jsdoc/check-param-names |
|
/** |
|
* The augmented selector call, considering first whether dependants have |
|
* changed before passing it to underlying memoize function. |
|
* |
|
* @param {Object} source Source object for derivation. |
|
* @param {...*} extraArgs Additional arguments to pass to selector. |
|
* |
|
* @return {*} Selector result. |
|
*/ |
|
function callSelector( /* source, ...extraArgs */ ) { |
|
var len = arguments.length, |
|
cache, node, i, args, dependants; |
|
|
|
// Create copy of arguments (avoid leaking deoptimization). |
|
args = new Array( len ); |
|
for ( i = 0; i < len; i++ ) { |
|
args[ i ] = arguments[ i ]; |
|
} |
|
|
|
dependants = getDependants.apply( null, args ); |
|
cache = getCache( dependants ); |
|
|
|
// If not guaranteed uniqueness by dependants (primitive type or lack |
|
// of WeakMap support), shallow compare against last dependants and, if |
|
// references have changed, destroy cache to recalculate result. |
|
if ( ! cache.isUniqueByDependants ) { |
|
if ( cache.lastDependants && ! isShallowEqual( dependants, cache.lastDependants, 0 ) ) { |
|
cache.clear(); |
|
} |
|
|
|
cache.lastDependants = dependants; |
|
} |
|
|
|
node = cache.head; |
|
while ( node ) { |
|
// Check whether node arguments match arguments |
|
if ( ! isShallowEqual( node.args, args, 1 ) ) { |
|
node = node.next; |
|
continue; |
|
} |
|
|
|
// At this point we can assume we've found a match |
|
|
|
// Surface matched node to head if not already |
|
if ( node !== cache.head ) { |
|
// Adjust siblings to point to each other. |
|
node.prev.next = node.next; |
|
if ( node.next ) { |
|
node.next.prev = node.prev; |
|
} |
|
|
|
node.next = cache.head; |
|
node.prev = null; |
|
cache.head.prev = node; |
|
cache.head = node; |
|
} |
|
|
|
// Return immediately |
|
return node.val; |
|
} |
|
|
|
// No cached value found. Continue to insertion phase: |
|
|
|
node = { |
|
// Generate the result from original function |
|
val: selector.apply( null, args ), |
|
}; |
|
|
|
// Avoid including the source object in the cache. |
|
args[ 0 ] = null; |
|
node.args = args; |
|
|
|
// Don't need to check whether node is already head, since it would |
|
// have been returned above already if it was |
|
|
|
// Shift existing head down list |
|
if ( cache.head ) { |
|
cache.head.prev = node; |
|
node.next = cache.head; |
|
} |
|
|
|
cache.head = node; |
|
|
|
return node.val; |
|
} |
|
|
|
callSelector.getDependants = getDependants; |
|
callSelector.clear = clear; |
|
clear(); |
|
|
|
return callSelector; |
|
}); |
|
|
|
|
|
/***/ }), |
|
/* 32 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["blob"]; }()); |
|
|
|
/***/ }), |
|
/* 33 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _iterableToArray; }); |
|
function _iterableToArray(iter) { |
|
if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); |
|
} |
|
|
|
/***/ }), |
|
/* 34 */, |
|
/* 35 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _arrayWithHoles; }); |
|
function _arrayWithHoles(arr) { |
|
if (Array.isArray(arr)) return arr; |
|
} |
|
|
|
/***/ }), |
|
/* 36 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _nonIterableRest; }); |
|
function _nonIterableRest() { |
|
throw new TypeError("Invalid attempt to destructure non-iterable instance"); |
|
} |
|
|
|
/***/ }), |
|
/* 37 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["viewport"]; }()); |
|
|
|
/***/ }), |
|
/* 38 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _asyncToGenerator; }); |
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { |
|
try { |
|
var info = gen[key](arg); |
|
var value = info.value; |
|
} catch (error) { |
|
reject(error); |
|
return; |
|
} |
|
|
|
if (info.done) { |
|
resolve(value); |
|
} else { |
|
Promise.resolve(value).then(_next, _throw); |
|
} |
|
} |
|
|
|
function _asyncToGenerator(fn) { |
|
return function () { |
|
var self = this, |
|
args = arguments; |
|
return new Promise(function (resolve, reject) { |
|
var gen = fn.apply(self, args); |
|
|
|
function _next(value) { |
|
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); |
|
} |
|
|
|
function _throw(err) { |
|
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); |
|
} |
|
|
|
_next(undefined); |
|
}); |
|
}; |
|
} |
|
|
|
/***/ }), |
|
/* 39 */, |
|
/* 40 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["isShallowEqual"]; }()); |
|
|
|
/***/ }), |
|
/* 41 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
module.exports = function memize( fn, options ) { |
|
var size = 0, |
|
maxSize, head, tail; |
|
|
|
if ( options && options.maxSize ) { |
|
maxSize = options.maxSize; |
|
} |
|
|
|
function memoized( /* ...args */ ) { |
|
var node = head, |
|
len = arguments.length, |
|
args, i; |
|
|
|
searchCache: while ( node ) { |
|
// Perform a shallow equality test to confirm that whether the node |
|
// under test is a candidate for the arguments passed. Two arrays |
|
// are shallowly equal if their length matches and each entry is |
|
// strictly equal between the two sets. Avoid abstracting to a |
|
// function which could incur an arguments leaking deoptimization. |
|
|
|
// Check whether node arguments match arguments length |
|
if ( node.args.length !== arguments.length ) { |
|
node = node.next; |
|
continue; |
|
} |
|
|
|
// Check whether node arguments match arguments values |
|
for ( i = 0; i < len; i++ ) { |
|
if ( node.args[ i ] !== arguments[ i ] ) { |
|
node = node.next; |
|
continue searchCache; |
|
} |
|
} |
|
|
|
// At this point we can assume we've found a match |
|
|
|
// Surface matched node to head if not already |
|
if ( node !== head ) { |
|
// As tail, shift to previous. Must only shift if not also |
|
// head, since if both head and tail, there is no previous. |
|
if ( node === tail ) { |
|
tail = node.prev; |
|
} |
|
|
|
// Adjust siblings to point to each other. If node was tail, |
|
// this also handles new tail's empty `next` assignment. |
|
node.prev.next = node.next; |
|
if ( node.next ) { |
|
node.next.prev = node.prev; |
|
} |
|
|
|
node.next = head; |
|
node.prev = null; |
|
head.prev = node; |
|
head = node; |
|
} |
|
|
|
// Return immediately |
|
return node.val; |
|
} |
|
|
|
// No cached value found. Continue to insertion phase: |
|
|
|
// Create a copy of arguments (avoid leaking deoptimization) |
|
args = new Array( len ); |
|
for ( i = 0; i < len; i++ ) { |
|
args[ i ] = arguments[ i ]; |
|
} |
|
|
|
node = { |
|
args: args, |
|
|
|
// Generate the result from original function |
|
val: fn.apply( null, args ) |
|
}; |
|
|
|
// Don't need to check whether node is already head, since it would |
|
// have been returned above already if it was |
|
|
|
// Shift existing head down list |
|
if ( head ) { |
|
head.prev = node; |
|
node.next = head; |
|
} else { |
|
// If no head, follows that there's no tail (at initial or reset) |
|
tail = node; |
|
} |
|
|
|
// Trim tail if we're reached max size and are pending cache insertion |
|
if ( size === maxSize ) { |
|
tail = tail.prev; |
|
tail.next = null; |
|
} else { |
|
size++; |
|
} |
|
|
|
head = node; |
|
|
|
return node.val; |
|
} |
|
|
|
memoized.clear = function() { |
|
head = null; |
|
tail = null; |
|
size = 0; |
|
}; |
|
|
|
if ( false ) {} |
|
|
|
return memoized; |
|
}; |
|
|
|
|
|
/***/ }), |
|
/* 42 */, |
|
/* 43 */, |
|
/* 44 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["a11y"]; }()); |
|
|
|
/***/ }), |
|
/* 45 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
var __WEBPACK_AMD_DEFINE_RESULT__;// TinyColor v1.4.1 |
|
// https://github.com/bgrins/TinyColor |
|
// Brian Grinstead, MIT License |
|
|
|
(function(Math) { |
|
|
|
var trimLeft = /^\s+/, |
|
trimRight = /\s+$/, |
|
tinyCounter = 0, |
|
mathRound = Math.round, |
|
mathMin = Math.min, |
|
mathMax = Math.max, |
|
mathRandom = Math.random; |
|
|
|
function tinycolor (color, opts) { |
|
|
|
color = (color) ? color : ''; |
|
opts = opts || { }; |
|
|
|
// If input is already a tinycolor, return itself |
|
if (color instanceof tinycolor) { |
|
return color; |
|
} |
|
// If we are called as a function, call using new instead |
|
if (!(this instanceof tinycolor)) { |
|
return new tinycolor(color, opts); |
|
} |
|
|
|
var rgb = inputToRGB(color); |
|
this._originalInput = color, |
|
this._r = rgb.r, |
|
this._g = rgb.g, |
|
this._b = rgb.b, |
|
this._a = rgb.a, |
|
this._roundA = mathRound(100*this._a) / 100, |
|
this._format = opts.format || rgb.format; |
|
this._gradientType = opts.gradientType; |
|
|
|
// Don't let the range of [0,255] come back in [0,1]. |
|
// Potentially lose a little bit of precision here, but will fix issues where |
|
// .5 gets interpreted as half of the total, instead of half of 1 |
|
// If it was supposed to be 128, this was already taken care of by `inputToRgb` |
|
if (this._r < 1) { this._r = mathRound(this._r); } |
|
if (this._g < 1) { this._g = mathRound(this._g); } |
|
if (this._b < 1) { this._b = mathRound(this._b); } |
|
|
|
this._ok = rgb.ok; |
|
this._tc_id = tinyCounter++; |
|
} |
|
|
|
tinycolor.prototype = { |
|
isDark: function() { |
|
return this.getBrightness() < 128; |
|
}, |
|
isLight: function() { |
|
return !this.isDark(); |
|
}, |
|
isValid: function() { |
|
return this._ok; |
|
}, |
|
getOriginalInput: function() { |
|
return this._originalInput; |
|
}, |
|
getFormat: function() { |
|
return this._format; |
|
}, |
|
getAlpha: function() { |
|
return this._a; |
|
}, |
|
getBrightness: function() { |
|
//http://www.w3.org/TR/AERT#color-contrast |
|
var rgb = this.toRgb(); |
|
return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000; |
|
}, |
|
getLuminance: function() { |
|
//http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef |
|
var rgb = this.toRgb(); |
|
var RsRGB, GsRGB, BsRGB, R, G, B; |
|
RsRGB = rgb.r/255; |
|
GsRGB = rgb.g/255; |
|
BsRGB = rgb.b/255; |
|
|
|
if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);} |
|
if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);} |
|
if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);} |
|
return (0.2126 * R) + (0.7152 * G) + (0.0722 * B); |
|
}, |
|
setAlpha: function(value) { |
|
this._a = boundAlpha(value); |
|
this._roundA = mathRound(100*this._a) / 100; |
|
return this; |
|
}, |
|
toHsv: function() { |
|
var hsv = rgbToHsv(this._r, this._g, this._b); |
|
return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a }; |
|
}, |
|
toHsvString: function() { |
|
var hsv = rgbToHsv(this._r, this._g, this._b); |
|
var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); |
|
return (this._a == 1) ? |
|
"hsv(" + h + ", " + s + "%, " + v + "%)" : |
|
"hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")"; |
|
}, |
|
toHsl: function() { |
|
var hsl = rgbToHsl(this._r, this._g, this._b); |
|
return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a }; |
|
}, |
|
toHslString: function() { |
|
var hsl = rgbToHsl(this._r, this._g, this._b); |
|
var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); |
|
return (this._a == 1) ? |
|
"hsl(" + h + ", " + s + "%, " + l + "%)" : |
|
"hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")"; |
|
}, |
|
toHex: function(allow3Char) { |
|
return rgbToHex(this._r, this._g, this._b, allow3Char); |
|
}, |
|
toHexString: function(allow3Char) { |
|
return '#' + this.toHex(allow3Char); |
|
}, |
|
toHex8: function(allow4Char) { |
|
return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char); |
|
}, |
|
toHex8String: function(allow4Char) { |
|
return '#' + this.toHex8(allow4Char); |
|
}, |
|
toRgb: function() { |
|
return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a }; |
|
}, |
|
toRgbString: function() { |
|
return (this._a == 1) ? |
|
"rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" : |
|
"rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")"; |
|
}, |
|
toPercentageRgb: function() { |
|
return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a }; |
|
}, |
|
toPercentageRgbString: function() { |
|
return (this._a == 1) ? |
|
"rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" : |
|
"rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")"; |
|
}, |
|
toName: function() { |
|
if (this._a === 0) { |
|
return "transparent"; |
|
} |
|
|
|
if (this._a < 1) { |
|
return false; |
|
} |
|
|
|
return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false; |
|
}, |
|
toFilter: function(secondColor) { |
|
var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a); |
|
var secondHex8String = hex8String; |
|
var gradientType = this._gradientType ? "GradientType = 1, " : ""; |
|
|
|
if (secondColor) { |
|
var s = tinycolor(secondColor); |
|
secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a); |
|
} |
|
|
|
return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")"; |
|
}, |
|
toString: function(format) { |
|
var formatSet = !!format; |
|
format = format || this._format; |
|
|
|
var formattedString = false; |
|
var hasAlpha = this._a < 1 && this._a >= 0; |
|
var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name"); |
|
|
|
if (needsAlphaFormat) { |
|
// Special case for "transparent", all other non-alpha formats |
|
// will return rgba when there is transparency. |
|
if (format === "name" && this._a === 0) { |
|
return this.toName(); |
|
} |
|
return this.toRgbString(); |
|
} |
|
if (format === "rgb") { |
|
formattedString = this.toRgbString(); |
|
} |
|
if (format === "prgb") { |
|
formattedString = this.toPercentageRgbString(); |
|
} |
|
if (format === "hex" || format === "hex6") { |
|
formattedString = this.toHexString(); |
|
} |
|
if (format === "hex3") { |
|
formattedString = this.toHexString(true); |
|
} |
|
if (format === "hex4") { |
|
formattedString = this.toHex8String(true); |
|
} |
|
if (format === "hex8") { |
|
formattedString = this.toHex8String(); |
|
} |
|
if (format === "name") { |
|
formattedString = this.toName(); |
|
} |
|
if (format === "hsl") { |
|
formattedString = this.toHslString(); |
|
} |
|
if (format === "hsv") { |
|
formattedString = this.toHsvString(); |
|
} |
|
|
|
return formattedString || this.toHexString(); |
|
}, |
|
clone: function() { |
|
return tinycolor(this.toString()); |
|
}, |
|
|
|
_applyModification: function(fn, args) { |
|
var color = fn.apply(null, [this].concat([].slice.call(args))); |
|
this._r = color._r; |
|
this._g = color._g; |
|
this._b = color._b; |
|
this.setAlpha(color._a); |
|
return this; |
|
}, |
|
lighten: function() { |
|
return this._applyModification(lighten, arguments); |
|
}, |
|
brighten: function() { |
|
return this._applyModification(brighten, arguments); |
|
}, |
|
darken: function() { |
|
return this._applyModification(darken, arguments); |
|
}, |
|
desaturate: function() { |
|
return this._applyModification(desaturate, arguments); |
|
}, |
|
saturate: function() { |
|
return this._applyModification(saturate, arguments); |
|
}, |
|
greyscale: function() { |
|
return this._applyModification(greyscale, arguments); |
|
}, |
|
spin: function() { |
|
return this._applyModification(spin, arguments); |
|
}, |
|
|
|
_applyCombination: function(fn, args) { |
|
return fn.apply(null, [this].concat([].slice.call(args))); |
|
}, |
|
analogous: function() { |
|
return this._applyCombination(analogous, arguments); |
|
}, |
|
complement: function() { |
|
return this._applyCombination(complement, arguments); |
|
}, |
|
monochromatic: function() { |
|
return this._applyCombination(monochromatic, arguments); |
|
}, |
|
splitcomplement: function() { |
|
return this._applyCombination(splitcomplement, arguments); |
|
}, |
|
triad: function() { |
|
return this._applyCombination(triad, arguments); |
|
}, |
|
tetrad: function() { |
|
return this._applyCombination(tetrad, arguments); |
|
} |
|
}; |
|
|
|
// If input is an object, force 1 into "1.0" to handle ratios properly |
|
// String input requires "1.0" as input, so 1 will be treated as 1 |
|
tinycolor.fromRatio = function(color, opts) { |
|
if (typeof color == "object") { |
|
var newColor = {}; |
|
for (var i in color) { |
|
if (color.hasOwnProperty(i)) { |
|
if (i === "a") { |
|
newColor[i] = color[i]; |
|
} |
|
else { |
|
newColor[i] = convertToPercentage(color[i]); |
|
} |
|
} |
|
} |
|
color = newColor; |
|
} |
|
|
|
return tinycolor(color, opts); |
|
}; |
|
|
|
// Given a string or object, convert that input to RGB |
|
// Possible string inputs: |
|
// |
|
// "red" |
|
// "#f00" or "f00" |
|
// "#ff0000" or "ff0000" |
|
// "#ff000000" or "ff000000" |
|
// "rgb 255 0 0" or "rgb (255, 0, 0)" |
|
// "rgb 1.0 0 0" or "rgb (1, 0, 0)" |
|
// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" |
|
// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" |
|
// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" |
|
// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" |
|
// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" |
|
// |
|
function inputToRGB(color) { |
|
|
|
var rgb = { r: 0, g: 0, b: 0 }; |
|
var a = 1; |
|
var s = null; |
|
var v = null; |
|
var l = null; |
|
var ok = false; |
|
var format = false; |
|
|
|
if (typeof color == "string") { |
|
color = stringInputToObject(color); |
|
} |
|
|
|
if (typeof color == "object") { |
|
if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) { |
|
rgb = rgbToRgb(color.r, color.g, color.b); |
|
ok = true; |
|
format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; |
|
} |
|
else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) { |
|
s = convertToPercentage(color.s); |
|
v = convertToPercentage(color.v); |
|
rgb = hsvToRgb(color.h, s, v); |
|
ok = true; |
|
format = "hsv"; |
|
} |
|
else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) { |
|
s = convertToPercentage(color.s); |
|
l = convertToPercentage(color.l); |
|
rgb = hslToRgb(color.h, s, l); |
|
ok = true; |
|
format = "hsl"; |
|
} |
|
|
|
if (color.hasOwnProperty("a")) { |
|
a = color.a; |
|
} |
|
} |
|
|
|
a = boundAlpha(a); |
|
|
|
return { |
|
ok: ok, |
|
format: color.format || format, |
|
r: mathMin(255, mathMax(rgb.r, 0)), |
|
g: mathMin(255, mathMax(rgb.g, 0)), |
|
b: mathMin(255, mathMax(rgb.b, 0)), |
|
a: a |
|
}; |
|
} |
|
|
|
|
|
// Conversion Functions |
|
// -------------------- |
|
|
|
// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from: |
|
// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript> |
|
|
|
// `rgbToRgb` |
|
// Handle bounds / percentage checking to conform to CSS color spec |
|
// <http://www.w3.org/TR/css3-color/> |
|
// *Assumes:* r, g, b in [0, 255] or [0, 1] |
|
// *Returns:* { r, g, b } in [0, 255] |
|
function rgbToRgb(r, g, b){ |
|
return { |
|
r: bound01(r, 255) * 255, |
|
g: bound01(g, 255) * 255, |
|
b: bound01(b, 255) * 255 |
|
}; |
|
} |
|
|
|
// `rgbToHsl` |
|
// Converts an RGB color value to HSL. |
|
// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] |
|
// *Returns:* { h, s, l } in [0,1] |
|
function rgbToHsl(r, g, b) { |
|
|
|
r = bound01(r, 255); |
|
g = bound01(g, 255); |
|
b = bound01(b, 255); |
|
|
|
var max = mathMax(r, g, b), min = mathMin(r, g, b); |
|
var h, s, l = (max + min) / 2; |
|
|
|
if(max == min) { |
|
h = s = 0; // achromatic |
|
} |
|
else { |
|
var d = max - min; |
|
s = l > 0.5 ? d / (2 - max - min) : d / (max + min); |
|
switch(max) { |
|
case r: h = (g - b) / d + (g < b ? 6 : 0); break; |
|
case g: h = (b - r) / d + 2; break; |
|
case b: h = (r - g) / d + 4; break; |
|
} |
|
|
|
h /= 6; |
|
} |
|
|
|
return { h: h, s: s, l: l }; |
|
} |
|
|
|
// `hslToRgb` |
|
// Converts an HSL color value to RGB. |
|
// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] |
|
// *Returns:* { r, g, b } in the set [0, 255] |
|
function hslToRgb(h, s, l) { |
|
var r, g, b; |
|
|
|
h = bound01(h, 360); |
|
s = bound01(s, 100); |
|
l = bound01(l, 100); |
|
|
|
function hue2rgb(p, q, t) { |
|
if(t < 0) t += 1; |
|
if(t > 1) t -= 1; |
|
if(t < 1/6) return p + (q - p) * 6 * t; |
|
if(t < 1/2) return q; |
|
if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; |
|
return p; |
|
} |
|
|
|
if(s === 0) { |
|
r = g = b = l; // achromatic |
|
} |
|
else { |
|
var q = l < 0.5 ? l * (1 + s) : l + s - l * s; |
|
var p = 2 * l - q; |
|
r = hue2rgb(p, q, h + 1/3); |
|
g = hue2rgb(p, q, h); |
|
b = hue2rgb(p, q, h - 1/3); |
|
} |
|
|
|
return { r: r * 255, g: g * 255, b: b * 255 }; |
|
} |
|
|
|
// `rgbToHsv` |
|
// Converts an RGB color value to HSV |
|
// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] |
|
// *Returns:* { h, s, v } in [0,1] |
|
function rgbToHsv(r, g, b) { |
|
|
|
r = bound01(r, 255); |
|
g = bound01(g, 255); |
|
b = bound01(b, 255); |
|
|
|
var max = mathMax(r, g, b), min = mathMin(r, g, b); |
|
var h, s, v = max; |
|
|
|
var d = max - min; |
|
s = max === 0 ? 0 : d / max; |
|
|
|
if(max == min) { |
|
h = 0; // achromatic |
|
} |
|
else { |
|
switch(max) { |
|
case r: h = (g - b) / d + (g < b ? 6 : 0); break; |
|
case g: h = (b - r) / d + 2; break; |
|
case b: h = (r - g) / d + 4; break; |
|
} |
|
h /= 6; |
|
} |
|
return { h: h, s: s, v: v }; |
|
} |
|
|
|
// `hsvToRgb` |
|
// Converts an HSV color value to RGB. |
|
// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] |
|
// *Returns:* { r, g, b } in the set [0, 255] |
|
function hsvToRgb(h, s, v) { |
|
|
|
h = bound01(h, 360) * 6; |
|
s = bound01(s, 100); |
|
v = bound01(v, 100); |
|
|
|
var i = Math.floor(h), |
|
f = h - i, |
|
p = v * (1 - s), |
|
q = v * (1 - f * s), |
|
t = v * (1 - (1 - f) * s), |
|
mod = i % 6, |
|
r = [v, q, p, p, t, v][mod], |
|
g = [t, v, v, q, p, p][mod], |
|
b = [p, p, t, v, v, q][mod]; |
|
|
|
return { r: r * 255, g: g * 255, b: b * 255 }; |
|
} |
|
|
|
// `rgbToHex` |
|
// Converts an RGB color to hex |
|
// Assumes r, g, and b are contained in the set [0, 255] |
|
// Returns a 3 or 6 character hex |
|
function rgbToHex(r, g, b, allow3Char) { |
|
|
|
var hex = [ |
|
pad2(mathRound(r).toString(16)), |
|
pad2(mathRound(g).toString(16)), |
|
pad2(mathRound(b).toString(16)) |
|
]; |
|
|
|
// Return a 3 character hex if possible |
|
if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { |
|
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); |
|
} |
|
|
|
return hex.join(""); |
|
} |
|
|
|
// `rgbaToHex` |
|
// Converts an RGBA color plus alpha transparency to hex |
|
// Assumes r, g, b are contained in the set [0, 255] and |
|
// a in [0, 1]. Returns a 4 or 8 character rgba hex |
|
function rgbaToHex(r, g, b, a, allow4Char) { |
|
|
|
var hex = [ |
|
pad2(mathRound(r).toString(16)), |
|
pad2(mathRound(g).toString(16)), |
|
pad2(mathRound(b).toString(16)), |
|
pad2(convertDecimalToHex(a)) |
|
]; |
|
|
|
// Return a 4 character hex if possible |
|
if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) { |
|
return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0); |
|
} |
|
|
|
return hex.join(""); |
|
} |
|
|
|
// `rgbaToArgbHex` |
|
// Converts an RGBA color to an ARGB Hex8 string |
|
// Rarely used, but required for "toFilter()" |
|
function rgbaToArgbHex(r, g, b, a) { |
|
|
|
var hex = [ |
|
pad2(convertDecimalToHex(a)), |
|
pad2(mathRound(r).toString(16)), |
|
pad2(mathRound(g).toString(16)), |
|
pad2(mathRound(b).toString(16)) |
|
]; |
|
|
|
return hex.join(""); |
|
} |
|
|
|
// `equals` |
|
// Can be called with any tinycolor input |
|
tinycolor.equals = function (color1, color2) { |
|
if (!color1 || !color2) { return false; } |
|
return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); |
|
}; |
|
|
|
tinycolor.random = function() { |
|
return tinycolor.fromRatio({ |
|
r: mathRandom(), |
|
g: mathRandom(), |
|
b: mathRandom() |
|
}); |
|
}; |
|
|
|
|
|
// Modification Functions |
|
// ---------------------- |
|
// Thanks to less.js for some of the basics here |
|
// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js> |
|
|
|
function desaturate(color, amount) { |
|
amount = (amount === 0) ? 0 : (amount || 10); |
|
var hsl = tinycolor(color).toHsl(); |
|
hsl.s -= amount / 100; |
|
hsl.s = clamp01(hsl.s); |
|
return tinycolor(hsl); |
|
} |
|
|
|
function saturate(color, amount) { |
|
amount = (amount === 0) ? 0 : (amount || 10); |
|
var hsl = tinycolor(color).toHsl(); |
|
hsl.s += amount / 100; |
|
hsl.s = clamp01(hsl.s); |
|
return tinycolor(hsl); |
|
} |
|
|
|
function greyscale(color) { |
|
return tinycolor(color).desaturate(100); |
|
} |
|
|
|
function lighten (color, amount) { |
|
amount = (amount === 0) ? 0 : (amount || 10); |
|
var hsl = tinycolor(color).toHsl(); |
|
hsl.l += amount / 100; |
|
hsl.l = clamp01(hsl.l); |
|
return tinycolor(hsl); |
|
} |
|
|
|
function brighten(color, amount) { |
|
amount = (amount === 0) ? 0 : (amount || 10); |
|
var rgb = tinycolor(color).toRgb(); |
|
rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100)))); |
|
rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100)))); |
|
rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100)))); |
|
return tinycolor(rgb); |
|
} |
|
|
|
function darken (color, amount) { |
|
amount = (amount === 0) ? 0 : (amount || 10); |
|
var hsl = tinycolor(color).toHsl(); |
|
hsl.l -= amount / 100; |
|
hsl.l = clamp01(hsl.l); |
|
return tinycolor(hsl); |
|
} |
|
|
|
// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue. |
|
// Values outside of this range will be wrapped into this range. |
|
function spin(color, amount) { |
|
var hsl = tinycolor(color).toHsl(); |
|
var hue = (hsl.h + amount) % 360; |
|
hsl.h = hue < 0 ? 360 + hue : hue; |
|
return tinycolor(hsl); |
|
} |
|
|
|
// Combination Functions |
|
// --------------------- |
|
// Thanks to jQuery xColor for some of the ideas behind these |
|
// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js> |
|
|
|
function complement(color) { |
|
var hsl = tinycolor(color).toHsl(); |
|
hsl.h = (hsl.h + 180) % 360; |
|
return tinycolor(hsl); |
|
} |
|
|
|
function triad(color) { |
|
var hsl = tinycolor(color).toHsl(); |
|
var h = hsl.h; |
|
return [ |
|
tinycolor(color), |
|
tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), |
|
tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) |
|
]; |
|
} |
|
|
|
function tetrad(color) { |
|
var hsl = tinycolor(color).toHsl(); |
|
var h = hsl.h; |
|
return [ |
|
tinycolor(color), |
|
tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), |
|
tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), |
|
tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) |
|
]; |
|
} |
|
|
|
function splitcomplement(color) { |
|
var hsl = tinycolor(color).toHsl(); |
|
var h = hsl.h; |
|
return [ |
|
tinycolor(color), |
|
tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), |
|
tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) |
|
]; |
|
} |
|
|
|
function analogous(color, results, slices) { |
|
results = results || 6; |
|
slices = slices || 30; |
|
|
|
var hsl = tinycolor(color).toHsl(); |
|
var part = 360 / slices; |
|
var ret = [tinycolor(color)]; |
|
|
|
for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { |
|
hsl.h = (hsl.h + part) % 360; |
|
ret.push(tinycolor(hsl)); |
|
} |
|
return ret; |
|
} |
|
|
|
function monochromatic(color, results) { |
|
results = results || 6; |
|
var hsv = tinycolor(color).toHsv(); |
|
var h = hsv.h, s = hsv.s, v = hsv.v; |
|
var ret = []; |
|
var modification = 1 / results; |
|
|
|
while (results--) { |
|
ret.push(tinycolor({ h: h, s: s, v: v})); |
|
v = (v + modification) % 1; |
|
} |
|
|
|
return ret; |
|
} |
|
|
|
// Utility Functions |
|
// --------------------- |
|
|
|
tinycolor.mix = function(color1, color2, amount) { |
|
amount = (amount === 0) ? 0 : (amount || 50); |
|
|
|
var rgb1 = tinycolor(color1).toRgb(); |
|
var rgb2 = tinycolor(color2).toRgb(); |
|
|
|
var p = amount / 100; |
|
|
|
var rgba = { |
|
r: ((rgb2.r - rgb1.r) * p) + rgb1.r, |
|
g: ((rgb2.g - rgb1.g) * p) + rgb1.g, |
|
b: ((rgb2.b - rgb1.b) * p) + rgb1.b, |
|
a: ((rgb2.a - rgb1.a) * p) + rgb1.a |
|
}; |
|
|
|
return tinycolor(rgba); |
|
}; |
|
|
|
|
|
// Readability Functions |
|
// --------------------- |
|
// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2) |
|
|
|
// `contrast` |
|
// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2) |
|
tinycolor.readability = function(color1, color2) { |
|
var c1 = tinycolor(color1); |
|
var c2 = tinycolor(color2); |
|
return (Math.max(c1.getLuminance(),c2.getLuminance())+0.05) / (Math.min(c1.getLuminance(),c2.getLuminance())+0.05); |
|
}; |
|
|
|
// `isReadable` |
|
// Ensure that foreground and background color combinations meet WCAG2 guidelines. |
|
// The third argument is an optional Object. |
|
// the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA'; |
|
// the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'. |
|
// If the entire object is absent, isReadable defaults to {level:"AA",size:"small"}. |
|
|
|
// *Example* |
|
// tinycolor.isReadable("#000", "#111") => false |
|
// tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false |
|
tinycolor.isReadable = function(color1, color2, wcag2) { |
|
var readability = tinycolor.readability(color1, color2); |
|
var wcag2Parms, out; |
|
|
|
out = false; |
|
|
|
wcag2Parms = validateWCAG2Parms(wcag2); |
|
switch (wcag2Parms.level + wcag2Parms.size) { |
|
case "AAsmall": |
|
case "AAAlarge": |
|
out = readability >= 4.5; |
|
break; |
|
case "AAlarge": |
|
out = readability >= 3; |
|
break; |
|
case "AAAsmall": |
|
out = readability >= 7; |
|
break; |
|
} |
|
return out; |
|
|
|
}; |
|
|
|
// `mostReadable` |
|
// Given a base color and a list of possible foreground or background |
|
// colors for that base, returns the most readable color. |
|
// Optionally returns Black or White if the most readable color is unreadable. |
|
// *Example* |
|
// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255" |
|
// tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString(); // "#ffffff" |
|
// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3" |
|
// tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff" |
|
tinycolor.mostReadable = function(baseColor, colorList, args) { |
|
var bestColor = null; |
|
var bestScore = 0; |
|
var readability; |
|
var includeFallbackColors, level, size ; |
|
args = args || {}; |
|
includeFallbackColors = args.includeFallbackColors ; |
|
level = args.level; |
|
size = args.size; |
|
|
|
for (var i= 0; i < colorList.length ; i++) { |
|
readability = tinycolor.readability(baseColor, colorList[i]); |
|
if (readability > bestScore) { |
|
bestScore = readability; |
|
bestColor = tinycolor(colorList[i]); |
|
} |
|
} |
|
|
|
if (tinycolor.isReadable(baseColor, bestColor, {"level":level,"size":size}) || !includeFallbackColors) { |
|
return bestColor; |
|
} |
|
else { |
|
args.includeFallbackColors=false; |
|
return tinycolor.mostReadable(baseColor,["#fff", "#000"],args); |
|
} |
|
}; |
|
|
|
|
|
// Big List of Colors |
|
// ------------------ |
|
// <http://www.w3.org/TR/css3-color/#svg-color> |
|
var names = tinycolor.names = { |
|
aliceblue: "f0f8ff", |
|
antiquewhite: "faebd7", |
|
aqua: "0ff", |
|
aquamarine: "7fffd4", |
|
azure: "f0ffff", |
|
beige: "f5f5dc", |
|
bisque: "ffe4c4", |
|
black: "000", |
|
blanchedalmond: "ffebcd", |
|
blue: "00f", |
|
blueviolet: "8a2be2", |
|
brown: "a52a2a", |
|
burlywood: "deb887", |
|
burntsienna: "ea7e5d", |
|
cadetblue: "5f9ea0", |
|
chartreuse: "7fff00", |
|
chocolate: "d2691e", |
|
coral: "ff7f50", |
|
cornflowerblue: "6495ed", |
|
cornsilk: "fff8dc", |
|
crimson: "dc143c", |
|
cyan: "0ff", |
|
darkblue: "00008b", |
|
darkcyan: "008b8b", |
|
darkgoldenrod: "b8860b", |
|
darkgray: "a9a9a9", |
|
darkgreen: "006400", |
|
darkgrey: "a9a9a9", |
|
darkkhaki: "bdb76b", |
|
darkmagenta: "8b008b", |
|
darkolivegreen: "556b2f", |
|
darkorange: "ff8c00", |
|
darkorchid: "9932cc", |
|
darkred: "8b0000", |
|
darksalmon: "e9967a", |
|
darkseagreen: "8fbc8f", |
|
darkslateblue: "483d8b", |
|
darkslategray: "2f4f4f", |
|
darkslategrey: "2f4f4f", |
|
darkturquoise: "00ced1", |
|
darkviolet: "9400d3", |
|
deeppink: "ff1493", |
|
deepskyblue: "00bfff", |
|
dimgray: "696969", |
|
dimgrey: "696969", |
|
dodgerblue: "1e90ff", |
|
firebrick: "b22222", |
|
floralwhite: "fffaf0", |
|
forestgreen: "228b22", |
|
fuchsia: "f0f", |
|
gainsboro: "dcdcdc", |
|
ghostwhite: "f8f8ff", |
|
gold: "ffd700", |
|
goldenrod: "daa520", |
|
gray: "808080", |
|
green: "008000", |
|
greenyellow: "adff2f", |
|
grey: "808080", |
|
honeydew: "f0fff0", |
|
hotpink: "ff69b4", |
|
indianred: "cd5c5c", |
|
indigo: "4b0082", |
|
ivory: "fffff0", |
|
khaki: "f0e68c", |
|
lavender: "e6e6fa", |
|
lavenderblush: "fff0f5", |
|
lawngreen: "7cfc00", |
|
lemonchiffon: "fffacd", |
|
lightblue: "add8e6", |
|
lightcoral: "f08080", |
|
lightcyan: "e0ffff", |
|
lightgoldenrodyellow: "fafad2", |
|
lightgray: "d3d3d3", |
|
lightgreen: "90ee90", |
|
lightgrey: "d3d3d3", |
|
lightpink: "ffb6c1", |
|
lightsalmon: "ffa07a", |
|
lightseagreen: "20b2aa", |
|
lightskyblue: "87cefa", |
|
lightslategray: "789", |
|
lightslategrey: "789", |
|
lightsteelblue: "b0c4de", |
|
lightyellow: "ffffe0", |
|
lime: "0f0", |
|
limegreen: "32cd32", |
|
linen: "faf0e6", |
|
magenta: "f0f", |
|
maroon: "800000", |
|
mediumaquamarine: "66cdaa", |
|
mediumblue: "0000cd", |
|
mediumorchid: "ba55d3", |
|
mediumpurple: "9370db", |
|
mediumseagreen: "3cb371", |
|
mediumslateblue: "7b68ee", |
|
mediumspringgreen: "00fa9a", |
|
mediumturquoise: "48d1cc", |
|
mediumvioletred: "c71585", |
|
midnightblue: "191970", |
|
mintcream: "f5fffa", |
|
mistyrose: "ffe4e1", |
|
moccasin: "ffe4b5", |
|
navajowhite: "ffdead", |
|
navy: "000080", |
|
oldlace: "fdf5e6", |
|
olive: "808000", |
|
olivedrab: "6b8e23", |
|
orange: "ffa500", |
|
orangered: "ff4500", |
|
orchid: "da70d6", |
|
palegoldenrod: "eee8aa", |
|
palegreen: "98fb98", |
|
paleturquoise: "afeeee", |
|
palevioletred: "db7093", |
|
papayawhip: "ffefd5", |
|
peachpuff: "ffdab9", |
|
peru: "cd853f", |
|
pink: "ffc0cb", |
|
plum: "dda0dd", |
|
powderblue: "b0e0e6", |
|
purple: "800080", |
|
rebeccapurple: "663399", |
|
red: "f00", |
|
rosybrown: "bc8f8f", |
|
royalblue: "4169e1", |
|
saddlebrown: "8b4513", |
|
salmon: "fa8072", |
|
sandybrown: "f4a460", |
|
seagreen: "2e8b57", |
|
seashell: "fff5ee", |
|
sienna: "a0522d", |
|
silver: "c0c0c0", |
|
skyblue: "87ceeb", |
|
slateblue: "6a5acd", |
|
slategray: "708090", |
|
slategrey: "708090", |
|
snow: "fffafa", |
|
springgreen: "00ff7f", |
|
steelblue: "4682b4", |
|
tan: "d2b48c", |
|
teal: "008080", |
|
thistle: "d8bfd8", |
|
tomato: "ff6347", |
|
turquoise: "40e0d0", |
|
violet: "ee82ee", |
|
wheat: "f5deb3", |
|
white: "fff", |
|
whitesmoke: "f5f5f5", |
|
yellow: "ff0", |
|
yellowgreen: "9acd32" |
|
}; |
|
|
|
// Make it easy to access colors via `hexNames[hex]` |
|
var hexNames = tinycolor.hexNames = flip(names); |
|
|
|
|
|
// Utilities |
|
// --------- |
|
|
|
// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }` |
|
function flip(o) { |
|
var flipped = { }; |
|
for (var i in o) { |
|
if (o.hasOwnProperty(i)) { |
|
flipped[o[i]] = i; |
|
} |
|
} |
|
return flipped; |
|
} |
|
|
|
// Return a valid alpha value [0,1] with all invalid values being set to 1 |
|
function boundAlpha(a) { |
|
a = parseFloat(a); |
|
|
|
if (isNaN(a) || a < 0 || a > 1) { |
|
a = 1; |
|
} |
|
|
|
return a; |
|
} |
|
|
|
// Take input from [0, n] and return it as [0, 1] |
|
function bound01(n, max) { |
|
if (isOnePointZero(n)) { n = "100%"; } |
|
|
|
var processPercent = isPercentage(n); |
|
n = mathMin(max, mathMax(0, parseFloat(n))); |
|
|
|
// Automatically convert percentage into number |
|
if (processPercent) { |
|
n = parseInt(n * max, 10) / 100; |
|
} |
|
|
|
// Handle floating point rounding errors |
|
if ((Math.abs(n - max) < 0.000001)) { |
|
return 1; |
|
} |
|
|
|
// Convert into [0, 1] range if it isn't already |
|
return (n % max) / parseFloat(max); |
|
} |
|
|
|
// Force a number between 0 and 1 |
|
function clamp01(val) { |
|
return mathMin(1, mathMax(0, val)); |
|
} |
|
|
|
// Parse a base-16 hex value into a base-10 integer |
|
function parseIntFromHex(val) { |
|
return parseInt(val, 16); |
|
} |
|
|
|
// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 |
|
// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0> |
|
function isOnePointZero(n) { |
|
return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; |
|
} |
|
|
|
// Check to see if string passed in is a percentage |
|
function isPercentage(n) { |
|
return typeof n === "string" && n.indexOf('%') != -1; |
|
} |
|
|
|
// Force a hex value to have 2 characters |
|
function pad2(c) { |
|
return c.length == 1 ? '0' + c : '' + c; |
|
} |
|
|
|
// Replace a decimal with it's percentage value |
|
function convertToPercentage(n) { |
|
if (n <= 1) { |
|
n = (n * 100) + "%"; |
|
} |
|
|
|
return n; |
|
} |
|
|
|
// Converts a decimal to a hex value |
|
function convertDecimalToHex(d) { |
|
return Math.round(parseFloat(d) * 255).toString(16); |
|
} |
|
// Converts a hex value to a decimal |
|
function convertHexToDecimal(h) { |
|
return (parseIntFromHex(h) / 255); |
|
} |
|
|
|
var matchers = (function() { |
|
|
|
// <http://www.w3.org/TR/css3-values/#integers> |
|
var CSS_INTEGER = "[-\\+]?\\d+%?"; |
|
|
|
// <http://www.w3.org/TR/css3-values/#number-value> |
|
var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; |
|
|
|
// Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. |
|
var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; |
|
|
|
// Actual matching. |
|
// Parentheses and commas are optional, but not required. |
|
// Whitespace can take the place of commas or opening paren |
|
var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; |
|
var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; |
|
|
|
return { |
|
CSS_UNIT: new RegExp(CSS_UNIT), |
|
rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), |
|
rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), |
|
hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), |
|
hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), |
|
hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), |
|
hsva: new RegExp("hsva" + PERMISSIVE_MATCH4), |
|
hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, |
|
hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, |
|
hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, |
|
hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ |
|
}; |
|
})(); |
|
|
|
// `isValidCSSUnit` |
|
// Take in a single string / number and check to see if it looks like a CSS unit |
|
// (see `matchers` above for definition). |
|
function isValidCSSUnit(color) { |
|
return !!matchers.CSS_UNIT.exec(color); |
|
} |
|
|
|
// `stringInputToObject` |
|
// Permissive string parsing. Take in a number of formats, and output an object |
|
// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` |
|
function stringInputToObject(color) { |
|
|
|
color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase(); |
|
var named = false; |
|
if (names[color]) { |
|
color = names[color]; |
|
named = true; |
|
} |
|
else if (color == 'transparent') { |
|
return { r: 0, g: 0, b: 0, a: 0, format: "name" }; |
|
} |
|
|
|
// Try to match string input using regular expressions. |
|
// Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] |
|
// Just return an object and let the conversion functions handle that. |
|
// This way the result will be the same whether the tinycolor is initialized with string or object. |
|
var match; |
|
if ((match = matchers.rgb.exec(color))) { |
|
return { r: match[1], g: match[2], b: match[3] }; |
|
} |
|
if ((match = matchers.rgba.exec(color))) { |
|
return { r: match[1], g: match[2], b: match[3], a: match[4] }; |
|
} |
|
if ((match = matchers.hsl.exec(color))) { |
|
return { h: match[1], s: match[2], l: match[3] }; |
|
} |
|
if ((match = matchers.hsla.exec(color))) { |
|
return { h: match[1], s: match[2], l: match[3], a: match[4] }; |
|
} |
|
if ((match = matchers.hsv.exec(color))) { |
|
return { h: match[1], s: match[2], v: match[3] }; |
|
} |
|
if ((match = matchers.hsva.exec(color))) { |
|
return { h: match[1], s: match[2], v: match[3], a: match[4] }; |
|
} |
|
if ((match = matchers.hex8.exec(color))) { |
|
return { |
|
r: parseIntFromHex(match[1]), |
|
g: parseIntFromHex(match[2]), |
|
b: parseIntFromHex(match[3]), |
|
a: convertHexToDecimal(match[4]), |
|
format: named ? "name" : "hex8" |
|
}; |
|
} |
|
if ((match = matchers.hex6.exec(color))) { |
|
return { |
|
r: parseIntFromHex(match[1]), |
|
g: parseIntFromHex(match[2]), |
|
b: parseIntFromHex(match[3]), |
|
format: named ? "name" : "hex" |
|
}; |
|
} |
|
if ((match = matchers.hex4.exec(color))) { |
|
return { |
|
r: parseIntFromHex(match[1] + '' + match[1]), |
|
g: parseIntFromHex(match[2] + '' + match[2]), |
|
b: parseIntFromHex(match[3] + '' + match[3]), |
|
a: convertHexToDecimal(match[4] + '' + match[4]), |
|
format: named ? "name" : "hex8" |
|
}; |
|
} |
|
if ((match = matchers.hex3.exec(color))) { |
|
return { |
|
r: parseIntFromHex(match[1] + '' + match[1]), |
|
g: parseIntFromHex(match[2] + '' + match[2]), |
|
b: parseIntFromHex(match[3] + '' + match[3]), |
|
format: named ? "name" : "hex" |
|
}; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
function validateWCAG2Parms(parms) { |
|
// return valid WCAG2 parms for isReadable. |
|
// If input parms are invalid, return {"level":"AA", "size":"small"} |
|
var level, size; |
|
parms = parms || {"level":"AA", "size":"small"}; |
|
level = (parms.level || "AA").toUpperCase(); |
|
size = (parms.size || "small").toLowerCase(); |
|
if (level !== "AA" && level !== "AAA") { |
|
level = "AA"; |
|
} |
|
if (size !== "small" && size !== "large") { |
|
size = "small"; |
|
} |
|
return {"level":level, "size":size}; |
|
} |
|
|
|
// Node: Export function |
|
if ( true && module.exports) { |
|
module.exports = tinycolor; |
|
} |
|
// AMD/requirejs: Define the module |
|
else if (true) { |
|
!(__WEBPACK_AMD_DEFINE_RESULT__ = (function () {return tinycolor;}).call(exports, __webpack_require__, exports, module), |
|
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); |
|
} |
|
// Browser: Expose to window |
|
else {} |
|
|
|
})(Math); |
|
|
|
|
|
/***/ }), |
|
/* 46 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["date"]; }()); |
|
|
|
/***/ }), |
|
/* 47 */, |
|
/* 48 */, |
|
/* 49 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["htmlEntities"]; }()); |
|
|
|
/***/ }), |
|
/* 50 */, |
|
/* 51 */ |
|
/***/ (function(module, exports) { |
|
|
|
var g; |
|
|
|
// This works in non-strict mode |
|
g = (function() { |
|
return this; |
|
})(); |
|
|
|
try { |
|
// This works if eval is allowed (see CSP) |
|
g = g || Function("return this")() || (1, eval)("this"); |
|
} catch (e) { |
|
// This works if the window reference is available |
|
if (typeof window === "object") g = window; |
|
} |
|
|
|
// g can still be undefined, but nothing to do about it... |
|
// We return undefined, instead of nothing here, so it's |
|
// easier to handle this case. if(!global) { ...} |
|
|
|
module.exports = g; |
|
|
|
|
|
/***/ }), |
|
/* 52 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["nux"]; }()); |
|
|
|
/***/ }), |
|
/* 53 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
module.exports = __webpack_require__(269); |
|
|
|
|
|
/***/ }), |
|
/* 54 */, |
|
/* 55 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
exports.__esModule = true; |
|
var TextareaAutosize_1 = __webpack_require__(270); |
|
exports["default"] = TextareaAutosize_1["default"]; |
|
|
|
|
|
/***/ }), |
|
/* 56 */, |
|
/* 57 */, |
|
/* 58 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["autop"]; }()); |
|
|
|
/***/ }), |
|
/* 59 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
|
|
module.exports = __webpack_require__(118); |
|
|
|
/***/ }), |
|
/* 60 */, |
|
/* 61 */, |
|
/* 62 */, |
|
/* 63 */, |
|
/* 64 */, |
|
/* 65 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["deprecated"]; }()); |
|
|
|
/***/ }), |
|
/* 66 */, |
|
/* 67 */, |
|
/* 68 */, |
|
/* 69 */, |
|
/* 70 */, |
|
/* 71 */, |
|
/* 72 */, |
|
/* 73 */, |
|
/* 74 */, |
|
/* 75 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
// Copyright Joyent, Inc. and other Node contributors. |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a |
|
// copy of this software and associated documentation files (the |
|
// "Software"), to deal in the Software without restriction, including |
|
// without limitation the rights to use, copy, modify, merge, publish, |
|
// distribute, sublicense, and/or sell copies of the Software, and to permit |
|
// persons to whom the Software is furnished to do so, subject to the |
|
// following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included |
|
// in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
|
// USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
|
|
|
|
|
var punycode = __webpack_require__(100); |
|
var util = __webpack_require__(102); |
|
|
|
exports.parse = urlParse; |
|
exports.resolve = urlResolve; |
|
exports.resolveObject = urlResolveObject; |
|
exports.format = urlFormat; |
|
|
|
exports.Url = Url; |
|
|
|
function Url() { |
|
this.protocol = null; |
|
this.slashes = null; |
|
this.auth = null; |
|
this.host = null; |
|
this.port = null; |
|
this.hostname = null; |
|
this.hash = null; |
|
this.search = null; |
|
this.query = null; |
|
this.pathname = null; |
|
this.path = null; |
|
this.href = null; |
|
} |
|
|
|
// Reference: RFC 3986, RFC 1808, RFC 2396 |
|
|
|
// define these here so at least they only have to be |
|
// compiled once on the first module load. |
|
var protocolPattern = /^([a-z0-9.+-]+:)/i, |
|
portPattern = /:[0-9]*$/, |
|
|
|
// Special case for a simple path URL |
|
simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/, |
|
|
|
// RFC 2396: characters reserved for delimiting URLs. |
|
// We actually just auto-escape these. |
|
delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'], |
|
|
|
// RFC 2396: characters not allowed for various reasons. |
|
unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims), |
|
|
|
// Allowed by RFCs, but cause of XSS attacks. Always escape these. |
|
autoEscape = ['\''].concat(unwise), |
|
// Characters that are never ever allowed in a hostname. |
|
// Note that any invalid chars are also handled, but these |
|
// are the ones that are *expected* to be seen, so we fast-path |
|
// them. |
|
nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape), |
|
hostEndingChars = ['/', '?', '#'], |
|
hostnameMaxLen = 255, |
|
hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/, |
|
hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/, |
|
// protocols that can allow "unsafe" and "unwise" chars. |
|
unsafeProtocol = { |
|
'javascript': true, |
|
'javascript:': true |
|
}, |
|
// protocols that never have a hostname. |
|
hostlessProtocol = { |
|
'javascript': true, |
|
'javascript:': true |
|
}, |
|
// protocols that always contain a // bit. |
|
slashedProtocol = { |
|
'http': true, |
|
'https': true, |
|
'ftp': true, |
|
'gopher': true, |
|
'file': true, |
|
'http:': true, |
|
'https:': true, |
|
'ftp:': true, |
|
'gopher:': true, |
|
'file:': true |
|
}, |
|
querystring = __webpack_require__(103); |
|
|
|
function urlParse(url, parseQueryString, slashesDenoteHost) { |
|
if (url && util.isObject(url) && url instanceof Url) return url; |
|
|
|
var u = new Url; |
|
u.parse(url, parseQueryString, slashesDenoteHost); |
|
return u; |
|
} |
|
|
|
Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) { |
|
if (!util.isString(url)) { |
|
throw new TypeError("Parameter 'url' must be a string, not " + typeof url); |
|
} |
|
|
|
// Copy chrome, IE, opera backslash-handling behavior. |
|
// Back slashes before the query string get converted to forward slashes |
|
// See: https://code.google.com/p/chromium/issues/detail?id=25916 |
|
var queryIndex = url.indexOf('?'), |
|
splitter = |
|
(queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#', |
|
uSplit = url.split(splitter), |
|
slashRegex = /\\/g; |
|
uSplit[0] = uSplit[0].replace(slashRegex, '/'); |
|
url = uSplit.join(splitter); |
|
|
|
var rest = url; |
|
|
|
// trim before proceeding. |
|
// This is to support parse stuff like " http://foo.com \n" |
|
rest = rest.trim(); |
|
|
|
if (!slashesDenoteHost && url.split('#').length === 1) { |
|
// Try fast path regexp |
|
var simplePath = simplePathPattern.exec(rest); |
|
if (simplePath) { |
|
this.path = rest; |
|
this.href = rest; |
|
this.pathname = simplePath[1]; |
|
if (simplePath[2]) { |
|
this.search = simplePath[2]; |
|
if (parseQueryString) { |
|
this.query = querystring.parse(this.search.substr(1)); |
|
} else { |
|
this.query = this.search.substr(1); |
|
} |
|
} else if (parseQueryString) { |
|
this.search = ''; |
|
this.query = {}; |
|
} |
|
return this; |
|
} |
|
} |
|
|
|
var proto = protocolPattern.exec(rest); |
|
if (proto) { |
|
proto = proto[0]; |
|
var lowerProto = proto.toLowerCase(); |
|
this.protocol = lowerProto; |
|
rest = rest.substr(proto.length); |
|
} |
|
|
|
// figure out if it's got a host |
|
// user@server is *always* interpreted as a hostname, and url |
|
// resolution will treat //foo/bar as host=foo,path=bar because that's |
|
// how the browser resolves relative URLs. |
|
if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) { |
|
var slashes = rest.substr(0, 2) === '//'; |
|
if (slashes && !(proto && hostlessProtocol[proto])) { |
|
rest = rest.substr(2); |
|
this.slashes = true; |
|
} |
|
} |
|
|
|
if (!hostlessProtocol[proto] && |
|
(slashes || (proto && !slashedProtocol[proto]))) { |
|
|
|
// there's a hostname. |
|
// the first instance of /, ?, ;, or # ends the host. |
|
// |
|
// If there is an @ in the hostname, then non-host chars *are* allowed |
|
// to the left of the last @ sign, unless some host-ending character |
|
// comes *before* the @-sign. |
|
// URLs are obnoxious. |
|
// |
|
// ex: |
|
// http://a@b@c/ => user:a@b host:c |
|
// http://a@b?@c => user:a host:c path:/?@c |
|
|
|
// v0.12 TODO(isaacs): This is not quite how Chrome does things. |
|
// Review our test case against browsers more comprehensively. |
|
|
|
// find the first instance of any hostEndingChars |
|
var hostEnd = -1; |
|
for (var i = 0; i < hostEndingChars.length; i++) { |
|
var hec = rest.indexOf(hostEndingChars[i]); |
|
if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) |
|
hostEnd = hec; |
|
} |
|
|
|
// at this point, either we have an explicit point where the |
|
// auth portion cannot go past, or the last @ char is the decider. |
|
var auth, atSign; |
|
if (hostEnd === -1) { |
|
// atSign can be anywhere. |
|
atSign = rest.lastIndexOf('@'); |
|
} else { |
|
// atSign must be in auth portion. |
|
// http://a@b/c@d => host:b auth:a path:/c@d |
|
atSign = rest.lastIndexOf('@', hostEnd); |
|
} |
|
|
|
// Now we have a portion which is definitely the auth. |
|
// Pull that off. |
|
if (atSign !== -1) { |
|
auth = rest.slice(0, atSign); |
|
rest = rest.slice(atSign + 1); |
|
this.auth = decodeURIComponent(auth); |
|
} |
|
|
|
// the host is the remaining to the left of the first non-host char |
|
hostEnd = -1; |
|
for (var i = 0; i < nonHostChars.length; i++) { |
|
var hec = rest.indexOf(nonHostChars[i]); |
|
if (hec !== -1 && (hostEnd === -1 || hec < hostEnd)) |
|
hostEnd = hec; |
|
} |
|
// if we still have not hit it, then the entire thing is a host. |
|
if (hostEnd === -1) |
|
hostEnd = rest.length; |
|
|
|
this.host = rest.slice(0, hostEnd); |
|
rest = rest.slice(hostEnd); |
|
|
|
// pull out port. |
|
this.parseHost(); |
|
|
|
// we've indicated that there is a hostname, |
|
// so even if it's empty, it has to be present. |
|
this.hostname = this.hostname || ''; |
|
|
|
// if hostname begins with [ and ends with ] |
|
// assume that it's an IPv6 address. |
|
var ipv6Hostname = this.hostname[0] === '[' && |
|
this.hostname[this.hostname.length - 1] === ']'; |
|
|
|
// validate a little. |
|
if (!ipv6Hostname) { |
|
var hostparts = this.hostname.split(/\./); |
|
for (var i = 0, l = hostparts.length; i < l; i++) { |
|
var part = hostparts[i]; |
|
if (!part) continue; |
|
if (!part.match(hostnamePartPattern)) { |
|
var newpart = ''; |
|
for (var j = 0, k = part.length; j < k; j++) { |
|
if (part.charCodeAt(j) > 127) { |
|
// we replace non-ASCII char with a temporary placeholder |
|
// we need this to make sure size of hostname is not |
|
// broken by replacing non-ASCII by nothing |
|
newpart += 'x'; |
|
} else { |
|
newpart += part[j]; |
|
} |
|
} |
|
// we test again with ASCII char only |
|
if (!newpart.match(hostnamePartPattern)) { |
|
var validParts = hostparts.slice(0, i); |
|
var notHost = hostparts.slice(i + 1); |
|
var bit = part.match(hostnamePartStart); |
|
if (bit) { |
|
validParts.push(bit[1]); |
|
notHost.unshift(bit[2]); |
|
} |
|
if (notHost.length) { |
|
rest = '/' + notHost.join('.') + rest; |
|
} |
|
this.hostname = validParts.join('.'); |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
|
|
if (this.hostname.length > hostnameMaxLen) { |
|
this.hostname = ''; |
|
} else { |
|
// hostnames are always lower case. |
|
this.hostname = this.hostname.toLowerCase(); |
|
} |
|
|
|
if (!ipv6Hostname) { |
|
// IDNA Support: Returns a punycoded representation of "domain". |
|
// It only converts parts of the domain name that |
|
// have non-ASCII characters, i.e. it doesn't matter if |
|
// you call it with a domain that already is ASCII-only. |
|
this.hostname = punycode.toASCII(this.hostname); |
|
} |
|
|
|
var p = this.port ? ':' + this.port : ''; |
|
var h = this.hostname || ''; |
|
this.host = h + p; |
|
this.href += this.host; |
|
|
|
// strip [ and ] from the hostname |
|
// the host field still retains them, though |
|
if (ipv6Hostname) { |
|
this.hostname = this.hostname.substr(1, this.hostname.length - 2); |
|
if (rest[0] !== '/') { |
|
rest = '/' + rest; |
|
} |
|
} |
|
} |
|
|
|
// now rest is set to the post-host stuff. |
|
// chop off any delim chars. |
|
if (!unsafeProtocol[lowerProto]) { |
|
|
|
// First, make 100% sure that any "autoEscape" chars get |
|
// escaped, even if encodeURIComponent doesn't think they |
|
// need to be. |
|
for (var i = 0, l = autoEscape.length; i < l; i++) { |
|
var ae = autoEscape[i]; |
|
if (rest.indexOf(ae) === -1) |
|
continue; |
|
var esc = encodeURIComponent(ae); |
|
if (esc === ae) { |
|
esc = escape(ae); |
|
} |
|
rest = rest.split(ae).join(esc); |
|
} |
|
} |
|
|
|
|
|
// chop off from the tail first. |
|
var hash = rest.indexOf('#'); |
|
if (hash !== -1) { |
|
// got a fragment string. |
|
this.hash = rest.substr(hash); |
|
rest = rest.slice(0, hash); |
|
} |
|
var qm = rest.indexOf('?'); |
|
if (qm !== -1) { |
|
this.search = rest.substr(qm); |
|
this.query = rest.substr(qm + 1); |
|
if (parseQueryString) { |
|
this.query = querystring.parse(this.query); |
|
} |
|
rest = rest.slice(0, qm); |
|
} else if (parseQueryString) { |
|
// no query string, but parseQueryString still requested |
|
this.search = ''; |
|
this.query = {}; |
|
} |
|
if (rest) this.pathname = rest; |
|
if (slashedProtocol[lowerProto] && |
|
this.hostname && !this.pathname) { |
|
this.pathname = '/'; |
|
} |
|
|
|
//to support http.request |
|
if (this.pathname || this.search) { |
|
var p = this.pathname || ''; |
|
var s = this.search || ''; |
|
this.path = p + s; |
|
} |
|
|
|
// finally, reconstruct the href based on what has been validated. |
|
this.href = this.format(); |
|
return this; |
|
}; |
|
|
|
// format a parsed object into a url string |
|
function urlFormat(obj) { |
|
// ensure it's an object, and not a string url. |
|
// If it's an obj, this is a no-op. |
|
// this way, you can call url_format() on strings |
|
// to clean up potentially wonky urls. |
|
if (util.isString(obj)) obj = urlParse(obj); |
|
if (!(obj instanceof Url)) return Url.prototype.format.call(obj); |
|
return obj.format(); |
|
} |
|
|
|
Url.prototype.format = function() { |
|
var auth = this.auth || ''; |
|
if (auth) { |
|
auth = encodeURIComponent(auth); |
|
auth = auth.replace(/%3A/i, ':'); |
|
auth += '@'; |
|
} |
|
|
|
var protocol = this.protocol || '', |
|
pathname = this.pathname || '', |
|
hash = this.hash || '', |
|
host = false, |
|
query = ''; |
|
|
|
if (this.host) { |
|
host = auth + this.host; |
|
} else if (this.hostname) { |
|
host = auth + (this.hostname.indexOf(':') === -1 ? |
|
this.hostname : |
|
'[' + this.hostname + ']'); |
|
if (this.port) { |
|
host += ':' + this.port; |
|
} |
|
} |
|
|
|
if (this.query && |
|
util.isObject(this.query) && |
|
Object.keys(this.query).length) { |
|
query = querystring.stringify(this.query); |
|
} |
|
|
|
var search = this.search || (query && ('?' + query)) || ''; |
|
|
|
if (protocol && protocol.substr(-1) !== ':') protocol += ':'; |
|
|
|
// only the slashedProtocols get the //. Not mailto:, xmpp:, etc. |
|
// unless they had them to begin with. |
|
if (this.slashes || |
|
(!protocol || slashedProtocol[protocol]) && host !== false) { |
|
host = '//' + (host || ''); |
|
if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname; |
|
} else if (!host) { |
|
host = ''; |
|
} |
|
|
|
if (hash && hash.charAt(0) !== '#') hash = '#' + hash; |
|
if (search && search.charAt(0) !== '?') search = '?' + search; |
|
|
|
pathname = pathname.replace(/[?#]/g, function(match) { |
|
return encodeURIComponent(match); |
|
}); |
|
search = search.replace('#', '%23'); |
|
|
|
return protocol + host + pathname + search + hash; |
|
}; |
|
|
|
function urlResolve(source, relative) { |
|
return urlParse(source, false, true).resolve(relative); |
|
} |
|
|
|
Url.prototype.resolve = function(relative) { |
|
return this.resolveObject(urlParse(relative, false, true)).format(); |
|
}; |
|
|
|
function urlResolveObject(source, relative) { |
|
if (!source) return relative; |
|
return urlParse(source, false, true).resolveObject(relative); |
|
} |
|
|
|
Url.prototype.resolveObject = function(relative) { |
|
if (util.isString(relative)) { |
|
var rel = new Url(); |
|
rel.parse(relative, false, true); |
|
relative = rel; |
|
} |
|
|
|
var result = new Url(); |
|
var tkeys = Object.keys(this); |
|
for (var tk = 0; tk < tkeys.length; tk++) { |
|
var tkey = tkeys[tk]; |
|
result[tkey] = this[tkey]; |
|
} |
|
|
|
// hash is always overridden, no matter what. |
|
// even href="" will remove it. |
|
result.hash = relative.hash; |
|
|
|
// if the relative url is empty, then there's nothing left to do here. |
|
if (relative.href === '') { |
|
result.href = result.format(); |
|
return result; |
|
} |
|
|
|
// hrefs like //foo/bar always cut to the protocol. |
|
if (relative.slashes && !relative.protocol) { |
|
// take everything except the protocol from relative |
|
var rkeys = Object.keys(relative); |
|
for (var rk = 0; rk < rkeys.length; rk++) { |
|
var rkey = rkeys[rk]; |
|
if (rkey !== 'protocol') |
|
result[rkey] = relative[rkey]; |
|
} |
|
|
|
//urlParse appends trailing / to urls like http://www.example.com |
|
if (slashedProtocol[result.protocol] && |
|
result.hostname && !result.pathname) { |
|
result.path = result.pathname = '/'; |
|
} |
|
|
|
result.href = result.format(); |
|
return result; |
|
} |
|
|
|
if (relative.protocol && relative.protocol !== result.protocol) { |
|
// if it's a known url protocol, then changing |
|
// the protocol does weird things |
|
// first, if it's not file:, then we MUST have a host, |
|
// and if there was a path |
|
// to begin with, then we MUST have a path. |
|
// if it is file:, then the host is dropped, |
|
// because that's known to be hostless. |
|
// anything else is assumed to be absolute. |
|
if (!slashedProtocol[relative.protocol]) { |
|
var keys = Object.keys(relative); |
|
for (var v = 0; v < keys.length; v++) { |
|
var k = keys[v]; |
|
result[k] = relative[k]; |
|
} |
|
result.href = result.format(); |
|
return result; |
|
} |
|
|
|
result.protocol = relative.protocol; |
|
if (!relative.host && !hostlessProtocol[relative.protocol]) { |
|
var relPath = (relative.pathname || '').split('/'); |
|
while (relPath.length && !(relative.host = relPath.shift())); |
|
if (!relative.host) relative.host = ''; |
|
if (!relative.hostname) relative.hostname = ''; |
|
if (relPath[0] !== '') relPath.unshift(''); |
|
if (relPath.length < 2) relPath.unshift(''); |
|
result.pathname = relPath.join('/'); |
|
} else { |
|
result.pathname = relative.pathname; |
|
} |
|
result.search = relative.search; |
|
result.query = relative.query; |
|
result.host = relative.host || ''; |
|
result.auth = relative.auth; |
|
result.hostname = relative.hostname || relative.host; |
|
result.port = relative.port; |
|
// to support http.request |
|
if (result.pathname || result.search) { |
|
var p = result.pathname || ''; |
|
var s = result.search || ''; |
|
result.path = p + s; |
|
} |
|
result.slashes = result.slashes || relative.slashes; |
|
result.href = result.format(); |
|
return result; |
|
} |
|
|
|
var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'), |
|
isRelAbs = ( |
|
relative.host || |
|
relative.pathname && relative.pathname.charAt(0) === '/' |
|
), |
|
mustEndAbs = (isRelAbs || isSourceAbs || |
|
(result.host && relative.pathname)), |
|
removeAllDots = mustEndAbs, |
|
srcPath = result.pathname && result.pathname.split('/') || [], |
|
relPath = relative.pathname && relative.pathname.split('/') || [], |
|
psychotic = result.protocol && !slashedProtocol[result.protocol]; |
|
|
|
// if the url is a non-slashed url, then relative |
|
// links like ../.. should be able |
|
// to crawl up to the hostname, as well. This is strange. |
|
// result.protocol has already been set by now. |
|
// Later on, put the first path part into the host field. |
|
if (psychotic) { |
|
result.hostname = ''; |
|
result.port = null; |
|
if (result.host) { |
|
if (srcPath[0] === '') srcPath[0] = result.host; |
|
else srcPath.unshift(result.host); |
|
} |
|
result.host = ''; |
|
if (relative.protocol) { |
|
relative.hostname = null; |
|
relative.port = null; |
|
if (relative.host) { |
|
if (relPath[0] === '') relPath[0] = relative.host; |
|
else relPath.unshift(relative.host); |
|
} |
|
relative.host = null; |
|
} |
|
mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === ''); |
|
} |
|
|
|
if (isRelAbs) { |
|
// it's absolute. |
|
result.host = (relative.host || relative.host === '') ? |
|
relative.host : result.host; |
|
result.hostname = (relative.hostname || relative.hostname === '') ? |
|
relative.hostname : result.hostname; |
|
result.search = relative.search; |
|
result.query = relative.query; |
|
srcPath = relPath; |
|
// fall through to the dot-handling below. |
|
} else if (relPath.length) { |
|
// it's relative |
|
// throw away the existing file, and take the new path instead. |
|
if (!srcPath) srcPath = []; |
|
srcPath.pop(); |
|
srcPath = srcPath.concat(relPath); |
|
result.search = relative.search; |
|
result.query = relative.query; |
|
} else if (!util.isNullOrUndefined(relative.search)) { |
|
// just pull out the search. |
|
// like href='?foo'. |
|
// Put this after the other two cases because it simplifies the booleans |
|
if (psychotic) { |
|
result.hostname = result.host = srcPath.shift(); |
|
//occationaly the auth can get stuck only in host |
|
//this especially happens in cases like |
|
//url.resolveObject('mailto:local1@domain1', 'local2@domain2') |
|
var authInHost = result.host && result.host.indexOf('@') > 0 ? |
|
result.host.split('@') : false; |
|
if (authInHost) { |
|
result.auth = authInHost.shift(); |
|
result.host = result.hostname = authInHost.shift(); |
|
} |
|
} |
|
result.search = relative.search; |
|
result.query = relative.query; |
|
//to support http.request |
|
if (!util.isNull(result.pathname) || !util.isNull(result.search)) { |
|
result.path = (result.pathname ? result.pathname : '') + |
|
(result.search ? result.search : ''); |
|
} |
|
result.href = result.format(); |
|
return result; |
|
} |
|
|
|
if (!srcPath.length) { |
|
// no path at all. easy. |
|
// we've already handled the other stuff above. |
|
result.pathname = null; |
|
//to support http.request |
|
if (result.search) { |
|
result.path = '/' + result.search; |
|
} else { |
|
result.path = null; |
|
} |
|
result.href = result.format(); |
|
return result; |
|
} |
|
|
|
// if a url ENDs in . or .., then it must get a trailing slash. |
|
// however, if it ends in anything else non-slashy, |
|
// then it must NOT get a trailing slash. |
|
var last = srcPath.slice(-1)[0]; |
|
var hasTrailingSlash = ( |
|
(result.host || relative.host || srcPath.length > 1) && |
|
(last === '.' || last === '..') || last === ''); |
|
|
|
// strip single dots, resolve double dots to parent dir |
|
// if the path tries to go above the root, `up` ends up > 0 |
|
var up = 0; |
|
for (var i = srcPath.length; i >= 0; i--) { |
|
last = srcPath[i]; |
|
if (last === '.') { |
|
srcPath.splice(i, 1); |
|
} else if (last === '..') { |
|
srcPath.splice(i, 1); |
|
up++; |
|
} else if (up) { |
|
srcPath.splice(i, 1); |
|
up--; |
|
} |
|
} |
|
|
|
// if the path is allowed to go above the root, restore leading ..s |
|
if (!mustEndAbs && !removeAllDots) { |
|
for (; up--; up) { |
|
srcPath.unshift('..'); |
|
} |
|
} |
|
|
|
if (mustEndAbs && srcPath[0] !== '' && |
|
(!srcPath[0] || srcPath[0].charAt(0) !== '/')) { |
|
srcPath.unshift(''); |
|
} |
|
|
|
if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) { |
|
srcPath.push(''); |
|
} |
|
|
|
var isAbsolute = srcPath[0] === '' || |
|
(srcPath[0] && srcPath[0].charAt(0) === '/'); |
|
|
|
// put the host back |
|
if (psychotic) { |
|
result.hostname = result.host = isAbsolute ? '' : |
|
srcPath.length ? srcPath.shift() : ''; |
|
//occationaly the auth can get stuck only in host |
|
//this especially happens in cases like |
|
//url.resolveObject('mailto:local1@domain1', 'local2@domain2') |
|
var authInHost = result.host && result.host.indexOf('@') > 0 ? |
|
result.host.split('@') : false; |
|
if (authInHost) { |
|
result.auth = authInHost.shift(); |
|
result.host = result.hostname = authInHost.shift(); |
|
} |
|
} |
|
|
|
mustEndAbs = mustEndAbs || (result.host && srcPath.length); |
|
|
|
if (mustEndAbs && !isAbsolute) { |
|
srcPath.unshift(''); |
|
} |
|
|
|
if (!srcPath.length) { |
|
result.pathname = null; |
|
result.path = null; |
|
} else { |
|
result.pathname = srcPath.join('/'); |
|
} |
|
|
|
//to support request.http |
|
if (!util.isNull(result.pathname) || !util.isNull(result.search)) { |
|
result.path = (result.pathname ? result.pathname : '') + |
|
(result.search ? result.search : ''); |
|
} |
|
result.auth = relative.auth || result.auth; |
|
result.slashes = result.slashes || relative.slashes; |
|
result.href = result.format(); |
|
return result; |
|
}; |
|
|
|
Url.prototype.parseHost = function() { |
|
var host = this.host; |
|
var port = portPattern.exec(host); |
|
if (port) { |
|
port = port[0]; |
|
if (port !== ':') { |
|
this.port = port.substr(1); |
|
} |
|
host = host.substr(0, host.length - port.length); |
|
} |
|
if (host) this.hostname = host; |
|
}; |
|
|
|
|
|
/***/ }), |
|
/* 76 */, |
|
/* 77 */, |
|
/* 78 */, |
|
/* 79 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["coreData"]; }()); |
|
|
|
/***/ }), |
|
/* 80 */, |
|
/* 81 */, |
|
/* 82 */, |
|
/* 83 */, |
|
/* 84 */, |
|
/* 85 */, |
|
/* 86 */, |
|
/* 87 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
|
|
function flattenIntoMap( map, effects ) { |
|
var i; |
|
if ( Array.isArray( effects ) ) { |
|
for ( i = 0; i < effects.length; i++ ) { |
|
flattenIntoMap( map, effects[ i ] ); |
|
} |
|
} else { |
|
for ( i in effects ) { |
|
map[ i ] = ( map[ i ] || [] ).concat( effects[ i ] ); |
|
} |
|
} |
|
} |
|
|
|
function refx( effects ) { |
|
var map = {}, |
|
middleware; |
|
|
|
flattenIntoMap( map, effects ); |
|
|
|
middleware = function( store ) { |
|
return function( next ) { |
|
return function( action ) { |
|
var handlers = map[ action.type ], |
|
result = next( action ), |
|
i, handlerAction; |
|
|
|
if ( handlers ) { |
|
for ( i = 0; i < handlers.length; i++ ) { |
|
handlerAction = handlers[ i ]( action, store ); |
|
if ( handlerAction ) { |
|
store.dispatch( handlerAction ); |
|
} |
|
} |
|
} |
|
|
|
return result; |
|
}; |
|
}; |
|
}; |
|
|
|
middleware.effects = map; |
|
|
|
return middleware; |
|
} |
|
|
|
module.exports = refx; |
|
|
|
|
|
/***/ }), |
|
/* 88 */, |
|
/* 89 */, |
|
/* 90 */, |
|
/* 91 */, |
|
/* 92 */, |
|
/* 93 */, |
|
/* 94 */, |
|
/* 95 */, |
|
/* 96 */, |
|
/* 97 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["wordcount"]; }()); |
|
|
|
/***/ }), |
|
/* 98 */ |
|
/***/ (function(module, exports) { |
|
|
|
if (typeof Object.create === 'function') { |
|
// implementation from standard node.js 'util' module |
|
module.exports = function inherits(ctor, superCtor) { |
|
ctor.super_ = superCtor |
|
ctor.prototype = Object.create(superCtor.prototype, { |
|
constructor: { |
|
value: ctor, |
|
enumerable: false, |
|
writable: true, |
|
configurable: true |
|
} |
|
}); |
|
}; |
|
} else { |
|
// old school shim for old browsers |
|
module.exports = function inherits(ctor, superCtor) { |
|
ctor.super_ = superCtor |
|
var TempCtor = function () {} |
|
TempCtor.prototype = superCtor.prototype |
|
ctor.prototype = new TempCtor() |
|
ctor.prototype.constructor = ctor |
|
} |
|
} |
|
|
|
|
|
/***/ }), |
|
/* 99 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["jQuery"]; }()); |
|
|
|
/***/ }), |
|
/* 100 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/* WEBPACK VAR INJECTION */(function(module, global) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.3.2 by @mathias */ |
|
;(function(root) { |
|
|
|
/** Detect free variables */ |
|
var freeExports = true && exports && |
|
!exports.nodeType && exports; |
|
var freeModule = true && module && |
|
!module.nodeType && module; |
|
var freeGlobal = typeof global == 'object' && global; |
|
if ( |
|
freeGlobal.global === freeGlobal || |
|
freeGlobal.window === freeGlobal || |
|
freeGlobal.self === freeGlobal |
|
) { |
|
root = freeGlobal; |
|
} |
|
|
|
/** |
|
* The `punycode` object. |
|
* @name punycode |
|
* @type Object |
|
*/ |
|
var punycode, |
|
|
|
/** Highest positive signed 32-bit float value */ |
|
maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1 |
|
|
|
/** Bootstring parameters */ |
|
base = 36, |
|
tMin = 1, |
|
tMax = 26, |
|
skew = 38, |
|
damp = 700, |
|
initialBias = 72, |
|
initialN = 128, // 0x80 |
|
delimiter = '-', // '\x2D' |
|
|
|
/** Regular expressions */ |
|
regexPunycode = /^xn--/, |
|
regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars |
|
regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators |
|
|
|
/** Error messages */ |
|
errors = { |
|
'overflow': 'Overflow: input needs wider integers to process', |
|
'not-basic': 'Illegal input >= 0x80 (not a basic code point)', |
|
'invalid-input': 'Invalid input' |
|
}, |
|
|
|
/** Convenience shortcuts */ |
|
baseMinusTMin = base - tMin, |
|
floor = Math.floor, |
|
stringFromCharCode = String.fromCharCode, |
|
|
|
/** Temporary variable */ |
|
key; |
|
|
|
/*--------------------------------------------------------------------------*/ |
|
|
|
/** |
|
* A generic error utility function. |
|
* @private |
|
* @param {String} type The error type. |
|
* @returns {Error} Throws a `RangeError` with the applicable error message. |
|
*/ |
|
function error(type) { |
|
throw RangeError(errors[type]); |
|
} |
|
|
|
/** |
|
* A generic `Array#map` utility function. |
|
* @private |
|
* @param {Array} array The array to iterate over. |
|
* @param {Function} callback The function that gets called for every array |
|
* item. |
|
* @returns {Array} A new array of values returned by the callback function. |
|
*/ |
|
function map(array, fn) { |
|
var length = array.length; |
|
var result = []; |
|
while (length--) { |
|
result[length] = fn(array[length]); |
|
} |
|
return result; |
|
} |
|
|
|
/** |
|
* A simple `Array#map`-like wrapper to work with domain name strings or email |
|
* addresses. |
|
* @private |
|
* @param {String} domain The domain name or email address. |
|
* @param {Function} callback The function that gets called for every |
|
* character. |
|
* @returns {Array} A new string of characters returned by the callback |
|
* function. |
|
*/ |
|
function mapDomain(string, fn) { |
|
var parts = string.split('@'); |
|
var result = ''; |
|
if (parts.length > 1) { |
|
// In email addresses, only the domain name should be punycoded. Leave |
|
// the local part (i.e. everything up to `@`) intact. |
|
result = parts[0] + '@'; |
|
string = parts[1]; |
|
} |
|
// Avoid `split(regex)` for IE8 compatibility. See #17. |
|
string = string.replace(regexSeparators, '\x2E'); |
|
var labels = string.split('.'); |
|
var encoded = map(labels, fn).join('.'); |
|
return result + encoded; |
|
} |
|
|
|
/** |
|
* Creates an array containing the numeric code points of each Unicode |
|
* character in the string. While JavaScript uses UCS-2 internally, |
|
* this function will convert a pair of surrogate halves (each of which |
|
* UCS-2 exposes as separate characters) into a single code point, |
|
* matching UTF-16. |
|
* @see `punycode.ucs2.encode` |
|
* @see <https://mathiasbynens.be/notes/javascript-encoding> |
|
* @memberOf punycode.ucs2 |
|
* @name decode |
|
* @param {String} string The Unicode input string (UCS-2). |
|
* @returns {Array} The new array of code points. |
|
*/ |
|
function ucs2decode(string) { |
|
var output = [], |
|
counter = 0, |
|
length = string.length, |
|
value, |
|
extra; |
|
while (counter < length) { |
|
value = string.charCodeAt(counter++); |
|
if (value >= 0xD800 && value <= 0xDBFF && counter < length) { |
|
// high surrogate, and there is a next character |
|
extra = string.charCodeAt(counter++); |
|
if ((extra & 0xFC00) == 0xDC00) { // low surrogate |
|
output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); |
|
} else { |
|
// unmatched surrogate; only append this code unit, in case the next |
|
// code unit is the high surrogate of a surrogate pair |
|
output.push(value); |
|
counter--; |
|
} |
|
} else { |
|
output.push(value); |
|
} |
|
} |
|
return output; |
|
} |
|
|
|
/** |
|
* Creates a string based on an array of numeric code points. |
|
* @see `punycode.ucs2.decode` |
|
* @memberOf punycode.ucs2 |
|
* @name encode |
|
* @param {Array} codePoints The array of numeric code points. |
|
* @returns {String} The new Unicode string (UCS-2). |
|
*/ |
|
function ucs2encode(array) { |
|
return map(array, function(value) { |
|
var output = ''; |
|
if (value > 0xFFFF) { |
|
value -= 0x10000; |
|
output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800); |
|
value = 0xDC00 | value & 0x3FF; |
|
} |
|
output += stringFromCharCode(value); |
|
return output; |
|
}).join(''); |
|
} |
|
|
|
/** |
|
* Converts a basic code point into a digit/integer. |
|
* @see `digitToBasic()` |
|
* @private |
|
* @param {Number} codePoint The basic numeric code point value. |
|
* @returns {Number} The numeric value of a basic code point (for use in |
|
* representing integers) in the range `0` to `base - 1`, or `base` if |
|
* the code point does not represent a value. |
|
*/ |
|
function basicToDigit(codePoint) { |
|
if (codePoint - 48 < 10) { |
|
return codePoint - 22; |
|
} |
|
if (codePoint - 65 < 26) { |
|
return codePoint - 65; |
|
} |
|
if (codePoint - 97 < 26) { |
|
return codePoint - 97; |
|
} |
|
return base; |
|
} |
|
|
|
/** |
|
* Converts a digit/integer into a basic code point. |
|
* @see `basicToDigit()` |
|
* @private |
|
* @param {Number} digit The numeric value of a basic code point. |
|
* @returns {Number} The basic code point whose value (when used for |
|
* representing integers) is `digit`, which needs to be in the range |
|
* `0` to `base - 1`. If `flag` is non-zero, the uppercase form is |
|
* used; else, the lowercase form is used. The behavior is undefined |
|
* if `flag` is non-zero and `digit` has no uppercase form. |
|
*/ |
|
function digitToBasic(digit, flag) { |
|
// 0..25 map to ASCII a..z or A..Z |
|
// 26..35 map to ASCII 0..9 |
|
return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5); |
|
} |
|
|
|
/** |
|
* Bias adaptation function as per section 3.4 of RFC 3492. |
|
* http://tools.ietf.org/html/rfc3492#section-3.4 |
|
* @private |
|
*/ |
|
function adapt(delta, numPoints, firstTime) { |
|
var k = 0; |
|
delta = firstTime ? floor(delta / damp) : delta >> 1; |
|
delta += floor(delta / numPoints); |
|
for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) { |
|
delta = floor(delta / baseMinusTMin); |
|
} |
|
return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); |
|
} |
|
|
|
/** |
|
* Converts a Punycode string of ASCII-only symbols to a string of Unicode |
|
* symbols. |
|
* @memberOf punycode |
|
* @param {String} input The Punycode string of ASCII-only symbols. |
|
* @returns {String} The resulting string of Unicode symbols. |
|
*/ |
|
function decode(input) { |
|
// Don't use UCS-2 |
|
var output = [], |
|
inputLength = input.length, |
|
out, |
|
i = 0, |
|
n = initialN, |
|
bias = initialBias, |
|
basic, |
|
j, |
|
index, |
|
oldi, |
|
w, |
|
k, |
|
digit, |
|
t, |
|
/** Cached calculation results */ |
|
baseMinusT; |
|
|
|
// Handle the basic code points: let `basic` be the number of input code |
|
// points before the last delimiter, or `0` if there is none, then copy |
|
// the first basic code points to the output. |
|
|
|
basic = input.lastIndexOf(delimiter); |
|
if (basic < 0) { |
|
basic = 0; |
|
} |
|
|
|
for (j = 0; j < basic; ++j) { |
|
// if it's not a basic code point |
|
if (input.charCodeAt(j) >= 0x80) { |
|
error('not-basic'); |
|
} |
|
output.push(input.charCodeAt(j)); |
|
} |
|
|
|
// Main decoding loop: start just after the last delimiter if any basic code |
|
// points were copied; start at the beginning otherwise. |
|
|
|
for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) { |
|
|
|
// `index` is the index of the next character to be consumed. |
|
// Decode a generalized variable-length integer into `delta`, |
|
// which gets added to `i`. The overflow checking is easier |
|
// if we increase `i` as we go, then subtract off its starting |
|
// value at the end to obtain `delta`. |
|
for (oldi = i, w = 1, k = base; /* no condition */; k += base) { |
|
|
|
if (index >= inputLength) { |
|
error('invalid-input'); |
|
} |
|
|
|
digit = basicToDigit(input.charCodeAt(index++)); |
|
|
|
if (digit >= base || digit > floor((maxInt - i) / w)) { |
|
error('overflow'); |
|
} |
|
|
|
i += digit * w; |
|
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); |
|
|
|
if (digit < t) { |
|
break; |
|
} |
|
|
|
baseMinusT = base - t; |
|
if (w > floor(maxInt / baseMinusT)) { |
|
error('overflow'); |
|
} |
|
|
|
w *= baseMinusT; |
|
|
|
} |
|
|
|
out = output.length + 1; |
|
bias = adapt(i - oldi, out, oldi == 0); |
|
|
|
// `i` was supposed to wrap around from `out` to `0`, |
|
// incrementing `n` each time, so we'll fix that now: |
|
if (floor(i / out) > maxInt - n) { |
|
error('overflow'); |
|
} |
|
|
|
n += floor(i / out); |
|
i %= out; |
|
|
|
// Insert `n` at position `i` of the output |
|
output.splice(i++, 0, n); |
|
|
|
} |
|
|
|
return ucs2encode(output); |
|
} |
|
|
|
/** |
|
* Converts a string of Unicode symbols (e.g. a domain name label) to a |
|
* Punycode string of ASCII-only symbols. |
|
* @memberOf punycode |
|
* @param {String} input The string of Unicode symbols. |
|
* @returns {String} The resulting Punycode string of ASCII-only symbols. |
|
*/ |
|
function encode(input) { |
|
var n, |
|
delta, |
|
handledCPCount, |
|
basicLength, |
|
bias, |
|
j, |
|
m, |
|
q, |
|
k, |
|
t, |
|
currentValue, |
|
output = [], |
|
/** `inputLength` will hold the number of code points in `input`. */ |
|
inputLength, |
|
/** Cached calculation results */ |
|
handledCPCountPlusOne, |
|
baseMinusT, |
|
qMinusT; |
|
|
|
// Convert the input in UCS-2 to Unicode |
|
input = ucs2decode(input); |
|
|
|
// Cache the length |
|
inputLength = input.length; |
|
|
|
// Initialize the state |
|
n = initialN; |
|
delta = 0; |
|
bias = initialBias; |
|
|
|
// Handle the basic code points |
|
for (j = 0; j < inputLength; ++j) { |
|
currentValue = input[j]; |
|
if (currentValue < 0x80) { |
|
output.push(stringFromCharCode(currentValue)); |
|
} |
|
} |
|
|
|
handledCPCount = basicLength = output.length; |
|
|
|
// `handledCPCount` is the number of code points that have been handled; |
|
// `basicLength` is the number of basic code points. |
|
|
|
// Finish the basic string - if it is not empty - with a delimiter |
|
if (basicLength) { |
|
output.push(delimiter); |
|
} |
|
|
|
// Main encoding loop: |
|
while (handledCPCount < inputLength) { |
|
|
|
// All non-basic code points < n have been handled already. Find the next |
|
// larger one: |
|
for (m = maxInt, j = 0; j < inputLength; ++j) { |
|
currentValue = input[j]; |
|
if (currentValue >= n && currentValue < m) { |
|
m = currentValue; |
|
} |
|
} |
|
|
|
// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, |
|
// but guard against overflow |
|
handledCPCountPlusOne = handledCPCount + 1; |
|
if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { |
|
error('overflow'); |
|
} |
|
|
|
delta += (m - n) * handledCPCountPlusOne; |
|
n = m; |
|
|
|
for (j = 0; j < inputLength; ++j) { |
|
currentValue = input[j]; |
|
|
|
if (currentValue < n && ++delta > maxInt) { |
|
error('overflow'); |
|
} |
|
|
|
if (currentValue == n) { |
|
// Represent delta as a generalized variable-length integer |
|
for (q = delta, k = base; /* no condition */; k += base) { |
|
t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias); |
|
if (q < t) { |
|
break; |
|
} |
|
qMinusT = q - t; |
|
baseMinusT = base - t; |
|
output.push( |
|
stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0)) |
|
); |
|
q = floor(qMinusT / baseMinusT); |
|
} |
|
|
|
output.push(stringFromCharCode(digitToBasic(q, 0))); |
|
bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength); |
|
delta = 0; |
|
++handledCPCount; |
|
} |
|
} |
|
|
|
++delta; |
|
++n; |
|
|
|
} |
|
return output.join(''); |
|
} |
|
|
|
/** |
|
* Converts a Punycode string representing a domain name or an email address |
|
* to Unicode. Only the Punycoded parts of the input will be converted, i.e. |
|
* it doesn't matter if you call it on a string that has already been |
|
* converted to Unicode. |
|
* @memberOf punycode |
|
* @param {String} input The Punycoded domain name or email address to |
|
* convert to Unicode. |
|
* @returns {String} The Unicode representation of the given Punycode |
|
* string. |
|
*/ |
|
function toUnicode(input) { |
|
return mapDomain(input, function(string) { |
|
return regexPunycode.test(string) |
|
? decode(string.slice(4).toLowerCase()) |
|
: string; |
|
}); |
|
} |
|
|
|
/** |
|
* Converts a Unicode string representing a domain name or an email address to |
|
* Punycode. Only the non-ASCII parts of the domain name will be converted, |
|
* i.e. it doesn't matter if you call it with a domain that's already in |
|
* ASCII. |
|
* @memberOf punycode |
|
* @param {String} input The domain name or email address to convert, as a |
|
* Unicode string. |
|
* @returns {String} The Punycode representation of the given domain name or |
|
* email address. |
|
*/ |
|
function toASCII(input) { |
|
return mapDomain(input, function(string) { |
|
return regexNonASCII.test(string) |
|
? 'xn--' + encode(string) |
|
: string; |
|
}); |
|
} |
|
|
|
/*--------------------------------------------------------------------------*/ |
|
|
|
/** Define the public API */ |
|
punycode = { |
|
/** |
|
* A string representing the current Punycode.js version number. |
|
* @memberOf punycode |
|
* @type String |
|
*/ |
|
'version': '1.3.2', |
|
/** |
|
* An object of methods to convert from JavaScript's internal character |
|
* representation (UCS-2) to Unicode code points, and back. |
|
* @see <https://mathiasbynens.be/notes/javascript-encoding> |
|
* @memberOf punycode |
|
* @type Object |
|
*/ |
|
'ucs2': { |
|
'decode': ucs2decode, |
|
'encode': ucs2encode |
|
}, |
|
'decode': decode, |
|
'encode': encode, |
|
'toASCII': toASCII, |
|
'toUnicode': toUnicode |
|
}; |
|
|
|
/** Expose `punycode` */ |
|
// Some AMD build optimizers, like r.js, check for specific condition patterns |
|
// like the following: |
|
if ( |
|
true |
|
) { |
|
!(__WEBPACK_AMD_DEFINE_RESULT__ = (function() { |
|
return punycode; |
|
}).call(exports, __webpack_require__, exports, module), |
|
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); |
|
} else {} |
|
|
|
}(this)); |
|
|
|
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(101)(module), __webpack_require__(51))) |
|
|
|
/***/ }), |
|
/* 101 */ |
|
/***/ (function(module, exports) { |
|
|
|
module.exports = function(module) { |
|
if (!module.webpackPolyfill) { |
|
module.deprecate = function() {}; |
|
module.paths = []; |
|
// module.parent = undefined by default |
|
if (!module.children) module.children = []; |
|
Object.defineProperty(module, "loaded", { |
|
enumerable: true, |
|
get: function() { |
|
return module.l; |
|
} |
|
}); |
|
Object.defineProperty(module, "id", { |
|
enumerable: true, |
|
get: function() { |
|
return module.i; |
|
} |
|
}); |
|
module.webpackPolyfill = 1; |
|
} |
|
return module; |
|
}; |
|
|
|
|
|
/***/ }), |
|
/* 102 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
|
|
module.exports = { |
|
isString: function(arg) { |
|
return typeof(arg) === 'string'; |
|
}, |
|
isObject: function(arg) { |
|
return typeof(arg) === 'object' && arg !== null; |
|
}, |
|
isNull: function(arg) { |
|
return arg === null; |
|
}, |
|
isNullOrUndefined: function(arg) { |
|
return arg == null; |
|
} |
|
}; |
|
|
|
|
|
/***/ }), |
|
/* 103 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
|
|
exports.decode = exports.parse = __webpack_require__(104); |
|
exports.encode = exports.stringify = __webpack_require__(105); |
|
|
|
|
|
/***/ }), |
|
/* 104 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
// Copyright Joyent, Inc. and other Node contributors. |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a |
|
// copy of this software and associated documentation files (the |
|
// "Software"), to deal in the Software without restriction, including |
|
// without limitation the rights to use, copy, modify, merge, publish, |
|
// distribute, sublicense, and/or sell copies of the Software, and to permit |
|
// persons to whom the Software is furnished to do so, subject to the |
|
// following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included |
|
// in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
|
// USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
|
|
|
|
|
// If obj.hasOwnProperty has been overridden, then calling |
|
// obj.hasOwnProperty(prop) will break. |
|
// See: https://github.com/joyent/node/issues/1707 |
|
function hasOwnProperty(obj, prop) { |
|
return Object.prototype.hasOwnProperty.call(obj, prop); |
|
} |
|
|
|
module.exports = function(qs, sep, eq, options) { |
|
sep = sep || '&'; |
|
eq = eq || '='; |
|
var obj = {}; |
|
|
|
if (typeof qs !== 'string' || qs.length === 0) { |
|
return obj; |
|
} |
|
|
|
var regexp = /\+/g; |
|
qs = qs.split(sep); |
|
|
|
var maxKeys = 1000; |
|
if (options && typeof options.maxKeys === 'number') { |
|
maxKeys = options.maxKeys; |
|
} |
|
|
|
var len = qs.length; |
|
// maxKeys <= 0 means that we should not limit keys count |
|
if (maxKeys > 0 && len > maxKeys) { |
|
len = maxKeys; |
|
} |
|
|
|
for (var i = 0; i < len; ++i) { |
|
var x = qs[i].replace(regexp, '%20'), |
|
idx = x.indexOf(eq), |
|
kstr, vstr, k, v; |
|
|
|
if (idx >= 0) { |
|
kstr = x.substr(0, idx); |
|
vstr = x.substr(idx + 1); |
|
} else { |
|
kstr = x; |
|
vstr = ''; |
|
} |
|
|
|
k = decodeURIComponent(kstr); |
|
v = decodeURIComponent(vstr); |
|
|
|
if (!hasOwnProperty(obj, k)) { |
|
obj[k] = v; |
|
} else if (isArray(obj[k])) { |
|
obj[k].push(v); |
|
} else { |
|
obj[k] = [obj[k], v]; |
|
} |
|
} |
|
|
|
return obj; |
|
}; |
|
|
|
var isArray = Array.isArray || function (xs) { |
|
return Object.prototype.toString.call(xs) === '[object Array]'; |
|
}; |
|
|
|
|
|
/***/ }), |
|
/* 105 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
// Copyright Joyent, Inc. and other Node contributors. |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a |
|
// copy of this software and associated documentation files (the |
|
// "Software"), to deal in the Software without restriction, including |
|
// without limitation the rights to use, copy, modify, merge, publish, |
|
// distribute, sublicense, and/or sell copies of the Software, and to permit |
|
// persons to whom the Software is furnished to do so, subject to the |
|
// following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included |
|
// in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
|
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
|
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
|
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
|
// USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
|
|
|
|
|
|
var stringifyPrimitive = function(v) { |
|
switch (typeof v) { |
|
case 'string': |
|
return v; |
|
|
|
case 'boolean': |
|
return v ? 'true' : 'false'; |
|
|
|
case 'number': |
|
return isFinite(v) ? v : ''; |
|
|
|
default: |
|
return ''; |
|
} |
|
}; |
|
|
|
module.exports = function(obj, sep, eq, name) { |
|
sep = sep || '&'; |
|
eq = eq || '='; |
|
if (obj === null) { |
|
obj = undefined; |
|
} |
|
|
|
if (typeof obj === 'object') { |
|
return map(objectKeys(obj), function(k) { |
|
var ks = encodeURIComponent(stringifyPrimitive(k)) + eq; |
|
if (isArray(obj[k])) { |
|
return map(obj[k], function(v) { |
|
return ks + encodeURIComponent(stringifyPrimitive(v)); |
|
}).join(sep); |
|
} else { |
|
return ks + encodeURIComponent(stringifyPrimitive(obj[k])); |
|
} |
|
}).join(sep); |
|
|
|
} |
|
|
|
if (!name) return ''; |
|
return encodeURIComponent(stringifyPrimitive(name)) + eq + |
|
encodeURIComponent(stringifyPrimitive(obj)); |
|
}; |
|
|
|
var isArray = Array.isArray || function (xs) { |
|
return Object.prototype.toString.call(xs) === '[object Array]'; |
|
}; |
|
|
|
function map (xs, f) { |
|
if (xs.map) return xs.map(f); |
|
var res = []; |
|
for (var i = 0; i < xs.length; i++) { |
|
res.push(f(xs[i], i)); |
|
} |
|
return res; |
|
} |
|
|
|
var objectKeys = Object.keys || function (obj) { |
|
var res = []; |
|
for (var key in obj) { |
|
if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key); |
|
} |
|
return res; |
|
}; |
|
|
|
|
|
/***/ }), |
|
/* 106 */, |
|
/* 107 */, |
|
/* 108 */, |
|
/* 109 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
/** |
|
* Copyright (c) 2013-present, Facebook, Inc. |
|
* |
|
* This source code is licensed under the MIT license found in the |
|
* LICENSE file in the root directory of this source tree. |
|
*/ |
|
|
|
|
|
|
|
var ReactPropTypesSecret = __webpack_require__(110); |
|
|
|
function emptyFunction() {} |
|
|
|
module.exports = function() { |
|
function shim(props, propName, componentName, location, propFullName, secret) { |
|
if (secret === ReactPropTypesSecret) { |
|
// It is still safe when called from React. |
|
return; |
|
} |
|
var err = new Error( |
|
'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + |
|
'Use PropTypes.checkPropTypes() to call them. ' + |
|
'Read more at http://fb.me/use-check-prop-types' |
|
); |
|
err.name = 'Invariant Violation'; |
|
throw err; |
|
}; |
|
shim.isRequired = shim; |
|
function getShim() { |
|
return shim; |
|
}; |
|
// Important! |
|
// Keep this list in sync with production version in `./factoryWithTypeCheckers.js`. |
|
var ReactPropTypes = { |
|
array: shim, |
|
bool: shim, |
|
func: shim, |
|
number: shim, |
|
object: shim, |
|
string: shim, |
|
symbol: shim, |
|
|
|
any: shim, |
|
arrayOf: getShim, |
|
element: shim, |
|
instanceOf: getShim, |
|
node: shim, |
|
objectOf: getShim, |
|
oneOf: getShim, |
|
oneOfType: getShim, |
|
shape: getShim, |
|
exact: getShim |
|
}; |
|
|
|
ReactPropTypes.checkPropTypes = emptyFunction; |
|
ReactPropTypes.PropTypes = ReactPropTypes; |
|
|
|
return ReactPropTypes; |
|
}; |
|
|
|
|
|
/***/ }), |
|
/* 110 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
/** |
|
* Copyright (c) 2013-present, Facebook, Inc. |
|
* |
|
* This source code is licensed under the MIT license found in the |
|
* LICENSE file in the root directory of this source tree. |
|
*/ |
|
|
|
|
|
|
|
var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; |
|
|
|
module.exports = ReactPropTypesSecret; |
|
|
|
|
|
/***/ }), |
|
/* 111 */, |
|
/* 112 */, |
|
/* 113 */, |
|
/* 114 */, |
|
/* 115 */, |
|
/* 116 */, |
|
/* 117 */, |
|
/* 118 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
|
|
var util = __webpack_require__(119); |
|
|
|
function scrollIntoView(elem, container, config) { |
|
config = config || {}; |
|
// document 归一化到 window |
|
if (container.nodeType === 9) { |
|
container = util.getWindow(container); |
|
} |
|
|
|
var allowHorizontalScroll = config.allowHorizontalScroll; |
|
var onlyScrollIfNeeded = config.onlyScrollIfNeeded; |
|
var alignWithTop = config.alignWithTop; |
|
var alignWithLeft = config.alignWithLeft; |
|
var offsetTop = config.offsetTop || 0; |
|
var offsetLeft = config.offsetLeft || 0; |
|
var offsetBottom = config.offsetBottom || 0; |
|
var offsetRight = config.offsetRight || 0; |
|
|
|
allowHorizontalScroll = allowHorizontalScroll === undefined ? true : allowHorizontalScroll; |
|
|
|
var isWin = util.isWindow(container); |
|
var elemOffset = util.offset(elem); |
|
var eh = util.outerHeight(elem); |
|
var ew = util.outerWidth(elem); |
|
var containerOffset = undefined; |
|
var ch = undefined; |
|
var cw = undefined; |
|
var containerScroll = undefined; |
|
var diffTop = undefined; |
|
var diffBottom = undefined; |
|
var win = undefined; |
|
var winScroll = undefined; |
|
var ww = undefined; |
|
var wh = undefined; |
|
|
|
if (isWin) { |
|
win = container; |
|
wh = util.height(win); |
|
ww = util.width(win); |
|
winScroll = { |
|
left: util.scrollLeft(win), |
|
top: util.scrollTop(win) |
|
}; |
|
// elem 相对 container 可视视窗的距离 |
|
diffTop = { |
|
left: elemOffset.left - winScroll.left - offsetLeft, |
|
top: elemOffset.top - winScroll.top - offsetTop |
|
}; |
|
diffBottom = { |
|
left: elemOffset.left + ew - (winScroll.left + ww) + offsetRight, |
|
top: elemOffset.top + eh - (winScroll.top + wh) + offsetBottom |
|
}; |
|
containerScroll = winScroll; |
|
} else { |
|
containerOffset = util.offset(container); |
|
ch = container.clientHeight; |
|
cw = container.clientWidth; |
|
containerScroll = { |
|
left: container.scrollLeft, |
|
top: container.scrollTop |
|
}; |
|
// elem 相对 container 可视视窗的距离 |
|
// 注意边框, offset 是边框到根节点 |
|
diffTop = { |
|
left: elemOffset.left - (containerOffset.left + (parseFloat(util.css(container, 'borderLeftWidth')) || 0)) - offsetLeft, |
|
top: elemOffset.top - (containerOffset.top + (parseFloat(util.css(container, 'borderTopWidth')) || 0)) - offsetTop |
|
}; |
|
diffBottom = { |
|
left: elemOffset.left + ew - (containerOffset.left + cw + (parseFloat(util.css(container, 'borderRightWidth')) || 0)) + offsetRight, |
|
top: elemOffset.top + eh - (containerOffset.top + ch + (parseFloat(util.css(container, 'borderBottomWidth')) || 0)) + offsetBottom |
|
}; |
|
} |
|
|
|
if (diffTop.top < 0 || diffBottom.top > 0) { |
|
// 强制向上 |
|
if (alignWithTop === true) { |
|
util.scrollTop(container, containerScroll.top + diffTop.top); |
|
} else if (alignWithTop === false) { |
|
util.scrollTop(container, containerScroll.top + diffBottom.top); |
|
} else { |
|
// 自动调整 |
|
if (diffTop.top < 0) { |
|
util.scrollTop(container, containerScroll.top + diffTop.top); |
|
} else { |
|
util.scrollTop(container, containerScroll.top + diffBottom.top); |
|
} |
|
} |
|
} else { |
|
if (!onlyScrollIfNeeded) { |
|
alignWithTop = alignWithTop === undefined ? true : !!alignWithTop; |
|
if (alignWithTop) { |
|
util.scrollTop(container, containerScroll.top + diffTop.top); |
|
} else { |
|
util.scrollTop(container, containerScroll.top + diffBottom.top); |
|
} |
|
} |
|
} |
|
|
|
if (allowHorizontalScroll) { |
|
if (diffTop.left < 0 || diffBottom.left > 0) { |
|
// 强制向上 |
|
if (alignWithLeft === true) { |
|
util.scrollLeft(container, containerScroll.left + diffTop.left); |
|
} else if (alignWithLeft === false) { |
|
util.scrollLeft(container, containerScroll.left + diffBottom.left); |
|
} else { |
|
// 自动调整 |
|
if (diffTop.left < 0) { |
|
util.scrollLeft(container, containerScroll.left + diffTop.left); |
|
} else { |
|
util.scrollLeft(container, containerScroll.left + diffBottom.left); |
|
} |
|
} |
|
} else { |
|
if (!onlyScrollIfNeeded) { |
|
alignWithLeft = alignWithLeft === undefined ? true : !!alignWithLeft; |
|
if (alignWithLeft) { |
|
util.scrollLeft(container, containerScroll.left + diffTop.left); |
|
} else { |
|
util.scrollLeft(container, containerScroll.left + diffBottom.left); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
module.exports = scrollIntoView; |
|
|
|
/***/ }), |
|
/* 119 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
|
|
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; |
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; |
|
|
|
var RE_NUM = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source; |
|
|
|
function getClientPosition(elem) { |
|
var box = undefined; |
|
var x = undefined; |
|
var y = undefined; |
|
var doc = elem.ownerDocument; |
|
var body = doc.body; |
|
var docElem = doc && doc.documentElement; |
|
// 根据 GBS 最新数据,A-Grade Browsers 都已支持 getBoundingClientRect 方法,不用再考虑传统的实现方式 |
|
box = elem.getBoundingClientRect(); |
|
|
|
// 注:jQuery 还考虑减去 docElem.clientLeft/clientTop |
|
// 但测试发现,这样反而会导致当 html 和 body 有边距/边框样式时,获取的值不正确 |
|
// 此外,ie6 会忽略 html 的 margin 值,幸运地是没有谁会去设置 html 的 margin |
|
|
|
x = box.left; |
|
y = box.top; |
|
|
|
// In IE, most of the time, 2 extra pixels are added to the top and left |
|
// due to the implicit 2-pixel inset border. In IE6/7 quirks mode and |
|
// IE6 standards mode, this border can be overridden by setting the |
|
// document element's border to zero -- thus, we cannot rely on the |
|
// offset always being 2 pixels. |
|
|
|
// In quirks mode, the offset can be determined by querying the body's |
|
// clientLeft/clientTop, but in standards mode, it is found by querying |
|
// the document element's clientLeft/clientTop. Since we already called |
|
// getClientBoundingRect we have already forced a reflow, so it is not |
|
// too expensive just to query them all. |
|
|
|
// ie 下应该减去窗口的边框吧,毕竟默认 absolute 都是相对窗口定位的 |
|
// 窗口边框标准是设 documentElement ,quirks 时设置 body |
|
// 最好禁止在 body 和 html 上边框 ,但 ie < 9 html 默认有 2px ,减去 |
|
// 但是非 ie 不可能设置窗口边框,body html 也不是窗口 ,ie 可以通过 html,body 设置 |
|
// 标准 ie 下 docElem.clientTop 就是 border-top |
|
// ie7 html 即窗口边框改变不了。永远为 2 |
|
// 但标准 firefox/chrome/ie9 下 docElem.clientTop 是窗口边框,即使设了 border-top 也为 0 |
|
|
|
x -= docElem.clientLeft || body.clientLeft || 0; |
|
y -= docElem.clientTop || body.clientTop || 0; |
|
|
|
return { |
|
left: x, |
|
top: y |
|
}; |
|
} |
|
|
|
function getScroll(w, top) { |
|
var ret = w['page' + (top ? 'Y' : 'X') + 'Offset']; |
|
var method = 'scroll' + (top ? 'Top' : 'Left'); |
|
if (typeof ret !== 'number') { |
|
var d = w.document; |
|
// ie6,7,8 standard mode |
|
ret = d.documentElement[method]; |
|
if (typeof ret !== 'number') { |
|
// quirks mode |
|
ret = d.body[method]; |
|
} |
|
} |
|
return ret; |
|
} |
|
|
|
function getScrollLeft(w) { |
|
return getScroll(w); |
|
} |
|
|
|
function getScrollTop(w) { |
|
return getScroll(w, true); |
|
} |
|
|
|
function getOffset(el) { |
|
var pos = getClientPosition(el); |
|
var doc = el.ownerDocument; |
|
var w = doc.defaultView || doc.parentWindow; |
|
pos.left += getScrollLeft(w); |
|
pos.top += getScrollTop(w); |
|
return pos; |
|
} |
|
function _getComputedStyle(elem, name, computedStyle_) { |
|
var val = ''; |
|
var d = elem.ownerDocument; |
|
var computedStyle = computedStyle_ || d.defaultView.getComputedStyle(elem, null); |
|
|
|
// https://github.com/kissyteam/kissy/issues/61 |
|
if (computedStyle) { |
|
val = computedStyle.getPropertyValue(name) || computedStyle[name]; |
|
} |
|
|
|
return val; |
|
} |
|
|
|
var _RE_NUM_NO_PX = new RegExp('^(' + RE_NUM + ')(?!px)[a-z%]+$', 'i'); |
|
var RE_POS = /^(top|right|bottom|left)$/; |
|
var CURRENT_STYLE = 'currentStyle'; |
|
var RUNTIME_STYLE = 'runtimeStyle'; |
|
var LEFT = 'left'; |
|
var PX = 'px'; |
|
|
|
function _getComputedStyleIE(elem, name) { |
|
// currentStyle maybe null |
|
// http://msdn.microsoft.com/en-us/library/ms535231.aspx |
|
var ret = elem[CURRENT_STYLE] && elem[CURRENT_STYLE][name]; |
|
|
|
// 当 width/height 设置为百分比时,通过 pixelLeft 方式转换的 width/height 值 |
|
// 一开始就处理了! CUSTOM_STYLE.height,CUSTOM_STYLE.width ,cssHook 解决@2011-08-19 |
|
// 在 ie 下不对,需要直接用 offset 方式 |
|
// borderWidth 等值也有问题,但考虑到 borderWidth 设为百分比的概率很小,这里就不考虑了 |
|
|
|
// From the awesome hack by Dean Edwards |
|
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 |
|
// If we're not dealing with a regular pixel number |
|
// but a number that has a weird ending, we need to convert it to pixels |
|
// exclude left right for relativity |
|
if (_RE_NUM_NO_PX.test(ret) && !RE_POS.test(name)) { |
|
// Remember the original values |
|
var style = elem.style; |
|
var left = style[LEFT]; |
|
var rsLeft = elem[RUNTIME_STYLE][LEFT]; |
|
|
|
// prevent flashing of content |
|
elem[RUNTIME_STYLE][LEFT] = elem[CURRENT_STYLE][LEFT]; |
|
|
|
// Put in the new values to get a computed value out |
|
style[LEFT] = name === 'fontSize' ? '1em' : ret || 0; |
|
ret = style.pixelLeft + PX; |
|
|
|
// Revert the changed values |
|
style[LEFT] = left; |
|
|
|
elem[RUNTIME_STYLE][LEFT] = rsLeft; |
|
} |
|
return ret === '' ? 'auto' : ret; |
|
} |
|
|
|
var getComputedStyleX = undefined; |
|
if (typeof window !== 'undefined') { |
|
getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE; |
|
} |
|
|
|
function each(arr, fn) { |
|
for (var i = 0; i < arr.length; i++) { |
|
fn(arr[i]); |
|
} |
|
} |
|
|
|
function isBorderBoxFn(elem) { |
|
return getComputedStyleX(elem, 'boxSizing') === 'border-box'; |
|
} |
|
|
|
var BOX_MODELS = ['margin', 'border', 'padding']; |
|
var CONTENT_INDEX = -1; |
|
var PADDING_INDEX = 2; |
|
var BORDER_INDEX = 1; |
|
var MARGIN_INDEX = 0; |
|
|
|
function swap(elem, options, callback) { |
|
var old = {}; |
|
var style = elem.style; |
|
var name = undefined; |
|
|
|
// Remember the old values, and insert the new ones |
|
for (name in options) { |
|
if (options.hasOwnProperty(name)) { |
|
old[name] = style[name]; |
|
style[name] = options[name]; |
|
} |
|
} |
|
|
|
callback.call(elem); |
|
|
|
// Revert the old values |
|
for (name in options) { |
|
if (options.hasOwnProperty(name)) { |
|
style[name] = old[name]; |
|
} |
|
} |
|
} |
|
|
|
function getPBMWidth(elem, props, which) { |
|
var value = 0; |
|
var prop = undefined; |
|
var j = undefined; |
|
var i = undefined; |
|
for (j = 0; j < props.length; j++) { |
|
prop = props[j]; |
|
if (prop) { |
|
for (i = 0; i < which.length; i++) { |
|
var cssProp = undefined; |
|
if (prop === 'border') { |
|
cssProp = prop + which[i] + 'Width'; |
|
} else { |
|
cssProp = prop + which[i]; |
|
} |
|
value += parseFloat(getComputedStyleX(elem, cssProp)) || 0; |
|
} |
|
} |
|
} |
|
return value; |
|
} |
|
|
|
/** |
|
* A crude way of determining if an object is a window |
|
* @member util |
|
*/ |
|
function isWindow(obj) { |
|
// must use == for ie8 |
|
/* eslint eqeqeq:0 */ |
|
return obj != null && obj == obj.window; |
|
} |
|
|
|
var domUtils = {}; |
|
|
|
each(['Width', 'Height'], function (name) { |
|
domUtils['doc' + name] = function (refWin) { |
|
var d = refWin.document; |
|
return Math.max( |
|
// firefox chrome documentElement.scrollHeight< body.scrollHeight |
|
// ie standard mode : documentElement.scrollHeight> body.scrollHeight |
|
d.documentElement['scroll' + name], |
|
// quirks : documentElement.scrollHeight 最大等于可视窗口多一点? |
|
d.body['scroll' + name], domUtils['viewport' + name](d)); |
|
}; |
|
|
|
domUtils['viewport' + name] = function (win) { |
|
// pc browser includes scrollbar in window.innerWidth |
|
var prop = 'client' + name; |
|
var doc = win.document; |
|
var body = doc.body; |
|
var documentElement = doc.documentElement; |
|
var documentElementProp = documentElement[prop]; |
|
// 标准模式取 documentElement |
|
// backcompat 取 body |
|
return doc.compatMode === 'CSS1Compat' && documentElementProp || body && body[prop] || documentElementProp; |
|
}; |
|
}); |
|
|
|
/* |
|
得到元素的大小信息 |
|
@param elem |
|
@param name |
|
@param {String} [extra] 'padding' : (css width) + padding |
|
'border' : (css width) + padding + border |
|
'margin' : (css width) + padding + border + margin |
|
*/ |
|
function getWH(elem, name, extra) { |
|
if (isWindow(elem)) { |
|
return name === 'width' ? domUtils.viewportWidth(elem) : domUtils.viewportHeight(elem); |
|
} else if (elem.nodeType === 9) { |
|
return name === 'width' ? domUtils.docWidth(elem) : domUtils.docHeight(elem); |
|
} |
|
var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom']; |
|
var borderBoxValue = name === 'width' ? elem.offsetWidth : elem.offsetHeight; |
|
var computedStyle = getComputedStyleX(elem); |
|
var isBorderBox = isBorderBoxFn(elem, computedStyle); |
|
var cssBoxValue = 0; |
|
if (borderBoxValue == null || borderBoxValue <= 0) { |
|
borderBoxValue = undefined; |
|
// Fall back to computed then un computed css if necessary |
|
cssBoxValue = getComputedStyleX(elem, name); |
|
if (cssBoxValue == null || Number(cssBoxValue) < 0) { |
|
cssBoxValue = elem.style[name] || 0; |
|
} |
|
// Normalize '', auto, and prepare for extra |
|
cssBoxValue = parseFloat(cssBoxValue) || 0; |
|
} |
|
if (extra === undefined) { |
|
extra = isBorderBox ? BORDER_INDEX : CONTENT_INDEX; |
|
} |
|
var borderBoxValueOrIsBorderBox = borderBoxValue !== undefined || isBorderBox; |
|
var val = borderBoxValue || cssBoxValue; |
|
if (extra === CONTENT_INDEX) { |
|
if (borderBoxValueOrIsBorderBox) { |
|
return val - getPBMWidth(elem, ['border', 'padding'], which, computedStyle); |
|
} |
|
return cssBoxValue; |
|
} |
|
if (borderBoxValueOrIsBorderBox) { |
|
var padding = extra === PADDING_INDEX ? -getPBMWidth(elem, ['border'], which, computedStyle) : getPBMWidth(elem, ['margin'], which, computedStyle); |
|
return val + (extra === BORDER_INDEX ? 0 : padding); |
|
} |
|
return cssBoxValue + getPBMWidth(elem, BOX_MODELS.slice(extra), which, computedStyle); |
|
} |
|
|
|
var cssShow = { |
|
position: 'absolute', |
|
visibility: 'hidden', |
|
display: 'block' |
|
}; |
|
|
|
// fix #119 : https://github.com/kissyteam/kissy/issues/119 |
|
function getWHIgnoreDisplay(elem) { |
|
var val = undefined; |
|
var args = arguments; |
|
// in case elem is window |
|
// elem.offsetWidth === undefined |
|
if (elem.offsetWidth !== 0) { |
|
val = getWH.apply(undefined, args); |
|
} else { |
|
swap(elem, cssShow, function () { |
|
val = getWH.apply(undefined, args); |
|
}); |
|
} |
|
return val; |
|
} |
|
|
|
function css(el, name, v) { |
|
var value = v; |
|
if ((typeof name === 'undefined' ? 'undefined' : _typeof(name)) === 'object') { |
|
for (var i in name) { |
|
if (name.hasOwnProperty(i)) { |
|
css(el, i, name[i]); |
|
} |
|
} |
|
return undefined; |
|
} |
|
if (typeof value !== 'undefined') { |
|
if (typeof value === 'number') { |
|
value += 'px'; |
|
} |
|
el.style[name] = value; |
|
return undefined; |
|
} |
|
return getComputedStyleX(el, name); |
|
} |
|
|
|
each(['width', 'height'], function (name) { |
|
var first = name.charAt(0).toUpperCase() + name.slice(1); |
|
domUtils['outer' + first] = function (el, includeMargin) { |
|
return el && getWHIgnoreDisplay(el, name, includeMargin ? MARGIN_INDEX : BORDER_INDEX); |
|
}; |
|
var which = name === 'width' ? ['Left', 'Right'] : ['Top', 'Bottom']; |
|
|
|
domUtils[name] = function (elem, val) { |
|
if (val !== undefined) { |
|
if (elem) { |
|
var computedStyle = getComputedStyleX(elem); |
|
var isBorderBox = isBorderBoxFn(elem); |
|
if (isBorderBox) { |
|
val += getPBMWidth(elem, ['padding', 'border'], which, computedStyle); |
|
} |
|
return css(elem, name, val); |
|
} |
|
return undefined; |
|
} |
|
return elem && getWHIgnoreDisplay(elem, name, CONTENT_INDEX); |
|
}; |
|
}); |
|
|
|
// 设置 elem 相对 elem.ownerDocument 的坐标 |
|
function setOffset(elem, offset) { |
|
// set position first, in-case top/left are set even on static elem |
|
if (css(elem, 'position') === 'static') { |
|
elem.style.position = 'relative'; |
|
} |
|
|
|
var old = getOffset(elem); |
|
var ret = {}; |
|
var current = undefined; |
|
var key = undefined; |
|
|
|
for (key in offset) { |
|
if (offset.hasOwnProperty(key)) { |
|
current = parseFloat(css(elem, key)) || 0; |
|
ret[key] = current + offset[key] - old[key]; |
|
} |
|
} |
|
css(elem, ret); |
|
} |
|
|
|
module.exports = _extends({ |
|
getWindow: function getWindow(node) { |
|
var doc = node.ownerDocument || node; |
|
return doc.defaultView || doc.parentWindow; |
|
}, |
|
offset: function offset(el, value) { |
|
if (typeof value !== 'undefined') { |
|
setOffset(el, value); |
|
} else { |
|
return getOffset(el); |
|
} |
|
}, |
|
|
|
isWindow: isWindow, |
|
each: each, |
|
css: css, |
|
clone: function clone(obj) { |
|
var ret = {}; |
|
for (var i in obj) { |
|
if (obj.hasOwnProperty(i)) { |
|
ret[i] = obj[i]; |
|
} |
|
} |
|
var overflow = obj.overflow; |
|
if (overflow) { |
|
for (var i in obj) { |
|
if (obj.hasOwnProperty(i)) { |
|
ret.overflow[i] = obj.overflow[i]; |
|
} |
|
} |
|
} |
|
return ret; |
|
}, |
|
scrollLeft: function scrollLeft(w, v) { |
|
if (isWindow(w)) { |
|
if (v === undefined) { |
|
return getScrollLeft(w); |
|
} |
|
window.scrollTo(v, getScrollTop(w)); |
|
} else { |
|
if (v === undefined) { |
|
return w.scrollLeft; |
|
} |
|
w.scrollLeft = v; |
|
} |
|
}, |
|
scrollTop: function scrollTop(w, v) { |
|
if (isWindow(w)) { |
|
if (v === undefined) { |
|
return getScrollTop(w); |
|
} |
|
window.scrollTo(getScrollLeft(w), v); |
|
} else { |
|
if (v === undefined) { |
|
return w.scrollTop; |
|
} |
|
w.scrollTop = v; |
|
} |
|
}, |
|
|
|
viewportWidth: 0, |
|
viewportHeight: 0 |
|
}, domUtils); |
|
|
|
/***/ }), |
|
/* 120 */, |
|
/* 121 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["notices"]; }()); |
|
|
|
/***/ }), |
|
/* 122 */, |
|
/* 123 */, |
|
/* 124 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["wp"]["tokenList"]; }()); |
|
|
|
/***/ }), |
|
/* 125 */, |
|
/* 126 */, |
|
/* 127 */, |
|
/* 128 */, |
|
/* 129 */, |
|
/* 130 */, |
|
/* 131 */, |
|
/* 132 */, |
|
/* 133 */, |
|
/* 134 */, |
|
/* 135 */, |
|
/* 136 */, |
|
/* 137 */, |
|
/* 138 */, |
|
/* 139 */, |
|
/* 140 */, |
|
/* 141 */, |
|
/* 142 */, |
|
/* 143 */, |
|
/* 144 */, |
|
/* 145 */, |
|
/* 146 */, |
|
/* 147 */, |
|
/* 148 */, |
|
/* 149 */, |
|
/* 150 */, |
|
/* 151 */, |
|
/* 152 */, |
|
/* 153 */, |
|
/* 154 */, |
|
/* 155 */, |
|
/* 156 */, |
|
/* 157 */, |
|
/* 158 */, |
|
/* 159 */, |
|
/* 160 */, |
|
/* 161 */, |
|
/* 162 */, |
|
/* 163 */, |
|
/* 164 */, |
|
/* 165 */, |
|
/* 166 */, |
|
/* 167 */, |
|
/* 168 */, |
|
/* 169 */, |
|
/* 170 */, |
|
/* 171 */, |
|
/* 172 */, |
|
/* 173 */, |
|
/* 174 */, |
|
/* 175 */, |
|
/* 176 */, |
|
/* 177 */, |
|
/* 178 */, |
|
/* 179 */, |
|
/* 180 */, |
|
/* 181 */, |
|
/* 182 */, |
|
/* 183 */, |
|
/* 184 */, |
|
/* 185 */, |
|
/* 186 */, |
|
/* 187 */, |
|
/* 188 */, |
|
/* 189 */, |
|
/* 190 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
|
|
Object.defineProperty(exports, "__esModule", { |
|
value: true |
|
}); |
|
/** |
|
* Redux dispatch multiple actions |
|
*/ |
|
|
|
function multi(_ref) { |
|
var dispatch = _ref.dispatch; |
|
|
|
return function (next) { |
|
return function (action) { |
|
return Array.isArray(action) ? action.filter(Boolean).map(dispatch) : next(action); |
|
}; |
|
}; |
|
} |
|
|
|
/** |
|
* Exports |
|
*/ |
|
|
|
exports.default = multi; |
|
|
|
/***/ }), |
|
/* 191 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/*! |
|
|
|
diff v3.5.0 |
|
|
|
Software License Agreement (BSD License) |
|
|
|
Copyright (c) 2009-2015, Kevin Decker <kpdecker@gmail.com> |
|
|
|
All rights reserved. |
|
|
|
Redistribution and use of this software in source and binary forms, with or without modification, |
|
are permitted provided that the following conditions are met: |
|
|
|
* Redistributions of source code must retain the above |
|
copyright notice, this list of conditions and the |
|
following disclaimer. |
|
|
|
* Redistributions in binary form must reproduce the above |
|
copyright notice, this list of conditions and the |
|
following disclaimer in the documentation and/or other |
|
materials provided with the distribution. |
|
|
|
* Neither the name of Kevin Decker nor the names of its |
|
contributors may be used to endorse or promote products |
|
derived from this software without specific prior |
|
written permission. |
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR |
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
|
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
|
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER |
|
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT |
|
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
@license |
|
*/ |
|
(function webpackUniversalModuleDefinition(root, factory) { |
|
if(true) |
|
module.exports = factory(); |
|
else {} |
|
})(this, function() { |
|
return /******/ (function(modules) { // webpackBootstrap |
|
/******/ // The module cache |
|
/******/ var installedModules = {}; |
|
|
|
/******/ // The require function |
|
/******/ function __webpack_require__(moduleId) { |
|
|
|
/******/ // Check if module is in cache |
|
/******/ if(installedModules[moduleId]) |
|
/******/ return installedModules[moduleId].exports; |
|
|
|
/******/ // Create a new module (and put it into the cache) |
|
/******/ var module = installedModules[moduleId] = { |
|
/******/ exports: {}, |
|
/******/ id: moduleId, |
|
/******/ loaded: false |
|
/******/ }; |
|
|
|
/******/ // Execute the module function |
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); |
|
|
|
/******/ // Flag the module as loaded |
|
/******/ module.loaded = true; |
|
|
|
/******/ // Return the exports of the module |
|
/******/ return module.exports; |
|
/******/ } |
|
|
|
|
|
/******/ // expose the modules object (__webpack_modules__) |
|
/******/ __webpack_require__.m = modules; |
|
|
|
/******/ // expose the module cache |
|
/******/ __webpack_require__.c = installedModules; |
|
|
|
/******/ // __webpack_public_path__ |
|
/******/ __webpack_require__.p = ""; |
|
|
|
/******/ // Load entry module and return exports |
|
/******/ return __webpack_require__(0); |
|
/******/ }) |
|
/************************************************************************/ |
|
/******/ ([ |
|
/* 0 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports.canonicalize = exports.convertChangesToXML = exports.convertChangesToDMP = exports.merge = exports.parsePatch = exports.applyPatches = exports.applyPatch = exports.createPatch = exports.createTwoFilesPatch = exports.structuredPatch = exports.diffArrays = exports.diffJson = exports.diffCss = exports.diffSentences = exports.diffTrimmedLines = exports.diffLines = exports.diffWordsWithSpace = exports.diffWords = exports.diffChars = exports.Diff = undefined; |
|
|
|
/*istanbul ignore end*/var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); |
|
|
|
/*istanbul ignore end*/var /*istanbul ignore start*/_character = __webpack_require__(2) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_word = __webpack_require__(3) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_sentence = __webpack_require__(6) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_css = __webpack_require__(7) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_json = __webpack_require__(8) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_array = __webpack_require__(9) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_apply = __webpack_require__(10) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_merge = __webpack_require__(13) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_create = __webpack_require__(14) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_dmp = __webpack_require__(16) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_xml = __webpack_require__(17) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } |
|
|
|
/* See LICENSE file for terms of use */ |
|
|
|
/* |
|
* Text diff implementation. |
|
* |
|
* This library supports the following APIS: |
|
* JsDiff.diffChars: Character by character diff |
|
* JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace |
|
* JsDiff.diffLines: Line based diff |
|
* |
|
* JsDiff.diffCss: Diff targeted at CSS content |
|
* |
|
* These methods are based on the implementation proposed in |
|
* "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). |
|
* http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 |
|
*/ |
|
exports. /*istanbul ignore end*/Diff = _base2['default']; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/diffChars = _character.diffChars; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWords = _word.diffWords; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = _word.diffWordsWithSpace; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/diffLines = _line.diffLines; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = _line.diffTrimmedLines; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/diffSentences = _sentence.diffSentences; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/diffCss = _css.diffCss; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/diffJson = _json.diffJson; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/diffArrays = _array.diffArrays; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/structuredPatch = _create.structuredPatch; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = _create.createTwoFilesPatch; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = _create.createPatch; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatch = _apply.applyPatch; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = _apply.applyPatches; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/parsePatch = _parse.parsePatch; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/merge = _merge.merge; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToDMP = _dmp.convertChangesToDMP; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToXML = _xml.convertChangesToXML; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = _json.canonicalize; |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJEaWZmIiwiZGlmZkNoYXJzIiwiZGlmZldvcmRzIiwiZGlmZldvcmRzV2l0aFNwYWNlIiwiZGlmZkxpbmVzIiwiZGlmZlRyaW1tZWRMaW5lcyIsImRpZmZTZW50ZW5jZXMiLCJkaWZmQ3NzIiwiZGlmZkpzb24iLCJkaWZmQXJyYXlzIiwic3RydWN0dXJlZFBhdGNoIiwiY3JlYXRlVHdvRmlsZXNQYXRjaCIsImNyZWF0ZVBhdGNoIiwiYXBwbHlQYXRjaCIsImFwcGx5UGF0Y2hlcyIsInBhcnNlUGF0Y2giLCJtZXJnZSIsImNvbnZlcnRDaGFuZ2VzVG9ETVAiLCJjb252ZXJ0Q2hhbmdlc1RvWE1MIiwiY2Fub25pY2FsaXplIl0sIm1hcHBpbmdzIjoiOzs7Ozt1QkFnQkE7Ozs7dUJBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7QUFqQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7O2dDQWtDRUEsSTt5REFFQUMsUzt5REFDQUMsUzt5REFDQUMsa0I7eURBQ0FDLFM7eURBQ0FDLGdCO3lEQUNBQyxhO3lEQUVBQyxPO3lEQUNBQyxRO3lEQUVBQyxVO3lEQUVBQyxlO3lEQUNBQyxtQjt5REFDQUMsVzt5REFDQUMsVTt5REFDQUMsWTt5REFDQUMsVTt5REFDQUMsSzt5REFDQUMsbUI7eURBQ0FDLG1CO3lEQUNBQyxZIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogU2VlIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMgb2YgdXNlICovXG5cbi8qXG4gKiBUZXh0IGRpZmYgaW1wbGVtZW50YXRpb24uXG4gKlxuICogVGhpcyBsaWJyYXJ5IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgQVBJUzpcbiAqIEpzRGlmZi5kaWZmQ2hhcnM6IENoYXJhY3RlciBieSBjaGFyYWN0ZXIgZGlmZlxuICogSnNEaWZmLmRpZmZXb3JkczogV29yZCAoYXMgZGVmaW5lZCBieSBcXGIgcmVnZXgpIGRpZmYgd2hpY2ggaWdub3JlcyB3aGl0ZXNwYWNlXG4gKiBKc0RpZmYuZGlmZkxpbmVzOiBMaW5lIGJhc2VkIGRpZmZcbiAqXG4gKiBKc0RpZmYuZGlmZkNzczogRGlmZiB0YXJnZXRlZCBhdCBDU1MgY29udGVudFxuICpcbiAqIFRoZXNlIG1ldGhvZHMgYXJlIGJhc2VkIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBwcm9wb3NlZCBpblxuICogXCJBbiBPKE5EKSBEaWZmZXJlbmNlIEFsZ29yaXRobSBhbmQgaXRzIFZhcmlhdGlvbnNcIiAoTXllcnMsIDE5ODYpLlxuICogaHR0cDovL2NpdGVzZWVyeC5pc3QucHN1LmVkdS92aWV3ZG9jL3N1bW1hcnk/ZG9pPTEwLjEuMS40LjY5MjdcbiAqL1xuaW1wb3J0IERpZmYgZnJvbSAnLi9kaWZmL2Jhc2UnO1xuaW1wb3J0IHtkaWZmQ2hhcnN9IGZyb20gJy4vZGlmZi9jaGFyYWN0ZXInO1xuaW1wb3J0IHtkaWZmV29yZHMsIGRpZmZXb3Jkc1dpdGhTcGFjZX0gZnJvbSAnLi9kaWZmL3dvcmQnO1xuaW1wb3J0IHtkaWZmTGluZXMsIGRpZmZUcmltbWVkTGluZXN9IGZyb20gJy4vZGlmZi9saW5lJztcbmltcG9ydCB7ZGlmZlNlbnRlbmNlc30gZnJvbSAnLi9kaWZmL3NlbnRlbmNlJztcblxuaW1wb3J0IHtkaWZmQ3NzfSBmcm9tICcuL2RpZmYvY3NzJztcbmltcG9ydCB7ZGlmZkpzb24sIGNhbm9uaWNhbGl6ZX0gZnJvbSAnLi9kaWZmL2pzb24nO1xuXG5pbXBvcnQge2RpZmZBcnJheXN9IGZyb20gJy4vZGlmZi9hcnJheSc7XG5cbmltcG9ydCB7YXBwbHlQYXRjaCwgYXBwbHlQYXRjaGVzfSBmcm9tICcuL3BhdGNoL2FwcGx5JztcbmltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXRjaC9wYXJzZSc7XG5pbXBvcnQge21lcmdlfSBmcm9tICcuL3BhdGNoL21lcmdlJztcbmltcG9ydCB7c3RydWN0dXJlZFBhdGNoLCBjcmVhdGVUd29GaWxlc1BhdGNoLCBjcmVhdGVQYXRjaH0gZnJvbSAnLi9wYXRjaC9jcmVhdGUnO1xuXG5pbXBvcnQge2NvbnZlcnRDaGFuZ2VzVG9ETVB9IGZyb20gJy4vY29udmVydC9kbXAnO1xuaW1wb3J0IHtjb252ZXJ0Q2hhbmdlc1RvWE1MfSBmcm9tICcuL2NvbnZlcnQveG1sJztcblxuZXhwb3J0IHtcbiAgRGlmZixcblxuICBkaWZmQ2hhcnMsXG4gIGRpZmZXb3JkcyxcbiAgZGlmZldvcmRzV2l0aFNwYWNlLFxuICBkaWZmTGluZXMsXG4gIGRpZmZUcmltbWVkTGluZXMsXG4gIGRpZmZTZW50ZW5jZXMsXG5cbiAgZGlmZkNzcyxcbiAgZGlmZkpzb24sXG5cbiAgZGlmZkFycmF5cyxcblxuICBzdHJ1Y3R1cmVkUGF0Y2gsXG4gIGNyZWF0ZVR3b0ZpbGVzUGF0Y2gsXG4gIGNyZWF0ZVBhdGNoLFxuICBhcHBseVBhdGNoLFxuICBhcHBseVBhdGNoZXMsXG4gIHBhcnNlUGF0Y2gsXG4gIG1lcmdlLFxuICBjb252ZXJ0Q2hhbmdlc1RvRE1QLFxuICBjb252ZXJ0Q2hhbmdlc1RvWE1MLFxuICBjYW5vbmljYWxpemVcbn07XG4iXX0= |
|
|
|
|
|
/***/ }), |
|
/* 1 */ |
|
/***/ (function(module, exports) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports['default'] = /*istanbul ignore end*/Diff; |
|
function Diff() {} |
|
|
|
Diff.prototype = { |
|
/*istanbul ignore start*/ /*istanbul ignore end*/diff: function diff(oldString, newString) { |
|
/*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; |
|
|
|
var callback = options.callback; |
|
if (typeof options === 'function') { |
|
callback = options; |
|
options = {}; |
|
} |
|
this.options = options; |
|
|
|
var self = this; |
|
|
|
function done(value) { |
|
if (callback) { |
|
setTimeout(function () { |
|
callback(undefined, value); |
|
}, 0); |
|
return true; |
|
} else { |
|
return value; |
|
} |
|
} |
|
|
|
// Allow subclasses to massage the input prior to running |
|
oldString = this.castInput(oldString); |
|
newString = this.castInput(newString); |
|
|
|
oldString = this.removeEmpty(this.tokenize(oldString)); |
|
newString = this.removeEmpty(this.tokenize(newString)); |
|
|
|
var newLen = newString.length, |
|
oldLen = oldString.length; |
|
var editLength = 1; |
|
var maxEditLength = newLen + oldLen; |
|
var bestPath = [{ newPos: -1, components: [] }]; |
|
|
|
// Seed editLength = 0, i.e. the content starts with the same values |
|
var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); |
|
if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { |
|
// Identity per the equality and tokenizer |
|
return done([{ value: this.join(newString), count: newString.length }]); |
|
} |
|
|
|
// Main worker method. checks all permutations of a given edit length for acceptance. |
|
function execEditLength() { |
|
for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { |
|
var basePath = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; |
|
var addPath = bestPath[diagonalPath - 1], |
|
removePath = bestPath[diagonalPath + 1], |
|
_oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; |
|
if (addPath) { |
|
// No one else is going to attempt to use this value, clear it |
|
bestPath[diagonalPath - 1] = undefined; |
|
} |
|
|
|
var canAdd = addPath && addPath.newPos + 1 < newLen, |
|
canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen; |
|
if (!canAdd && !canRemove) { |
|
// If this path is a terminal then prune |
|
bestPath[diagonalPath] = undefined; |
|
continue; |
|
} |
|
|
|
// Select the diagonal that we want to branch from. We select the prior |
|
// path whose position in the new string is the farthest from the origin |
|
// and does not pass the bounds of the diff graph |
|
if (!canAdd || canRemove && addPath.newPos < removePath.newPos) { |
|
basePath = clonePath(removePath); |
|
self.pushComponent(basePath.components, undefined, true); |
|
} else { |
|
basePath = addPath; // No need to clone, we've pulled it from the list |
|
basePath.newPos++; |
|
self.pushComponent(basePath.components, true, undefined); |
|
} |
|
|
|
_oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); |
|
|
|
// If we have hit the end of both strings, then we are done |
|
if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) { |
|
return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken)); |
|
} else { |
|
// Otherwise track this path as a potential candidate and continue. |
|
bestPath[diagonalPath] = basePath; |
|
} |
|
} |
|
|
|
editLength++; |
|
} |
|
|
|
// Performs the length of edit iteration. Is a bit fugly as this has to support the |
|
// sync and async mode which is never fun. Loops over execEditLength until a value |
|
// is produced. |
|
if (callback) { |
|
(function exec() { |
|
setTimeout(function () { |
|
// This should not happen, but we want to be safe. |
|
/* istanbul ignore next */ |
|
if (editLength > maxEditLength) { |
|
return callback(); |
|
} |
|
|
|
if (!execEditLength()) { |
|
exec(); |
|
} |
|
}, 0); |
|
})(); |
|
} else { |
|
while (editLength <= maxEditLength) { |
|
var ret = execEditLength(); |
|
if (ret) { |
|
return ret; |
|
} |
|
} |
|
} |
|
}, |
|
/*istanbul ignore start*/ /*istanbul ignore end*/pushComponent: function pushComponent(components, added, removed) { |
|
var last = components[components.length - 1]; |
|
if (last && last.added === added && last.removed === removed) { |
|
// We need to clone here as the component clone operation is just |
|
// as shallow array clone |
|
components[components.length - 1] = { count: last.count + 1, added: added, removed: removed }; |
|
} else { |
|
components.push({ count: 1, added: added, removed: removed }); |
|
} |
|
}, |
|
/*istanbul ignore start*/ /*istanbul ignore end*/extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) { |
|
var newLen = newString.length, |
|
oldLen = oldString.length, |
|
newPos = basePath.newPos, |
|
oldPos = newPos - diagonalPath, |
|
commonCount = 0; |
|
while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { |
|
newPos++; |
|
oldPos++; |
|
commonCount++; |
|
} |
|
|
|
if (commonCount) { |
|
basePath.components.push({ count: commonCount }); |
|
} |
|
|
|
basePath.newPos = newPos; |
|
return oldPos; |
|
}, |
|
/*istanbul ignore start*/ /*istanbul ignore end*/equals: function equals(left, right) { |
|
if (this.options.comparator) { |
|
return this.options.comparator(left, right); |
|
} else { |
|
return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase(); |
|
} |
|
}, |
|
/*istanbul ignore start*/ /*istanbul ignore end*/removeEmpty: function removeEmpty(array) { |
|
var ret = []; |
|
for (var i = 0; i < array.length; i++) { |
|
if (array[i]) { |
|
ret.push(array[i]); |
|
} |
|
} |
|
return ret; |
|
}, |
|
/*istanbul ignore start*/ /*istanbul ignore end*/castInput: function castInput(value) { |
|
return value; |
|
}, |
|
/*istanbul ignore start*/ /*istanbul ignore end*/tokenize: function tokenize(value) { |
|
return value.split(''); |
|
}, |
|
/*istanbul ignore start*/ /*istanbul ignore end*/join: function join(chars) { |
|
return chars.join(''); |
|
} |
|
}; |
|
|
|
function buildValues(diff, components, newString, oldString, useLongestToken) { |
|
var componentPos = 0, |
|
componentLen = components.length, |
|
newPos = 0, |
|
oldPos = 0; |
|
|
|
for (; componentPos < componentLen; componentPos++) { |
|
var component = components[componentPos]; |
|
if (!component.removed) { |
|
if (!component.added && useLongestToken) { |
|
var value = newString.slice(newPos, newPos + component.count); |
|
value = value.map(function (value, i) { |
|
var oldValue = oldString[oldPos + i]; |
|
return oldValue.length > value.length ? oldValue : value; |
|
}); |
|
|
|
component.value = diff.join(value); |
|
} else { |
|
component.value = diff.join(newString.slice(newPos, newPos + component.count)); |
|
} |
|
newPos += component.count; |
|
|
|
// Common case |
|
if (!component.added) { |
|
oldPos += component.count; |
|
} |
|
} else { |
|
component.value = diff.join(oldString.slice(oldPos, oldPos + component.count)); |
|
oldPos += component.count; |
|
|
|
// Reverse add and remove so removes are output first to match common convention |
|
// The diffing algorithm is tied to add then remove output and this is the simplest |
|
// route to get the desired output with minimal overhead. |
|
if (componentPos && components[componentPos - 1].added) { |
|
var tmp = components[componentPos - 1]; |
|
components[componentPos - 1] = components[componentPos]; |
|
components[componentPos] = tmp; |
|
} |
|
} |
|
} |
|
|
|
// Special case handle for when one terminal is ignored (i.e. whitespace). |
|
// For this case we merge the terminal into the prior string and drop the change. |
|
// This is only available for string mode. |
|
var lastComponent = components[componentLen - 1]; |
|
if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) { |
|
components[componentLen - 2].value += lastComponent.value; |
|
components.pop(); |
|
} |
|
|
|
return components; |
|
} |
|
|
|
function clonePath(path) { |
|
return { newPos: path.newPos, components: path.components.slice(0) }; |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Jhc2UuanMiXSwibmFtZXMiOlsiRGlmZiIsInByb3RvdHlwZSIsImRpZmYiLCJvbGRTdHJpbmciLCJuZXdTdHJpbmciLCJvcHRpb25zIiwiY2FsbGJhY2siLCJzZWxmIiwiZG9uZSIsInZhbHVlIiwic2V0VGltZW91dCIsInVuZGVmaW5lZCIsImNhc3RJbnB1dCIsInJlbW92ZUVtcHR5IiwidG9rZW5pemUiLCJuZXdMZW4iLCJsZW5ndGgiLCJvbGRMZW4iLCJlZGl0TGVuZ3RoIiwibWF4RWRpdExlbmd0aCIsImJlc3RQYXRoIiwibmV3UG9zIiwiY29tcG9uZW50cyIsIm9sZFBvcyIsImV4dHJhY3RDb21tb24iLCJqb2luIiwiY291bnQiLCJleGVjRWRpdExlbmd0aCIsImRpYWdvbmFsUGF0aCIsImJhc2VQYXRoIiwiYWRkUGF0aCIsInJlbW92ZVBhdGgiLCJjYW5BZGQiLCJjYW5SZW1vdmUiLCJjbG9uZVBhdGgiLCJwdXNoQ29tcG9uZW50IiwiYnVpbGRWYWx1ZXMiLCJ1c2VMb25nZXN0VG9rZW4iLCJleGVjIiwicmV0IiwiYWRkZWQiLCJyZW1vdmVkIiwibGFzdCIsInB1c2giLCJjb21tb25Db3VudCIsImVxdWFscyIsImxlZnQiLCJyaWdodCIsImNvbXBhcmF0b3IiLCJpZ25vcmVDYXNlIiwidG9Mb3dlckNhc2UiLCJhcnJheSIsImkiLCJzcGxpdCIsImNoYXJzIiwiY29tcG9uZW50UG9zIiwiY29tcG9uZW50TGVuIiwiY29tcG9uZW50Iiwic2xpY2UiLCJtYXAiLCJvbGRWYWx1ZSIsInRtcCIsImxhc3RDb21wb25lbnQiLCJwb3AiLCJwYXRoIl0sIm1hcHBpbmdzIjoiOzs7NENBQXdCQSxJO0FBQVQsU0FBU0EsSUFBVCxHQUFnQixDQUFFOztBQUVqQ0EsS0FBS0MsU0FBTCxHQUFpQjtBQUFBLG1EQUNmQyxJQURlLGdCQUNWQyxTQURVLEVBQ0NDLFNBREQsRUFDMEI7QUFBQSx3REFBZEMsT0FBYyx1RUFBSixFQUFJOztBQUN2QyxRQUFJQyxXQUFXRCxRQUFRQyxRQUF2QjtBQUNBLFFBQUksT0FBT0QsT0FBUCxLQUFtQixVQUF2QixFQUFtQztBQUNqQ0MsaUJBQVdELE9BQVg7QUFDQUEsZ0JBQVUsRUFBVjtBQUNEO0FBQ0QsU0FBS0EsT0FBTCxHQUFlQSxPQUFmOztBQUVBLFFBQUlFLE9BQU8sSUFBWDs7QUFFQSxhQUFTQyxJQUFULENBQWNDLEtBQWQsRUFBcUI7QUFDbkIsVUFBSUgsUUFBSixFQUFjO0FBQ1pJLG1CQUFXLFlBQVc7QUFBRUosbUJBQVNLLFNBQVQsRUFBb0JGLEtBQXBCO0FBQTZCLFNBQXJELEVBQXVELENBQXZEO0FBQ0EsZUFBTyxJQUFQO0FBQ0QsT0FIRCxNQUdPO0FBQ0wsZUFBT0EsS0FBUDtBQUNEO0FBQ0Y7O0FBRUQ7QUFDQU4sZ0JBQVksS0FBS1MsU0FBTCxDQUFlVCxTQUFmLENBQVo7QUFDQUMsZ0JBQVksS0FBS1EsU0FBTCxDQUFlUixTQUFmLENBQVo7O0FBRUFELGdCQUFZLEtBQUtVLFdBQUwsQ0FBaUIsS0FBS0MsUUFBTCxDQUFjWCxTQUFkLENBQWpCLENBQVo7QUFDQUMsZ0JBQVksS0FBS1MsV0FBTCxDQUFpQixLQUFLQyxRQUFMLENBQWNWLFNBQWQsQ0FBakIsQ0FBWjs7QUFFQSxRQUFJVyxTQUFTWCxVQUFVWSxNQUF2QjtBQUFBLFFBQStCQyxTQUFTZCxVQUFVYSxNQUFsRDtBQUNBLFFBQUlFLGFBQWEsQ0FBakI7QUFDQSxRQUFJQyxnQkFBZ0JKLFNBQVNFLE1BQTdCO0FBQ0EsUUFBSUcsV0FBVyxDQUFDLEVBQUVDLFFBQVEsQ0FBQyxDQUFYLEVBQWNDLFlBQVksRUFBMUIsRUFBRCxDQUFmOztBQUVBO0FBQ0EsUUFBSUMsU0FBUyxLQUFLQyxhQUFMLENBQW1CSixTQUFTLENBQVQsQ0FBbkIsRUFBZ0NoQixTQUFoQyxFQUEyQ0QsU0FBM0MsRUFBc0QsQ0FBdEQsQ0FBYjtBQUNBLFFBQUlpQixTQUFTLENBQVQsRUFBWUMsTUFBWixHQUFxQixDQUFyQixJQUEwQk4sTUFBMUIsSUFBb0NRLFNBQVMsQ0FBVCxJQUFjTixNQUF0RCxFQUE4RDtBQUM1RDtBQUNBLGFBQU9ULEtBQUssQ0FBQyxFQUFDQyxPQUFPLEtBQUtnQixJQUFMLENBQVVyQixTQUFWLENBQVIsRUFBOEJzQixPQUFPdEIsVUFBVVksTUFBL0MsRUFBRCxDQUFMLENBQVA7QUFDRDs7QUFFRDtBQUNBLGFBQVNXLGNBQVQsR0FBMEI7QUFDeEIsV0FBSyxJQUFJQyxlQUFlLENBQUMsQ0FBRCxHQUFLVixVQUE3QixFQUF5Q1UsZ0JBQWdCVixVQUF6RCxFQUFxRVUsZ0JBQWdCLENBQXJGLEVBQXdGO0FBQ3RGLFlBQUlDLDBDQUFKO0FBQ0EsWUFBSUMsVUFBVVYsU0FBU1EsZUFBZSxDQUF4QixDQUFkO0FBQUEsWUFDSUcsYUFBYVgsU0FBU1EsZUFBZSxDQUF4QixDQURqQjtBQUFBLFlBRUlMLFVBQVMsQ0FBQ1EsYUFBYUEsV0FBV1YsTUFBeEIsR0FBaUMsQ0FBbEMsSUFBdUNPLFlBRnBEO0FBR0EsWUFBSUUsT0FBSixFQUFhO0FBQ1g7QUFDQVYsbUJBQVNRLGVBQWUsQ0FBeEIsSUFBNkJqQixTQUE3QjtBQUNEOztBQUVELFlBQUlxQixTQUFTRixXQUFXQSxRQUFRVCxNQUFSLEdBQWlCLENBQWpCLEdBQXFCTixNQUE3QztBQUFBLFlBQ0lrQixZQUFZRixjQUFjLEtBQUtSLE9BQW5CLElBQTZCQSxVQUFTTixNQUR0RDtBQUVBLFlBQUksQ0FBQ2UsTUFBRCxJQUFXLENBQUNDLFNBQWhCLEVBQTJCO0FBQ3pCO0FBQ0FiLG1CQUFTUSxZQUFULElBQXlCakIsU0FBekI7QUFDQTtBQUNEOztBQUVEO0FBQ0E7QUFDQTtBQUNBLFlBQUksQ0FBQ3FCLE1BQUQsSUFBWUMsYUFBYUgsUUFBUVQsTUFBUixHQUFpQlUsV0FBV1YsTUFBekQsRUFBa0U7QUFDaEVRLHFCQUFXSyxVQUFVSCxVQUFWLENBQVg7QUFDQXhCLGVBQUs0QixhQUFMLENBQW1CTixTQUFTUCxVQUE1QixFQUF3Q1gsU0FBeEMsRUFBbUQsSUFBbkQ7QUFDRCxTQUhELE1BR087QUFDTGtCLHFCQUFXQyxPQUFYLENBREssQ0FDaUI7QUFDdEJELG1CQUFTUixNQUFUO0FBQ0FkLGVBQUs0QixhQUFMLENBQW1CTixTQUFTUCxVQUE1QixFQUF3QyxJQUF4QyxFQUE4Q1gsU0FBOUM7QUFDRDs7QUFFRFksa0JBQVNoQixLQUFLaUIsYUFBTCxDQUFtQkssUUFBbkIsRUFBNkJ6QixTQUE3QixFQUF3Q0QsU0FBeEMsRUFBbUR5QixZQUFuRCxDQUFUOztBQUVBO0FBQ0EsWUFBSUMsU0FBU1IsTUFBVCxHQUFrQixDQUFsQixJQUF1Qk4sTUFBdkIsSUFBaUNRLFVBQVMsQ0FBVCxJQUFjTixNQUFuRCxFQUEyRDtBQUN6RCxpQkFBT1QsS0FBSzRCLFlBQVk3QixJQUFaLEVBQWtCc0IsU0FBU1AsVUFBM0IsRUFBdUNsQixTQUF2QyxFQUFrREQsU0FBbEQsRUFBNkRJLEtBQUs4QixlQUFsRSxDQUFMLENBQVA7QUFDRCxTQUZELE1BRU87QUFDTDtBQUNBakIsbUJBQVNRLFlBQVQsSUFBeUJDLFFBQXpCO0FBQ0Q7QUFDRjs7QUFFRFg7QUFDRDs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxRQUFJWixRQUFKLEVBQWM7QUFDWCxnQkFBU2dDLElBQVQsR0FBZ0I7QUFDZjVCLG1CQUFXLFlBQVc7QUFDcEI7QUFDQTtBQUNBLGNBQUlRLGFBQWFDLGFBQWpCLEVBQWdDO0FBQzlCLG1CQUFPYixVQUFQO0FBQ0Q7O0FBRUQsY0FBSSxDQUFDcUIsZ0JBQUwsRUFBdUI7QUFDckJXO0FBQ0Q7QUFDRixTQVZELEVBVUcsQ0FWSDtBQVdELE9BWkEsR0FBRDtBQWFELEtBZEQsTUFjTztBQUNMLGFBQU9wQixjQUFjQyxhQUFyQixFQUFvQztBQUNsQyxZQUFJb0IsTUFBTVosZ0JBQVY7QUFDQSxZQUFJWSxHQUFKLEVBQVM7QUFDUCxpQkFBT0EsR0FBUDtBQUNEO0FBQ0Y7QUFDRjtBQUNGLEdBOUdjO0FBQUEsbURBZ0hmSixhQWhIZSx5QkFnSERiLFVBaEhDLEVBZ0hXa0IsS0FoSFgsRUFnSGtCQyxPQWhIbEIsRUFnSDJCO0FBQ3hDLFFBQUlDLE9BQU9wQixXQUFXQSxXQUFXTixNQUFYLEdBQW9CLENBQS9CLENBQVg7QUFDQSxRQUFJMEIsUUFBUUEsS0FBS0YsS0FBTCxLQUFlQSxLQUF2QixJQUFnQ0UsS0FBS0QsT0FBTCxLQUFpQkEsT0FBckQsRUFBOEQ7QUFDNUQ7QUFDQTtBQUNBbkIsaUJBQVdBLFdBQVdOLE1BQVgsR0FBb0IsQ0FBL0IsSUFBb0MsRUFBQ1UsT0FBT2dCLEtBQUtoQixLQUFMLEdBQWEsQ0FBckIsRUFBd0JjLE9BQU9BLEtBQS9CLEVBQXNDQyxTQUFTQSxPQUEvQyxFQUFwQztBQUNELEtBSkQsTUFJTztBQUNMbkIsaUJBQVdxQixJQUFYLENBQWdCLEVBQUNqQixPQUFPLENBQVIsRUFBV2MsT0FBT0EsS0FBbEIsRUFBeUJDLFNBQVNBLE9BQWxDLEVBQWhCO0FBQ0Q7QUFDRixHQXpIYztBQUFBLG1EQTBIZmpCLGFBMUhlLHlCQTBIREssUUExSEMsRUEwSFN6QixTQTFIVCxFQTBIb0JELFNBMUhwQixFQTBIK0J5QixZQTFIL0IsRUEwSDZDO0FBQzFELFFBQUliLFNBQVNYLFVBQVVZLE1BQXZCO0FBQUEsUUFDSUMsU0FBU2QsVUFBVWEsTUFEdkI7QUFBQSxRQUVJSyxTQUFTUSxTQUFTUixNQUZ0QjtBQUFBLFFBR0lFLFNBQVNGLFNBQVNPLFlBSHRCO0FBQUEsUUFLSWdCLGNBQWMsQ0FMbEI7QUFNQSxXQUFPdkIsU0FBUyxDQUFULEdBQWFOLE1BQWIsSUFBdUJRLFNBQVMsQ0FBVCxHQUFhTixNQUFwQyxJQUE4QyxLQUFLNEIsTUFBTCxDQUFZekMsVUFBVWlCLFNBQVMsQ0FBbkIsQ0FBWixFQUFtQ2xCLFVBQVVvQixTQUFTLENBQW5CLENBQW5DLENBQXJELEVBQWdIO0FBQzlHRjtBQUNBRTtBQUNBcUI7QUFDRDs7QUFFRCxRQUFJQSxXQUFKLEVBQWlCO0FBQ2ZmLGVBQVNQLFVBQVQsQ0FBb0JxQixJQUFwQixDQUF5QixFQUFDakIsT0FBT2tCLFdBQVIsRUFBekI7QUFDRDs7QUFFRGYsYUFBU1IsTUFBVCxHQUFrQkEsTUFBbEI7QUFDQSxXQUFPRSxNQUFQO0FBQ0QsR0E3SWM7QUFBQSxtREErSWZzQixNQS9JZSxrQkErSVJDLElBL0lRLEVBK0lGQyxLQS9JRSxFQStJSztBQUNsQixRQUFJLEtBQUsxQyxPQUFMLENBQWEyQyxVQUFqQixFQUE2QjtBQUMzQixhQUFPLEtBQUszQyxPQUFMLENBQWEyQyxVQUFiLENBQXdCRixJQUF4QixFQUE4QkMsS0FBOUIsQ0FBUDtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU9ELFNBQVNDLEtBQVQsSUFDRCxLQUFLMUMsT0FBTCxDQUFhNEMsVUFBYixJQUEyQkgsS0FBS0ksV0FBTCxPQUF1QkgsTUFBTUcsV0FBTixFQUR4RDtBQUVEO0FBQ0YsR0F0SmM7QUFBQSxtREF1SmZyQyxXQXZKZSx1QkF1SkhzQyxLQXZKRyxFQXVKSTtBQUNqQixRQUFJWixNQUFNLEVBQVY7QUFDQSxTQUFLLElBQUlhLElBQUksQ0FBYixFQUFnQkEsSUFBSUQsTUFBTW5DLE1BQTFCLEVBQWtDb0MsR0FBbEMsRUFBdUM7QUFDckMsVUFBSUQsTUFBTUMsQ0FBTixDQUFKLEVBQWM7QUFDWmIsWUFBSUksSUFBSixDQUFTUSxNQUFNQyxDQUFOLENBQVQ7QUFDRDtBQUNGO0FBQ0QsV0FBT2IsR0FBUDtBQUNELEdBL0pjO0FBQUEsbURBZ0tmM0IsU0FoS2UscUJBZ0tMSCxLQWhLSyxFQWdLRTtBQUNmLFdBQU9BLEtBQVA7QUFDRCxHQWxLYztBQUFBLG1EQW1LZkssUUFuS2Usb0JBbUtOTCxLQW5LTSxFQW1LQztBQUNkLFdBQU9BLE1BQU00QyxLQUFOLENBQVksRUFBWixDQUFQO0FBQ0QsR0FyS2M7QUFBQSxtREFzS2Y1QixJQXRLZSxnQkFzS1Y2QixLQXRLVSxFQXNLSDtBQUNWLFdBQU9BLE1BQU03QixJQUFOLENBQVcsRUFBWCxDQUFQO0FBQ0Q7QUF4S2MsQ0FBakI7O0FBMktBLFNBQVNXLFdBQVQsQ0FBcUJsQyxJQUFyQixFQUEyQm9CLFVBQTNCLEVBQXVDbEIsU0FBdkMsRUFBa0RELFNBQWxELEVBQTZEa0MsZUFBN0QsRUFBOEU7QUFDNUUsTUFBSWtCLGVBQWUsQ0FBbkI7QUFBQSxNQUNJQyxlQUFlbEMsV0FBV04sTUFEOUI7QUFBQSxNQUVJSyxTQUFTLENBRmI7QUFBQSxNQUdJRSxTQUFTLENBSGI7O0FBS0EsU0FBT2dDLGVBQWVDLFlBQXRCLEVBQW9DRCxjQUFwQyxFQUFvRDtBQUNsRCxRQUFJRSxZQUFZbkMsV0FBV2lDLFlBQVgsQ0FBaEI7QUFDQSxRQUFJLENBQUNFLFVBQVVoQixPQUFmLEVBQXdCO0FBQ3RCLFVBQUksQ0FBQ2dCLFVBQVVqQixLQUFYLElBQW9CSCxlQUF4QixFQUF5QztBQUN2QyxZQUFJNUIsUUFBUUwsVUFBVXNELEtBQVYsQ0FBZ0JyQyxNQUFoQixFQUF3QkEsU0FBU29DLFVBQVUvQixLQUEzQyxDQUFaO0FBQ0FqQixnQkFBUUEsTUFBTWtELEdBQU4sQ0FBVSxVQUFTbEQsS0FBVCxFQUFnQjJDLENBQWhCLEVBQW1CO0FBQ25DLGNBQUlRLFdBQVd6RCxVQUFVb0IsU0FBUzZCLENBQW5CLENBQWY7QUFDQSxpQkFBT1EsU0FBUzVDLE1BQVQsR0FBa0JQLE1BQU1PLE1BQXhCLEdBQWlDNEMsUUFBakMsR0FBNENuRCxLQUFuRDtBQUNELFNBSE8sQ0FBUjs7QUFLQWdELGtCQUFVaEQsS0FBVixHQUFrQlAsS0FBS3VCLElBQUwsQ0FBVWhCLEtBQVYsQ0FBbEI7QUFDRCxPQVJELE1BUU87QUFDTGdELGtCQUFVaEQsS0FBVixHQUFrQlAsS0FBS3VCLElBQUwsQ0FBVXJCLFVBQVVzRCxLQUFWLENBQWdCckMsTUFBaEIsRUFBd0JBLFNBQVNvQyxVQUFVL0IsS0FBM0MsQ0FBVixDQUFsQjtBQUNEO0FBQ0RMLGdCQUFVb0MsVUFBVS9CLEtBQXBCOztBQUVBO0FBQ0EsVUFBSSxDQUFDK0IsVUFBVWpCLEtBQWYsRUFBc0I7QUFDcEJqQixrQkFBVWtDLFVBQVUvQixLQUFwQjtBQUNEO0FBQ0YsS0FsQkQsTUFrQk87QUFDTCtCLGdCQUFVaEQsS0FBVixHQUFrQlAsS0FBS3VCLElBQUwsQ0FBVXRCLFVBQVV1RCxLQUFWLENBQWdCbkMsTUFBaEIsRUFBd0JBLFNBQVNrQyxVQUFVL0IsS0FBM0MsQ0FBVixDQUFsQjtBQUNBSCxnQkFBVWtDLFVBQVUvQixLQUFwQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFJNkIsZ0JBQWdCakMsV0FBV2lDLGVBQWUsQ0FBMUIsRUFBNkJmLEtBQWpELEVBQXdEO0FBQ3RELFlBQUlxQixNQUFNdkMsV0FBV2lDLGVBQWUsQ0FBMUIsQ0FBVjtBQUNBakMsbUJBQVdpQyxlQUFlLENBQTFCLElBQStCakMsV0FBV2lDLFlBQVgsQ0FBL0I7QUFDQWpDLG1CQUFXaUMsWUFBWCxJQUEyQk0sR0FBM0I7QUFDRDtBQUNGO0FBQ0Y7O0FBRUQ7QUFDQTtBQUNBO0FBQ0EsTUFBSUMsZ0JBQWdCeEMsV0FBV2tDLGVBQWUsQ0FBMUIsQ0FBcEI7QUFDQSxNQUFJQSxlQUFlLENBQWYsSUFDRyxPQUFPTSxjQUFjckQsS0FBckIsS0FBK0IsUUFEbEMsS0FFSXFELGNBQWN0QixLQUFkLElBQXVCc0IsY0FBY3JCLE9BRnpDLEtBR0d2QyxLQUFLMkMsTUFBTCxDQUFZLEVBQVosRUFBZ0JpQixjQUFjckQsS0FBOUIsQ0FIUCxFQUc2QztBQUMzQ2EsZUFBV2tDLGVBQWUsQ0FBMUIsRUFBNkIvQyxLQUE3QixJQUFzQ3FELGNBQWNyRCxLQUFwRDtBQUNBYSxlQUFXeUMsR0FBWDtBQUNEOztBQUVELFNBQU96QyxVQUFQO0FBQ0Q7O0FBRUQsU0FBU1ksU0FBVCxDQUFtQjhCLElBQW5CLEVBQXlCO0FBQ3ZCLFNBQU8sRUFBRTNDLFFBQVEyQyxLQUFLM0MsTUFBZixFQUF1QkMsWUFBWTBDLEtBQUsxQyxVQUFMLENBQWdCb0MsS0FBaEIsQ0FBc0IsQ0FBdEIsQ0FBbkMsRUFBUDtBQUNEIiwiZmlsZSI6ImJhc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEaWZmKCkge31cblxuRGlmZi5wcm90b3R5cGUgPSB7XG4gIGRpZmYob2xkU3RyaW5nLCBuZXdTdHJpbmcsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBjYWxsYmFjayA9IG9wdGlvbnMuY2FsbGJhY2s7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYWxsYmFjayA9IG9wdGlvbnM7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cbiAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICBmdW5jdGlvbiBkb25lKHZhbHVlKSB7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgY2FsbGJhY2sodW5kZWZpbmVkLCB2YWx1ZSk7IH0sIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbGxvdyBzdWJjbGFzc2VzIHRvIG1hc3NhZ2UgdGhlIGlucHV0IHByaW9yIHRvIHJ1bm5pbmdcbiAgICBvbGRTdHJpbmcgPSB0aGlzLmNhc3RJbnB1dChvbGRTdHJpbmcpO1xuICAgIG5ld1N0cmluZyA9IHRoaXMuY2FzdElucHV0KG5ld1N0cmluZyk7XG5cbiAgICBvbGRTdHJpbmcgPSB0aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUob2xkU3RyaW5nKSk7XG4gICAgbmV3U3RyaW5nID0gdGhpcy5yZW1vdmVFbXB0eSh0aGlzLnRva2VuaXplKG5ld1N0cmluZykpO1xuXG4gICAgbGV0IG5ld0xlbiA9IG5ld1N0cmluZy5sZW5ndGgsIG9sZExlbiA9IG9sZFN0cmluZy5sZW5ndGg7XG4gICAgbGV0IGVkaXRMZW5ndGggPSAxO1xuICAgIGxldCBtYXhFZGl0TGVuZ3RoID0gbmV3TGVuICsgb2xkTGVuO1xuICAgIGxldCBiZXN0UGF0aCA9IFt7IG5ld1BvczogLTEsIGNvbXBvbmVudHM6IFtdIH1dO1xuXG4gICAgLy8gU2VlZCBlZGl0TGVuZ3RoID0gMCwgaS5lLiB0aGUgY29udGVudCBzdGFydHMgd2l0aCB0aGUgc2FtZSB2YWx1ZXNcbiAgICBsZXQgb2xkUG9zID0gdGhpcy5leHRyYWN0Q29tbW9uKGJlc3RQYXRoWzBdLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgMCk7XG4gICAgaWYgKGJlc3RQYXRoWzBdLm5ld1BvcyArIDEgPj0gbmV3TGVuICYmIG9sZFBvcyArIDEgPj0gb2xkTGVuKSB7XG4gICAgICAvLyBJZGVudGl0eSBwZXIgdGhlIGVxdWFsaXR5IGFuZCB0b2tlbml6ZXJcbiAgICAgIHJldHVybiBkb25lKFt7dmFsdWU6IHRoaXMuam9pbihuZXdTdHJpbmcpLCBjb3VudDogbmV3U3RyaW5nLmxlbmd0aH1dKTtcbiAgICB9XG5cbiAgICAvLyBNYWluIHdvcmtlciBtZXRob2QuIGNoZWNrcyBhbGwgcGVybXV0YXRpb25zIG9mIGEgZ2l2ZW4gZWRpdCBsZW5ndGggZm9yIGFjY2VwdGFuY2UuXG4gICAgZnVuY3Rpb24gZXhlY0VkaXRMZW5ndGgoKSB7XG4gICAgICBmb3IgKGxldCBkaWFnb25hbFBhdGggPSAtMSAqIGVkaXRMZW5ndGg7IGRpYWdvbmFsUGF0aCA8PSBlZGl0TGVuZ3RoOyBkaWFnb25hbFBhdGggKz0gMikge1xuICAgICAgICBsZXQgYmFzZVBhdGg7XG4gICAgICAgIGxldCBhZGRQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoIC0gMV0sXG4gICAgICAgICAgICByZW1vdmVQYXRoID0gYmVzdFBhdGhbZGlhZ29uYWxQYXRoICsgMV0sXG4gICAgICAgICAgICBvbGRQb3MgPSAocmVtb3ZlUGF0aCA/IHJlbW92ZVBhdGgubmV3UG9zIDogMCkgLSBkaWFnb25hbFBhdGg7XG4gICAgICAgIGlmIChhZGRQYXRoKSB7XG4gICAgICAgICAgLy8gTm8gb25lIGVsc2UgaXMgZ29pbmcgdG8gYXR0ZW1wdCB0byB1c2UgdGhpcyB2YWx1ZSwgY2xlYXIgaXRcbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGggLSAxXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjYW5BZGQgPSBhZGRQYXRoICYmIGFkZFBhdGgubmV3UG9zICsgMSA8IG5ld0xlbixcbiAgICAgICAgICAgIGNhblJlbW92ZSA9IHJlbW92ZVBhdGggJiYgMCA8PSBvbGRQb3MgJiYgb2xkUG9zIDwgb2xkTGVuO1xuICAgICAgICBpZiAoIWNhbkFkZCAmJiAhY2FuUmVtb3ZlKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBwYXRoIGlzIGEgdGVybWluYWwgdGhlbiBwcnVuZVxuICAgICAgICAgIGJlc3RQYXRoW2RpYWdvbmFsUGF0aF0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZWxlY3QgdGhlIGRpYWdvbmFsIHRoYXQgd2Ugd2FudCB0byBicmFuY2ggZnJvbS4gV2Ugc2VsZWN0IHRoZSBwcmlvclxuICAgICAgICAvLyBwYXRoIHdob3NlIHBvc2l0aW9uIGluIHRoZSBuZXcgc3RyaW5nIGlzIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBvcmlnaW5cbiAgICAgICAgLy8gYW5kIGRvZXMgbm90IHBhc3MgdGhlIGJvdW5kcyBvZiB0aGUgZGlmZiBncmFwaFxuICAgICAgICBpZiAoIWNhbkFkZCB8fCAoY2FuUmVtb3ZlICYmIGFkZFBhdGgubmV3UG9zIDwgcmVtb3ZlUGF0aC5uZXdQb3MpKSB7XG4gICAgICAgICAgYmFzZVBhdGggPSBjbG9uZVBhdGgocmVtb3ZlUGF0aCk7XG4gICAgICAgICAgc2VsZi5wdXNoQ29tcG9uZW50KGJhc2VQYXRoLmNvbXBvbmVudHMsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmFzZVBhdGggPSBhZGRQYXRoOyAgIC8vIE5vIG5lZWQgdG8gY2xvbmUsIHdlJ3ZlIHB1bGxlZCBpdCBmcm9tIHRoZSBsaXN0XG4gICAgICAgICAgYmFzZVBhdGgubmV3UG9zKys7XG4gICAgICAgICAgc2VsZi5wdXNoQ29tcG9uZW50KGJhc2VQYXRoLmNvbXBvbmVudHMsIHRydWUsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICBvbGRQb3MgPSBzZWxmLmV4dHJhY3RDb21tb24oYmFzZVBhdGgsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBkaWFnb25hbFBhdGgpO1xuXG4gICAgICAgIC8vIElmIHdlIGhhdmUgaGl0IHRoZSBlbmQgb2YgYm90aCBzdHJpbmdzLCB0aGVuIHdlIGFyZSBkb25lXG4gICAgICAgIGlmIChiYXNlUGF0aC5uZXdQb3MgKyAxID49IG5ld0xlbiAmJiBvbGRQb3MgKyAxID49IG9sZExlbikge1xuICAgICAgICAgIHJldHVybiBkb25lKGJ1aWxkVmFsdWVzKHNlbGYsIGJhc2VQYXRoLmNvbXBvbmVudHMsIG5ld1N0cmluZywgb2xkU3RyaW5nLCBzZWxmLnVzZUxvbmdlc3RUb2tlbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyd2lzZSB0cmFjayB0aGlzIHBhdGggYXMgYSBwb3RlbnRpYWwgY2FuZGlkYXRlIGFuZCBjb250aW51ZS5cbiAgICAgICAgICBiZXN0UGF0aFtkaWFnb25hbFBhdGhdID0gYmFzZVBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZWRpdExlbmd0aCsrO1xuICAgIH1cblxuICAgIC8vIFBlcmZvcm1zIHRoZSBsZW5ndGggb2YgZWRpdCBpdGVyYXRpb24uIElzIGEgYml0IGZ1Z2x5IGFzIHRoaXMgaGFzIHRvIHN1cHBvcnQgdGhlXG4gICAgLy8gc3luYyBhbmQgYXN5bmMgbW9kZSB3aGljaCBpcyBuZXZlciBmdW4uIExvb3BzIG92ZXIgZXhlY0VkaXRMZW5ndGggdW50aWwgYSB2YWx1ZVxuICAgIC8vIGlzIHByb2R1Y2VkLlxuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgKGZ1bmN0aW9uIGV4ZWMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHdlIHdhbnQgdG8gYmUgc2FmZS5cbiAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAgIGlmIChlZGl0TGVuZ3RoID4gbWF4RWRpdExlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFleGVjRWRpdExlbmd0aCgpKSB7XG4gICAgICAgICAgICBleGVjKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAwKTtcbiAgICAgIH0oKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlIChlZGl0TGVuZ3RoIDw9IG1heEVkaXRMZW5ndGgpIHtcbiAgICAgICAgbGV0IHJldCA9IGV4ZWNFZGl0TGVuZ3RoKCk7XG4gICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHB1c2hDb21wb25lbnQoY29tcG9uZW50cywgYWRkZWQsIHJlbW92ZWQpIHtcbiAgICBsZXQgbGFzdCA9IGNvbXBvbmVudHNbY29tcG9uZW50cy5sZW5ndGggLSAxXTtcbiAgICBpZiAobGFzdCAmJiBsYXN0LmFkZGVkID09PSBhZGRlZCAmJiBsYXN0LnJlbW92ZWQgPT09IHJlbW92ZWQpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2xvbmUgaGVyZSBhcyB0aGUgY29tcG9uZW50IGNsb25lIG9wZXJhdGlvbiBpcyBqdXN0XG4gICAgICAvLyBhcyBzaGFsbG93IGFycmF5IGNsb25lXG4gICAgICBjb21wb25lbnRzW2NvbXBvbmVudHMubGVuZ3RoIC0gMV0gPSB7Y291bnQ6IGxhc3QuY291bnQgKyAxLCBhZGRlZDogYWRkZWQsIHJlbW92ZWQ6IHJlbW92ZWQgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50cy5wdXNoKHtjb3VudDogMSwgYWRkZWQ6IGFkZGVkLCByZW1vdmVkOiByZW1vdmVkIH0pO1xuICAgIH1cbiAgfSxcbiAgZXh0cmFjdENvbW1vbihiYXNlUGF0aCwgbmV3U3RyaW5nLCBvbGRTdHJpbmcsIGRpYWdvbmFsUGF0aCkge1xuICAgIGxldCBuZXdMZW4gPSBuZXdTdHJpbmcubGVuZ3RoLFxuICAgICAgICBvbGRMZW4gPSBvbGRTdHJpbmcubGVuZ3RoLFxuICAgICAgICBuZXdQb3MgPSBiYXNlUGF0aC5uZXdQb3MsXG4gICAgICAgIG9sZFBvcyA9IG5ld1BvcyAtIGRpYWdvbmFsUGF0aCxcblxuICAgICAgICBjb21tb25Db3VudCA9IDA7XG4gICAgd2hpbGUgKG5ld1BvcyArIDEgPCBuZXdMZW4gJiYgb2xkUG9zICsgMSA8IG9sZExlbiAmJiB0aGlzLmVxdWFscyhuZXdTdHJpbmdbbmV3UG9zICsgMV0sIG9sZFN0cmluZ1tvbGRQb3MgKyAxXSkpIHtcbiAgICAgIG5ld1BvcysrO1xuICAgICAgb2xkUG9zKys7XG4gICAgICBjb21tb25Db3VudCsrO1xuICAgIH1cblxuICAgIGlmIChjb21tb25Db3VudCkge1xuICAgICAgYmFzZVBhdGguY29tcG9uZW50cy5wdXNoKHtjb3VudDogY29tbW9uQ291bnR9KTtcbiAgICB9XG5cbiAgICBiYXNlUGF0aC5uZXdQb3MgPSBuZXdQb3M7XG4gICAgcmV0dXJuIG9sZFBvcztcbiAgfSxcblxuICBlcXVhbHMobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuY29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBsZWZ0ID09PSByaWdodFxuICAgICAgICB8fCAodGhpcy5vcHRpb25zLmlnbm9yZUNhc2UgJiYgbGVmdC50b0xvd2VyQ2FzZSgpID09PSByaWdodC50b0xvd2VyQ2FzZSgpKTtcbiAgICB9XG4gIH0sXG4gIHJlbW92ZUVtcHR5KGFycmF5KSB7XG4gICAgbGV0IHJldCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChhcnJheVtpXSkge1xuICAgICAgICByZXQucHVzaChhcnJheVtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH0sXG4gIGNhc3RJbnB1dCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSxcbiAgdG9rZW5pemUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUuc3BsaXQoJycpO1xuICB9LFxuICBqb2luKGNoYXJzKSB7XG4gICAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBidWlsZFZhbHVlcyhkaWZmLCBjb21wb25lbnRzLCBuZXdTdHJpbmcsIG9sZFN0cmluZywgdXNlTG9uZ2VzdFRva2VuKSB7XG4gIGxldCBjb21wb25lbnRQb3MgPSAwLFxuICAgICAgY29tcG9uZW50TGVuID0gY29tcG9uZW50cy5sZW5ndGgsXG4gICAgICBuZXdQb3MgPSAwLFxuICAgICAgb2xkUG9zID0gMDtcblxuICBmb3IgKDsgY29tcG9uZW50UG9zIDwgY29tcG9uZW50TGVuOyBjb21wb25lbnRQb3MrKykge1xuICAgIGxldCBjb21wb25lbnQgPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG4gICAgaWYgKCFjb21wb25lbnQucmVtb3ZlZCkge1xuICAgICAgaWYgKCFjb21wb25lbnQuYWRkZWQgJiYgdXNlTG9uZ2VzdFRva2VuKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCk7XG4gICAgICAgIHZhbHVlID0gdmFsdWUubWFwKGZ1bmN0aW9uKHZhbHVlLCBpKSB7XG4gICAgICAgICAgbGV0IG9sZFZhbHVlID0gb2xkU3RyaW5nW29sZFBvcyArIGldO1xuICAgICAgICAgIHJldHVybiBvbGRWYWx1ZS5sZW5ndGggPiB2YWx1ZS5sZW5ndGggPyBvbGRWYWx1ZSA6IHZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb21wb25lbnQudmFsdWUgPSBkaWZmLmpvaW4odmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50LnZhbHVlID0gZGlmZi5qb2luKG5ld1N0cmluZy5zbGljZShuZXdQb3MsIG5ld1BvcyArIGNvbXBvbmVudC5jb3VudCkpO1xuICAgICAgfVxuICAgICAgbmV3UG9zICs9IGNvbXBvbmVudC5jb3VudDtcblxuICAgICAgLy8gQ29tbW9uIGNhc2VcbiAgICAgIGlmICghY29tcG9uZW50LmFkZGVkKSB7XG4gICAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbXBvbmVudC52YWx1ZSA9IGRpZmYuam9pbihvbGRTdHJpbmcuc2xpY2Uob2xkUG9zLCBvbGRQb3MgKyBjb21wb25lbnQuY291bnQpKTtcbiAgICAgIG9sZFBvcyArPSBjb21wb25lbnQuY291bnQ7XG5cbiAgICAgIC8vIFJldmVyc2UgYWRkIGFuZCByZW1vdmUgc28gcmVtb3ZlcyBhcmUgb3V0cHV0IGZpcnN0IHRvIG1hdGNoIGNvbW1vbiBjb252ZW50aW9uXG4gICAgICAvLyBUaGUgZGlmZmluZyBhbGdvcml0aG0gaXMgdGllZCB0byBhZGQgdGhlbiByZW1vdmUgb3V0cHV0IGFuZCB0aGlzIGlzIHRoZSBzaW1wbGVzdFxuICAgICAgLy8gcm91dGUgdG8gZ2V0IHRoZSBkZXNpcmVkIG91dHB1dCB3aXRoIG1pbmltYWwgb3ZlcmhlYWQuXG4gICAgICBpZiAoY29tcG9uZW50UG9zICYmIGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV0uYWRkZWQpIHtcbiAgICAgICAgbGV0IHRtcCA9IGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV07XG4gICAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50UG9zIC0gMV0gPSBjb21wb25lbnRzW2NvbXBvbmVudFBvc107XG4gICAgICAgIGNvbXBvbmVudHNbY29tcG9uZW50UG9zXSA9IHRtcDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTcGVjaWFsIGNhc2UgaGFuZGxlIGZvciB3aGVuIG9uZSB0ZXJtaW5hbCBpcyBpZ25vcmVkIChpLmUuIHdoaXRlc3BhY2UpLlxuICAvLyBGb3IgdGhpcyBjYXNlIHdlIG1lcmdlIHRoZSB0ZXJtaW5hbCBpbnRvIHRoZSBwcmlvciBzdHJpbmcgYW5kIGRyb3AgdGhlIGNoYW5nZS5cbiAgLy8gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3Igc3RyaW5nIG1vZGUuXG4gIGxldCBsYXN0Q29tcG9uZW50ID0gY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAxXTtcbiAgaWYgKGNvbXBvbmVudExlbiA+IDFcbiAgICAgICYmIHR5cGVvZiBsYXN0Q29tcG9uZW50LnZhbHVlID09PSAnc3RyaW5nJ1xuICAgICAgJiYgKGxhc3RDb21wb25lbnQuYWRkZWQgfHwgbGFzdENvbXBvbmVudC5yZW1vdmVkKVxuICAgICAgJiYgZGlmZi5lcXVhbHMoJycsIGxhc3RDb21wb25lbnQudmFsdWUpKSB7XG4gICAgY29tcG9uZW50c1tjb21wb25lbnRMZW4gLSAyXS52YWx1ZSArPSBsYXN0Q29tcG9uZW50LnZhbHVlO1xuICAgIGNvbXBvbmVudHMucG9wKCk7XG4gIH1cblxuICByZXR1cm4gY29tcG9uZW50cztcbn1cblxuZnVuY3Rpb24gY2xvbmVQYXRoKHBhdGgpIHtcbiAgcmV0dXJuIHsgbmV3UG9zOiBwYXRoLm5ld1BvcywgY29tcG9uZW50czogcGF0aC5jb21wb25lbnRzLnNsaWNlKDApIH07XG59XG4iXX0= |
|
|
|
|
|
/***/ }), |
|
/* 2 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports.characterDiff = undefined; |
|
exports. /*istanbul ignore end*/diffChars = diffChars; |
|
|
|
var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); |
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } |
|
|
|
/*istanbul ignore end*/var characterDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/characterDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); |
|
function diffChars(oldStr, newStr, options) { |
|
return characterDiff.diff(oldStr, newStr, options); |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2NoYXJhY3Rlci5qcyJdLCJuYW1lcyI6WyJkaWZmQ2hhcnMiLCJjaGFyYWN0ZXJEaWZmIiwib2xkU3RyIiwibmV3U3RyIiwib3B0aW9ucyIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Z0NBR2dCQSxTLEdBQUFBLFM7O0FBSGhCOzs7Ozs7dUJBRU8sSUFBTUMseUZBQWdCLHdFQUF0QjtBQUNBLFNBQVNELFNBQVQsQ0FBbUJFLE1BQW5CLEVBQTJCQyxNQUEzQixFQUFtQ0MsT0FBbkMsRUFBNEM7QUFBRSxTQUFPSCxjQUFjSSxJQUFkLENBQW1CSCxNQUFuQixFQUEyQkMsTUFBM0IsRUFBbUNDLE9BQW5DLENBQVA7QUFBcUQiLCJmaWxlIjoiY2hhcmFjdGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGNvbnN0IGNoYXJhY3RlckRpZmYgPSBuZXcgRGlmZigpO1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZDaGFycyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykgeyByZXR1cm4gY2hhcmFjdGVyRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTsgfVxuIl19 |
|
|
|
|
|
/***/ }), |
|
/* 3 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports.wordDiff = undefined; |
|
exports. /*istanbul ignore end*/diffWords = diffWords; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = diffWordsWithSpace; |
|
|
|
var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); |
|
|
|
/*istanbul ignore end*/var /*istanbul ignore start*/_params = __webpack_require__(4) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } |
|
|
|
/*istanbul ignore end*/ // Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode |
|
// |
|
// Ranges and exceptions: |
|
// Latin-1 Supplement, 0080–00FF |
|
// - U+00D7 × Multiplication sign |
|
// - U+00F7 ÷ Division sign |
|
// Latin Extended-A, 0100–017F |
|
// Latin Extended-B, 0180–024F |
|
// IPA Extensions, 0250–02AF |
|
// Spacing Modifier Letters, 02B0–02FF |
|
// - U+02C7 ˇ ˇ Caron |
|
// - U+02D8 ˘ ˘ Breve |
|
// - U+02D9 ˙ ˙ Dot Above |
|
// - U+02DA ˚ ˚ Ring Above |
|
// - U+02DB ˛ ˛ Ogonek |
|
// - U+02DC ˜ ˜ Small Tilde |
|
// - U+02DD ˝ ˝ Double Acute Accent |
|
// Latin Extended Additional, 1E00–1EFF |
|
var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/; |
|
|
|
var reWhitespace = /\S/; |
|
|
|
var wordDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/wordDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); |
|
wordDiff.equals = function (left, right) { |
|
if (this.options.ignoreCase) { |
|
left = left.toLowerCase(); |
|
right = right.toLowerCase(); |
|
} |
|
return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right); |
|
}; |
|
wordDiff.tokenize = function (value) { |
|
var tokens = value.split(/(\s+|\b)/); |
|
|
|
// Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set. |
|
for (var i = 0; i < tokens.length - 1; i++) { |
|
// If we have an empty string in the next field and we have only word chars before and after, merge |
|
if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) { |
|
tokens[i] += tokens[i + 2]; |
|
tokens.splice(i + 1, 2); |
|
i--; |
|
} |
|
} |
|
|
|
return tokens; |
|
}; |
|
|
|
function diffWords(oldStr, newStr, options) { |
|
options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(options, { ignoreWhitespace: true }); |
|
return wordDiff.diff(oldStr, newStr, options); |
|
} |
|
|
|
function diffWordsWithSpace(oldStr, newStr, options) { |
|
return wordDiff.diff(oldStr, newStr, options); |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL3dvcmQuanMiXSwibmFtZXMiOlsiZGlmZldvcmRzIiwiZGlmZldvcmRzV2l0aFNwYWNlIiwiZXh0ZW5kZWRXb3JkQ2hhcnMiLCJyZVdoaXRlc3BhY2UiLCJ3b3JkRGlmZiIsImVxdWFscyIsImxlZnQiLCJyaWdodCIsIm9wdGlvbnMiLCJpZ25vcmVDYXNlIiwidG9Mb3dlckNhc2UiLCJpZ25vcmVXaGl0ZXNwYWNlIiwidGVzdCIsInRva2VuaXplIiwidmFsdWUiLCJ0b2tlbnMiLCJzcGxpdCIsImkiLCJsZW5ndGgiLCJzcGxpY2UiLCJvbGRTdHIiLCJuZXdTdHIiLCJkaWZmIl0sIm1hcHBpbmdzIjoiOzs7O2dDQW1EZ0JBLFMsR0FBQUEsUzt5REFLQUMsa0IsR0FBQUEsa0I7O0FBeERoQjs7Ozt1QkFDQTs7Ozt3QkFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFNQyxvQkFBb0IsK0RBQTFCOztBQUVBLElBQU1DLGVBQWUsSUFBckI7O0FBRU8sSUFBTUMsK0VBQVcsd0VBQWpCO0FBQ1BBLFNBQVNDLE1BQVQsR0FBa0IsVUFBU0MsSUFBVCxFQUFlQyxLQUFmLEVBQXNCO0FBQ3RDLE1BQUksS0FBS0MsT0FBTCxDQUFhQyxVQUFqQixFQUE2QjtBQUMzQkgsV0FBT0EsS0FBS0ksV0FBTCxFQUFQO0FBQ0FILFlBQVFBLE1BQU1HLFdBQU4sRUFBUjtBQUNEO0FBQ0QsU0FBT0osU0FBU0MsS0FBVCxJQUFtQixLQUFLQyxPQUFMLENBQWFHLGdCQUFiLElBQWlDLENBQUNSLGFBQWFTLElBQWIsQ0FBa0JOLElBQWxCLENBQWxDLElBQTZELENBQUNILGFBQWFTLElBQWIsQ0FBa0JMLEtBQWxCLENBQXhGO0FBQ0QsQ0FORDtBQU9BSCxTQUFTUyxRQUFULEdBQW9CLFVBQVNDLEtBQVQsRUFBZ0I7QUFDbEMsTUFBSUMsU0FBU0QsTUFBTUUsS0FBTixDQUFZLFVBQVosQ0FBYjs7QUFFQTtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixPQUFPRyxNQUFQLEdBQWdCLENBQXBDLEVBQXVDRCxHQUF2QyxFQUE0QztBQUMxQztBQUNBLFFBQUksQ0FBQ0YsT0FBT0UsSUFBSSxDQUFYLENBQUQsSUFBa0JGLE9BQU9FLElBQUksQ0FBWCxDQUFsQixJQUNLZixrQkFBa0JVLElBQWxCLENBQXVCRyxPQUFPRSxDQUFQLENBQXZCLENBREwsSUFFS2Ysa0JBQWtCVSxJQUFsQixDQUF1QkcsT0FBT0UsSUFBSSxDQUFYLENBQXZCLENBRlQsRUFFZ0Q7QUFDOUNGLGFBQU9FLENBQVAsS0FBYUYsT0FBT0UsSUFBSSxDQUFYLENBQWI7QUFDQUYsYUFBT0ksTUFBUCxDQUFjRixJQUFJLENBQWxCLEVBQXFCLENBQXJCO0FBQ0FBO0FBQ0Q7QUFDRjs7QUFFRCxTQUFPRixNQUFQO0FBQ0QsQ0FoQkQ7O0FBa0JPLFNBQVNmLFNBQVQsQ0FBbUJvQixNQUFuQixFQUEyQkMsTUFBM0IsRUFBbUNiLE9BQW5DLEVBQTRDO0FBQ2pEQSxZQUFVLDhFQUFnQkEsT0FBaEIsRUFBeUIsRUFBQ0csa0JBQWtCLElBQW5CLEVBQXpCLENBQVY7QUFDQSxTQUFPUCxTQUFTa0IsSUFBVCxDQUFjRixNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmIsT0FBOUIsQ0FBUDtBQUNEOztBQUVNLFNBQVNQLGtCQUFULENBQTRCbUIsTUFBNUIsRUFBb0NDLE1BQXBDLEVBQTRDYixPQUE1QyxFQUFxRDtBQUMxRCxTQUFPSixTQUFTa0IsSUFBVCxDQUFjRixNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmIsT0FBOUIsQ0FBUDtBQUNEIiwiZmlsZSI6IndvcmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGlmZiBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHtnZW5lcmF0ZU9wdGlvbnN9IGZyb20gJy4uL3V0aWwvcGFyYW1zJztcblxuLy8gQmFzZWQgb24gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fc2NyaXB0X2luX1VuaWNvZGVcbi8vXG4vLyBSYW5nZXMgYW5kIGV4Y2VwdGlvbnM6XG4vLyBMYXRpbi0xIFN1cHBsZW1lbnQsIDAwODDigJMwMEZGXG4vLyAgLSBVKzAwRDcgIMOXIE11bHRpcGxpY2F0aW9uIHNpZ25cbi8vICAtIFUrMDBGNyAgw7cgRGl2aXNpb24gc2lnblxuLy8gTGF0aW4gRXh0ZW5kZWQtQSwgMDEwMOKAkzAxN0Zcbi8vIExhdGluIEV4dGVuZGVkLUIsIDAxODDigJMwMjRGXG4vLyBJUEEgRXh0ZW5zaW9ucywgMDI1MOKAkzAyQUZcbi8vIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycywgMDJCMOKAkzAyRkZcbi8vICAtIFUrMDJDNyAgy4cgJiM3MTE7ICBDYXJvblxuLy8gIC0gVSswMkQ4ICDLmCAmIzcyODsgIEJyZXZlXG4vLyAgLSBVKzAyRDkgIMuZICYjNzI5OyAgRG90IEFib3ZlXG4vLyAgLSBVKzAyREEgIMuaICYjNzMwOyAgUmluZyBBYm92ZVxuLy8gIC0gVSswMkRCICDLmyAmIzczMTsgIE9nb25la1xuLy8gIC0gVSswMkRDICDLnCAmIzczMjsgIFNtYWxsIFRpbGRlXG4vLyAgLSBVKzAyREQgIMudICYjNzMzOyAgRG91YmxlIEFjdXRlIEFjY2VudFxuLy8gTGF0aW4gRXh0ZW5kZWQgQWRkaXRpb25hbCwgMUUwMOKAkzFFRkZcbmNvbnN0IGV4dGVuZGVkV29yZENoYXJzID0gL15bYS16QS1aXFx1e0MwfS1cXHV7RkZ9XFx1e0Q4fS1cXHV7RjZ9XFx1e0Y4fS1cXHV7MkM2fVxcdXsyQzh9LVxcdXsyRDd9XFx1ezJERX0tXFx1ezJGRn1cXHV7MUUwMH0tXFx1ezFFRkZ9XSskL3U7XG5cbmNvbnN0IHJlV2hpdGVzcGFjZSA9IC9cXFMvO1xuXG5leHBvcnQgY29uc3Qgd29yZERpZmYgPSBuZXcgRGlmZigpO1xud29yZERpZmYuZXF1YWxzID0gZnVuY3Rpb24obGVmdCwgcmlnaHQpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy5pZ25vcmVDYXNlKSB7XG4gICAgbGVmdCA9IGxlZnQudG9Mb3dlckNhc2UoKTtcbiAgICByaWdodCA9IHJpZ2h0LnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuIGxlZnQgPT09IHJpZ2h0IHx8ICh0aGlzLm9wdGlvbnMuaWdub3JlV2hpdGVzcGFjZSAmJiAhcmVXaGl0ZXNwYWNlLnRlc3QobGVmdCkgJiYgIXJlV2hpdGVzcGFjZS50ZXN0KHJpZ2h0KSk7XG59O1xud29yZERpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICBsZXQgdG9rZW5zID0gdmFsdWUuc3BsaXQoLyhcXHMrfFxcYikvKTtcblxuICAvLyBKb2luIHRoZSBib3VuZGFyeSBzcGxpdHMgdGhhdCB3ZSBkbyBub3QgY29uc2lkZXIgdG8gYmUgYm91bmRhcmllcy4gVGhpcyBpcyBwcmltYXJpbHkgdGhlIGV4dGVuZGVkIExhdGluIGNoYXJhY3RlciBzZXQuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIC8vIElmIHdlIGhhdmUgYW4gZW1wdHkgc3RyaW5nIGluIHRoZSBuZXh0IGZpZWxkIGFuZCB3ZSBoYXZlIG9ubHkgd29yZCBjaGFycyBiZWZvcmUgYW5kIGFmdGVyLCBtZXJnZVxuICAgIGlmICghdG9rZW5zW2kgKyAxXSAmJiB0b2tlbnNbaSArIDJdXG4gICAgICAgICAgJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaV0pXG4gICAgICAgICAgJiYgZXh0ZW5kZWRXb3JkQ2hhcnMudGVzdCh0b2tlbnNbaSArIDJdKSkge1xuICAgICAgdG9rZW5zW2ldICs9IHRva2Vuc1tpICsgMl07XG4gICAgICB0b2tlbnMuc3BsaWNlKGkgKyAxLCAyKTtcbiAgICAgIGktLTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZXb3JkcyhvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICBvcHRpb25zID0gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIHtpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlfSk7XG4gIHJldHVybiB3b3JkRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZXb3Jkc1dpdGhTcGFjZShvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucykge1xuICByZXR1cm4gd29yZERpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgb3B0aW9ucyk7XG59XG4iXX0= |
|
|
|
|
|
/***/ }), |
|
/* 4 */ |
|
/***/ (function(module, exports) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports. /*istanbul ignore end*/generateOptions = generateOptions; |
|
function generateOptions(options, defaults) { |
|
if (typeof options === 'function') { |
|
defaults.callback = options; |
|
} else if (options) { |
|
for (var name in options) { |
|
/* istanbul ignore else */ |
|
if (options.hasOwnProperty(name)) { |
|
defaults[name] = options[name]; |
|
} |
|
} |
|
} |
|
return defaults; |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3BhcmFtcy5qcyJdLCJuYW1lcyI6WyJnZW5lcmF0ZU9wdGlvbnMiLCJvcHRpb25zIiwiZGVmYXVsdHMiLCJjYWxsYmFjayIsIm5hbWUiLCJoYXNPd25Qcm9wZXJ0eSJdLCJtYXBwaW5ncyI6Ijs7O2dDQUFnQkEsZSxHQUFBQSxlO0FBQVQsU0FBU0EsZUFBVCxDQUF5QkMsT0FBekIsRUFBa0NDLFFBQWxDLEVBQTRDO0FBQ2pELE1BQUksT0FBT0QsT0FBUCxLQUFtQixVQUF2QixFQUFtQztBQUNqQ0MsYUFBU0MsUUFBVCxHQUFvQkYsT0FBcEI7QUFDRCxHQUZELE1BRU8sSUFBSUEsT0FBSixFQUFhO0FBQ2xCLFNBQUssSUFBSUcsSUFBVCxJQUFpQkgsT0FBakIsRUFBMEI7QUFDeEI7QUFDQSxVQUFJQSxRQUFRSSxjQUFSLENBQXVCRCxJQUF2QixDQUFKLEVBQWtDO0FBQ2hDRixpQkFBU0UsSUFBVCxJQUFpQkgsUUFBUUcsSUFBUixDQUFqQjtBQUNEO0FBQ0Y7QUFDRjtBQUNELFNBQU9GLFFBQVA7QUFDRCIsImZpbGUiOiJwYXJhbXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVPcHRpb25zKG9wdGlvbnMsIGRlZmF1bHRzKSB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRlZmF1bHRzLmNhbGxiYWNrID0gb3B0aW9ucztcbiAgfSBlbHNlIGlmIChvcHRpb25zKSB7XG4gICAgZm9yIChsZXQgbmFtZSBpbiBvcHRpb25zKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgZGVmYXVsdHNbbmFtZV0gPSBvcHRpb25zW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZGVmYXVsdHM7XG59XG4iXX0= |
|
|
|
|
|
/***/ }), |
|
/* 5 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports.lineDiff = undefined; |
|
exports. /*istanbul ignore end*/diffLines = diffLines; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = diffTrimmedLines; |
|
|
|
var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); |
|
|
|
/*istanbul ignore end*/var /*istanbul ignore start*/_params = __webpack_require__(4) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } |
|
|
|
/*istanbul ignore end*/var lineDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/lineDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); |
|
lineDiff.tokenize = function (value) { |
|
var retLines = [], |
|
linesAndNewlines = value.split(/(\n|\r\n)/); |
|
|
|
// Ignore the final empty token that occurs if the string ends with a new line |
|
if (!linesAndNewlines[linesAndNewlines.length - 1]) { |
|
linesAndNewlines.pop(); |
|
} |
|
|
|
// Merge the content and line separators into single tokens |
|
for (var i = 0; i < linesAndNewlines.length; i++) { |
|
var line = linesAndNewlines[i]; |
|
|
|
if (i % 2 && !this.options.newlineIsToken) { |
|
retLines[retLines.length - 1] += line; |
|
} else { |
|
if (this.options.ignoreWhitespace) { |
|
line = line.trim(); |
|
} |
|
retLines.push(line); |
|
} |
|
} |
|
|
|
return retLines; |
|
}; |
|
|
|
function diffLines(oldStr, newStr, callback) { |
|
return lineDiff.diff(oldStr, newStr, callback); |
|
} |
|
function diffTrimmedLines(oldStr, newStr, callback) { |
|
var options = /*istanbul ignore start*/(0, _params.generateOptions) /*istanbul ignore end*/(callback, { ignoreWhitespace: true }); |
|
return lineDiff.diff(oldStr, newStr, options); |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2xpbmUuanMiXSwibmFtZXMiOlsiZGlmZkxpbmVzIiwiZGlmZlRyaW1tZWRMaW5lcyIsImxpbmVEaWZmIiwidG9rZW5pemUiLCJ2YWx1ZSIsInJldExpbmVzIiwibGluZXNBbmROZXdsaW5lcyIsInNwbGl0IiwibGVuZ3RoIiwicG9wIiwiaSIsImxpbmUiLCJvcHRpb25zIiwibmV3bGluZUlzVG9rZW4iLCJpZ25vcmVXaGl0ZXNwYWNlIiwidHJpbSIsInB1c2giLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Z0NBOEJnQkEsUyxHQUFBQSxTO3lEQUNBQyxnQixHQUFBQSxnQjs7QUEvQmhCOzs7O3VCQUNBOzs7O3VCQUVPLElBQU1DLCtFQUFXLHdFQUFqQjtBQUNQQSxTQUFTQyxRQUFULEdBQW9CLFVBQVNDLEtBQVQsRUFBZ0I7QUFDbEMsTUFBSUMsV0FBVyxFQUFmO0FBQUEsTUFDSUMsbUJBQW1CRixNQUFNRyxLQUFOLENBQVksV0FBWixDQUR2Qjs7QUFHQTtBQUNBLE1BQUksQ0FBQ0QsaUJBQWlCQSxpQkFBaUJFLE1BQWpCLEdBQTBCLENBQTNDLENBQUwsRUFBb0Q7QUFDbERGLHFCQUFpQkcsR0FBakI7QUFDRDs7QUFFRDtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJSixpQkFBaUJFLE1BQXJDLEVBQTZDRSxHQUE3QyxFQUFrRDtBQUNoRCxRQUFJQyxPQUFPTCxpQkFBaUJJLENBQWpCLENBQVg7O0FBRUEsUUFBSUEsSUFBSSxDQUFKLElBQVMsQ0FBQyxLQUFLRSxPQUFMLENBQWFDLGNBQTNCLEVBQTJDO0FBQ3pDUixlQUFTQSxTQUFTRyxNQUFULEdBQWtCLENBQTNCLEtBQWlDRyxJQUFqQztBQUNELEtBRkQsTUFFTztBQUNMLFVBQUksS0FBS0MsT0FBTCxDQUFhRSxnQkFBakIsRUFBbUM7QUFDakNILGVBQU9BLEtBQUtJLElBQUwsRUFBUDtBQUNEO0FBQ0RWLGVBQVNXLElBQVQsQ0FBY0wsSUFBZDtBQUNEO0FBQ0Y7O0FBRUQsU0FBT04sUUFBUDtBQUNELENBeEJEOztBQTBCTyxTQUFTTCxTQUFULENBQW1CaUIsTUFBbkIsRUFBMkJDLE1BQTNCLEVBQW1DQyxRQUFuQyxFQUE2QztBQUFFLFNBQU9qQixTQUFTa0IsSUFBVCxDQUFjSCxNQUFkLEVBQXNCQyxNQUF0QixFQUE4QkMsUUFBOUIsQ0FBUDtBQUFpRDtBQUNoRyxTQUFTbEIsZ0JBQVQsQ0FBMEJnQixNQUExQixFQUFrQ0MsTUFBbEMsRUFBMENDLFFBQTFDLEVBQW9EO0FBQ3pELE1BQUlQLFVBQVUsOEVBQWdCTyxRQUFoQixFQUEwQixFQUFDTCxrQkFBa0IsSUFBbkIsRUFBMUIsQ0FBZDtBQUNBLFNBQU9aLFNBQVNrQixJQUFULENBQWNILE1BQWQsRUFBc0JDLE1BQXRCLEVBQThCTixPQUE5QixDQUFQO0FBQ0QiLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5pbXBvcnQge2dlbmVyYXRlT3B0aW9uc30gZnJvbSAnLi4vdXRpbC9wYXJhbXMnO1xuXG5leHBvcnQgY29uc3QgbGluZURpZmYgPSBuZXcgRGlmZigpO1xubGluZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICBsZXQgcmV0TGluZXMgPSBbXSxcbiAgICAgIGxpbmVzQW5kTmV3bGluZXMgPSB2YWx1ZS5zcGxpdCgvKFxcbnxcXHJcXG4pLyk7XG5cbiAgLy8gSWdub3JlIHRoZSBmaW5hbCBlbXB0eSB0b2tlbiB0aGF0IG9jY3VycyBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCBhIG5ldyBsaW5lXG4gIGlmICghbGluZXNBbmROZXdsaW5lc1tsaW5lc0FuZE5ld2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgbGluZXNBbmROZXdsaW5lcy5wb3AoKTtcbiAgfVxuXG4gIC8vIE1lcmdlIHRoZSBjb250ZW50IGFuZCBsaW5lIHNlcGFyYXRvcnMgaW50byBzaW5nbGUgdG9rZW5zXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNBbmROZXdsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBsaW5lID0gbGluZXNBbmROZXdsaW5lc1tpXTtcblxuICAgIGlmIChpICUgMiAmJiAhdGhpcy5vcHRpb25zLm5ld2xpbmVJc1Rva2VuKSB7XG4gICAgICByZXRMaW5lc1tyZXRMaW5lcy5sZW5ndGggLSAxXSArPSBsaW5lO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmlnbm9yZVdoaXRlc3BhY2UpIHtcbiAgICAgICAgbGluZSA9IGxpbmUudHJpbSgpO1xuICAgICAgfVxuICAgICAgcmV0TGluZXMucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0TGluZXM7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjaykgeyByZXR1cm4gbGluZURpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spOyB9XG5leHBvcnQgZnVuY3Rpb24gZGlmZlRyaW1tZWRMaW5lcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHtcbiAgbGV0IG9wdGlvbnMgPSBnZW5lcmF0ZU9wdGlvbnMoY2FsbGJhY2ssIHtpZ25vcmVXaGl0ZXNwYWNlOiB0cnVlfSk7XG4gIHJldHVybiBsaW5lRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbn1cbiJdfQ== |
|
|
|
|
|
/***/ }), |
|
/* 6 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports.sentenceDiff = undefined; |
|
exports. /*istanbul ignore end*/diffSentences = diffSentences; |
|
|
|
var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); |
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } |
|
|
|
/*istanbul ignore end*/var sentenceDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/sentenceDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); |
|
sentenceDiff.tokenize = function (value) { |
|
return value.split(/(\S.+?[.!?])(?=\s+|$)/); |
|
}; |
|
|
|
function diffSentences(oldStr, newStr, callback) { |
|
return sentenceDiff.diff(oldStr, newStr, callback); |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL3NlbnRlbmNlLmpzIl0sIm5hbWVzIjpbImRpZmZTZW50ZW5jZXMiLCJzZW50ZW5jZURpZmYiLCJ0b2tlbml6ZSIsInZhbHVlIiwic3BsaXQiLCJvbGRTdHIiLCJuZXdTdHIiLCJjYWxsYmFjayIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Z0NBUWdCQSxhLEdBQUFBLGE7O0FBUmhCOzs7Ozs7dUJBR08sSUFBTUMsdUZBQWUsd0VBQXJCO0FBQ1BBLGFBQWFDLFFBQWIsR0FBd0IsVUFBU0MsS0FBVCxFQUFnQjtBQUN0QyxTQUFPQSxNQUFNQyxLQUFOLENBQVksdUJBQVosQ0FBUDtBQUNELENBRkQ7O0FBSU8sU0FBU0osYUFBVCxDQUF1QkssTUFBdkIsRUFBK0JDLE1BQS9CLEVBQXVDQyxRQUF2QyxFQUFpRDtBQUFFLFNBQU9OLGFBQWFPLElBQWIsQ0FBa0JILE1BQWxCLEVBQTBCQyxNQUExQixFQUFrQ0MsUUFBbEMsQ0FBUDtBQUFxRCIsImZpbGUiOiJzZW50ZW5jZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5cblxuZXhwb3J0IGNvbnN0IHNlbnRlbmNlRGlmZiA9IG5ldyBEaWZmKCk7XG5zZW50ZW5jZURpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhcXFMuKz9bLiE/XSkoPz1cXHMrfCQpLyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZlNlbnRlbmNlcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHsgcmV0dXJuIHNlbnRlbmNlRGlmZi5kaWZmKG9sZFN0ciwgbmV3U3RyLCBjYWxsYmFjayk7IH1cbiJdfQ== |
|
|
|
|
|
/***/ }), |
|
/* 7 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports.cssDiff = undefined; |
|
exports. /*istanbul ignore end*/diffCss = diffCss; |
|
|
|
var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); |
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } |
|
|
|
/*istanbul ignore end*/var cssDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/cssDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); |
|
cssDiff.tokenize = function (value) { |
|
return value.split(/([{}:;,]|\s+)/); |
|
}; |
|
|
|
function diffCss(oldStr, newStr, callback) { |
|
return cssDiff.diff(oldStr, newStr, callback); |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2Nzcy5qcyJdLCJuYW1lcyI6WyJkaWZmQ3NzIiwiY3NzRGlmZiIsInRva2VuaXplIiwidmFsdWUiLCJzcGxpdCIsIm9sZFN0ciIsIm5ld1N0ciIsImNhbGxiYWNrIiwiZGlmZiJdLCJtYXBwaW5ncyI6Ijs7OztnQ0FPZ0JBLE8sR0FBQUEsTzs7QUFQaEI7Ozs7Ozt1QkFFTyxJQUFNQyw2RUFBVSx3RUFBaEI7QUFDUEEsUUFBUUMsUUFBUixHQUFtQixVQUFTQyxLQUFULEVBQWdCO0FBQ2pDLFNBQU9BLE1BQU1DLEtBQU4sQ0FBWSxlQUFaLENBQVA7QUFDRCxDQUZEOztBQUlPLFNBQVNKLE9BQVQsQ0FBaUJLLE1BQWpCLEVBQXlCQyxNQUF6QixFQUFpQ0MsUUFBakMsRUFBMkM7QUFBRSxTQUFPTixRQUFRTyxJQUFSLENBQWFILE1BQWIsRUFBcUJDLE1BQXJCLEVBQTZCQyxRQUE3QixDQUFQO0FBQWdEIiwiZmlsZSI6ImNzcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBjb25zdCBjc3NEaWZmID0gbmV3IERpZmYoKTtcbmNzc0RpZmYudG9rZW5pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUuc3BsaXQoLyhbe306OyxdfFxccyspLyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkNzcyhvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spIHsgcmV0dXJuIGNzc0RpZmYuZGlmZihvbGRTdHIsIG5ld1N0ciwgY2FsbGJhY2spOyB9XG4iXX0= |
|
|
|
|
|
/***/ }), |
|
/* 8 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports.jsonDiff = undefined; |
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; |
|
|
|
exports. /*istanbul ignore end*/diffJson = diffJson; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = canonicalize; |
|
|
|
var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); |
|
|
|
/*istanbul ignore end*/var /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } |
|
|
|
/*istanbul ignore end*/var objectPrototypeToString = Object.prototype.toString; |
|
|
|
var jsonDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/jsonDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); |
|
// Discriminate between two lines of pretty-printed, serialized JSON where one of them has a |
|
// dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: |
|
jsonDiff.useLongestToken = true; |
|
|
|
jsonDiff.tokenize = /*istanbul ignore start*/_line.lineDiff /*istanbul ignore end*/.tokenize; |
|
jsonDiff.castInput = function (value) { |
|
/*istanbul ignore start*/var _options = /*istanbul ignore end*/this.options, |
|
undefinedReplacement = _options.undefinedReplacement, |
|
_options$stringifyRep = _options.stringifyReplacer, |
|
stringifyReplacer = _options$stringifyRep === undefined ? function (k, v) /*istanbul ignore start*/{ |
|
return (/*istanbul ignore end*/typeof v === 'undefined' ? undefinedReplacement : v |
|
); |
|
} : _options$stringifyRep; |
|
|
|
|
|
return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' '); |
|
}; |
|
jsonDiff.equals = function (left, right) { |
|
return (/*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/.prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')) |
|
); |
|
}; |
|
|
|
function diffJson(oldObj, newObj, options) { |
|
return jsonDiff.diff(oldObj, newObj, options); |
|
} |
|
|
|
// This function handles the presence of circular references by bailing out when encountering an |
|
// object that is already on the "stack" of items being processed. Accepts an optional replacer |
|
function canonicalize(obj, stack, replacementStack, replacer, key) { |
|
stack = stack || []; |
|
replacementStack = replacementStack || []; |
|
|
|
if (replacer) { |
|
obj = replacer(key, obj); |
|
} |
|
|
|
var i = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; |
|
|
|
for (i = 0; i < stack.length; i += 1) { |
|
if (stack[i] === obj) { |
|
return replacementStack[i]; |
|
} |
|
} |
|
|
|
var canonicalizedObj = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; |
|
|
|
if ('[object Array]' === objectPrototypeToString.call(obj)) { |
|
stack.push(obj); |
|
canonicalizedObj = new Array(obj.length); |
|
replacementStack.push(canonicalizedObj); |
|
for (i = 0; i < obj.length; i += 1) { |
|
canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key); |
|
} |
|
stack.pop(); |
|
replacementStack.pop(); |
|
return canonicalizedObj; |
|
} |
|
|
|
if (obj && obj.toJSON) { |
|
obj = obj.toJSON(); |
|
} |
|
|
|
if ( /*istanbul ignore start*/(typeof /*istanbul ignore end*/obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj !== null) { |
|
stack.push(obj); |
|
canonicalizedObj = {}; |
|
replacementStack.push(canonicalizedObj); |
|
var sortedKeys = [], |
|
_key = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; |
|
for (_key in obj) { |
|
/* istanbul ignore else */ |
|
if (obj.hasOwnProperty(_key)) { |
|
sortedKeys.push(_key); |
|
} |
|
} |
|
sortedKeys.sort(); |
|
for (i = 0; i < sortedKeys.length; i += 1) { |
|
_key = sortedKeys[i]; |
|
canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key); |
|
} |
|
stack.pop(); |
|
replacementStack.pop(); |
|
} else { |
|
canonicalizedObj = obj; |
|
} |
|
return canonicalizedObj; |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2pzb24uanMiXSwibmFtZXMiOlsiZGlmZkpzb24iLCJjYW5vbmljYWxpemUiLCJvYmplY3RQcm90b3R5cGVUb1N0cmluZyIsIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwianNvbkRpZmYiLCJ1c2VMb25nZXN0VG9rZW4iLCJ0b2tlbml6ZSIsImNhc3RJbnB1dCIsInZhbHVlIiwib3B0aW9ucyIsInVuZGVmaW5lZFJlcGxhY2VtZW50Iiwic3RyaW5naWZ5UmVwbGFjZXIiLCJrIiwidiIsIkpTT04iLCJzdHJpbmdpZnkiLCJlcXVhbHMiLCJsZWZ0IiwicmlnaHQiLCJjYWxsIiwicmVwbGFjZSIsIm9sZE9iaiIsIm5ld09iaiIsImRpZmYiLCJvYmoiLCJzdGFjayIsInJlcGxhY2VtZW50U3RhY2siLCJyZXBsYWNlciIsImtleSIsImkiLCJsZW5ndGgiLCJjYW5vbmljYWxpemVkT2JqIiwicHVzaCIsIkFycmF5IiwicG9wIiwidG9KU09OIiwic29ydGVkS2V5cyIsImhhc093blByb3BlcnR5Iiwic29ydCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztnQ0FxQmdCQSxRLEdBQUFBLFE7eURBSUFDLFksR0FBQUEsWTs7QUF6QmhCOzs7O3VCQUNBOzs7O3VCQUVBLElBQU1DLDBCQUEwQkMsT0FBT0MsU0FBUCxDQUFpQkMsUUFBakQ7O0FBR08sSUFBTUMsK0VBQVcsd0VBQWpCO0FBQ1A7QUFDQTtBQUNBQSxTQUFTQyxlQUFULEdBQTJCLElBQTNCOztBQUVBRCxTQUFTRSxRQUFULEdBQW9CLGdFQUFTQSxRQUE3QjtBQUNBRixTQUFTRyxTQUFULEdBQXFCLFVBQVNDLEtBQVQsRUFBZ0I7QUFBQSxpRUFDK0UsS0FBS0MsT0FEcEY7QUFBQSxNQUM1QkMsb0JBRDRCLFlBQzVCQSxvQkFENEI7QUFBQSx1Q0FDTkMsaUJBRE07QUFBQSxNQUNOQSxpQkFETSx5Q0FDYyxVQUFDQyxDQUFELEVBQUlDLENBQUo7QUFBQSxtQ0FBVSxPQUFPQSxDQUFQLEtBQWEsV0FBYixHQUEyQkgsb0JBQTNCLEdBQWtERztBQUE1RDtBQUFBLEdBRGQ7OztBQUduQyxTQUFPLE9BQU9MLEtBQVAsS0FBaUIsUUFBakIsR0FBNEJBLEtBQTVCLEdBQW9DTSxLQUFLQyxTQUFMLENBQWVoQixhQUFhUyxLQUFiLEVBQW9CLElBQXBCLEVBQTBCLElBQTFCLEVBQWdDRyxpQkFBaEMsQ0FBZixFQUFtRUEsaUJBQW5FLEVBQXNGLElBQXRGLENBQTNDO0FBQ0QsQ0FKRDtBQUtBUCxTQUFTWSxNQUFULEdBQWtCLFVBQVNDLElBQVQsRUFBZUMsS0FBZixFQUFzQjtBQUN0QyxTQUFPLG9FQUFLaEIsU0FBTCxDQUFlYyxNQUFmLENBQXNCRyxJQUF0QixDQUEyQmYsUUFBM0IsRUFBcUNhLEtBQUtHLE9BQUwsQ0FBYSxZQUFiLEVBQTJCLElBQTNCLENBQXJDLEVBQXVFRixNQUFNRSxPQUFOLENBQWMsWUFBZCxFQUE0QixJQUE1QixDQUF2RTtBQUFQO0FBQ0QsQ0FGRDs7QUFJTyxTQUFTdEIsUUFBVCxDQUFrQnVCLE1BQWxCLEVBQTBCQyxNQUExQixFQUFrQ2IsT0FBbEMsRUFBMkM7QUFBRSxTQUFPTCxTQUFTbUIsSUFBVCxDQUFjRixNQUFkLEVBQXNCQyxNQUF0QixFQUE4QmIsT0FBOUIsQ0FBUDtBQUFnRDs7QUFFcEc7QUFDQTtBQUNPLFNBQVNWLFlBQVQsQ0FBc0J5QixHQUF0QixFQUEyQkMsS0FBM0IsRUFBa0NDLGdCQUFsQyxFQUFvREMsUUFBcEQsRUFBOERDLEdBQTlELEVBQW1FO0FBQ3hFSCxVQUFRQSxTQUFTLEVBQWpCO0FBQ0FDLHFCQUFtQkEsb0JBQW9CLEVBQXZDOztBQUVBLE1BQUlDLFFBQUosRUFBYztBQUNaSCxVQUFNRyxTQUFTQyxHQUFULEVBQWNKLEdBQWQsQ0FBTjtBQUNEOztBQUVELE1BQUlLLG1DQUFKOztBQUVBLE9BQUtBLElBQUksQ0FBVCxFQUFZQSxJQUFJSixNQUFNSyxNQUF0QixFQUE4QkQsS0FBSyxDQUFuQyxFQUFzQztBQUNwQyxRQUFJSixNQUFNSSxDQUFOLE1BQWFMLEdBQWpCLEVBQXNCO0FBQ3BCLGFBQU9FLGlCQUFpQkcsQ0FBakIsQ0FBUDtBQUNEO0FBQ0Y7O0FBRUQsTUFBSUUsa0RBQUo7O0FBRUEsTUFBSSxxQkFBcUIvQix3QkFBd0JtQixJQUF4QixDQUE2QkssR0FBN0IsQ0FBekIsRUFBNEQ7QUFDMURDLFVBQU1PLElBQU4sQ0FBV1IsR0FBWDtBQUNBTyx1QkFBbUIsSUFBSUUsS0FBSixDQUFVVCxJQUFJTSxNQUFkLENBQW5CO0FBQ0FKLHFCQUFpQk0sSUFBakIsQ0FBc0JELGdCQUF0QjtBQUNBLFNBQUtGLElBQUksQ0FBVCxFQUFZQSxJQUFJTCxJQUFJTSxNQUFwQixFQUE0QkQsS0FBSyxDQUFqQyxFQUFvQztBQUNsQ0UsdUJBQWlCRixDQUFqQixJQUFzQjlCLGFBQWF5QixJQUFJSyxDQUFKLENBQWIsRUFBcUJKLEtBQXJCLEVBQTRCQyxnQkFBNUIsRUFBOENDLFFBQTlDLEVBQXdEQyxHQUF4RCxDQUF0QjtBQUNEO0FBQ0RILFVBQU1TLEdBQU47QUFDQVIscUJBQWlCUSxHQUFqQjtBQUNBLFdBQU9ILGdCQUFQO0FBQ0Q7O0FBRUQsTUFBSVAsT0FBT0EsSUFBSVcsTUFBZixFQUF1QjtBQUNyQlgsVUFBTUEsSUFBSVcsTUFBSixFQUFOO0FBQ0Q7O0FBRUQsTUFBSSx5REFBT1gsR0FBUCx5Q0FBT0EsR0FBUCxPQUFlLFFBQWYsSUFBMkJBLFFBQVEsSUFBdkMsRUFBNkM7QUFDM0NDLFVBQU1PLElBQU4sQ0FBV1IsR0FBWDtBQUNBTyx1QkFBbUIsRUFBbkI7QUFDQUwscUJBQWlCTSxJQUFqQixDQUFzQkQsZ0JBQXRCO0FBQ0EsUUFBSUssYUFBYSxFQUFqQjtBQUFBLFFBQ0lSLHNDQURKO0FBRUEsU0FBS0EsSUFBTCxJQUFZSixHQUFaLEVBQWlCO0FBQ2Y7QUFDQSxVQUFJQSxJQUFJYSxjQUFKLENBQW1CVCxJQUFuQixDQUFKLEVBQTZCO0FBQzNCUSxtQkFBV0osSUFBWCxDQUFnQkosSUFBaEI7QUFDRDtBQUNGO0FBQ0RRLGVBQVdFLElBQVg7QUFDQSxTQUFLVCxJQUFJLENBQVQsRUFBWUEsSUFBSU8sV0FBV04sTUFBM0IsRUFBbUNELEtBQUssQ0FBeEMsRUFBMkM7QUFDekNELGFBQU1RLFdBQVdQLENBQVgsQ0FBTjtBQUNBRSx1QkFBaUJILElBQWpCLElBQXdCN0IsYUFBYXlCLElBQUlJLElBQUosQ0FBYixFQUF1QkgsS0FBdkIsRUFBOEJDLGdCQUE5QixFQUFnREMsUUFBaEQsRUFBMERDLElBQTFELENBQXhCO0FBQ0Q7QUFDREgsVUFBTVMsR0FBTjtBQUNBUixxQkFBaUJRLEdBQWpCO0FBQ0QsR0FuQkQsTUFtQk87QUFDTEgsdUJBQW1CUCxHQUFuQjtBQUNEO0FBQ0QsU0FBT08sZ0JBQVA7QUFDRCIsImZpbGUiOiJqc29uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpZmYgZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7bGluZURpZmZ9IGZyb20gJy4vbGluZSc7XG5cbmNvbnN0IG9iamVjdFByb3RvdHlwZVRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuXG5leHBvcnQgY29uc3QganNvbkRpZmYgPSBuZXcgRGlmZigpO1xuLy8gRGlzY3JpbWluYXRlIGJldHdlZW4gdHdvIGxpbmVzIG9mIHByZXR0eS1wcmludGVkLCBzZXJpYWxpemVkIEpTT04gd2hlcmUgb25lIG9mIHRoZW0gaGFzIGFcbi8vIGRhbmdsaW5nIGNvbW1hIGFuZCB0aGUgb3RoZXIgZG9lc24ndC4gVHVybnMgb3V0IGluY2x1ZGluZyB0aGUgZGFuZ2xpbmcgY29tbWEgeWllbGRzIHRoZSBuaWNlc3Qgb3V0cHV0OlxuanNvbkRpZmYudXNlTG9uZ2VzdFRva2VuID0gdHJ1ZTtcblxuanNvbkRpZmYudG9rZW5pemUgPSBsaW5lRGlmZi50b2tlbml6ZTtcbmpzb25EaWZmLmNhc3RJbnB1dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gIGNvbnN0IHt1bmRlZmluZWRSZXBsYWNlbWVudCwgc3RyaW5naWZ5UmVwbGFjZXIgPSAoaywgdikgPT4gdHlwZW9mIHYgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkUmVwbGFjZW1lbnQgOiB2fSA9IHRoaXMub3B0aW9ucztcblxuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogSlNPTi5zdHJpbmdpZnkoY2Fub25pY2FsaXplKHZhbHVlLCBudWxsLCBudWxsLCBzdHJpbmdpZnlSZXBsYWNlciksIHN0cmluZ2lmeVJlcGxhY2VyLCAnICAnKTtcbn07XG5qc29uRGlmZi5lcXVhbHMgPSBmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICByZXR1cm4gRGlmZi5wcm90b3R5cGUuZXF1YWxzLmNhbGwoanNvbkRpZmYsIGxlZnQucmVwbGFjZSgvLChbXFxyXFxuXSkvZywgJyQxJyksIHJpZ2h0LnJlcGxhY2UoLywoW1xcclxcbl0pL2csICckMScpKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmSnNvbihvbGRPYmosIG5ld09iaiwgb3B0aW9ucykgeyByZXR1cm4ganNvbkRpZmYuZGlmZihvbGRPYmosIG5ld09iaiwgb3B0aW9ucyk7IH1cblxuLy8gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBwcmVzZW5jZSBvZiBjaXJjdWxhciByZWZlcmVuY2VzIGJ5IGJhaWxpbmcgb3V0IHdoZW4gZW5jb3VudGVyaW5nIGFuXG4vLyBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IG9uIHRoZSBcInN0YWNrXCIgb2YgaXRlbXMgYmVpbmcgcHJvY2Vzc2VkLiBBY2NlcHRzIGFuIG9wdGlvbmFsIHJlcGxhY2VyXG5leHBvcnQgZnVuY3Rpb24gY2Fub25pY2FsaXplKG9iaiwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBrZXkpIHtcbiAgc3RhY2sgPSBzdGFjayB8fCBbXTtcbiAgcmVwbGFjZW1lbnRTdGFjayA9IHJlcGxhY2VtZW50U3RhY2sgfHwgW107XG5cbiAgaWYgKHJlcGxhY2VyKSB7XG4gICAgb2JqID0gcmVwbGFjZXIoa2V5LCBvYmopO1xuICB9XG5cbiAgbGV0IGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IHN0YWNrLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKHN0YWNrW2ldID09PSBvYmopIHtcbiAgICAgIHJldHVybiByZXBsYWNlbWVudFN0YWNrW2ldO1xuICAgIH1cbiAgfVxuXG4gIGxldCBjYW5vbmljYWxpemVkT2JqO1xuXG4gIGlmICgnW29iamVjdCBBcnJheV0nID09PSBvYmplY3RQcm90b3R5cGVUb1N0cmluZy5jYWxsKG9iaikpIHtcbiAgICBzdGFjay5wdXNoKG9iaik7XG4gICAgY2Fub25pY2FsaXplZE9iaiA9IG5ldyBBcnJheShvYmoubGVuZ3RoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnB1c2goY2Fub25pY2FsaXplZE9iaik7XG4gICAgZm9yIChpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgY2Fub25pY2FsaXplZE9ialtpXSA9IGNhbm9uaWNhbGl6ZShvYmpbaV0sIHN0YWNrLCByZXBsYWNlbWVudFN0YWNrLCByZXBsYWNlciwga2V5KTtcbiAgICB9XG4gICAgc3RhY2sucG9wKCk7XG4gICAgcmVwbGFjZW1lbnRTdGFjay5wb3AoKTtcbiAgICByZXR1cm4gY2Fub25pY2FsaXplZE9iajtcbiAgfVxuXG4gIGlmIChvYmogJiYgb2JqLnRvSlNPTikge1xuICAgIG9iaiA9IG9iai50b0pTT04oKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyAmJiBvYmogIT09IG51bGwpIHtcbiAgICBzdGFjay5wdXNoKG9iaik7XG4gICAgY2Fub25pY2FsaXplZE9iaiA9IHt9O1xuICAgIHJlcGxhY2VtZW50U3RhY2sucHVzaChjYW5vbmljYWxpemVkT2JqKTtcbiAgICBsZXQgc29ydGVkS2V5cyA9IFtdLFxuICAgICAgICBrZXk7XG4gICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIHNvcnRlZEtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0ZWRLZXlzLnNvcnQoKTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc29ydGVkS2V5cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAga2V5ID0gc29ydGVkS2V5c1tpXTtcbiAgICAgIGNhbm9uaWNhbGl6ZWRPYmpba2V5XSA9IGNhbm9uaWNhbGl6ZShvYmpba2V5XSwgc3RhY2ssIHJlcGxhY2VtZW50U3RhY2ssIHJlcGxhY2VyLCBrZXkpO1xuICAgIH1cbiAgICBzdGFjay5wb3AoKTtcbiAgICByZXBsYWNlbWVudFN0YWNrLnBvcCgpO1xuICB9IGVsc2Uge1xuICAgIGNhbm9uaWNhbGl6ZWRPYmogPSBvYmo7XG4gIH1cbiAgcmV0dXJuIGNhbm9uaWNhbGl6ZWRPYmo7XG59XG4iXX0= |
|
|
|
|
|
/***/ }), |
|
/* 9 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports.arrayDiff = undefined; |
|
exports. /*istanbul ignore end*/diffArrays = diffArrays; |
|
|
|
var /*istanbul ignore start*/_base = __webpack_require__(1) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/var _base2 = _interopRequireDefault(_base); |
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } |
|
|
|
/*istanbul ignore end*/var arrayDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/arrayDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); |
|
arrayDiff.tokenize = function (value) { |
|
return value.slice(); |
|
}; |
|
arrayDiff.join = arrayDiff.removeEmpty = function (value) { |
|
return value; |
|
}; |
|
|
|
function diffArrays(oldArr, newArr, callback) { |
|
return arrayDiff.diff(oldArr, newArr, callback); |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kaWZmL2FycmF5LmpzIl0sIm5hbWVzIjpbImRpZmZBcnJheXMiLCJhcnJheURpZmYiLCJ0b2tlbml6ZSIsInZhbHVlIiwic2xpY2UiLCJqb2luIiwicmVtb3ZlRW1wdHkiLCJvbGRBcnIiLCJuZXdBcnIiLCJjYWxsYmFjayIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7Z0NBVWdCQSxVLEdBQUFBLFU7O0FBVmhCOzs7Ozs7dUJBRU8sSUFBTUMsaUZBQVksd0VBQWxCO0FBQ1BBLFVBQVVDLFFBQVYsR0FBcUIsVUFBU0MsS0FBVCxFQUFnQjtBQUNuQyxTQUFPQSxNQUFNQyxLQUFOLEVBQVA7QUFDRCxDQUZEO0FBR0FILFVBQVVJLElBQVYsR0FBaUJKLFVBQVVLLFdBQVYsR0FBd0IsVUFBU0gsS0FBVCxFQUFnQjtBQUN2RCxTQUFPQSxLQUFQO0FBQ0QsQ0FGRDs7QUFJTyxTQUFTSCxVQUFULENBQW9CTyxNQUFwQixFQUE0QkMsTUFBNUIsRUFBb0NDLFFBQXBDLEVBQThDO0FBQUUsU0FBT1IsVUFBVVMsSUFBVixDQUFlSCxNQUFmLEVBQXVCQyxNQUF2QixFQUErQkMsUUFBL0IsQ0FBUDtBQUFrRCIsImZpbGUiOiJhcnJheS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaWZmIGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBjb25zdCBhcnJheURpZmYgPSBuZXcgRGlmZigpO1xuYXJyYXlEaWZmLnRva2VuaXplID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLnNsaWNlKCk7XG59O1xuYXJyYXlEaWZmLmpvaW4gPSBhcnJheURpZmYucmVtb3ZlRW1wdHkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkFycmF5cyhvbGRBcnIsIG5ld0FyciwgY2FsbGJhY2spIHsgcmV0dXJuIGFycmF5RGlmZi5kaWZmKG9sZEFyciwgbmV3QXJyLCBjYWxsYmFjayk7IH1cbiJdfQ== |
|
|
|
|
|
/***/ }), |
|
/* 10 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports. /*istanbul ignore end*/applyPatch = applyPatch; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = applyPatches; |
|
|
|
var /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_distanceIterator = __webpack_require__(12) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/var _distanceIterator2 = _interopRequireDefault(_distanceIterator); |
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } |
|
|
|
/*istanbul ignore end*/function applyPatch(source, uniDiff) { |
|
/*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; |
|
|
|
if (typeof uniDiff === 'string') { |
|
uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff); |
|
} |
|
|
|
if (Array.isArray(uniDiff)) { |
|
if (uniDiff.length > 1) { |
|
throw new Error('applyPatch only works with a single input.'); |
|
} |
|
|
|
uniDiff = uniDiff[0]; |
|
} |
|
|
|
// Apply the diff to the input |
|
var lines = source.split(/\r\n|[\n\v\f\r\x85]/), |
|
delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [], |
|
hunks = uniDiff.hunks, |
|
compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) /*istanbul ignore start*/{ |
|
return (/*istanbul ignore end*/line === patchContent |
|
); |
|
}, |
|
errorCount = 0, |
|
fuzzFactor = options.fuzzFactor || 0, |
|
minLine = 0, |
|
offset = 0, |
|
removeEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/, |
|
addEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; |
|
|
|
/** |
|
* Checks if the hunk exactly fits on the provided location |
|
*/ |
|
function hunkFits(hunk, toPos) { |
|
for (var j = 0; j < hunk.lines.length; j++) { |
|
var line = hunk.lines[j], |
|
operation = line.length > 0 ? line[0] : ' ', |
|
content = line.length > 0 ? line.substr(1) : line; |
|
|
|
if (operation === ' ' || operation === '-') { |
|
// Context sanity check |
|
if (!compareLine(toPos + 1, lines[toPos], operation, content)) { |
|
errorCount++; |
|
|
|
if (errorCount > fuzzFactor) { |
|
return false; |
|
} |
|
} |
|
toPos++; |
|
} |
|
} |
|
|
|
return true; |
|
} |
|
|
|
// Search best fit offsets for each hunk based on the previous ones |
|
for (var i = 0; i < hunks.length; i++) { |
|
var hunk = hunks[i], |
|
maxLine = lines.length - hunk.oldLines, |
|
localOffset = 0, |
|
toPos = offset + hunk.oldStart - 1; |
|
|
|
var iterator = /*istanbul ignore start*/(0, _distanceIterator2['default']) /*istanbul ignore end*/(toPos, minLine, maxLine); |
|
|
|
for (; localOffset !== undefined; localOffset = iterator()) { |
|
if (hunkFits(hunk, toPos + localOffset)) { |
|
hunk.offset = offset += localOffset; |
|
break; |
|
} |
|
} |
|
|
|
if (localOffset === undefined) { |
|
return false; |
|
} |
|
|
|
// Set lower text limit to end of the current hunk, so next ones don't try |
|
// to fit over already patched text |
|
minLine = hunk.offset + hunk.oldStart + hunk.oldLines; |
|
} |
|
|
|
// Apply patch hunks |
|
var diffOffset = 0; |
|
for (var _i = 0; _i < hunks.length; _i++) { |
|
var _hunk = hunks[_i], |
|
_toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1; |
|
diffOffset += _hunk.newLines - _hunk.oldLines; |
|
|
|
if (_toPos < 0) { |
|
// Creating a new file |
|
_toPos = 0; |
|
} |
|
|
|
for (var j = 0; j < _hunk.lines.length; j++) { |
|
var line = _hunk.lines[j], |
|
operation = line.length > 0 ? line[0] : ' ', |
|
content = line.length > 0 ? line.substr(1) : line, |
|
delimiter = _hunk.linedelimiters[j]; |
|
|
|
if (operation === ' ') { |
|
_toPos++; |
|
} else if (operation === '-') { |
|
lines.splice(_toPos, 1); |
|
delimiters.splice(_toPos, 1); |
|
/* istanbul ignore else */ |
|
} else if (operation === '+') { |
|
lines.splice(_toPos, 0, content); |
|
delimiters.splice(_toPos, 0, delimiter); |
|
_toPos++; |
|
} else if (operation === '\\') { |
|
var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null; |
|
if (previousOperation === '+') { |
|
removeEOFNL = true; |
|
} else if (previousOperation === '-') { |
|
addEOFNL = true; |
|
} |
|
} |
|
} |
|
} |
|
|
|
// Handle EOFNL insertion/removal |
|
if (removeEOFNL) { |
|
while (!lines[lines.length - 1]) { |
|
lines.pop(); |
|
delimiters.pop(); |
|
} |
|
} else if (addEOFNL) { |
|
lines.push(''); |
|
delimiters.push('\n'); |
|
} |
|
for (var _k = 0; _k < lines.length - 1; _k++) { |
|
lines[_k] = lines[_k] + delimiters[_k]; |
|
} |
|
return lines.join(''); |
|
} |
|
|
|
// Wrapper that supports multiple file patches via callbacks. |
|
function applyPatches(uniDiff, options) { |
|
if (typeof uniDiff === 'string') { |
|
uniDiff = /*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(uniDiff); |
|
} |
|
|
|
var currentIndex = 0; |
|
function processIndex() { |
|
var index = uniDiff[currentIndex++]; |
|
if (!index) { |
|
return options.complete(); |
|
} |
|
|
|
options.loadFile(index, function (err, data) { |
|
if (err) { |
|
return options.complete(err); |
|
} |
|
|
|
var updatedContent = applyPatch(data, index, options); |
|
options.patched(index, updatedContent, function (err) { |
|
if (err) { |
|
return options.complete(err); |
|
} |
|
|
|
processIndex(); |
|
}); |
|
}); |
|
} |
|
processIndex(); |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9hcHBseS5qcyJdLCJuYW1lcyI6WyJhcHBseVBhdGNoIiwiYXBwbHlQYXRjaGVzIiwic291cmNlIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJFcnJvciIsImxpbmVzIiwic3BsaXQiLCJkZWxpbWl0ZXJzIiwibWF0Y2giLCJodW5rcyIsImNvbXBhcmVMaW5lIiwibGluZU51bWJlciIsImxpbmUiLCJvcGVyYXRpb24iLCJwYXRjaENvbnRlbnQiLCJlcnJvckNvdW50IiwiZnV6ekZhY3RvciIsIm1pbkxpbmUiLCJvZmZzZXQiLCJyZW1vdmVFT0ZOTCIsImFkZEVPRk5MIiwiaHVua0ZpdHMiLCJodW5rIiwidG9Qb3MiLCJqIiwiY29udGVudCIsInN1YnN0ciIsImkiLCJtYXhMaW5lIiwib2xkTGluZXMiLCJsb2NhbE9mZnNldCIsIm9sZFN0YXJ0IiwiaXRlcmF0b3IiLCJ1bmRlZmluZWQiLCJkaWZmT2Zmc2V0IiwibmV3TGluZXMiLCJkZWxpbWl0ZXIiLCJsaW5lZGVsaW1pdGVycyIsInNwbGljZSIsInByZXZpb3VzT3BlcmF0aW9uIiwicG9wIiwicHVzaCIsIl9rIiwiam9pbiIsImN1cnJlbnRJbmRleCIsInByb2Nlc3NJbmRleCIsImluZGV4IiwiY29tcGxldGUiLCJsb2FkRmlsZSIsImVyciIsImRhdGEiLCJ1cGRhdGVkQ29udGVudCIsInBhdGNoZWQiXSwibWFwcGluZ3MiOiI7OztnQ0FHZ0JBLFUsR0FBQUEsVTt5REFvSUFDLFksR0FBQUEsWTs7QUF2SWhCOztBQUNBOzs7Ozs7dUJBRU8sU0FBU0QsVUFBVCxDQUFvQkUsTUFBcEIsRUFBNEJDLE9BQTVCLEVBQW1EO0FBQUEsc0RBQWRDLE9BQWMsdUVBQUosRUFBSTs7QUFDeEQsTUFBSSxPQUFPRCxPQUFQLEtBQW1CLFFBQXZCLEVBQWlDO0FBQy9CQSxjQUFVLHdFQUFXQSxPQUFYLENBQVY7QUFDRDs7QUFFRCxNQUFJRSxNQUFNQyxPQUFOLENBQWNILE9BQWQsQ0FBSixFQUE0QjtBQUMxQixRQUFJQSxRQUFRSSxNQUFSLEdBQWlCLENBQXJCLEVBQXdCO0FBQ3RCLFlBQU0sSUFBSUMsS0FBSixDQUFVLDRDQUFWLENBQU47QUFDRDs7QUFFREwsY0FBVUEsUUFBUSxDQUFSLENBQVY7QUFDRDs7QUFFRDtBQUNBLE1BQUlNLFFBQVFQLE9BQU9RLEtBQVAsQ0FBYSxxQkFBYixDQUFaO0FBQUEsTUFDSUMsYUFBYVQsT0FBT1UsS0FBUCxDQUFhLHNCQUFiLEtBQXdDLEVBRHpEO0FBQUEsTUFFSUMsUUFBUVYsUUFBUVUsS0FGcEI7QUFBQSxNQUlJQyxjQUFjVixRQUFRVSxXQUFSLElBQXdCLFVBQUNDLFVBQUQsRUFBYUMsSUFBYixFQUFtQkMsU0FBbkIsRUFBOEJDLFlBQTlCO0FBQUEsbUNBQStDRixTQUFTRTtBQUF4RDtBQUFBLEdBSjFDO0FBQUEsTUFLSUMsYUFBYSxDQUxqQjtBQUFBLE1BTUlDLGFBQWFoQixRQUFRZ0IsVUFBUixJQUFzQixDQU52QztBQUFBLE1BT0lDLFVBQVUsQ0FQZDtBQUFBLE1BUUlDLFNBQVMsQ0FSYjtBQUFBLE1BVUlDLDZDQVZKO0FBQUEsTUFXSUMsMENBWEo7O0FBYUE7OztBQUdBLFdBQVNDLFFBQVQsQ0FBa0JDLElBQWxCLEVBQXdCQyxLQUF4QixFQUErQjtBQUM3QixTQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUYsS0FBS2pCLEtBQUwsQ0FBV0YsTUFBL0IsRUFBdUNxQixHQUF2QyxFQUE0QztBQUMxQyxVQUFJWixPQUFPVSxLQUFLakIsS0FBTCxDQUFXbUIsQ0FBWCxDQUFYO0FBQUEsVUFDSVgsWUFBYUQsS0FBS1QsTUFBTCxHQUFjLENBQWQsR0FBa0JTLEtBQUssQ0FBTCxDQUFsQixHQUE0QixHQUQ3QztBQUFBLFVBRUlhLFVBQVdiLEtBQUtULE1BQUwsR0FBYyxDQUFkLEdBQWtCUyxLQUFLYyxNQUFMLENBQVksQ0FBWixDQUFsQixHQUFtQ2QsSUFGbEQ7O0FBSUEsVUFBSUMsY0FBYyxHQUFkLElBQXFCQSxjQUFjLEdBQXZDLEVBQTRDO0FBQzFDO0FBQ0EsWUFBSSxDQUFDSCxZQUFZYSxRQUFRLENBQXBCLEVBQXVCbEIsTUFBTWtCLEtBQU4sQ0FBdkIsRUFBcUNWLFNBQXJDLEVBQWdEWSxPQUFoRCxDQUFMLEVBQStEO0FBQzdEVjs7QUFFQSxjQUFJQSxhQUFhQyxVQUFqQixFQUE2QjtBQUMzQixtQkFBTyxLQUFQO0FBQ0Q7QUFDRjtBQUNETztBQUNEO0FBQ0Y7O0FBRUQsV0FBTyxJQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxPQUFLLElBQUlJLElBQUksQ0FBYixFQUFnQkEsSUFBSWxCLE1BQU1OLE1BQTFCLEVBQWtDd0IsR0FBbEMsRUFBdUM7QUFDckMsUUFBSUwsT0FBT2IsTUFBTWtCLENBQU4sQ0FBWDtBQUFBLFFBQ0lDLFVBQVV2QixNQUFNRixNQUFOLEdBQWVtQixLQUFLTyxRQURsQztBQUFBLFFBRUlDLGNBQWMsQ0FGbEI7QUFBQSxRQUdJUCxRQUFRTCxTQUFTSSxLQUFLUyxRQUFkLEdBQXlCLENBSHJDOztBQUtBLFFBQUlDLFdBQVcsb0ZBQWlCVCxLQUFqQixFQUF3Qk4sT0FBeEIsRUFBaUNXLE9BQWpDLENBQWY7O0FBRUEsV0FBT0UsZ0JBQWdCRyxTQUF2QixFQUFrQ0gsY0FBY0UsVUFBaEQsRUFBNEQ7QUFDMUQsVUFBSVgsU0FBU0MsSUFBVCxFQUFlQyxRQUFRTyxXQUF2QixDQUFKLEVBQXlDO0FBQ3ZDUixhQUFLSixNQUFMLEdBQWNBLFVBQVVZLFdBQXhCO0FBQ0E7QUFDRDtBQUNGOztBQUVELFFBQUlBLGdCQUFnQkcsU0FBcEIsRUFBK0I7QUFDN0IsYUFBTyxLQUFQO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBaEIsY0FBVUssS0FBS0osTUFBTCxHQUFjSSxLQUFLUyxRQUFuQixHQUE4QlQsS0FBS08sUUFBN0M7QUFDRDs7QUFFRDtBQUNBLE1BQUlLLGFBQWEsQ0FBakI7QUFDQSxPQUFLLElBQUlQLEtBQUksQ0FBYixFQUFnQkEsS0FBSWxCLE1BQU1OLE1BQTFCLEVBQWtDd0IsSUFBbEMsRUFBdUM7QUFDckMsUUFBSUwsUUFBT2IsTUFBTWtCLEVBQU4sQ0FBWDtBQUFBLFFBQ0lKLFNBQVFELE1BQUtTLFFBQUwsR0FBZ0JULE1BQUtKLE1BQXJCLEdBQThCZ0IsVUFBOUIsR0FBMkMsQ0FEdkQ7QUFFQUEsa0JBQWNaLE1BQUthLFFBQUwsR0FBZ0JiLE1BQUtPLFFBQW5DOztBQUVBLFFBQUlOLFNBQVEsQ0FBWixFQUFlO0FBQUU7QUFDZkEsZUFBUSxDQUFSO0FBQ0Q7O0FBRUQsU0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLE1BQUtqQixLQUFMLENBQVdGLE1BQS9CLEVBQXVDcUIsR0FBdkMsRUFBNEM7QUFDMUMsVUFBSVosT0FBT1UsTUFBS2pCLEtBQUwsQ0FBV21CLENBQVgsQ0FBWDtBQUFBLFVBQ0lYLFlBQWFELEtBQUtULE1BQUwsR0FBYyxDQUFkLEdBQWtCUyxLQUFLLENBQUwsQ0FBbEIsR0FBNEIsR0FEN0M7QUFBQSxVQUVJYSxVQUFXYixLQUFLVCxNQUFMLEdBQWMsQ0FBZCxHQUFrQlMsS0FBS2MsTUFBTCxDQUFZLENBQVosQ0FBbEIsR0FBbUNkLElBRmxEO0FBQUEsVUFHSXdCLFlBQVlkLE1BQUtlLGNBQUwsQ0FBb0JiLENBQXBCLENBSGhCOztBQUtBLFVBQUlYLGNBQWMsR0FBbEIsRUFBdUI7QUFDckJVO0FBQ0QsT0FGRCxNQUVPLElBQUlWLGNBQWMsR0FBbEIsRUFBdUI7QUFDNUJSLGNBQU1pQyxNQUFOLENBQWFmLE1BQWIsRUFBb0IsQ0FBcEI7QUFDQWhCLG1CQUFXK0IsTUFBWCxDQUFrQmYsTUFBbEIsRUFBeUIsQ0FBekI7QUFDRjtBQUNDLE9BSk0sTUFJQSxJQUFJVixjQUFjLEdBQWxCLEVBQXVCO0FBQzVCUixjQUFNaUMsTUFBTixDQUFhZixNQUFiLEVBQW9CLENBQXBCLEVBQXVCRSxPQUF2QjtBQUNBbEIsbUJBQVcrQixNQUFYLENBQWtCZixNQUFsQixFQUF5QixDQUF6QixFQUE0QmEsU0FBNUI7QUFDQWI7QUFDRCxPQUpNLE1BSUEsSUFBSVYsY0FBYyxJQUFsQixFQUF3QjtBQUM3QixZQUFJMEIsb0JBQW9CakIsTUFBS2pCLEtBQUwsQ0FBV21CLElBQUksQ0FBZixJQUFvQkYsTUFBS2pCLEtBQUwsQ0FBV21CLElBQUksQ0FBZixFQUFrQixDQUFsQixDQUFwQixHQUEyQyxJQUFuRTtBQUNBLFlBQUllLHNCQUFzQixHQUExQixFQUErQjtBQUM3QnBCLHdCQUFjLElBQWQ7QUFDRCxTQUZELE1BRU8sSUFBSW9CLHNCQUFzQixHQUExQixFQUErQjtBQUNwQ25CLHFCQUFXLElBQVg7QUFDRDtBQUNGO0FBQ0Y7QUFDRjs7QUFFRDtBQUNBLE1BQUlELFdBQUosRUFBaUI7QUFDZixXQUFPLENBQUNkLE1BQU1BLE1BQU1GLE1BQU4sR0FBZSxDQUFyQixDQUFSLEVBQWlDO0FBQy9CRSxZQUFNbUMsR0FBTjtBQUNBakMsaUJBQVdpQyxHQUFYO0FBQ0Q7QUFDRixHQUxELE1BS08sSUFBSXBCLFFBQUosRUFBYztBQUNuQmYsVUFBTW9DLElBQU4sQ0FBVyxFQUFYO0FBQ0FsQyxlQUFXa0MsSUFBWCxDQUFnQixJQUFoQjtBQUNEO0FBQ0QsT0FBSyxJQUFJQyxLQUFLLENBQWQsRUFBaUJBLEtBQUtyQyxNQUFNRixNQUFOLEdBQWUsQ0FBckMsRUFBd0N1QyxJQUF4QyxFQUE4QztBQUM1Q3JDLFVBQU1xQyxFQUFOLElBQVlyQyxNQUFNcUMsRUFBTixJQUFZbkMsV0FBV21DLEVBQVgsQ0FBeEI7QUFDRDtBQUNELFNBQU9yQyxNQUFNc0MsSUFBTixDQUFXLEVBQVgsQ0FBUDtBQUNEOztBQUVEO0FBQ08sU0FBUzlDLFlBQVQsQ0FBc0JFLE9BQXRCLEVBQStCQyxPQUEvQixFQUF3QztBQUM3QyxNQUFJLE9BQU9ELE9BQVAsS0FBbUIsUUFBdkIsRUFBaUM7QUFDL0JBLGNBQVUsd0VBQVdBLE9BQVgsQ0FBVjtBQUNEOztBQUVELE1BQUk2QyxlQUFlLENBQW5CO0FBQ0EsV0FBU0MsWUFBVCxHQUF3QjtBQUN0QixRQUFJQyxRQUFRL0MsUUFBUTZDLGNBQVIsQ0FBWjtBQUNBLFFBQUksQ0FBQ0UsS0FBTCxFQUFZO0FBQ1YsYUFBTzlDLFFBQVErQyxRQUFSLEVBQVA7QUFDRDs7QUFFRC9DLFlBQVFnRCxRQUFSLENBQWlCRixLQUFqQixFQUF3QixVQUFTRyxHQUFULEVBQWNDLElBQWQsRUFBb0I7QUFDMUMsVUFBSUQsR0FBSixFQUFTO0FBQ1AsZUFBT2pELFFBQVErQyxRQUFSLENBQWlCRSxHQUFqQixDQUFQO0FBQ0Q7O0FBRUQsVUFBSUUsaUJBQWlCdkQsV0FBV3NELElBQVgsRUFBaUJKLEtBQWpCLEVBQXdCOUMsT0FBeEIsQ0FBckI7QUFDQUEsY0FBUW9ELE9BQVIsQ0FBZ0JOLEtBQWhCLEVBQXVCSyxjQUF2QixFQUF1QyxVQUFTRixHQUFULEVBQWM7QUFDbkQsWUFBSUEsR0FBSixFQUFTO0FBQ1AsaUJBQU9qRCxRQUFRK0MsUUFBUixDQUFpQkUsR0FBakIsQ0FBUDtBQUNEOztBQUVESjtBQUNELE9BTkQ7QUFPRCxLQWJEO0FBY0Q7QUFDREE7QUFDRCIsImZpbGUiOiJhcHBseS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cGFyc2VQYXRjaH0gZnJvbSAnLi9wYXJzZSc7XG5pbXBvcnQgZGlzdGFuY2VJdGVyYXRvciBmcm9tICcuLi91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2goc291cmNlLCB1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKHR5cGVvZiB1bmlEaWZmID09PSAnc3RyaW5nJykge1xuICAgIHVuaURpZmYgPSBwYXJzZVBhdGNoKHVuaURpZmYpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodW5pRGlmZikpIHtcbiAgICBpZiAodW5pRGlmZi5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FwcGx5UGF0Y2ggb25seSB3b3JrcyB3aXRoIGEgc2luZ2xlIGlucHV0LicpO1xuICAgIH1cblxuICAgIHVuaURpZmYgPSB1bmlEaWZmWzBdO1xuICB9XG5cbiAgLy8gQXBwbHkgdGhlIGRpZmYgdG8gdGhlIGlucHV0XG4gIGxldCBsaW5lcyA9IHNvdXJjZS5zcGxpdCgvXFxyXFxufFtcXG5cXHZcXGZcXHJcXHg4NV0vKSxcbiAgICAgIGRlbGltaXRlcnMgPSBzb3VyY2UubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgaHVua3MgPSB1bmlEaWZmLmh1bmtzLFxuXG4gICAgICBjb21wYXJlTGluZSA9IG9wdGlvbnMuY29tcGFyZUxpbmUgfHwgKChsaW5lTnVtYmVyLCBsaW5lLCBvcGVyYXRpb24sIHBhdGNoQ29udGVudCkgPT4gbGluZSA9PT0gcGF0Y2hDb250ZW50KSxcbiAgICAgIGVycm9yQ291bnQgPSAwLFxuICAgICAgZnV6ekZhY3RvciA9IG9wdGlvbnMuZnV6ekZhY3RvciB8fCAwLFxuICAgICAgbWluTGluZSA9IDAsXG4gICAgICBvZmZzZXQgPSAwLFxuXG4gICAgICByZW1vdmVFT0ZOTCxcbiAgICAgIGFkZEVPRk5MO1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGh1bmsgZXhhY3RseSBmaXRzIG9uIHRoZSBwcm92aWRlZCBsb2NhdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gaHVua0ZpdHMoaHVuaywgdG9Qb3MpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGh1bmsubGluZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGxldCBsaW5lID0gaHVuay5saW5lc1tqXSxcbiAgICAgICAgICBvcGVyYXRpb24gPSAobGluZS5sZW5ndGggPiAwID8gbGluZVswXSA6ICcgJyksXG4gICAgICAgICAgY29udGVudCA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lLnN1YnN0cigxKSA6IGxpbmUpO1xuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnLScpIHtcbiAgICAgICAgLy8gQ29udGV4dCBzYW5pdHkgY2hlY2tcbiAgICAgICAgaWYgKCFjb21wYXJlTGluZSh0b1BvcyArIDEsIGxpbmVzW3RvUG9zXSwgb3BlcmF0aW9uLCBjb250ZW50KSkge1xuICAgICAgICAgIGVycm9yQ291bnQrKztcblxuICAgICAgICAgIGlmIChlcnJvckNvdW50ID4gZnV6ekZhY3Rvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0b1BvcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gU2VhcmNoIGJlc3QgZml0IG9mZnNldHMgZm9yIGVhY2ggaHVuayBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb25lc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGh1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGh1bmsgPSBodW5rc1tpXSxcbiAgICAgICAgbWF4TGluZSA9IGxpbmVzLmxlbmd0aCAtIGh1bmsub2xkTGluZXMsXG4gICAgICAgIGxvY2FsT2Zmc2V0ID0gMCxcbiAgICAgICAgdG9Qb3MgPSBvZmZzZXQgKyBodW5rLm9sZFN0YXJ0IC0gMTtcblxuICAgIGxldCBpdGVyYXRvciA9IGRpc3RhbmNlSXRlcmF0b3IodG9Qb3MsIG1pbkxpbmUsIG1heExpbmUpO1xuXG4gICAgZm9yICg7IGxvY2FsT2Zmc2V0ICE9PSB1bmRlZmluZWQ7IGxvY2FsT2Zmc2V0ID0gaXRlcmF0b3IoKSkge1xuICAgICAgaWYgKGh1bmtGaXRzKGh1bmssIHRvUG9zICsgbG9jYWxPZmZzZXQpKSB7XG4gICAgICAgIGh1bmsub2Zmc2V0ID0gb2Zmc2V0ICs9IGxvY2FsT2Zmc2V0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobG9jYWxPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNldCBsb3dlciB0ZXh0IGxpbWl0IHRvIGVuZCBvZiB0aGUgY3VycmVudCBodW5rLCBzbyBuZXh0IG9uZXMgZG9uJ3QgdHJ5XG4gICAgLy8gdG8gZml0IG92ZXIgYWxyZWFkeSBwYXRjaGVkIHRleHRcbiAgICBtaW5MaW5lID0gaHVuay5vZmZzZXQgKyBodW5rLm9sZFN0YXJ0ICsgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIC8vIEFwcGx5IHBhdGNoIGh1bmtzXG4gIGxldCBkaWZmT2Zmc2V0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBodW5rcy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBodW5rID0gaHVua3NbaV0sXG4gICAgICAgIHRvUG9zID0gaHVuay5vbGRTdGFydCArIGh1bmsub2Zmc2V0ICsgZGlmZk9mZnNldCAtIDE7XG4gICAgZGlmZk9mZnNldCArPSBodW5rLm5ld0xpbmVzIC0gaHVuay5vbGRMaW5lcztcblxuICAgIGlmICh0b1BvcyA8IDApIHsgLy8gQ3JlYXRpbmcgYSBuZXcgZmlsZVxuICAgICAgdG9Qb3MgPSAwO1xuICAgIH1cblxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaHVuay5saW5lcy5sZW5ndGg7IGorKykge1xuICAgICAgbGV0IGxpbmUgPSBodW5rLmxpbmVzW2pdLFxuICAgICAgICAgIG9wZXJhdGlvbiA9IChsaW5lLmxlbmd0aCA+IDAgPyBsaW5lWzBdIDogJyAnKSxcbiAgICAgICAgICBjb250ZW50ID0gKGxpbmUubGVuZ3RoID4gMCA/IGxpbmUuc3Vic3RyKDEpIDogbGluZSksXG4gICAgICAgICAgZGVsaW1pdGVyID0gaHVuay5saW5lZGVsaW1pdGVyc1tqXTtcblxuICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJyAnKSB7XG4gICAgICAgIHRvUG9zKys7XG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJy0nKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMSk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAxKTtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgIGxpbmVzLnNwbGljZSh0b1BvcywgMCwgY29udGVudCk7XG4gICAgICAgIGRlbGltaXRlcnMuc3BsaWNlKHRvUG9zLCAwLCBkZWxpbWl0ZXIpO1xuICAgICAgICB0b1BvcysrO1xuICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICdcXFxcJykge1xuICAgICAgICBsZXQgcHJldmlvdXNPcGVyYXRpb24gPSBodW5rLmxpbmVzW2ogLSAxXSA/IGh1bmsubGluZXNbaiAtIDFdWzBdIDogbnVsbDtcbiAgICAgICAgaWYgKHByZXZpb3VzT3BlcmF0aW9uID09PSAnKycpIHtcbiAgICAgICAgICByZW1vdmVFT0ZOTCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNPcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIGFkZEVPRk5MID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSBFT0ZOTCBpbnNlcnRpb24vcmVtb3ZhbFxuICBpZiAocmVtb3ZlRU9GTkwpIHtcbiAgICB3aGlsZSAoIWxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdKSB7XG4gICAgICBsaW5lcy5wb3AoKTtcbiAgICAgIGRlbGltaXRlcnMucG9wKCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGFkZEVPRk5MKSB7XG4gICAgbGluZXMucHVzaCgnJyk7XG4gICAgZGVsaW1pdGVycy5wdXNoKCdcXG4nKTtcbiAgfVxuICBmb3IgKGxldCBfayA9IDA7IF9rIDwgbGluZXMubGVuZ3RoIC0gMTsgX2srKykge1xuICAgIGxpbmVzW19rXSA9IGxpbmVzW19rXSArIGRlbGltaXRlcnNbX2tdO1xuICB9XG4gIHJldHVybiBsaW5lcy5qb2luKCcnKTtcbn1cblxuLy8gV3JhcHBlciB0aGF0IHN1cHBvcnRzIG11bHRpcGxlIGZpbGUgcGF0Y2hlcyB2aWEgY2FsbGJhY2tzLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hlcyh1bmlEaWZmLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgdW5pRGlmZiA9PT0gJ3N0cmluZycpIHtcbiAgICB1bmlEaWZmID0gcGFyc2VQYXRjaCh1bmlEaWZmKTtcbiAgfVxuXG4gIGxldCBjdXJyZW50SW5kZXggPSAwO1xuICBmdW5jdGlvbiBwcm9jZXNzSW5kZXgoKSB7XG4gICAgbGV0IGluZGV4ID0gdW5pRGlmZltjdXJyZW50SW5kZXgrK107XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBvcHRpb25zLmxvYWRGaWxlKGluZGV4LCBmdW5jdGlvbihlcnIsIGRhdGEpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuY29tcGxldGUoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHVwZGF0ZWRDb250ZW50ID0gYXBwbHlQYXRjaChkYXRhLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBhdGNoZWQoaW5kZXgsIHVwZGF0ZWRDb250ZW50LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBvcHRpb25zLmNvbXBsZXRlKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzSW5kZXgoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHByb2Nlc3NJbmRleCgpO1xufVxuIl19 |
|
|
|
|
|
/***/ }), |
|
/* 11 */ |
|
/***/ (function(module, exports) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports. /*istanbul ignore end*/parsePatch = parsePatch; |
|
function parsePatch(uniDiff) { |
|
/*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
|
|
|
var diffstr = uniDiff.split(/\r\n|[\n\v\f\r\x85]/), |
|
delimiters = uniDiff.match(/\r\n|[\n\v\f\r\x85]/g) || [], |
|
list = [], |
|
i = 0; |
|
|
|
function parseIndex() { |
|
var index = {}; |
|
list.push(index); |
|
|
|
// Parse diff metadata |
|
while (i < diffstr.length) { |
|
var line = diffstr[i]; |
|
|
|
// File header found, end parsing diff metadata |
|
if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) { |
|
break; |
|
} |
|
|
|
// Diff index |
|
var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line); |
|
if (header) { |
|
index.index = header[1]; |
|
} |
|
|
|
i++; |
|
} |
|
|
|
// Parse file headers if they are defined. Unified diff requires them, but |
|
// there's no technical issues to have an isolated hunk without file header |
|
parseFileHeader(index); |
|
parseFileHeader(index); |
|
|
|
// Parse hunks |
|
index.hunks = []; |
|
|
|
while (i < diffstr.length) { |
|
var _line = diffstr[i]; |
|
|
|
if (/^(Index:|diff|\-\-\-|\+\+\+)\s/.test(_line)) { |
|
break; |
|
} else if (/^@@/.test(_line)) { |
|
index.hunks.push(parseHunk()); |
|
} else if (_line && options.strict) { |
|
// Ignore unexpected content unless in strict mode |
|
throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line)); |
|
} else { |
|
i++; |
|
} |
|
} |
|
} |
|
|
|
// Parses the --- and +++ headers, if none are found, no lines |
|
// are consumed. |
|
function parseFileHeader(index) { |
|
var fileHeader = /^(---|\+\+\+)\s+(.*)$/.exec(diffstr[i]); |
|
if (fileHeader) { |
|
var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new'; |
|
var data = fileHeader[2].split('\t', 2); |
|
var fileName = data[0].replace(/\\\\/g, '\\'); |
|
if (/^".*"$/.test(fileName)) { |
|
fileName = fileName.substr(1, fileName.length - 2); |
|
} |
|
index[keyPrefix + 'FileName'] = fileName; |
|
index[keyPrefix + 'Header'] = (data[1] || '').trim(); |
|
|
|
i++; |
|
} |
|
} |
|
|
|
// Parses a hunk |
|
// This assumes that we are at the start of a hunk. |
|
function parseHunk() { |
|
var chunkHeaderIndex = i, |
|
chunkHeaderLine = diffstr[i++], |
|
chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/); |
|
|
|
var hunk = { |
|
oldStart: +chunkHeader[1], |
|
oldLines: +chunkHeader[2] || 1, |
|
newStart: +chunkHeader[3], |
|
newLines: +chunkHeader[4] || 1, |
|
lines: [], |
|
linedelimiters: [] |
|
}; |
|
|
|
var addCount = 0, |
|
removeCount = 0; |
|
for (; i < diffstr.length; i++) { |
|
// Lines starting with '---' could be mistaken for the "remove line" operation |
|
// But they could be the header for the next file. Therefore prune such cases out. |
|
if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) { |
|
break; |
|
} |
|
var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0]; |
|
|
|
if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') { |
|
hunk.lines.push(diffstr[i]); |
|
hunk.linedelimiters.push(delimiters[i] || '\n'); |
|
|
|
if (operation === '+') { |
|
addCount++; |
|
} else if (operation === '-') { |
|
removeCount++; |
|
} else if (operation === ' ') { |
|
addCount++; |
|
removeCount++; |
|
} |
|
} else { |
|
break; |
|
} |
|
} |
|
|
|
// Handle the empty block count case |
|
if (!addCount && hunk.newLines === 1) { |
|
hunk.newLines = 0; |
|
} |
|
if (!removeCount && hunk.oldLines === 1) { |
|
hunk.oldLines = 0; |
|
} |
|
|
|
// Perform optional sanity checking |
|
if (options.strict) { |
|
if (addCount !== hunk.newLines) { |
|
throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); |
|
} |
|
if (removeCount !== hunk.oldLines) { |
|
throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); |
|
} |
|
} |
|
|
|
return hunk; |
|
} |
|
|
|
while (i < diffstr.length) { |
|
parseIndex(); |
|
} |
|
|
|
return list; |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9wYXJzZS5qcyJdLCJuYW1lcyI6WyJwYXJzZVBhdGNoIiwidW5pRGlmZiIsIm9wdGlvbnMiLCJkaWZmc3RyIiwic3BsaXQiLCJkZWxpbWl0ZXJzIiwibWF0Y2giLCJsaXN0IiwiaSIsInBhcnNlSW5kZXgiLCJpbmRleCIsInB1c2giLCJsZW5ndGgiLCJsaW5lIiwidGVzdCIsImhlYWRlciIsImV4ZWMiLCJwYXJzZUZpbGVIZWFkZXIiLCJodW5rcyIsInBhcnNlSHVuayIsInN0cmljdCIsIkVycm9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImZpbGVIZWFkZXIiLCJrZXlQcmVmaXgiLCJkYXRhIiwiZmlsZU5hbWUiLCJyZXBsYWNlIiwic3Vic3RyIiwidHJpbSIsImNodW5rSGVhZGVySW5kZXgiLCJjaHVua0hlYWRlckxpbmUiLCJjaHVua0hlYWRlciIsImh1bmsiLCJvbGRTdGFydCIsIm9sZExpbmVzIiwibmV3U3RhcnQiLCJuZXdMaW5lcyIsImxpbmVzIiwibGluZWRlbGltaXRlcnMiLCJhZGRDb3VudCIsInJlbW92ZUNvdW50IiwiaW5kZXhPZiIsIm9wZXJhdGlvbiJdLCJtYXBwaW5ncyI6Ijs7O2dDQUFnQkEsVSxHQUFBQSxVO0FBQVQsU0FBU0EsVUFBVCxDQUFvQkMsT0FBcEIsRUFBMkM7QUFBQSxzREFBZEMsT0FBYyx1RUFBSixFQUFJOztBQUNoRCxNQUFJQyxVQUFVRixRQUFRRyxLQUFSLENBQWMscUJBQWQsQ0FBZDtBQUFBLE1BQ0lDLGFBQWFKLFFBQVFLLEtBQVIsQ0FBYyxzQkFBZCxLQUF5QyxFQUQxRDtBQUFBLE1BRUlDLE9BQU8sRUFGWDtBQUFBLE1BR0lDLElBQUksQ0FIUjs7QUFLQSxXQUFTQyxVQUFULEdBQXNCO0FBQ3BCLFFBQUlDLFFBQVEsRUFBWjtBQUNBSCxTQUFLSSxJQUFMLENBQVVELEtBQVY7O0FBRUE7QUFDQSxXQUFPRixJQUFJTCxRQUFRUyxNQUFuQixFQUEyQjtBQUN6QixVQUFJQyxPQUFPVixRQUFRSyxDQUFSLENBQVg7O0FBRUE7QUFDQSxVQUFJLHdCQUF3Qk0sSUFBeEIsQ0FBNkJELElBQTdCLENBQUosRUFBd0M7QUFDdEM7QUFDRDs7QUFFRDtBQUNBLFVBQUlFLFNBQVUsMENBQUQsQ0FBNkNDLElBQTdDLENBQWtESCxJQUFsRCxDQUFiO0FBQ0EsVUFBSUUsTUFBSixFQUFZO0FBQ1ZMLGNBQU1BLEtBQU4sR0FBY0ssT0FBTyxDQUFQLENBQWQ7QUFDRDs7QUFFRFA7QUFDRDs7QUFFRDtBQUNBO0FBQ0FTLG9CQUFnQlAsS0FBaEI7QUFDQU8sb0JBQWdCUCxLQUFoQjs7QUFFQTtBQUNBQSxVQUFNUSxLQUFOLEdBQWMsRUFBZDs7QUFFQSxXQUFPVixJQUFJTCxRQUFRUyxNQUFuQixFQUEyQjtBQUN6QixVQUFJQyxRQUFPVixRQUFRSyxDQUFSLENBQVg7O0FBRUEsVUFBSSxpQ0FBaUNNLElBQWpDLENBQXNDRCxLQUF0QyxDQUFKLEVBQWlEO0FBQy9DO0FBQ0QsT0FGRCxNQUVPLElBQUksTUFBTUMsSUFBTixDQUFXRCxLQUFYLENBQUosRUFBc0I7QUFDM0JILGNBQU1RLEtBQU4sQ0FBWVAsSUFBWixDQUFpQlEsV0FBakI7QUFDRCxPQUZNLE1BRUEsSUFBSU4sU0FBUVgsUUFBUWtCLE1BQXBCLEVBQTRCO0FBQ2pDO0FBQ0EsY0FBTSxJQUFJQyxLQUFKLENBQVUsbUJBQW1CYixJQUFJLENBQXZCLElBQTRCLEdBQTVCLEdBQWtDYyxLQUFLQyxTQUFMLENBQWVWLEtBQWYsQ0FBNUMsQ0FBTjtBQUNELE9BSE0sTUFHQTtBQUNMTDtBQUNEO0FBQ0Y7QUFDRjs7QUFFRDtBQUNBO0FBQ0EsV0FBU1MsZUFBVCxDQUF5QlAsS0FBekIsRUFBZ0M7QUFDOUIsUUFBTWMsYUFBYyx1QkFBRCxDQUEwQlIsSUFBMUIsQ0FBK0JiLFFBQVFLLENBQVIsQ0FBL0IsQ0FBbkI7QUFDQSxRQUFJZ0IsVUFBSixFQUFnQjtBQUNkLFVBQUlDLFlBQVlELFdBQVcsQ0FBWCxNQUFrQixLQUFsQixHQUEwQixLQUExQixHQUFrQyxLQUFsRDtBQUNBLFVBQU1FLE9BQU9GLFdBQVcsQ0FBWCxFQUFjcEIsS0FBZCxDQUFvQixJQUFwQixFQUEwQixDQUExQixDQUFiO0FBQ0EsVUFBSXVCLFdBQVdELEtBQUssQ0FBTCxFQUFRRSxPQUFSLENBQWdCLE9BQWhCLEVBQXlCLElBQXpCLENBQWY7QUFDQSxVQUFJLFNBQVNkLElBQVQsQ0FBY2EsUUFBZCxDQUFKLEVBQTZCO0FBQzNCQSxtQkFBV0EsU0FBU0UsTUFBVCxDQUFnQixDQUFoQixFQUFtQkYsU0FBU2YsTUFBVCxHQUFrQixDQUFyQyxDQUFYO0FBQ0Q7QUFDREYsWUFBTWUsWUFBWSxVQUFsQixJQUFnQ0UsUUFBaEM7QUFDQWpCLFlBQU1lLFlBQVksUUFBbEIsSUFBOEIsQ0FBQ0MsS0FBSyxDQUFMLEtBQVcsRUFBWixFQUFnQkksSUFBaEIsRUFBOUI7O0FBRUF0QjtBQUNEO0FBQ0Y7O0FBRUQ7QUFDQTtBQUNBLFdBQVNXLFNBQVQsR0FBcUI7QUFDbkIsUUFBSVksbUJBQW1CdkIsQ0FBdkI7QUFBQSxRQUNJd0Isa0JBQWtCN0IsUUFBUUssR0FBUixDQUR0QjtBQUFBLFFBRUl5QixjQUFjRCxnQkFBZ0I1QixLQUFoQixDQUFzQiw0Q0FBdEIsQ0FGbEI7O0FBSUEsUUFBSThCLE9BQU87QUFDVEMsZ0JBQVUsQ0FBQ0YsWUFBWSxDQUFaLENBREY7QUFFVEcsZ0JBQVUsQ0FBQ0gsWUFBWSxDQUFaLENBQUQsSUFBbUIsQ0FGcEI7QUFHVEksZ0JBQVUsQ0FBQ0osWUFBWSxDQUFaLENBSEY7QUFJVEssZ0JBQVUsQ0FBQ0wsWUFBWSxDQUFaLENBQUQsSUFBbUIsQ0FKcEI7QUFLVE0sYUFBTyxFQUxFO0FBTVRDLHNCQUFnQjtBQU5QLEtBQVg7O0FBU0EsUUFBSUMsV0FBVyxDQUFmO0FBQUEsUUFDSUMsY0FBYyxDQURsQjtBQUVBLFdBQU9sQyxJQUFJTCxRQUFRUyxNQUFuQixFQUEyQkosR0FBM0IsRUFBZ0M7QUFDOUI7QUFDQTtBQUNBLFVBQUlMLFFBQVFLLENBQVIsRUFBV21DLE9BQVgsQ0FBbUIsTUFBbkIsTUFBK0IsQ0FBL0IsSUFDTW5DLElBQUksQ0FBSixHQUFRTCxRQUFRUyxNQUR0QixJQUVLVCxRQUFRSyxJQUFJLENBQVosRUFBZW1DLE9BQWYsQ0FBdUIsTUFBdkIsTUFBbUMsQ0FGeEMsSUFHS3hDLFFBQVFLLElBQUksQ0FBWixFQUFlbUMsT0FBZixDQUF1QixJQUF2QixNQUFpQyxDQUgxQyxFQUc2QztBQUN6QztBQUNIO0FBQ0QsVUFBSUMsWUFBYXpDLFFBQVFLLENBQVIsRUFBV0ksTUFBWCxJQUFxQixDQUFyQixJQUEwQkosS0FBTUwsUUFBUVMsTUFBUixHQUFpQixDQUFsRCxHQUF3RCxHQUF4RCxHQUE4RFQsUUFBUUssQ0FBUixFQUFXLENBQVgsQ0FBOUU7O0FBRUEsVUFBSW9DLGNBQWMsR0FBZCxJQUFxQkEsY0FBYyxHQUFuQyxJQUEwQ0EsY0FBYyxHQUF4RCxJQUErREEsY0FBYyxJQUFqRixFQUF1RjtBQUNyRlYsYUFBS0ssS0FBTCxDQUFXNUIsSUFBWCxDQUFnQlIsUUFBUUssQ0FBUixDQUFoQjtBQUNBMEIsYUFBS00sY0FBTCxDQUFvQjdCLElBQXBCLENBQXlCTixXQUFXRyxDQUFYLEtBQWlCLElBQTFDOztBQUVBLFlBQUlvQyxjQUFjLEdBQWxCLEVBQXVCO0FBQ3JCSDtBQUNELFNBRkQsTUFFTyxJQUFJRyxjQUFjLEdBQWxCLEVBQXVCO0FBQzVCRjtBQUNELFNBRk0sTUFFQSxJQUFJRSxjQUFjLEdBQWxCLEVBQXVCO0FBQzVCSDtBQUNBQztBQUNEO0FBQ0YsT0FaRCxNQVlPO0FBQ0w7QUFDRDtBQUNGOztBQUVEO0FBQ0EsUUFBSSxDQUFDRCxRQUFELElBQWFQLEtBQUtJLFFBQUwsS0FBa0IsQ0FBbkMsRUFBc0M7QUFDcENKLFdBQUtJLFFBQUwsR0FBZ0IsQ0FBaEI7QUFDRDtBQUNELFFBQUksQ0FBQ0ksV0FBRCxJQUFnQlIsS0FBS0UsUUFBTCxLQUFrQixDQUF0QyxFQUF5QztBQUN2Q0YsV0FBS0UsUUFBTCxHQUFnQixDQUFoQjtBQUNEOztBQUVEO0FBQ0EsUUFBSWxDLFFBQVFrQixNQUFaLEVBQW9CO0FBQ2xCLFVBQUlxQixhQUFhUCxLQUFLSSxRQUF0QixFQUFnQztBQUM5QixjQUFNLElBQUlqQixLQUFKLENBQVUsc0RBQXNEVSxtQkFBbUIsQ0FBekUsQ0FBVixDQUFOO0FBQ0Q7QUFDRCxVQUFJVyxnQkFBZ0JSLEtBQUtFLFFBQXpCLEVBQW1DO0FBQ2pDLGNBQU0sSUFBSWYsS0FBSixDQUFVLHdEQUF3RFUsbUJBQW1CLENBQTNFLENBQVYsQ0FBTjtBQUNEO0FBQ0Y7O0FBRUQsV0FBT0csSUFBUDtBQUNEOztBQUVELFNBQU8xQixJQUFJTCxRQUFRUyxNQUFuQixFQUEyQjtBQUN6Qkg7QUFDRDs7QUFFRCxTQUFPRixJQUFQO0FBQ0QiLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcGFyc2VQYXRjaCh1bmlEaWZmLCBvcHRpb25zID0ge30pIHtcbiAgbGV0IGRpZmZzdHIgPSB1bmlEaWZmLnNwbGl0KC9cXHJcXG58W1xcblxcdlxcZlxcclxceDg1XS8pLFxuICAgICAgZGVsaW1pdGVycyA9IHVuaURpZmYubWF0Y2goL1xcclxcbnxbXFxuXFx2XFxmXFxyXFx4ODVdL2cpIHx8IFtdLFxuICAgICAgbGlzdCA9IFtdLFxuICAgICAgaSA9IDA7XG5cbiAgZnVuY3Rpb24gcGFyc2VJbmRleCgpIHtcbiAgICBsZXQgaW5kZXggPSB7fTtcbiAgICBsaXN0LnB1c2goaW5kZXgpO1xuXG4gICAgLy8gUGFyc2UgZGlmZiBtZXRhZGF0YVxuICAgIHdoaWxlIChpIDwgZGlmZnN0ci5sZW5ndGgpIHtcbiAgICAgIGxldCBsaW5lID0gZGlmZnN0cltpXTtcblxuICAgICAgLy8gRmlsZSBoZWFkZXIgZm91bmQsIGVuZCBwYXJzaW5nIGRpZmYgbWV0YWRhdGFcbiAgICAgIGlmICgvXihcXC1cXC1cXC18XFwrXFwrXFwrfEBAKVxccy8udGVzdChsaW5lKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gRGlmZiBpbmRleFxuICAgICAgbGV0IGhlYWRlciA9ICgvXig/OkluZGV4OnxkaWZmKD86IC1yIFxcdyspKylcXHMrKC4rPylcXHMqJC8pLmV4ZWMobGluZSk7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGluZGV4LmluZGV4ID0gaGVhZGVyWzFdO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgZmlsZSBoZWFkZXJzIGlmIHRoZXkgYXJlIGRlZmluZWQuIFVuaWZpZWQgZGlmZiByZXF1aXJlcyB0aGVtLCBidXRcbiAgICAvLyB0aGVyZSdzIG5vIHRlY2huaWNhbCBpc3N1ZXMgdG8gaGF2ZSBhbiBpc29sYXRlZCBodW5rIHdpdGhvdXQgZmlsZSBoZWFkZXJcbiAgICBwYXJzZUZpbGVIZWFkZXIoaW5kZXgpO1xuICAgIHBhcnNlRmlsZUhlYWRlcihpbmRleCk7XG5cbiAgICAvLyBQYXJzZSBodW5rc1xuICAgIGluZGV4Lmh1bmtzID0gW107XG5cbiAgICB3aGlsZSAoaSA8IGRpZmZzdHIubGVuZ3RoKSB7XG4gICAgICBsZXQgbGluZSA9IGRpZmZzdHJbaV07XG5cbiAgICAgIGlmICgvXihJbmRleDp8ZGlmZnxcXC1cXC1cXC18XFwrXFwrXFwrKVxccy8udGVzdChsaW5lKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAoL15AQC8udGVzdChsaW5lKSkge1xuICAgICAgICBpbmRleC5odW5rcy5wdXNoKHBhcnNlSHVuaygpKTtcbiAgICAgIH0gZWxzZSBpZiAobGluZSAmJiBvcHRpb25zLnN0cmljdCkge1xuICAgICAgICAvLyBJZ25vcmUgdW5leHBlY3RlZCBjb250ZW50IHVubGVzcyBpbiBzdHJpY3QgbW9kZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbGluZSAnICsgKGkgKyAxKSArICcgJyArIEpTT04uc3RyaW5naWZ5KGxpbmUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGkrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBQYXJzZXMgdGhlIC0tLSBhbmQgKysrIGhlYWRlcnMsIGlmIG5vbmUgYXJlIGZvdW5kLCBubyBsaW5lc1xuICAvLyBhcmUgY29uc3VtZWQuXG4gIGZ1bmN0aW9uIHBhcnNlRmlsZUhlYWRlcihpbmRleCkge1xuICAgIGNvbnN0IGZpbGVIZWFkZXIgPSAoL14oLS0tfFxcK1xcK1xcKylcXHMrKC4qKSQvKS5leGVjKGRpZmZzdHJbaV0pO1xuICAgIGlmIChmaWxlSGVhZGVyKSB7XG4gICAgICBsZXQga2V5UHJlZml4ID0gZmlsZUhlYWRlclsxXSA9PT0gJy0tLScgPyAnb2xkJyA6ICduZXcnO1xuICAgICAgY29uc3QgZGF0YSA9IGZpbGVIZWFkZXJbMl0uc3BsaXQoJ1xcdCcsIDIpO1xuICAgICAgbGV0IGZpbGVOYW1lID0gZGF0YVswXS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnXFxcXCcpO1xuICAgICAgaWYgKC9eXCIuKlwiJC8udGVzdChmaWxlTmFtZSkpIHtcbiAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHIoMSwgZmlsZU5hbWUubGVuZ3RoIC0gMik7XG4gICAgICB9XG4gICAgICBpbmRleFtrZXlQcmVmaXggKyAnRmlsZU5hbWUnXSA9IGZpbGVOYW1lO1xuICAgICAgaW5kZXhba2V5UHJlZml4ICsgJ0hlYWRlciddID0gKGRhdGFbMV0gfHwgJycpLnRyaW0oKTtcblxuICAgICAgaSsrO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBhcnNlcyBhIGh1bmtcbiAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgd2UgYXJlIGF0IHRoZSBzdGFydCBvZiBhIGh1bmsuXG4gIGZ1bmN0aW9uIHBhcnNlSHVuaygpIHtcbiAgICBsZXQgY2h1bmtIZWFkZXJJbmRleCA9IGksXG4gICAgICAgIGNodW5rSGVhZGVyTGluZSA9IGRpZmZzdHJbaSsrXSxcbiAgICAgICAgY2h1bmtIZWFkZXIgPSBjaHVua0hlYWRlckxpbmUuc3BsaXQoL0BAIC0oXFxkKykoPzosKFxcZCspKT8gXFwrKFxcZCspKD86LChcXGQrKSk/IEBALyk7XG5cbiAgICBsZXQgaHVuayA9IHtcbiAgICAgIG9sZFN0YXJ0OiArY2h1bmtIZWFkZXJbMV0sXG4gICAgICBvbGRMaW5lczogK2NodW5rSGVhZGVyWzJdIHx8IDEsXG4gICAgICBuZXdTdGFydDogK2NodW5rSGVhZGVyWzNdLFxuICAgICAgbmV3TGluZXM6ICtjaHVua0hlYWRlcls0XSB8fCAxLFxuICAgICAgbGluZXM6IFtdLFxuICAgICAgbGluZWRlbGltaXRlcnM6IFtdXG4gICAgfTtcblxuICAgIGxldCBhZGRDb3VudCA9IDAsXG4gICAgICAgIHJlbW92ZUNvdW50ID0gMDtcbiAgICBmb3IgKDsgaSA8IGRpZmZzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIExpbmVzIHN0YXJ0aW5nIHdpdGggJy0tLScgY291bGQgYmUgbWlzdGFrZW4gZm9yIHRoZSBcInJlbW92ZSBsaW5lXCIgb3BlcmF0aW9uXG4gICAgICAvLyBCdXQgdGhleSBjb3VsZCBiZSB0aGUgaGVhZGVyIGZvciB0aGUgbmV4dCBmaWxlLiBUaGVyZWZvcmUgcHJ1bmUgc3VjaCBjYXNlcyBvdXQuXG4gICAgICBpZiAoZGlmZnN0cltpXS5pbmRleE9mKCctLS0gJykgPT09IDBcbiAgICAgICAgICAgICYmIChpICsgMiA8IGRpZmZzdHIubGVuZ3RoKVxuICAgICAgICAgICAgJiYgZGlmZnN0cltpICsgMV0uaW5kZXhPZignKysrICcpID09PSAwXG4gICAgICAgICAgICAmJiBkaWZmc3RyW2kgKyAyXS5pbmRleE9mKCdAQCcpID09PSAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBsZXQgb3BlcmF0aW9uID0gKGRpZmZzdHJbaV0ubGVuZ3RoID09IDAgJiYgaSAhPSAoZGlmZnN0ci5sZW5ndGggLSAxKSkgPyAnICcgOiBkaWZmc3RyW2ldWzBdO1xuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnKycgfHwgb3BlcmF0aW9uID09PSAnLScgfHwgb3BlcmF0aW9uID09PSAnICcgfHwgb3BlcmF0aW9uID09PSAnXFxcXCcpIHtcbiAgICAgICAgaHVuay5saW5lcy5wdXNoKGRpZmZzdHJbaV0pO1xuICAgICAgICBodW5rLmxpbmVkZWxpbWl0ZXJzLnB1c2goZGVsaW1pdGVyc1tpXSB8fCAnXFxuJyk7XG5cbiAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gJysnKSB7XG4gICAgICAgICAgYWRkQ291bnQrKztcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gPT09ICctJykge1xuICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uID09PSAnICcpIHtcbiAgICAgICAgICBhZGRDb3VudCsrO1xuICAgICAgICAgIHJlbW92ZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgZW1wdHkgYmxvY2sgY291bnQgY2FzZVxuICAgIGlmICghYWRkQ291bnQgJiYgaHVuay5uZXdMaW5lcyA9PT0gMSkge1xuICAgICAgaHVuay5uZXdMaW5lcyA9IDA7XG4gICAgfVxuICAgIGlmICghcmVtb3ZlQ291bnQgJiYgaHVuay5vbGRMaW5lcyA9PT0gMSkge1xuICAgICAgaHVuay5vbGRMaW5lcyA9IDA7XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBvcHRpb25hbCBzYW5pdHkgY2hlY2tpbmdcbiAgICBpZiAob3B0aW9ucy5zdHJpY3QpIHtcbiAgICAgIGlmIChhZGRDb3VudCAhPT0gaHVuay5uZXdMaW5lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FkZGVkIGxpbmUgY291bnQgZGlkIG5vdCBtYXRjaCBmb3IgaHVuayBhdCBsaW5lICcgKyAoY2h1bmtIZWFkZXJJbmRleCArIDEpKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZW1vdmVDb3VudCAhPT0gaHVuay5vbGRMaW5lcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlbW92ZWQgbGluZSBjb3VudCBkaWQgbm90IG1hdGNoIGZvciBodW5rIGF0IGxpbmUgJyArIChjaHVua0hlYWRlckluZGV4ICsgMSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBodW5rO1xuICB9XG5cbiAgd2hpbGUgKGkgPCBkaWZmc3RyLmxlbmd0aCkge1xuICAgIHBhcnNlSW5kZXgoKTtcbiAgfVxuXG4gIHJldHVybiBsaXN0O1xufVxuIl19 |
|
|
|
|
|
/***/ }), |
|
/* 12 */ |
|
/***/ (function(module, exports) { |
|
|
|
/*istanbul ignore start*/"use strict"; |
|
|
|
exports.__esModule = true; |
|
|
|
exports["default"] = /*istanbul ignore end*/function (start, minLine, maxLine) { |
|
var wantForward = true, |
|
backwardExhausted = false, |
|
forwardExhausted = false, |
|
localOffset = 1; |
|
|
|
return function iterator() { |
|
if (wantForward && !forwardExhausted) { |
|
if (backwardExhausted) { |
|
localOffset++; |
|
} else { |
|
wantForward = false; |
|
} |
|
|
|
// Check if trying to fit beyond text length, and if not, check it fits |
|
// after offset location (or desired location on first iteration) |
|
if (start + localOffset <= maxLine) { |
|
return localOffset; |
|
} |
|
|
|
forwardExhausted = true; |
|
} |
|
|
|
if (!backwardExhausted) { |
|
if (!forwardExhausted) { |
|
wantForward = true; |
|
} |
|
|
|
// Check if trying to fit before text beginning, and if not, check it fits |
|
// before offset location |
|
if (minLine <= start - localOffset) { |
|
return -localOffset++; |
|
} |
|
|
|
backwardExhausted = true; |
|
return iterator(); |
|
} |
|
|
|
// We tried to fit hunk before text beginning and beyond text length, then |
|
// hunk can't fit on the text. Return undefined |
|
}; |
|
}; |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2Rpc3RhbmNlLWl0ZXJhdG9yLmpzIl0sIm5hbWVzIjpbInN0YXJ0IiwibWluTGluZSIsIm1heExpbmUiLCJ3YW50Rm9yd2FyZCIsImJhY2t3YXJkRXhoYXVzdGVkIiwiZm9yd2FyZEV4aGF1c3RlZCIsImxvY2FsT2Zmc2V0IiwiaXRlcmF0b3IiXSwibWFwcGluZ3MiOiI7Ozs7NENBR2UsVUFBU0EsS0FBVCxFQUFnQkMsT0FBaEIsRUFBeUJDLE9BQXpCLEVBQWtDO0FBQy9DLE1BQUlDLGNBQWMsSUFBbEI7QUFBQSxNQUNJQyxvQkFBb0IsS0FEeEI7QUFBQSxNQUVJQyxtQkFBbUIsS0FGdkI7QUFBQSxNQUdJQyxjQUFjLENBSGxCOztBQUtBLFNBQU8sU0FBU0MsUUFBVCxHQUFvQjtBQUN6QixRQUFJSixlQUFlLENBQUNFLGdCQUFwQixFQUFzQztBQUNwQyxVQUFJRCxpQkFBSixFQUF1QjtBQUNyQkU7QUFDRCxPQUZELE1BRU87QUFDTEgsc0JBQWMsS0FBZDtBQUNEOztBQUVEO0FBQ0E7QUFDQSxVQUFJSCxRQUFRTSxXQUFSLElBQXVCSixPQUEzQixFQUFvQztBQUNsQyxlQUFPSSxXQUFQO0FBQ0Q7O0FBRURELHlCQUFtQixJQUFuQjtBQUNEOztBQUVELFFBQUksQ0FBQ0QsaUJBQUwsRUFBd0I7QUFDdEIsVUFBSSxDQUFDQyxnQkFBTCxFQUF1QjtBQUNyQkYsc0JBQWMsSUFBZDtBQUNEOztBQUVEO0FBQ0E7QUFDQSxVQUFJRixXQUFXRCxRQUFRTSxXQUF2QixFQUFvQztBQUNsQyxlQUFPLENBQUNBLGFBQVI7QUFDRDs7QUFFREYsMEJBQW9CLElBQXBCO0FBQ0EsYUFBT0csVUFBUDtBQUNEOztBQUVEO0FBQ0E7QUFDRCxHQWxDRDtBQW1DRCxDIiwiZmlsZSI6ImRpc3RhbmNlLWl0ZXJhdG9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSXRlcmF0b3IgdGhhdCB0cmF2ZXJzZXMgaW4gdGhlIHJhbmdlIG9mIFttaW4sIG1heF0sIHN0ZXBwaW5nXG4vLyBieSBkaXN0YW5jZSBmcm9tIGEgZ2l2ZW4gc3RhcnQgcG9zaXRpb24uIEkuZS4gZm9yIFswLCA0XSwgd2l0aFxuLy8gc3RhcnQgb2YgMiwgdGhpcyB3aWxsIGl0ZXJhdGUgMiwgMywgMSwgNCwgMC5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKHN0YXJ0LCBtaW5MaW5lLCBtYXhMaW5lKSB7XG4gIGxldCB3YW50Rm9yd2FyZCA9IHRydWUsXG4gICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IGZhbHNlLFxuICAgICAgbG9jYWxPZmZzZXQgPSAxO1xuXG4gIHJldHVybiBmdW5jdGlvbiBpdGVyYXRvcigpIHtcbiAgICBpZiAod2FudEZvcndhcmQgJiYgIWZvcndhcmRFeGhhdXN0ZWQpIHtcbiAgICAgIGlmIChiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgICBsb2NhbE9mZnNldCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FudEZvcndhcmQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZXlvbmQgdGV4dCBsZW5ndGgsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgIC8vIGFmdGVyIG9mZnNldCBsb2NhdGlvbiAob3IgZGVzaXJlZCBsb2NhdGlvbiBvbiBmaXJzdCBpdGVyYXRpb24pXG4gICAgICBpZiAoc3RhcnQgKyBsb2NhbE9mZnNldCA8PSBtYXhMaW5lKSB7XG4gICAgICAgIHJldHVybiBsb2NhbE9mZnNldDtcbiAgICAgIH1cblxuICAgICAgZm9yd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCFiYWNrd2FyZEV4aGF1c3RlZCkge1xuICAgICAgaWYgKCFmb3J3YXJkRXhoYXVzdGVkKSB7XG4gICAgICAgIHdhbnRGb3J3YXJkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdHJ5aW5nIHRvIGZpdCBiZWZvcmUgdGV4dCBiZWdpbm5pbmcsIGFuZCBpZiBub3QsIGNoZWNrIGl0IGZpdHNcbiAgICAgIC8vIGJlZm9yZSBvZmZzZXQgbG9jYXRpb25cbiAgICAgIGlmIChtaW5MaW5lIDw9IHN0YXJ0IC0gbG9jYWxPZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIC1sb2NhbE9mZnNldCsrO1xuICAgICAgfVxuXG4gICAgICBiYWNrd2FyZEV4aGF1c3RlZCA9IHRydWU7XG4gICAgICByZXR1cm4gaXRlcmF0b3IoKTtcbiAgICB9XG5cbiAgICAvLyBXZSB0cmllZCB0byBmaXQgaHVuayBiZWZvcmUgdGV4dCBiZWdpbm5pbmcgYW5kIGJleW9uZCB0ZXh0IGxlbmd0aCwgdGhlblxuICAgIC8vIGh1bmsgY2FuJ3QgZml0IG9uIHRoZSB0ZXh0LiBSZXR1cm4gdW5kZWZpbmVkXG4gIH07XG59XG4iXX0= |
|
|
|
|
|
/***/ }), |
|
/* 13 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports. /*istanbul ignore end*/calcLineCount = calcLineCount; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/merge = merge; |
|
|
|
var /*istanbul ignore start*/_create = __webpack_require__(14) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_parse = __webpack_require__(11) /*istanbul ignore end*/; |
|
|
|
var /*istanbul ignore start*/_array = __webpack_require__(15) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } |
|
|
|
/*istanbul ignore end*/function calcLineCount(hunk) { |
|
/*istanbul ignore start*/var _calcOldNewLineCount = /*istanbul ignore end*/calcOldNewLineCount(hunk.lines), |
|
oldLines = _calcOldNewLineCount.oldLines, |
|
newLines = _calcOldNewLineCount.newLines; |
|
|
|
if (oldLines !== undefined) { |
|
hunk.oldLines = oldLines; |
|
} else { |
|
delete hunk.oldLines; |
|
} |
|
|
|
if (newLines !== undefined) { |
|
hunk.newLines = newLines; |
|
} else { |
|
delete hunk.newLines; |
|
} |
|
} |
|
|
|
function merge(mine, theirs, base) { |
|
mine = loadPatch(mine, base); |
|
theirs = loadPatch(theirs, base); |
|
|
|
var ret = {}; |
|
|
|
// For index we just let it pass through as it doesn't have any necessary meaning. |
|
// Leaving sanity checks on this to the API consumer that may know more about the |
|
// meaning in their own context. |
|
if (mine.index || theirs.index) { |
|
ret.index = mine.index || theirs.index; |
|
} |
|
|
|
if (mine.newFileName || theirs.newFileName) { |
|
if (!fileNameChanged(mine)) { |
|
// No header or no change in ours, use theirs (and ours if theirs does not exist) |
|
ret.oldFileName = theirs.oldFileName || mine.oldFileName; |
|
ret.newFileName = theirs.newFileName || mine.newFileName; |
|
ret.oldHeader = theirs.oldHeader || mine.oldHeader; |
|
ret.newHeader = theirs.newHeader || mine.newHeader; |
|
} else if (!fileNameChanged(theirs)) { |
|
// No header or no change in theirs, use ours |
|
ret.oldFileName = mine.oldFileName; |
|
ret.newFileName = mine.newFileName; |
|
ret.oldHeader = mine.oldHeader; |
|
ret.newHeader = mine.newHeader; |
|
} else { |
|
// Both changed... figure it out |
|
ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName); |
|
ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName); |
|
ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader); |
|
ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader); |
|
} |
|
} |
|
|
|
ret.hunks = []; |
|
|
|
var mineIndex = 0, |
|
theirsIndex = 0, |
|
mineOffset = 0, |
|
theirsOffset = 0; |
|
|
|
while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) { |
|
var mineCurrent = mine.hunks[mineIndex] || { oldStart: Infinity }, |
|
theirsCurrent = theirs.hunks[theirsIndex] || { oldStart: Infinity }; |
|
|
|
if (hunkBefore(mineCurrent, theirsCurrent)) { |
|
// This patch does not overlap with any of the others, yay. |
|
ret.hunks.push(cloneHunk(mineCurrent, mineOffset)); |
|
mineIndex++; |
|
theirsOffset += mineCurrent.newLines - mineCurrent.oldLines; |
|
} else if (hunkBefore(theirsCurrent, mineCurrent)) { |
|
// This patch does not overlap with any of the others, yay. |
|
ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset)); |
|
theirsIndex++; |
|
mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines; |
|
} else { |
|
// Overlap, merge as best we can |
|
var mergedHunk = { |
|
oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart), |
|
oldLines: 0, |
|
newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset), |
|
newLines: 0, |
|
lines: [] |
|
}; |
|
mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines); |
|
theirsIndex++; |
|
mineIndex++; |
|
|
|
ret.hunks.push(mergedHunk); |
|
} |
|
} |
|
|
|
return ret; |
|
} |
|
|
|
function loadPatch(param, base) { |
|
if (typeof param === 'string') { |
|
if (/^@@/m.test(param) || /^Index:/m.test(param)) { |
|
return (/*istanbul ignore start*/(0, _parse.parsePatch) /*istanbul ignore end*/(param)[0] |
|
); |
|
} |
|
|
|
if (!base) { |
|
throw new Error('Must provide a base reference or pass in a patch'); |
|
} |
|
return (/*istanbul ignore start*/(0, _create.structuredPatch) /*istanbul ignore end*/(undefined, undefined, base, param) |
|
); |
|
} |
|
|
|
return param; |
|
} |
|
|
|
function fileNameChanged(patch) { |
|
return patch.newFileName && patch.newFileName !== patch.oldFileName; |
|
} |
|
|
|
function selectField(index, mine, theirs) { |
|
if (mine === theirs) { |
|
return mine; |
|
} else { |
|
index.conflict = true; |
|
return { mine: mine, theirs: theirs }; |
|
} |
|
} |
|
|
|
function hunkBefore(test, check) { |
|
return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart; |
|
} |
|
|
|
function cloneHunk(hunk, offset) { |
|
return { |
|
oldStart: hunk.oldStart, oldLines: hunk.oldLines, |
|
newStart: hunk.newStart + offset, newLines: hunk.newLines, |
|
lines: hunk.lines |
|
}; |
|
} |
|
|
|
function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) { |
|
// This will generally result in a conflicted hunk, but there are cases where the context |
|
// is the only overlap where we can successfully merge the content here. |
|
var mine = { offset: mineOffset, lines: mineLines, index: 0 }, |
|
their = { offset: theirOffset, lines: theirLines, index: 0 }; |
|
|
|
// Handle any leading content |
|
insertLeading(hunk, mine, their); |
|
insertLeading(hunk, their, mine); |
|
|
|
// Now in the overlap content. Scan through and select the best changes from each. |
|
while (mine.index < mine.lines.length && their.index < their.lines.length) { |
|
var mineCurrent = mine.lines[mine.index], |
|
theirCurrent = their.lines[their.index]; |
|
|
|
if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) { |
|
// Both modified ... |
|
mutualChange(hunk, mine, their); |
|
} else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') { |
|
/*istanbul ignore start*/var _hunk$lines; |
|
|
|
/*istanbul ignore end*/ // Mine inserted |
|
/*istanbul ignore start*/(_hunk$lines = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(mine))); |
|
} else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') { |
|
/*istanbul ignore start*/var _hunk$lines2; |
|
|
|
/*istanbul ignore end*/ // Theirs inserted |
|
/*istanbul ignore start*/(_hunk$lines2 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(their))); |
|
} else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') { |
|
// Mine removed or edited |
|
removal(hunk, mine, their); |
|
} else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') { |
|
// Their removed or edited |
|
removal(hunk, their, mine, true); |
|
} else if (mineCurrent === theirCurrent) { |
|
// Context identity |
|
hunk.lines.push(mineCurrent); |
|
mine.index++; |
|
their.index++; |
|
} else { |
|
// Context mismatch |
|
conflict(hunk, collectChange(mine), collectChange(their)); |
|
} |
|
} |
|
|
|
// Now push anything that may be remaining |
|
insertTrailing(hunk, mine); |
|
insertTrailing(hunk, their); |
|
|
|
calcLineCount(hunk); |
|
} |
|
|
|
function mutualChange(hunk, mine, their) { |
|
var myChanges = collectChange(mine), |
|
theirChanges = collectChange(their); |
|
|
|
if (allRemoves(myChanges) && allRemoves(theirChanges)) { |
|
// Special case for remove changes that are supersets of one another |
|
if ( /*istanbul ignore start*/(0, _array.arrayStartsWith) /*istanbul ignore end*/(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) { |
|
/*istanbul ignore start*/var _hunk$lines3; |
|
|
|
/*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines3 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges)); |
|
return; |
|
} else if ( /*istanbul ignore start*/(0, _array.arrayStartsWith) /*istanbul ignore end*/(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) { |
|
/*istanbul ignore start*/var _hunk$lines4; |
|
|
|
/*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines4 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines4 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges)); |
|
return; |
|
} |
|
} else if ( /*istanbul ignore start*/(0, _array.arrayEqual) /*istanbul ignore end*/(myChanges, theirChanges)) { |
|
/*istanbul ignore start*/var _hunk$lines5; |
|
|
|
/*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines5 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines5 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges)); |
|
return; |
|
} |
|
|
|
conflict(hunk, myChanges, theirChanges); |
|
} |
|
|
|
function removal(hunk, mine, their, swap) { |
|
var myChanges = collectChange(mine), |
|
theirChanges = collectContext(their, myChanges); |
|
if (theirChanges.merged) { |
|
/*istanbul ignore start*/var _hunk$lines6; |
|
|
|
/*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines6 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines6 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges.merged)); |
|
} else { |
|
conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges); |
|
} |
|
} |
|
|
|
function conflict(hunk, mine, their) { |
|
hunk.conflict = true; |
|
hunk.lines.push({ |
|
conflict: true, |
|
mine: mine, |
|
theirs: their |
|
}); |
|
} |
|
|
|
function insertLeading(hunk, insert, their) { |
|
while (insert.offset < their.offset && insert.index < insert.lines.length) { |
|
var line = insert.lines[insert.index++]; |
|
hunk.lines.push(line); |
|
insert.offset++; |
|
} |
|
} |
|
function insertTrailing(hunk, insert) { |
|
while (insert.index < insert.lines.length) { |
|
var line = insert.lines[insert.index++]; |
|
hunk.lines.push(line); |
|
} |
|
} |
|
|
|
function collectChange(state) { |
|
var ret = [], |
|
operation = state.lines[state.index][0]; |
|
while (state.index < state.lines.length) { |
|
var line = state.lines[state.index]; |
|
|
|
// Group additions that are immediately after subtractions and treat them as one "atomic" modify change. |
|
if (operation === '-' && line[0] === '+') { |
|
operation = '+'; |
|
} |
|
|
|
if (operation === line[0]) { |
|
ret.push(line); |
|
state.index++; |
|
} else { |
|
break; |
|
} |
|
} |
|
|
|
return ret; |
|
} |
|
function collectContext(state, matchChanges) { |
|
var changes = [], |
|
merged = [], |
|
matchIndex = 0, |
|
contextChanges = false, |
|
conflicted = false; |
|
while (matchIndex < matchChanges.length && state.index < state.lines.length) { |
|
var change = state.lines[state.index], |
|
match = matchChanges[matchIndex]; |
|
|
|
// Once we've hit our add, then we are done |
|
if (match[0] === '+') { |
|
break; |
|
} |
|
|
|
contextChanges = contextChanges || change[0] !== ' '; |
|
|
|
merged.push(match); |
|
matchIndex++; |
|
|
|
// Consume any additions in the other block as a conflict to attempt |
|
// to pull in the remaining context after this |
|
if (change[0] === '+') { |
|
conflicted = true; |
|
|
|
while (change[0] === '+') { |
|
changes.push(change); |
|
change = state.lines[++state.index]; |
|
} |
|
} |
|
|
|
if (match.substr(1) === change.substr(1)) { |
|
changes.push(change); |
|
state.index++; |
|
} else { |
|
conflicted = true; |
|
} |
|
} |
|
|
|
if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) { |
|
conflicted = true; |
|
} |
|
|
|
if (conflicted) { |
|
return changes; |
|
} |
|
|
|
while (matchIndex < matchChanges.length) { |
|
merged.push(matchChanges[matchIndex++]); |
|
} |
|
|
|
return { |
|
merged: merged, |
|
changes: changes |
|
}; |
|
} |
|
|
|
function allRemoves(changes) { |
|
return changes.reduce(function (prev, change) { |
|
return prev && change[0] === '-'; |
|
}, true); |
|
} |
|
function skipRemoveSuperset(state, removeChanges, delta) { |
|
for (var i = 0; i < delta; i++) { |
|
var changeContent = removeChanges[removeChanges.length - delta + i].substr(1); |
|
if (state.lines[state.index + i] !== ' ' + changeContent) { |
|
return false; |
|
} |
|
} |
|
|
|
state.index += delta; |
|
return true; |
|
} |
|
|
|
function calcOldNewLineCount(lines) { |
|
var oldLines = 0; |
|
var newLines = 0; |
|
|
|
lines.forEach(function (line) { |
|
if (typeof line !== 'string') { |
|
var myCount = calcOldNewLineCount(line.mine); |
|
var theirCount = calcOldNewLineCount(line.theirs); |
|
|
|
if (oldLines !== undefined) { |
|
if (myCount.oldLines === theirCount.oldLines) { |
|
oldLines += myCount.oldLines; |
|
} else { |
|
oldLines = undefined; |
|
} |
|
} |
|
|
|
if (newLines !== undefined) { |
|
if (myCount.newLines === theirCount.newLines) { |
|
newLines += myCount.newLines; |
|
} else { |
|
newLines = undefined; |
|
} |
|
} |
|
} else { |
|
if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) { |
|
newLines++; |
|
} |
|
if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) { |
|
oldLines++; |
|
} |
|
} |
|
}); |
|
|
|
return { oldLines: oldLines, newLines: newLines }; |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9tZXJnZS5qcyJdLCJuYW1lcyI6WyJjYWxjTGluZUNvdW50IiwibWVyZ2UiLCJodW5rIiwiY2FsY09sZE5ld0xpbmVDb3VudCIsImxpbmVzIiwib2xkTGluZXMiLCJuZXdMaW5lcyIsInVuZGVmaW5lZCIsIm1pbmUiLCJ0aGVpcnMiLCJiYXNlIiwibG9hZFBhdGNoIiwicmV0IiwiaW5kZXgiLCJuZXdGaWxlTmFtZSIsImZpbGVOYW1lQ2hhbmdlZCIsIm9sZEZpbGVOYW1lIiwib2xkSGVhZGVyIiwibmV3SGVhZGVyIiwic2VsZWN0RmllbGQiLCJodW5rcyIsIm1pbmVJbmRleCIsInRoZWlyc0luZGV4IiwibWluZU9mZnNldCIsInRoZWlyc09mZnNldCIsImxlbmd0aCIsIm1pbmVDdXJyZW50Iiwib2xkU3RhcnQiLCJJbmZpbml0eSIsInRoZWlyc0N1cnJlbnQiLCJodW5rQmVmb3JlIiwicHVzaCIsImNsb25lSHVuayIsIm1lcmdlZEh1bmsiLCJNYXRoIiwibWluIiwibmV3U3RhcnQiLCJtZXJnZUxpbmVzIiwicGFyYW0iLCJ0ZXN0IiwiRXJyb3IiLCJwYXRjaCIsImNvbmZsaWN0IiwiY2hlY2siLCJvZmZzZXQiLCJtaW5lTGluZXMiLCJ0aGVpck9mZnNldCIsInRoZWlyTGluZXMiLCJ0aGVpciIsImluc2VydExlYWRpbmciLCJ0aGVpckN1cnJlbnQiLCJtdXR1YWxDaGFuZ2UiLCJjb2xsZWN0Q2hhbmdlIiwicmVtb3ZhbCIsImluc2VydFRyYWlsaW5nIiwibXlDaGFuZ2VzIiwidGhlaXJDaGFuZ2VzIiwiYWxsUmVtb3ZlcyIsInNraXBSZW1vdmVTdXBlcnNldCIsInN3YXAiLCJjb2xsZWN0Q29udGV4dCIsIm1lcmdlZCIsImluc2VydCIsImxpbmUiLCJzdGF0ZSIsIm9wZXJhdGlvbiIsIm1hdGNoQ2hhbmdlcyIsImNoYW5nZXMiLCJtYXRjaEluZGV4IiwiY29udGV4dENoYW5nZXMiLCJjb25mbGljdGVkIiwiY2hhbmdlIiwibWF0Y2giLCJzdWJzdHIiLCJyZWR1Y2UiLCJwcmV2IiwicmVtb3ZlQ2hhbmdlcyIsImRlbHRhIiwiaSIsImNoYW5nZUNvbnRlbnQiLCJmb3JFYWNoIiwibXlDb3VudCIsInRoZWlyQ291bnQiXSwibWFwcGluZ3MiOiI7OztnQ0FLZ0JBLGEsR0FBQUEsYTt5REFnQkFDLEssR0FBQUEsSzs7QUFyQmhCOztBQUNBOztBQUVBOzs7O3VCQUVPLFNBQVNELGFBQVQsQ0FBdUJFLElBQXZCLEVBQTZCO0FBQUEsNkVBQ0xDLG9CQUFvQkQsS0FBS0UsS0FBekIsQ0FESztBQUFBLE1BQzNCQyxRQUQyQix3QkFDM0JBLFFBRDJCO0FBQUEsTUFDakJDLFFBRGlCLHdCQUNqQkEsUUFEaUI7O0FBR2xDLE1BQUlELGFBQWFFLFNBQWpCLEVBQTRCO0FBQzFCTCxTQUFLRyxRQUFMLEdBQWdCQSxRQUFoQjtBQUNELEdBRkQsTUFFTztBQUNMLFdBQU9ILEtBQUtHLFFBQVo7QUFDRDs7QUFFRCxNQUFJQyxhQUFhQyxTQUFqQixFQUE0QjtBQUMxQkwsU0FBS0ksUUFBTCxHQUFnQkEsUUFBaEI7QUFDRCxHQUZELE1BRU87QUFDTCxXQUFPSixLQUFLSSxRQUFaO0FBQ0Q7QUFDRjs7QUFFTSxTQUFTTCxLQUFULENBQWVPLElBQWYsRUFBcUJDLE1BQXJCLEVBQTZCQyxJQUE3QixFQUFtQztBQUN4Q0YsU0FBT0csVUFBVUgsSUFBVixFQUFnQkUsSUFBaEIsQ0FBUDtBQUNBRCxXQUFTRSxVQUFVRixNQUFWLEVBQWtCQyxJQUFsQixDQUFUOztBQUVBLE1BQUlFLE1BQU0sRUFBVjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFJSixLQUFLSyxLQUFMLElBQWNKLE9BQU9JLEtBQXpCLEVBQWdDO0FBQzlCRCxRQUFJQyxLQUFKLEdBQVlMLEtBQUtLLEtBQUwsSUFBY0osT0FBT0ksS0FBakM7QUFDRDs7QUFFRCxNQUFJTCxLQUFLTSxXQUFMLElBQW9CTCxPQUFPSyxXQUEvQixFQUE0QztBQUMxQyxRQUFJLENBQUNDLGdCQUFnQlAsSUFBaEIsQ0FBTCxFQUE0QjtBQUMxQjtBQUNBSSxVQUFJSSxXQUFKLEdBQWtCUCxPQUFPTyxXQUFQLElBQXNCUixLQUFLUSxXQUE3QztBQUNBSixVQUFJRSxXQUFKLEdBQWtCTCxPQUFPSyxXQUFQLElBQXNCTixLQUFLTSxXQUE3QztBQUNBRixVQUFJSyxTQUFKLEdBQWdCUixPQUFPUSxTQUFQLElBQW9CVCxLQUFLUyxTQUF6QztBQUNBTCxVQUFJTSxTQUFKLEdBQWdCVCxPQUFPUyxTQUFQLElBQW9CVixLQUFLVSxTQUF6QztBQUNELEtBTkQsTUFNTyxJQUFJLENBQUNILGdCQUFnQk4sTUFBaEIsQ0FBTCxFQUE4QjtBQUNuQztBQUNBRyxVQUFJSSxXQUFKLEdBQWtCUixLQUFLUSxXQUF2QjtBQUNBSixVQUFJRSxXQUFKLEdBQWtCTixLQUFLTSxXQUF2QjtBQUNBRixVQUFJSyxTQUFKLEdBQWdCVCxLQUFLUyxTQUFyQjtBQUNBTCxVQUFJTSxTQUFKLEdBQWdCVixLQUFLVSxTQUFyQjtBQUNELEtBTk0sTUFNQTtBQUNMO0FBQ0FOLFVBQUlJLFdBQUosR0FBa0JHLFlBQVlQLEdBQVosRUFBaUJKLEtBQUtRLFdBQXRCLEVBQW1DUCxPQUFPTyxXQUExQyxDQUFsQjtBQUNBSixVQUFJRSxXQUFKLEdBQWtCSyxZQUFZUCxHQUFaLEVBQWlCSixLQUFLTSxXQUF0QixFQUFtQ0wsT0FBT0ssV0FBMUMsQ0FBbEI7QUFDQUYsVUFBSUssU0FBSixHQUFnQkUsWUFBWVAsR0FBWixFQUFpQkosS0FBS1MsU0FBdEIsRUFBaUNSLE9BQU9RLFNBQXhDLENBQWhCO0FBQ0FMLFVBQUlNLFNBQUosR0FBZ0JDLFlBQVlQLEdBQVosRUFBaUJKLEtBQUtVLFNBQXRCLEVBQWlDVCxPQUFPUyxTQUF4QyxDQUFoQjtBQUNEO0FBQ0Y7O0FBRUROLE1BQUlRLEtBQUosR0FBWSxFQUFaOztBQUVBLE1BQUlDLFlBQVksQ0FBaEI7QUFBQSxNQUNJQyxjQUFjLENBRGxCO0FBQUEsTUFFSUMsYUFBYSxDQUZqQjtBQUFBLE1BR0lDLGVBQWUsQ0FIbkI7O0FBS0EsU0FBT0gsWUFBWWIsS0FBS1ksS0FBTCxDQUFXSyxNQUF2QixJQUFpQ0gsY0FBY2IsT0FBT1csS0FBUCxDQUFhSyxNQUFuRSxFQUEyRTtBQUN6RSxRQUFJQyxjQUFjbEIsS0FBS1ksS0FBTCxDQUFXQyxTQUFYLEtBQXlCLEVBQUNNLFVBQVVDLFFBQVgsRUFBM0M7QUFBQSxRQUNJQyxnQkFBZ0JwQixPQUFPVyxLQUFQLENBQWFFLFdBQWIsS0FBNkIsRUFBQ0ssVUFBVUMsUUFBWCxFQURqRDs7QUFHQSxRQUFJRSxXQUFXSixXQUFYLEVBQXdCRyxhQUF4QixDQUFKLEVBQTRDO0FBQzFDO0FBQ0FqQixVQUFJUSxLQUFKLENBQVVXLElBQVYsQ0FBZUMsVUFBVU4sV0FBVixFQUF1QkgsVUFBdkIsQ0FBZjtBQUNBRjtBQUNBRyxzQkFBZ0JFLFlBQVlwQixRQUFaLEdBQXVCb0IsWUFBWXJCLFFBQW5EO0FBQ0QsS0FMRCxNQUtPLElBQUl5QixXQUFXRCxhQUFYLEVBQTBCSCxXQUExQixDQUFKLEVBQTRDO0FBQ2pEO0FBQ0FkLFVBQUlRLEtBQUosQ0FBVVcsSUFBVixDQUFlQyxVQUFVSCxhQUFWLEVBQXlCTCxZQUF6QixDQUFmO0FBQ0FGO0FBQ0FDLG9CQUFjTSxjQUFjdkIsUUFBZCxHQUF5QnVCLGNBQWN4QixRQUFyRDtBQUNELEtBTE0sTUFLQTtBQUNMO0FBQ0EsVUFBSTRCLGFBQWE7QUFDZk4sa0JBQVVPLEtBQUtDLEdBQUwsQ0FBU1QsWUFBWUMsUUFBckIsRUFBK0JFLGNBQWNGLFFBQTdDLENBREs7QUFFZnRCLGtCQUFVLENBRks7QUFHZitCLGtCQUFVRixLQUFLQyxHQUFMLENBQVNULFlBQVlVLFFBQVosR0FBdUJiLFVBQWhDLEVBQTRDTSxjQUFjRixRQUFkLEdBQXlCSCxZQUFyRSxDQUhLO0FBSWZsQixrQkFBVSxDQUpLO0FBS2ZGLGVBQU87QUFMUSxPQUFqQjtBQU9BaUMsaUJBQVdKLFVBQVgsRUFBdUJQLFlBQVlDLFFBQW5DLEVBQTZDRCxZQUFZdEIsS0FBekQsRUFBZ0V5QixjQUFjRixRQUE5RSxFQUF3RkUsY0FBY3pCLEtBQXRHO0FBQ0FrQjtBQUNBRDs7QUFFQVQsVUFBSVEsS0FBSixDQUFVVyxJQUFWLENBQWVFLFVBQWY7QUFDRDtBQUNGOztBQUVELFNBQU9yQixHQUFQO0FBQ0Q7O0FBRUQsU0FBU0QsU0FBVCxDQUFtQjJCLEtBQW5CLEVBQTBCNUIsSUFBMUIsRUFBZ0M7QUFDOUIsTUFBSSxPQUFPNEIsS0FBUCxLQUFpQixRQUFyQixFQUErQjtBQUM3QixRQUFJLE9BQU9DLElBQVAsQ0FBWUQsS0FBWixLQUF1QixXQUFXQyxJQUFYLENBQWdCRCxLQUFoQixDQUEzQixFQUFvRDtBQUNsRCxhQUFPLHlFQUFXQSxLQUFYLEVBQWtCLENBQWxCO0FBQVA7QUFDRDs7QUFFRCxRQUFJLENBQUM1QixJQUFMLEVBQVc7QUFDVCxZQUFNLElBQUk4QixLQUFKLENBQVUsa0RBQVYsQ0FBTjtBQUNEO0FBQ0QsV0FBTywrRUFBZ0JqQyxTQUFoQixFQUEyQkEsU0FBM0IsRUFBc0NHLElBQXRDLEVBQTRDNEIsS0FBNUM7QUFBUDtBQUNEOztBQUVELFNBQU9BLEtBQVA7QUFDRDs7QUFFRCxTQUFTdkIsZUFBVCxDQUF5QjBCLEtBQXpCLEVBQWdDO0FBQzlCLFNBQU9BLE1BQU0zQixXQUFOLElBQXFCMkIsTUFBTTNCLFdBQU4sS0FBc0IyQixNQUFNekIsV0FBeEQ7QUFDRDs7QUFFRCxTQUFTRyxXQUFULENBQXFCTixLQUFyQixFQUE0QkwsSUFBNUIsRUFBa0NDLE1BQWxDLEVBQTBDO0FBQ3hDLE1BQUlELFNBQVNDLE1BQWIsRUFBcUI7QUFDbkIsV0FBT0QsSUFBUDtBQUNELEdBRkQsTUFFTztBQUNMSyxVQUFNNkIsUUFBTixHQUFpQixJQUFqQjtBQUNBLFdBQU8sRUFBQ2xDLFVBQUQsRUFBT0MsY0FBUCxFQUFQO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTcUIsVUFBVCxDQUFvQlMsSUFBcEIsRUFBMEJJLEtBQTFCLEVBQWlDO0FBQy9CLFNBQU9KLEtBQUtaLFFBQUwsR0FBZ0JnQixNQUFNaEIsUUFBdEIsSUFDRFksS0FBS1osUUFBTCxHQUFnQlksS0FBS2xDLFFBQXRCLEdBQWtDc0MsTUFBTWhCLFFBRDdDO0FBRUQ7O0FBRUQsU0FBU0ssU0FBVCxDQUFtQjlCLElBQW5CLEVBQXlCMEMsTUFBekIsRUFBaUM7QUFDL0IsU0FBTztBQUNMakIsY0FBVXpCLEtBQUt5QixRQURWLEVBQ29CdEIsVUFBVUgsS0FBS0csUUFEbkM7QUFFTCtCLGNBQVVsQyxLQUFLa0MsUUFBTCxHQUFnQlEsTUFGckIsRUFFNkJ0QyxVQUFVSixLQUFLSSxRQUY1QztBQUdMRixXQUFPRixLQUFLRTtBQUhQLEdBQVA7QUFLRDs7QUFFRCxTQUFTaUMsVUFBVCxDQUFvQm5DLElBQXBCLEVBQTBCcUIsVUFBMUIsRUFBc0NzQixTQUF0QyxFQUFpREMsV0FBakQsRUFBOERDLFVBQTlELEVBQTBFO0FBQ3hFO0FBQ0E7QUFDQSxNQUFJdkMsT0FBTyxFQUFDb0MsUUFBUXJCLFVBQVQsRUFBcUJuQixPQUFPeUMsU0FBNUIsRUFBdUNoQyxPQUFPLENBQTlDLEVBQVg7QUFBQSxNQUNJbUMsUUFBUSxFQUFDSixRQUFRRSxXQUFULEVBQXNCMUMsT0FBTzJDLFVBQTdCLEVBQXlDbEMsT0FBTyxDQUFoRCxFQURaOztBQUdBO0FBQ0FvQyxnQkFBYy9DLElBQWQsRUFBb0JNLElBQXBCLEVBQTBCd0MsS0FBMUI7QUFDQUMsZ0JBQWMvQyxJQUFkLEVBQW9COEMsS0FBcEIsRUFBMkJ4QyxJQUEzQjs7QUFFQTtBQUNBLFNBQU9BLEtBQUtLLEtBQUwsR0FBYUwsS0FBS0osS0FBTCxDQUFXcUIsTUFBeEIsSUFBa0N1QixNQUFNbkMsS0FBTixHQUFjbUMsTUFBTTVDLEtBQU4sQ0FBWXFCLE1BQW5FLEVBQTJFO0FBQ3pFLFFBQUlDLGNBQWNsQixLQUFLSixLQUFMLENBQVdJLEtBQUtLLEtBQWhCLENBQWxCO0FBQUEsUUFDSXFDLGVBQWVGLE1BQU01QyxLQUFOLENBQVk0QyxNQUFNbkMsS0FBbEIsQ0FEbkI7O0FBR0EsUUFBSSxDQUFDYSxZQUFZLENBQVosTUFBbUIsR0FBbkIsSUFBMEJBLFlBQVksQ0FBWixNQUFtQixHQUE5QyxNQUNJd0IsYUFBYSxDQUFiLE1BQW9CLEdBQXBCLElBQTJCQSxhQUFhLENBQWIsTUFBb0IsR0FEbkQsQ0FBSixFQUM2RDtBQUMzRDtBQUNBQyxtQkFBYWpELElBQWIsRUFBbUJNLElBQW5CLEVBQXlCd0MsS0FBekI7QUFDRCxLQUpELE1BSU8sSUFBSXRCLFlBQVksQ0FBWixNQUFtQixHQUFuQixJQUEwQndCLGFBQWEsQ0FBYixNQUFvQixHQUFsRCxFQUF1RDtBQUFBOztBQUFBLDhCQUM1RDtBQUNBLDBFQUFLOUMsS0FBTCxFQUFXMkIsSUFBWCw0TEFBb0JxQixjQUFjNUMsSUFBZCxDQUFwQjtBQUNELEtBSE0sTUFHQSxJQUFJMEMsYUFBYSxDQUFiLE1BQW9CLEdBQXBCLElBQTJCeEIsWUFBWSxDQUFaLE1BQW1CLEdBQWxELEVBQXVEO0FBQUE7O0FBQUEsOEJBQzVEO0FBQ0EsMkVBQUt0QixLQUFMLEVBQVcyQixJQUFYLDZMQUFvQnFCLGNBQWNKLEtBQWQsQ0FBcEI7QUFDRCxLQUhNLE1BR0EsSUFBSXRCLFlBQVksQ0FBWixNQUFtQixHQUFuQixJQUEwQndCLGFBQWEsQ0FBYixNQUFvQixHQUFsRCxFQUF1RDtBQUM1RDtBQUNBRyxjQUFRbkQsSUFBUixFQUFjTSxJQUFkLEVBQW9Cd0MsS0FBcEI7QUFDRCxLQUhNLE1BR0EsSUFBSUUsYUFBYSxDQUFiLE1BQW9CLEdBQXBCLElBQTJCeEIsWUFBWSxDQUFaLE1BQW1CLEdBQWxELEVBQXVEO0FBQzVEO0FBQ0EyQixjQUFRbkQsSUFBUixFQUFjOEMsS0FBZCxFQUFxQnhDLElBQXJCLEVBQTJCLElBQTNCO0FBQ0QsS0FITSxNQUdBLElBQUlrQixnQkFBZ0J3QixZQUFwQixFQUFrQztBQUN2QztBQUNBaEQsV0FBS0UsS0FBTCxDQUFXMkIsSUFBWCxDQUFnQkwsV0FBaEI7QUFDQWxCLFdBQUtLLEtBQUw7QUFDQW1DLFlBQU1uQyxLQUFOO0FBQ0QsS0FMTSxNQUtBO0FBQ0w7QUFDQTZCLGVBQVN4QyxJQUFULEVBQWVrRCxjQUFjNUMsSUFBZCxDQUFmLEVBQW9DNEMsY0FBY0osS0FBZCxDQUFwQztBQUNEO0FBQ0Y7O0FBRUQ7QUFDQU0saUJBQWVwRCxJQUFmLEVBQXFCTSxJQUFyQjtBQUNBOEMsaUJBQWVwRCxJQUFmLEVBQXFCOEMsS0FBckI7O0FBRUFoRCxnQkFBY0UsSUFBZDtBQUNEOztBQUVELFNBQVNpRCxZQUFULENBQXNCakQsSUFBdEIsRUFBNEJNLElBQTVCLEVBQWtDd0MsS0FBbEMsRUFBeUM7QUFDdkMsTUFBSU8sWUFBWUgsY0FBYzVDLElBQWQsQ0FBaEI7QUFBQSxNQUNJZ0QsZUFBZUosY0FBY0osS0FBZCxDQURuQjs7QUFHQSxNQUFJUyxXQUFXRixTQUFYLEtBQXlCRSxXQUFXRCxZQUFYLENBQTdCLEVBQXVEO0FBQ3JEO0FBQ0EsUUFBSSw4RUFBZ0JELFNBQWhCLEVBQTJCQyxZQUEzQixLQUNHRSxtQkFBbUJWLEtBQW5CLEVBQTBCTyxTQUExQixFQUFxQ0EsVUFBVTlCLE1BQVYsR0FBbUIrQixhQUFhL0IsTUFBckUsQ0FEUCxFQUNxRjtBQUFBOztBQUFBLDZCQUNuRixzRUFBS3JCLEtBQUwsRUFBVzJCLElBQVgsNkxBQW9Cd0IsU0FBcEI7QUFDQTtBQUNELEtBSkQsTUFJTyxJQUFJLDhFQUFnQkMsWUFBaEIsRUFBOEJELFNBQTlCLEtBQ0pHLG1CQUFtQmxELElBQW5CLEVBQXlCZ0QsWUFBekIsRUFBdUNBLGFBQWEvQixNQUFiLEdBQXNCOEIsVUFBVTlCLE1BQXZFLENBREEsRUFDZ0Y7QUFBQTs7QUFBQSw2QkFDckYsc0VBQUtyQixLQUFMLEVBQVcyQixJQUFYLDZMQUFvQnlCLFlBQXBCO0FBQ0E7QUFDRDtBQUNGLEdBWEQsTUFXTyxJQUFJLHlFQUFXRCxTQUFYLEVBQXNCQyxZQUF0QixDQUFKLEVBQXlDO0FBQUE7O0FBQUEsMkJBQzlDLHNFQUFLcEQsS0FBTCxFQUFXMkIsSUFBWCw2TEFBb0J3QixTQUFwQjtBQUNBO0FBQ0Q7O0FBRURiLFdBQVN4QyxJQUFULEVBQWVxRCxTQUFmLEVBQTBCQyxZQUExQjtBQUNEOztBQUVELFNBQVNILE9BQVQsQ0FBaUJuRCxJQUFqQixFQUF1Qk0sSUFBdkIsRUFBNkJ3QyxLQUE3QixFQUFvQ1csSUFBcEMsRUFBMEM7QUFDeEMsTUFBSUosWUFBWUgsY0FBYzVDLElBQWQsQ0FBaEI7QUFBQSxNQUNJZ0QsZUFBZUksZUFBZVosS0FBZixFQUFzQk8sU0FBdEIsQ0FEbkI7QUFFQSxNQUFJQyxhQUFhSyxNQUFqQixFQUF5QjtBQUFBOztBQUFBLDJCQUN2QixzRUFBS3pELEtBQUwsRUFBVzJCLElBQVgsNkxBQW9CeUIsYUFBYUssTUFBakM7QUFDRCxHQUZELE1BRU87QUFDTG5CLGFBQVN4QyxJQUFULEVBQWV5RCxPQUFPSCxZQUFQLEdBQXNCRCxTQUFyQyxFQUFnREksT0FBT0osU0FBUCxHQUFtQkMsWUFBbkU7QUFDRDtBQUNGOztBQUVELFNBQVNkLFFBQVQsQ0FBa0J4QyxJQUFsQixFQUF3Qk0sSUFBeEIsRUFBOEJ3QyxLQUE5QixFQUFxQztBQUNuQzlDLE9BQUt3QyxRQUFMLEdBQWdCLElBQWhCO0FBQ0F4QyxPQUFLRSxLQUFMLENBQVcyQixJQUFYLENBQWdCO0FBQ2RXLGNBQVUsSUFESTtBQUVkbEMsVUFBTUEsSUFGUTtBQUdkQyxZQUFRdUM7QUFITSxHQUFoQjtBQUtEOztBQUVELFNBQVNDLGFBQVQsQ0FBdUIvQyxJQUF2QixFQUE2QjRELE1BQTdCLEVBQXFDZCxLQUFyQyxFQUE0QztBQUMxQyxTQUFPYyxPQUFPbEIsTUFBUCxHQUFnQkksTUFBTUosTUFBdEIsSUFBZ0NrQixPQUFPakQsS0FBUCxHQUFlaUQsT0FBTzFELEtBQVAsQ0FBYXFCLE1BQW5FLEVBQTJFO0FBQ3pFLFFBQUlzQyxPQUFPRCxPQUFPMUQsS0FBUCxDQUFhMEQsT0FBT2pELEtBQVAsRUFBYixDQUFYO0FBQ0FYLFNBQUtFLEtBQUwsQ0FBVzJCLElBQVgsQ0FBZ0JnQyxJQUFoQjtBQUNBRCxXQUFPbEIsTUFBUDtBQUNEO0FBQ0Y7QUFDRCxTQUFTVSxjQUFULENBQXdCcEQsSUFBeEIsRUFBOEI0RCxNQUE5QixFQUFzQztBQUNwQyxTQUFPQSxPQUFPakQsS0FBUCxHQUFlaUQsT0FBTzFELEtBQVAsQ0FBYXFCLE1BQW5DLEVBQTJDO0FBQ3pDLFFBQUlzQyxPQUFPRCxPQUFPMUQsS0FBUCxDQUFhMEQsT0FBT2pELEtBQVAsRUFBYixDQUFYO0FBQ0FYLFNBQUtFLEtBQUwsQ0FBVzJCLElBQVgsQ0FBZ0JnQyxJQUFoQjtBQUNEO0FBQ0Y7O0FBRUQsU0FBU1gsYUFBVCxDQUF1QlksS0FBdkIsRUFBOEI7QUFDNUIsTUFBSXBELE1BQU0sRUFBVjtBQUFBLE1BQ0lxRCxZQUFZRCxNQUFNNUQsS0FBTixDQUFZNEQsTUFBTW5ELEtBQWxCLEVBQXlCLENBQXpCLENBRGhCO0FBRUEsU0FBT21ELE1BQU1uRCxLQUFOLEdBQWNtRCxNQUFNNUQsS0FBTixDQUFZcUIsTUFBakMsRUFBeUM7QUFDdkMsUUFBSXNDLE9BQU9DLE1BQU01RCxLQUFOLENBQVk0RCxNQUFNbkQsS0FBbEIsQ0FBWDs7QUFFQTtBQUNBLFFBQUlvRCxjQUFjLEdBQWQsSUFBcUJGLEtBQUssQ0FBTCxNQUFZLEdBQXJDLEVBQTBDO0FBQ3hDRSxrQkFBWSxHQUFaO0FBQ0Q7O0FBRUQsUUFBSUEsY0FBY0YsS0FBSyxDQUFMLENBQWxCLEVBQTJCO0FBQ3pCbkQsVUFBSW1CLElBQUosQ0FBU2dDLElBQVQ7QUFDQUMsWUFBTW5ELEtBQU47QUFDRCxLQUhELE1BR087QUFDTDtBQUNEO0FBQ0Y7O0FBRUQsU0FBT0QsR0FBUDtBQUNEO0FBQ0QsU0FBU2dELGNBQVQsQ0FBd0JJLEtBQXhCLEVBQStCRSxZQUEvQixFQUE2QztBQUMzQyxNQUFJQyxVQUFVLEVBQWQ7QUFBQSxNQUNJTixTQUFTLEVBRGI7QUFBQSxNQUVJTyxhQUFhLENBRmpCO0FBQUEsTUFHSUMsaUJBQWlCLEtBSHJCO0FBQUEsTUFJSUMsYUFBYSxLQUpqQjtBQUtBLFNBQU9GLGFBQWFGLGFBQWF6QyxNQUExQixJQUNFdUMsTUFBTW5ELEtBQU4sR0FBY21ELE1BQU01RCxLQUFOLENBQVlxQixNQURuQyxFQUMyQztBQUN6QyxRQUFJOEMsU0FBU1AsTUFBTTVELEtBQU4sQ0FBWTRELE1BQU1uRCxLQUFsQixDQUFiO0FBQUEsUUFDSTJELFFBQVFOLGFBQWFFLFVBQWIsQ0FEWjs7QUFHQTtBQUNBLFFBQUlJLE1BQU0sQ0FBTixNQUFhLEdBQWpCLEVBQXNCO0FBQ3BCO0FBQ0Q7O0FBRURILHFCQUFpQkEsa0JBQWtCRSxPQUFPLENBQVAsTUFBYyxHQUFqRDs7QUFFQVYsV0FBTzlCLElBQVAsQ0FBWXlDLEtBQVo7QUFDQUo7O0FBRUE7QUFDQTtBQUNBLFFBQUlHLE9BQU8sQ0FBUCxNQUFjLEdBQWxCLEVBQXVCO0FBQ3JCRCxtQkFBYSxJQUFiOztBQUVBLGFBQU9DLE9BQU8sQ0FBUCxNQUFjLEdBQXJCLEVBQTBCO0FBQ3hCSixnQkFBUXBDLElBQVIsQ0FBYXdDLE1BQWI7QUFDQUEsaUJBQVNQLE1BQU01RCxLQUFOLENBQVksRUFBRTRELE1BQU1uRCxLQUFwQixDQUFUO0FBQ0Q7QUFDRjs7QUFFRCxRQUFJMkQsTUFBTUMsTUFBTixDQUFhLENBQWIsTUFBb0JGLE9BQU9FLE1BQVAsQ0FBYyxDQUFkLENBQXhCLEVBQTBDO0FBQ3hDTixjQUFRcEMsSUFBUixDQUFhd0MsTUFBYjtBQUNBUCxZQUFNbkQsS0FBTjtBQUNELEtBSEQsTUFHTztBQUNMeUQsbUJBQWEsSUFBYjtBQUNEO0FBQ0Y7O0FBRUQsTUFBSSxDQUFDSixhQUFhRSxVQUFiLEtBQTRCLEVBQTdCLEVBQWlDLENBQWpDLE1BQXdDLEdBQXhDLElBQ0dDLGNBRFAsRUFDdUI7QUFDckJDLGlCQUFhLElBQWI7QUFDRDs7QUFFRCxNQUFJQSxVQUFKLEVBQWdCO0FBQ2QsV0FBT0gsT0FBUDtBQUNEOztBQUVELFNBQU9DLGFBQWFGLGFBQWF6QyxNQUFqQyxFQUF5QztBQUN2Q29DLFdBQU85QixJQUFQLENBQVltQyxhQUFhRSxZQUFiLENBQVo7QUFDRDs7QUFFRCxTQUFPO0FBQ0xQLGtCQURLO0FBRUxNO0FBRkssR0FBUDtBQUlEOztBQUVELFNBQVNWLFVBQVQsQ0FBb0JVLE9BQXBCLEVBQTZCO0FBQzNCLFNBQU9BLFFBQVFPLE1BQVIsQ0FBZSxVQUFTQyxJQUFULEVBQWVKLE1BQWYsRUFBdUI7QUFDM0MsV0FBT0ksUUFBUUosT0FBTyxDQUFQLE1BQWMsR0FBN0I7QUFDRCxHQUZNLEVBRUosSUFGSSxDQUFQO0FBR0Q7QUFDRCxTQUFTYixrQkFBVCxDQUE0Qk0sS0FBNUIsRUFBbUNZLGFBQW5DLEVBQWtEQyxLQUFsRCxFQUF5RDtBQUN2RCxPQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUQsS0FBcEIsRUFBMkJDLEdBQTNCLEVBQWdDO0FBQzlCLFFBQUlDLGdCQUFnQkgsY0FBY0EsY0FBY25ELE1BQWQsR0FBdUJvRCxLQUF2QixHQUErQkMsQ0FBN0MsRUFBZ0RMLE1BQWhELENBQXVELENBQXZELENBQXBCO0FBQ0EsUUFBSVQsTUFBTTVELEtBQU4sQ0FBWTRELE1BQU1uRCxLQUFOLEdBQWNpRSxDQUExQixNQUFpQyxNQUFNQyxhQUEzQyxFQUEwRDtBQUN4RCxhQUFPLEtBQVA7QUFDRDtBQUNGOztBQUVEZixRQUFNbkQsS0FBTixJQUFlZ0UsS0FBZjtBQUNBLFNBQU8sSUFBUDtBQUNEOztBQUVELFNBQVMxRSxtQkFBVCxDQUE2QkMsS0FBN0IsRUFBb0M7QUFDbEMsTUFBSUMsV0FBVyxDQUFmO0FBQ0EsTUFBSUMsV0FBVyxDQUFmOztBQUVBRixRQUFNNEUsT0FBTixDQUFjLFVBQVNqQixJQUFULEVBQWU7QUFDM0IsUUFBSSxPQUFPQSxJQUFQLEtBQWdCLFFBQXBCLEVBQThCO0FBQzVCLFVBQUlrQixVQUFVOUUsb0JBQW9CNEQsS0FBS3ZELElBQXpCLENBQWQ7QUFDQSxVQUFJMEUsYUFBYS9FLG9CQUFvQjRELEtBQUt0RCxNQUF6QixDQUFqQjs7QUFFQSxVQUFJSixhQUFhRSxTQUFqQixFQUE0QjtBQUMxQixZQUFJMEUsUUFBUTVFLFFBQVIsS0FBcUI2RSxXQUFXN0UsUUFBcEMsRUFBOEM7QUFDNUNBLHNCQUFZNEUsUUFBUTVFLFFBQXBCO0FBQ0QsU0FGRCxNQUVPO0FBQ0xBLHFCQUFXRSxTQUFYO0FBQ0Q7QUFDRjs7QUFFRCxVQUFJRCxhQUFhQyxTQUFqQixFQUE0QjtBQUMxQixZQUFJMEUsUUFBUTNFLFFBQVIsS0FBcUI0RSxXQUFXNUUsUUFBcEMsRUFBOEM7QUFDNUNBLHNCQUFZMkUsUUFBUTNFLFFBQXBCO0FBQ0QsU0FGRCxNQUVPO0FBQ0xBLHFCQUFXQyxTQUFYO0FBQ0Q7QUFDRjtBQUNGLEtBbkJELE1BbUJPO0FBQ0wsVUFBSUQsYUFBYUMsU0FBYixLQUEyQndELEtBQUssQ0FBTCxNQUFZLEdBQVosSUFBbUJBLEtBQUssQ0FBTCxNQUFZLEdBQTFELENBQUosRUFBb0U7QUFDbEV6RDtBQUNEO0FBQ0QsVUFBSUQsYUFBYUUsU0FBYixLQUEyQndELEtBQUssQ0FBTCxNQUFZLEdBQVosSUFBbUJBLEtBQUssQ0FBTCxNQUFZLEdBQTFELENBQUosRUFBb0U7QUFDbEUxRDtBQUNEO0FBQ0Y7QUFDRixHQTVCRDs7QUE4QkEsU0FBTyxFQUFDQSxrQkFBRCxFQUFXQyxrQkFBWCxFQUFQO0FBQ0QiLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3N0cnVjdHVyZWRQYXRjaH0gZnJvbSAnLi9jcmVhdGUnO1xuaW1wb3J0IHtwYXJzZVBhdGNofSBmcm9tICcuL3BhcnNlJztcblxuaW1wb3J0IHthcnJheUVxdWFsLCBhcnJheVN0YXJ0c1dpdGh9IGZyb20gJy4uL3V0aWwvYXJyYXknO1xuXG5leHBvcnQgZnVuY3Rpb24gY2FsY0xpbmVDb3VudChodW5rKSB7XG4gIGNvbnN0IHtvbGRMaW5lcywgbmV3TGluZXN9ID0gY2FsY09sZE5ld0xpbmVDb3VudChodW5rLmxpbmVzKTtcblxuICBpZiAob2xkTGluZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGh1bmsub2xkTGluZXMgPSBvbGRMaW5lcztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgaHVuay5vbGRMaW5lcztcbiAgfVxuXG4gIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaHVuay5uZXdMaW5lcyA9IG5ld0xpbmVzO1xuICB9IGVsc2Uge1xuICAgIGRlbGV0ZSBodW5rLm5ld0xpbmVzO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZShtaW5lLCB0aGVpcnMsIGJhc2UpIHtcbiAgbWluZSA9IGxvYWRQYXRjaChtaW5lLCBiYXNlKTtcbiAgdGhlaXJzID0gbG9hZFBhdGNoKHRoZWlycywgYmFzZSk7XG5cbiAgbGV0IHJldCA9IHt9O1xuXG4gIC8vIEZvciBpbmRleCB3ZSBqdXN0IGxldCBpdCBwYXNzIHRocm91Z2ggYXMgaXQgZG9lc24ndCBoYXZlIGFueSBuZWNlc3NhcnkgbWVhbmluZy5cbiAgLy8gTGVhdmluZyBzYW5pdHkgY2hlY2tzIG9uIHRoaXMgdG8gdGhlIEFQSSBjb25zdW1lciB0aGF0IG1heSBrbm93IG1vcmUgYWJvdXQgdGhlXG4gIC8vIG1lYW5pbmcgaW4gdGhlaXIgb3duIGNvbnRleHQuXG4gIGlmIChtaW5lLmluZGV4IHx8IHRoZWlycy5pbmRleCkge1xuICAgIHJldC5pbmRleCA9IG1pbmUuaW5kZXggfHwgdGhlaXJzLmluZGV4O1xuICB9XG5cbiAgaWYgKG1pbmUubmV3RmlsZU5hbWUgfHwgdGhlaXJzLm5ld0ZpbGVOYW1lKSB7XG4gICAgaWYgKCFmaWxlTmFtZUNoYW5nZWQobWluZSkpIHtcbiAgICAgIC8vIE5vIGhlYWRlciBvciBubyBjaGFuZ2UgaW4gb3VycywgdXNlIHRoZWlycyAoYW5kIG91cnMgaWYgdGhlaXJzIGRvZXMgbm90IGV4aXN0KVxuICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gdGhlaXJzLm9sZEZpbGVOYW1lIHx8IG1pbmUub2xkRmlsZU5hbWU7XG4gICAgICByZXQubmV3RmlsZU5hbWUgPSB0aGVpcnMubmV3RmlsZU5hbWUgfHwgbWluZS5uZXdGaWxlTmFtZTtcbiAgICAgIHJldC5vbGRIZWFkZXIgPSB0aGVpcnMub2xkSGVhZGVyIHx8IG1pbmUub2xkSGVhZGVyO1xuICAgICAgcmV0Lm5ld0hlYWRlciA9IHRoZWlycy5uZXdIZWFkZXIgfHwgbWluZS5uZXdIZWFkZXI7XG4gICAgfSBlbHNlIGlmICghZmlsZU5hbWVDaGFuZ2VkKHRoZWlycykpIHtcbiAgICAgIC8vIE5vIGhlYWRlciBvciBubyBjaGFuZ2UgaW4gdGhlaXJzLCB1c2Ugb3Vyc1xuICAgICAgcmV0Lm9sZEZpbGVOYW1lID0gbWluZS5vbGRGaWxlTmFtZTtcbiAgICAgIHJldC5uZXdGaWxlTmFtZSA9IG1pbmUubmV3RmlsZU5hbWU7XG4gICAgICByZXQub2xkSGVhZGVyID0gbWluZS5vbGRIZWFkZXI7XG4gICAgICByZXQubmV3SGVhZGVyID0gbWluZS5uZXdIZWFkZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJvdGggY2hhbmdlZC4uLiBmaWd1cmUgaXQgb3V0XG4gICAgICByZXQub2xkRmlsZU5hbWUgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUub2xkRmlsZU5hbWUsIHRoZWlycy5vbGRGaWxlTmFtZSk7XG4gICAgICByZXQubmV3RmlsZU5hbWUgPSBzZWxlY3RGaWVsZChyZXQsIG1pbmUubmV3RmlsZU5hbWUsIHRoZWlycy5uZXdGaWxlTmFtZSk7XG4gICAgICByZXQub2xkSGVhZGVyID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm9sZEhlYWRlciwgdGhlaXJzLm9sZEhlYWRlcik7XG4gICAgICByZXQubmV3SGVhZGVyID0gc2VsZWN0RmllbGQocmV0LCBtaW5lLm5ld0hlYWRlciwgdGhlaXJzLm5ld0hlYWRlcik7XG4gICAgfVxuICB9XG5cbiAgcmV0Lmh1bmtzID0gW107XG5cbiAgbGV0IG1pbmVJbmRleCA9IDAsXG4gICAgICB0aGVpcnNJbmRleCA9IDAsXG4gICAgICBtaW5lT2Zmc2V0ID0gMCxcbiAgICAgIHRoZWlyc09mZnNldCA9IDA7XG5cbiAgd2hpbGUgKG1pbmVJbmRleCA8IG1pbmUuaHVua3MubGVuZ3RoIHx8IHRoZWlyc0luZGV4IDwgdGhlaXJzLmh1bmtzLmxlbmd0aCkge1xuICAgIGxldCBtaW5lQ3VycmVudCA9IG1pbmUuaHVua3NbbWluZUluZGV4XSB8fCB7b2xkU3RhcnQ6IEluZmluaXR5fSxcbiAgICAgICAgdGhlaXJzQ3VycmVudCA9IHRoZWlycy5odW5rc1t0aGVpcnNJbmRleF0gfHwge29sZFN0YXJ0OiBJbmZpbml0eX07XG5cbiAgICBpZiAoaHVua0JlZm9yZShtaW5lQ3VycmVudCwgdGhlaXJzQ3VycmVudCkpIHtcbiAgICAgIC8vIFRoaXMgcGF0Y2ggZG9lcyBub3Qgb3ZlcmxhcCB3aXRoIGFueSBvZiB0aGUgb3RoZXJzLCB5YXkuXG4gICAgICByZXQuaHVua3MucHVzaChjbG9uZUh1bmsobWluZUN1cnJlbnQsIG1pbmVPZmZzZXQpKTtcbiAgICAgIG1pbmVJbmRleCsrO1xuICAgICAgdGhlaXJzT2Zmc2V0ICs9IG1pbmVDdXJyZW50Lm5ld0xpbmVzIC0gbWluZUN1cnJlbnQub2xkTGluZXM7XG4gICAgfSBlbHNlIGlmIChodW5rQmVmb3JlKHRoZWlyc0N1cnJlbnQsIG1pbmVDdXJyZW50KSkge1xuICAgICAgLy8gVGhpcyBwYXRjaCBkb2VzIG5vdCBvdmVybGFwIHdpdGggYW55IG9mIHRoZSBvdGhlcnMsIHlheS5cbiAgICAgIHJldC5odW5rcy5wdXNoKGNsb25lSHVuayh0aGVpcnNDdXJyZW50LCB0aGVpcnNPZmZzZXQpKTtcbiAgICAgIHRoZWlyc0luZGV4Kys7XG4gICAgICBtaW5lT2Zmc2V0ICs9IHRoZWlyc0N1cnJlbnQubmV3TGluZXMgLSB0aGVpcnNDdXJyZW50Lm9sZExpbmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdmVybGFwLCBtZXJnZSBhcyBiZXN0IHdlIGNhblxuICAgICAgbGV0IG1lcmdlZEh1bmsgPSB7XG4gICAgICAgIG9sZFN0YXJ0OiBNYXRoLm1pbihtaW5lQ3VycmVudC5vbGRTdGFydCwgdGhlaXJzQ3VycmVudC5vbGRTdGFydCksXG4gICAgICAgIG9sZExpbmVzOiAwLFxuICAgICAgICBuZXdTdGFydDogTWF0aC5taW4obWluZUN1cnJlbnQubmV3U3RhcnQgKyBtaW5lT2Zmc2V0LCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0ICsgdGhlaXJzT2Zmc2V0KSxcbiAgICAgICAgbmV3TGluZXM6IDAsXG4gICAgICAgIGxpbmVzOiBbXVxuICAgICAgfTtcbiAgICAgIG1lcmdlTGluZXMobWVyZ2VkSHVuaywgbWluZUN1cnJlbnQub2xkU3RhcnQsIG1pbmVDdXJyZW50LmxpbmVzLCB0aGVpcnNDdXJyZW50Lm9sZFN0YXJ0LCB0aGVpcnNDdXJyZW50LmxpbmVzKTtcbiAgICAgIHRoZWlyc0luZGV4Kys7XG4gICAgICBtaW5lSW5kZXgrKztcblxuICAgICAgcmV0Lmh1bmtzLnB1c2gobWVyZ2VkSHVuayk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gbG9hZFBhdGNoKHBhcmFtLCBiYXNlKSB7XG4gIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKC9eQEAvbS50ZXN0KHBhcmFtKSB8fCAoL15JbmRleDovbS50ZXN0KHBhcmFtKSkpIHtcbiAgICAgIHJldHVybiBwYXJzZVBhdGNoKHBhcmFtKVswXTtcbiAgICB9XG5cbiAgICBpZiAoIWJhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBwcm92aWRlIGEgYmFzZSByZWZlcmVuY2Ugb3IgcGFzcyBpbiBhIHBhdGNoJyk7XG4gICAgfVxuICAgIHJldHVybiBzdHJ1Y3R1cmVkUGF0Y2godW5kZWZpbmVkLCB1bmRlZmluZWQsIGJhc2UsIHBhcmFtKTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbTtcbn1cblxuZnVuY3Rpb24gZmlsZU5hbWVDaGFuZ2VkKHBhdGNoKSB7XG4gIHJldHVybiBwYXRjaC5uZXdGaWxlTmFtZSAmJiBwYXRjaC5uZXdGaWxlTmFtZSAhPT0gcGF0Y2gub2xkRmlsZU5hbWU7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdEZpZWxkKGluZGV4LCBtaW5lLCB0aGVpcnMpIHtcbiAgaWYgKG1pbmUgPT09IHRoZWlycykge1xuICAgIHJldHVybiBtaW5lO1xuICB9IGVsc2Uge1xuICAgIGluZGV4LmNvbmZsaWN0ID0gdHJ1ZTtcbiAgICByZXR1cm4ge21pbmUsIHRoZWlyc307XG4gIH1cbn1cblxuZnVuY3Rpb24gaHVua0JlZm9yZSh0ZXN0LCBjaGVjaykge1xuICByZXR1cm4gdGVzdC5vbGRTdGFydCA8IGNoZWNrLm9sZFN0YXJ0XG4gICAgJiYgKHRlc3Qub2xkU3RhcnQgKyB0ZXN0Lm9sZExpbmVzKSA8IGNoZWNrLm9sZFN0YXJ0O1xufVxuXG5mdW5jdGlvbiBjbG9uZUh1bmsoaHVuaywgb2Zmc2V0KSB7XG4gIHJldHVybiB7XG4gICAgb2xkU3RhcnQ6IGh1bmsub2xkU3RhcnQsIG9sZExpbmVzOiBodW5rLm9sZExpbmVzLFxuICAgIG5ld1N0YXJ0OiBodW5rLm5ld1N0YXJ0ICsgb2Zmc2V0LCBuZXdMaW5lczogaHVuay5uZXdMaW5lcyxcbiAgICBsaW5lczogaHVuay5saW5lc1xuICB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZUxpbmVzKGh1bmssIG1pbmVPZmZzZXQsIG1pbmVMaW5lcywgdGhlaXJPZmZzZXQsIHRoZWlyTGluZXMpIHtcbiAgLy8gVGhpcyB3aWxsIGdlbmVyYWxseSByZXN1bHQgaW4gYSBjb25mbGljdGVkIGh1bmssIGJ1dCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIGNvbnRleHRcbiAgLy8gaXMgdGhlIG9ubHkgb3ZlcmxhcCB3aGVyZSB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IG1lcmdlIHRoZSBjb250ZW50IGhlcmUuXG4gIGxldCBtaW5lID0ge29mZnNldDogbWluZU9mZnNldCwgbGluZXM6IG1pbmVMaW5lcywgaW5kZXg6IDB9LFxuICAgICAgdGhlaXIgPSB7b2Zmc2V0OiB0aGVpck9mZnNldCwgbGluZXM6IHRoZWlyTGluZXMsIGluZGV4OiAwfTtcblxuICAvLyBIYW5kbGUgYW55IGxlYWRpbmcgY29udGVudFxuICBpbnNlcnRMZWFkaW5nKGh1bmssIG1pbmUsIHRoZWlyKTtcbiAgaW5zZXJ0TGVhZGluZyhodW5rLCB0aGVpciwgbWluZSk7XG5cbiAgLy8gTm93IGluIHRoZSBvdmVybGFwIGNvbnRlbnQuIFNjYW4gdGhyb3VnaCBhbmQgc2VsZWN0IHRoZSBiZXN0IGNoYW5nZXMgZnJvbSBlYWNoLlxuICB3aGlsZSAobWluZS5pbmRleCA8IG1pbmUubGluZXMubGVuZ3RoICYmIHRoZWlyLmluZGV4IDwgdGhlaXIubGluZXMubGVuZ3RoKSB7XG4gICAgbGV0IG1pbmVDdXJyZW50ID0gbWluZS5saW5lc1ttaW5lLmluZGV4XSxcbiAgICAgICAgdGhlaXJDdXJyZW50ID0gdGhlaXIubGluZXNbdGhlaXIuaW5kZXhdO1xuXG4gICAgaWYgKChtaW5lQ3VycmVudFswXSA9PT0gJy0nIHx8IG1pbmVDdXJyZW50WzBdID09PSAnKycpXG4gICAgICAgICYmICh0aGVpckN1cnJlbnRbMF0gPT09ICctJyB8fCB0aGVpckN1cnJlbnRbMF0gPT09ICcrJykpIHtcbiAgICAgIC8vIEJvdGggbW9kaWZpZWQgLi4uXG4gICAgICBtdXR1YWxDaGFuZ2UoaHVuaywgbWluZSwgdGhlaXIpO1xuICAgIH0gZWxzZSBpZiAobWluZUN1cnJlbnRbMF0gPT09ICcrJyAmJiB0aGVpckN1cnJlbnRbMF0gPT09ICcgJykge1xuICAgICAgLy8gTWluZSBpbnNlcnRlZFxuICAgICAgaHVuay5saW5lcy5wdXNoKC4uLiBjb2xsZWN0Q2hhbmdlKG1pbmUpKTtcbiAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJysnICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8vIFRoZWlycyBpbnNlcnRlZFxuICAgICAgaHVuay5saW5lcy5wdXNoKC4uLiBjb2xsZWN0Q2hhbmdlKHRoZWlyKSk7XG4gICAgfSBlbHNlIGlmIChtaW5lQ3VycmVudFswXSA9PT0gJy0nICYmIHRoZWlyQ3VycmVudFswXSA9PT0gJyAnKSB7XG4gICAgICAvLyBNaW5lIHJlbW92ZWQgb3IgZWRpdGVkXG4gICAgICByZW1vdmFsKGh1bmssIG1pbmUsIHRoZWlyKTtcbiAgICB9IGVsc2UgaWYgKHRoZWlyQ3VycmVudFswXSA9PT0gJy0nICYmIG1pbmVDdXJyZW50WzBdID09PSAnICcpIHtcbiAgICAgIC8vIFRoZWlyIHJlbW92ZWQgb3IgZWRpdGVkXG4gICAgICByZW1vdmFsKGh1bmssIHRoZWlyLCBtaW5lLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKG1pbmVDdXJyZW50ID09PSB0aGVpckN1cnJlbnQpIHtcbiAgICAgIC8vIENvbnRleHQgaWRlbnRpdHlcbiAgICAgIGh1bmsubGluZXMucHVzaChtaW5lQ3VycmVudCk7XG4gICAgICBtaW5lLmluZGV4Kys7XG4gICAgICB0aGVpci5pbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb250ZXh0IG1pc21hdGNoXG4gICAgICBjb25mbGljdChodW5rLCBjb2xsZWN0Q2hhbmdlKG1pbmUpLCBjb2xsZWN0Q2hhbmdlKHRoZWlyKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gTm93IHB1c2ggYW55dGhpbmcgdGhhdCBtYXkgYmUgcmVtYWluaW5nXG4gIGluc2VydFRyYWlsaW5nKGh1bmssIG1pbmUpO1xuICBpbnNlcnRUcmFpbGluZyhodW5rLCB0aGVpcik7XG5cbiAgY2FsY0xpbmVDb3VudChodW5rKTtcbn1cblxuZnVuY3Rpb24gbXV0dWFsQ2hhbmdlKGh1bmssIG1pbmUsIHRoZWlyKSB7XG4gIGxldCBteUNoYW5nZXMgPSBjb2xsZWN0Q2hhbmdlKG1pbmUpLFxuICAgICAgdGhlaXJDaGFuZ2VzID0gY29sbGVjdENoYW5nZSh0aGVpcik7XG5cbiAgaWYgKGFsbFJlbW92ZXMobXlDaGFuZ2VzKSAmJiBhbGxSZW1vdmVzKHRoZWlyQ2hhbmdlcykpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHJlbW92ZSBjaGFuZ2VzIHRoYXQgYXJlIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlclxuICAgIGlmIChhcnJheVN0YXJ0c1dpdGgobXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpXG4gICAgICAgICYmIHNraXBSZW1vdmVTdXBlcnNldCh0aGVpciwgbXlDaGFuZ2VzLCBteUNoYW5nZXMubGVuZ3RoIC0gdGhlaXJDaGFuZ2VzLmxlbmd0aCkpIHtcbiAgICAgIGh1bmsubGluZXMucHVzaCguLi4gbXlDaGFuZ2VzKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGFycmF5U3RhcnRzV2l0aCh0aGVpckNoYW5nZXMsIG15Q2hhbmdlcylcbiAgICAgICAgJiYgc2tpcFJlbW92ZVN1cGVyc2V0KG1pbmUsIHRoZWlyQ2hhbmdlcywgdGhlaXJDaGFuZ2VzLmxlbmd0aCAtIG15Q2hhbmdlcy5sZW5ndGgpKSB7XG4gICAgICBodW5rLmxpbmVzLnB1c2goLi4uIHRoZWlyQ2hhbmdlcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGVsc2UgaWYgKGFycmF5RXF1YWwobXlDaGFuZ2VzLCB0aGVpckNoYW5nZXMpKSB7XG4gICAgaHVuay5saW5lcy5wdXNoKC4uLiBteUNoYW5nZXMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbmZsaWN0KGh1bmssIG15Q2hhbmdlcywgdGhlaXJDaGFuZ2VzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZhbChodW5rLCBtaW5lLCB0aGVpciwgc3dhcCkge1xuICBsZXQgbXlDaGFuZ2VzID0gY29sbGVjdENoYW5nZShtaW5lKSxcbiAgICAgIHRoZWlyQ2hhbmdlcyA9IGNvbGxlY3RDb250ZXh0KHRoZWlyLCBteUNoYW5nZXMpO1xuICBpZiAodGhlaXJDaGFuZ2VzLm1lcmdlZCkge1xuICAgIGh1bmsubGluZXMucHVzaCguLi4gdGhlaXJDaGFuZ2VzLm1lcmdlZCk7XG4gIH0gZWxzZSB7XG4gICAgY29uZmxpY3QoaHVuaywgc3dhcCA/IHRoZWlyQ2hhbmdlcyA6IG15Q2hhbmdlcywgc3dhcCA/IG15Q2hhbmdlcyA6IHRoZWlyQ2hhbmdlcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uZmxpY3QoaHVuaywgbWluZSwgdGhlaXIpIHtcbiAgaHVuay5jb25mbGljdCA9IHRydWU7XG4gIGh1bmsubGluZXMucHVzaCh7XG4gICAgY29uZmxpY3Q6IHRydWUsXG4gICAgbWluZTogbWluZSxcbiAgICB0aGVpcnM6IHRoZWlyXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbnNlcnRMZWFkaW5nKGh1bmssIGluc2VydCwgdGhlaXIpIHtcbiAgd2hpbGUgKGluc2VydC5vZmZzZXQgPCB0aGVpci5vZmZzZXQgJiYgaW5zZXJ0LmluZGV4IDwgaW5zZXJ0LmxpbmVzLmxlbmd0aCkge1xuICAgIGxldCBsaW5lID0gaW5zZXJ0LmxpbmVzW2luc2VydC5pbmRleCsrXTtcbiAgICBodW5rLmxpbmVzLnB1c2gobGluZSk7XG4gICAgaW5zZXJ0Lm9mZnNldCsrO1xuICB9XG59XG5mdW5jdGlvbiBpbnNlcnRUcmFpbGluZyhodW5rLCBpbnNlcnQpIHtcbiAgd2hpbGUgKGluc2VydC5pbmRleCA8IGluc2VydC5saW5lcy5sZW5ndGgpIHtcbiAgICBsZXQgbGluZSA9IGluc2VydC5saW5lc1tpbnNlcnQuaW5kZXgrK107XG4gICAgaHVuay5saW5lcy5wdXNoKGxpbmUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RDaGFuZ2Uoc3RhdGUpIHtcbiAgbGV0IHJldCA9IFtdLFxuICAgICAgb3BlcmF0aW9uID0gc3RhdGUubGluZXNbc3RhdGUuaW5kZXhdWzBdO1xuICB3aGlsZSAoc3RhdGUuaW5kZXggPCBzdGF0ZS5saW5lcy5sZW5ndGgpIHtcbiAgICBsZXQgbGluZSA9IHN0YXRlLmxpbmVzW3N0YXRlLmluZGV4XTtcblxuICAgIC8vIEdyb3VwIGFkZGl0aW9ucyB0aGF0IGFyZSBpbW1lZGlhdGVseSBhZnRlciBzdWJ0cmFjdGlvbnMgYW5kIHRyZWF0IHRoZW0gYXMgb25lIFwiYXRvbWljXCIgbW9kaWZ5IGNoYW5nZS5cbiAgICBpZiAob3BlcmF0aW9uID09PSAnLScgJiYgbGluZVswXSA9PT0gJysnKSB7XG4gICAgICBvcGVyYXRpb24gPSAnKyc7XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdGlvbiA9PT0gbGluZVswXSkge1xuICAgICAgcmV0LnB1c2gobGluZSk7XG4gICAgICBzdGF0ZS5pbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufVxuZnVuY3Rpb24gY29sbGVjdENvbnRleHQoc3RhdGUsIG1hdGNoQ2hhbmdlcykge1xuICBsZXQgY2hhbmdlcyA9IFtdLFxuICAgICAgbWVyZ2VkID0gW10sXG4gICAgICBtYXRjaEluZGV4ID0gMCxcbiAgICAgIGNvbnRleHRDaGFuZ2VzID0gZmFsc2UsXG4gICAgICBjb25mbGljdGVkID0gZmFsc2U7XG4gIHdoaWxlIChtYXRjaEluZGV4IDwgbWF0Y2hDaGFuZ2VzLmxlbmd0aFxuICAgICAgICAmJiBzdGF0ZS5pbmRleCA8IHN0YXRlLmxpbmVzLmxlbmd0aCkge1xuICAgIGxldCBjaGFuZ2UgPSBzdGF0ZS5saW5lc1tzdGF0ZS5pbmRleF0sXG4gICAgICAgIG1hdGNoID0gbWF0Y2hDaGFuZ2VzW21hdGNoSW5kZXhdO1xuXG4gICAgLy8gT25jZSB3ZSd2ZSBoaXQgb3VyIGFkZCwgdGhlbiB3ZSBhcmUgZG9uZVxuICAgIGlmIChtYXRjaFswXSA9PT0gJysnKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBjb250ZXh0Q2hhbmdlcyA9IGNvbnRleHRDaGFuZ2VzIHx8IGNoYW5nZVswXSAhPT0gJyAnO1xuXG4gICAgbWVyZ2VkLnB1c2gobWF0Y2gpO1xuICAgIG1hdGNoSW5kZXgrKztcblxuICAgIC8vIENvbnN1bWUgYW55IGFkZGl0aW9ucyBpbiB0aGUgb3RoZXIgYmxvY2sgYXMgYSBjb25mbGljdCB0byBhdHRlbXB0XG4gICAgLy8gdG8gcHVsbCBpbiB0aGUgcmVtYWluaW5nIGNvbnRleHQgYWZ0ZXIgdGhpc1xuICAgIGlmIChjaGFuZ2VbMF0gPT09ICcrJykge1xuICAgICAgY29uZmxpY3RlZCA9IHRydWU7XG5cbiAgICAgIHdoaWxlIChjaGFuZ2VbMF0gPT09ICcrJykge1xuICAgICAgICBjaGFuZ2VzLnB1c2goY2hhbmdlKTtcbiAgICAgICAgY2hhbmdlID0gc3RhdGUubGluZXNbKytzdGF0ZS5pbmRleF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoLnN1YnN0cigxKSA9PT0gY2hhbmdlLnN1YnN0cigxKSkge1xuICAgICAgY2hhbmdlcy5wdXNoKGNoYW5nZSk7XG4gICAgICBzdGF0ZS5pbmRleCsrO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25mbGljdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoKG1hdGNoQ2hhbmdlc1ttYXRjaEluZGV4XSB8fCAnJylbMF0gPT09ICcrJ1xuICAgICAgJiYgY29udGV4dENoYW5nZXMpIHtcbiAgICBjb25mbGljdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChjb25mbGljdGVkKSB7XG4gICAgcmV0dXJuIGNoYW5nZXM7XG4gIH1cblxuICB3aGlsZSAobWF0Y2hJbmRleCA8IG1hdGNoQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICBtZXJnZWQucHVzaChtYXRjaENoYW5nZXNbbWF0Y2hJbmRleCsrXSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1lcmdlZCxcbiAgICBjaGFuZ2VzXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFsbFJlbW92ZXMoY2hhbmdlcykge1xuICByZXR1cm4gY2hhbmdlcy5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY2hhbmdlKSB7XG4gICAgcmV0dXJuIHByZXYgJiYgY2hhbmdlWzBdID09PSAnLSc7XG4gIH0sIHRydWUpO1xufVxuZnVuY3Rpb24gc2tpcFJlbW92ZVN1cGVyc2V0KHN0YXRlLCByZW1vdmVDaGFuZ2VzLCBkZWx0YSkge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHtcbiAgICBsZXQgY2hhbmdlQ29udGVudCA9IHJlbW92ZUNoYW5nZXNbcmVtb3ZlQ2hhbmdlcy5sZW5ndGggLSBkZWx0YSArIGldLnN1YnN0cigxKTtcbiAgICBpZiAoc3RhdGUubGluZXNbc3RhdGUuaW5kZXggKyBpXSAhPT0gJyAnICsgY2hhbmdlQ29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRlLmluZGV4ICs9IGRlbHRhO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lcykge1xuICBsZXQgb2xkTGluZXMgPSAwO1xuICBsZXQgbmV3TGluZXMgPSAwO1xuXG4gIGxpbmVzLmZvckVhY2goZnVuY3Rpb24obGluZSkge1xuICAgIGlmICh0eXBlb2YgbGluZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCBteUNvdW50ID0gY2FsY09sZE5ld0xpbmVDb3VudChsaW5lLm1pbmUpO1xuICAgICAgbGV0IHRoZWlyQ291bnQgPSBjYWxjT2xkTmV3TGluZUNvdW50KGxpbmUudGhlaXJzKTtcblxuICAgICAgaWYgKG9sZExpbmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG15Q291bnQub2xkTGluZXMgPT09IHRoZWlyQ291bnQub2xkTGluZXMpIHtcbiAgICAgICAgICBvbGRMaW5lcyArPSBteUNvdW50Lm9sZExpbmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9sZExpbmVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXdMaW5lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChteUNvdW50Lm5ld0xpbmVzID09PSB0aGVpckNvdW50Lm5ld0xpbmVzKSB7XG4gICAgICAgICAgbmV3TGluZXMgKz0gbXlDb3VudC5uZXdMaW5lcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdMaW5lcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV3TGluZXMgIT09IHVuZGVmaW5lZCAmJiAobGluZVswXSA9PT0gJysnIHx8IGxpbmVbMF0gPT09ICcgJykpIHtcbiAgICAgICAgbmV3TGluZXMrKztcbiAgICAgIH1cbiAgICAgIGlmIChvbGRMaW5lcyAhPT0gdW5kZWZpbmVkICYmIChsaW5lWzBdID09PSAnLScgfHwgbGluZVswXSA9PT0gJyAnKSkge1xuICAgICAgICBvbGRMaW5lcysrO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtvbGRMaW5lcywgbmV3TGluZXN9O1xufVxuIl19 |
|
|
|
|
|
/***/ }), |
|
/* 14 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports. /*istanbul ignore end*/structuredPatch = structuredPatch; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = createTwoFilesPatch; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = createPatch; |
|
|
|
var /*istanbul ignore start*/_line = __webpack_require__(5) /*istanbul ignore end*/; |
|
|
|
/*istanbul ignore start*/function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } |
|
|
|
/*istanbul ignore end*/function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { |
|
if (!options) { |
|
options = {}; |
|
} |
|
if (typeof options.context === 'undefined') { |
|
options.context = 4; |
|
} |
|
|
|
var diff = /*istanbul ignore start*/(0, _line.diffLines) /*istanbul ignore end*/(oldStr, newStr, options); |
|
diff.push({ value: '', lines: [] }); // Append an empty value to make cleanup easier |
|
|
|
function contextLines(lines) { |
|
return lines.map(function (entry) { |
|
return ' ' + entry; |
|
}); |
|
} |
|
|
|
var hunks = []; |
|
var oldRangeStart = 0, |
|
newRangeStart = 0, |
|
curRange = [], |
|
oldLine = 1, |
|
newLine = 1; |
|
|
|
/*istanbul ignore start*/var _loop = function _loop( /*istanbul ignore end*/i) { |
|
var current = diff[i], |
|
lines = current.lines || current.value.replace(/\n$/, '').split('\n'); |
|
current.lines = lines; |
|
|
|
if (current.added || current.removed) { |
|
/*istanbul ignore start*/var _curRange; |
|
|
|
/*istanbul ignore end*/ // If we have previous context, start with that |
|
if (!oldRangeStart) { |
|
var prev = diff[i - 1]; |
|
oldRangeStart = oldLine; |
|
newRangeStart = newLine; |
|
|
|
if (prev) { |
|
curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : []; |
|
oldRangeStart -= curRange.length; |
|
newRangeStart -= curRange.length; |
|
} |
|
} |
|
|
|
// Output our changes |
|
/*istanbul ignore start*/(_curRange = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/lines.map(function (entry) { |
|
return (current.added ? '+' : '-') + entry; |
|
}))); |
|
|
|
// Track the updated file position |
|
if (current.added) { |
|
newLine += lines.length; |
|
} else { |
|
oldLine += lines.length; |
|
} |
|
} else { |
|
// Identical context lines. Track line changes |
|
if (oldRangeStart) { |
|
// Close out any changes that have been output (or join overlapping) |
|
if (lines.length <= options.context * 2 && i < diff.length - 2) { |
|
/*istanbul ignore start*/var _curRange2; |
|
|
|
/*istanbul ignore end*/ // Overlapping |
|
/*istanbul ignore start*/(_curRange2 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines))); |
|
} else { |
|
/*istanbul ignore start*/var _curRange3; |
|
|
|
/*istanbul ignore end*/ // end the range and output |
|
var contextSize = Math.min(lines.length, options.context); |
|
/*istanbul ignore start*/(_curRange3 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines.slice(0, contextSize)))); |
|
|
|
var hunk = { |
|
oldStart: oldRangeStart, |
|
oldLines: oldLine - oldRangeStart + contextSize, |
|
newStart: newRangeStart, |
|
newLines: newLine - newRangeStart + contextSize, |
|
lines: curRange |
|
}; |
|
if (i >= diff.length - 2 && lines.length <= options.context) { |
|
// EOF is inside this hunk |
|
var oldEOFNewline = /\n$/.test(oldStr); |
|
var newEOFNewline = /\n$/.test(newStr); |
|
if (lines.length == 0 && !oldEOFNewline) { |
|
// special case: old has no eol and no trailing context; no-nl can end up before adds |
|
curRange.splice(hunk.oldLines, 0, '\\ No newline at end of file'); |
|
} else if (!oldEOFNewline || !newEOFNewline) { |
|
curRange.push('\\ No newline at end of file'); |
|
} |
|
} |
|
hunks.push(hunk); |
|
|
|
oldRangeStart = 0; |
|
newRangeStart = 0; |
|
curRange = []; |
|
} |
|
} |
|
oldLine += lines.length; |
|
newLine += lines.length; |
|
} |
|
}; |
|
|
|
for (var i = 0; i < diff.length; i++) { |
|
/*istanbul ignore start*/_loop( /*istanbul ignore end*/i); |
|
} |
|
|
|
return { |
|
oldFileName: oldFileName, newFileName: newFileName, |
|
oldHeader: oldHeader, newHeader: newHeader, |
|
hunks: hunks |
|
}; |
|
} |
|
|
|
function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { |
|
var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options); |
|
|
|
var ret = []; |
|
if (oldFileName == newFileName) { |
|
ret.push('Index: ' + oldFileName); |
|
} |
|
ret.push('==================================================================='); |
|
ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader)); |
|
ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader)); |
|
|
|
for (var i = 0; i < diff.hunks.length; i++) { |
|
var hunk = diff.hunks[i]; |
|
ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@'); |
|
ret.push.apply(ret, hunk.lines); |
|
} |
|
|
|
return ret.join('\n') + '\n'; |
|
} |
|
|
|
function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) { |
|
return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options); |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wYXRjaC9jcmVhdGUuanMiXSwibmFtZXMiOlsic3RydWN0dXJlZFBhdGNoIiwiY3JlYXRlVHdvRmlsZXNQYXRjaCIsImNyZWF0ZVBhdGNoIiwib2xkRmlsZU5hbWUiLCJuZXdGaWxlTmFtZSIsIm9sZFN0ciIsIm5ld1N0ciIsIm9sZEhlYWRlciIsIm5ld0hlYWRlciIsIm9wdGlvbnMiLCJjb250ZXh0IiwiZGlmZiIsInB1c2giLCJ2YWx1ZSIsImxpbmVzIiwiY29udGV4dExpbmVzIiwibWFwIiwiZW50cnkiLCJodW5rcyIsIm9sZFJhbmdlU3RhcnQiLCJuZXdSYW5nZVN0YXJ0IiwiY3VyUmFuZ2UiLCJvbGRMaW5lIiwibmV3TGluZSIsImkiLCJjdXJyZW50IiwicmVwbGFjZSIsInNwbGl0IiwiYWRkZWQiLCJyZW1vdmVkIiwicHJldiIsInNsaWNlIiwibGVuZ3RoIiwiY29udGV4dFNpemUiLCJNYXRoIiwibWluIiwiaHVuayIsIm9sZFN0YXJ0Iiwib2xkTGluZXMiLCJuZXdTdGFydCIsIm5ld0xpbmVzIiwib2xkRU9GTmV3bGluZSIsInRlc3QiLCJuZXdFT0ZOZXdsaW5lIiwic3BsaWNlIiwicmV0IiwiYXBwbHkiLCJqb2luIiwiZmlsZU5hbWUiXSwibWFwcGluZ3MiOiI7OztnQ0FFZ0JBLGUsR0FBQUEsZTt5REFpR0FDLG1CLEdBQUFBLG1CO3lEQXdCQUMsVyxHQUFBQSxXOztBQTNIaEI7Ozs7dUJBRU8sU0FBU0YsZUFBVCxDQUF5QkcsV0FBekIsRUFBc0NDLFdBQXRDLEVBQW1EQyxNQUFuRCxFQUEyREMsTUFBM0QsRUFBbUVDLFNBQW5FLEVBQThFQyxTQUE5RSxFQUF5RkMsT0FBekYsRUFBa0c7QUFDdkcsTUFBSSxDQUFDQSxPQUFMLEVBQWM7QUFDWkEsY0FBVSxFQUFWO0FBQ0Q7QUFDRCxNQUFJLE9BQU9BLFFBQVFDLE9BQWYsS0FBMkIsV0FBL0IsRUFBNEM7QUFDMUNELFlBQVFDLE9BQVIsR0FBa0IsQ0FBbEI7QUFDRDs7QUFFRCxNQUFNQyxPQUFPLHNFQUFVTixNQUFWLEVBQWtCQyxNQUFsQixFQUEwQkcsT0FBMUIsQ0FBYjtBQUNBRSxPQUFLQyxJQUFMLENBQVUsRUFBQ0MsT0FBTyxFQUFSLEVBQVlDLE9BQU8sRUFBbkIsRUFBVixFQVR1RyxDQVNsRTs7QUFFckMsV0FBU0MsWUFBVCxDQUFzQkQsS0FBdEIsRUFBNkI7QUFDM0IsV0FBT0EsTUFBTUUsR0FBTixDQUFVLFVBQVNDLEtBQVQsRUFBZ0I7QUFBRSxhQUFPLE1BQU1BLEtBQWI7QUFBcUIsS0FBakQsQ0FBUDtBQUNEOztBQUVELE1BQUlDLFFBQVEsRUFBWjtBQUNBLE1BQUlDLGdCQUFnQixDQUFwQjtBQUFBLE1BQXVCQyxnQkFBZ0IsQ0FBdkM7QUFBQSxNQUEwQ0MsV0FBVyxFQUFyRDtBQUFBLE1BQ0lDLFVBQVUsQ0FEZDtBQUFBLE1BQ2lCQyxVQUFVLENBRDNCOztBQWhCdUcsOEVBa0I5RkMsQ0FsQjhGO0FBbUJyRyxRQUFNQyxVQUFVZCxLQUFLYSxDQUFMLENBQWhCO0FBQUEsUUFDTVYsUUFBUVcsUUFBUVgsS0FBUixJQUFpQlcsUUFBUVosS0FBUixDQUFjYSxPQUFkLENBQXNCLEtBQXRCLEVBQTZCLEVBQTdCLEVBQWlDQyxLQUFqQyxDQUF1QyxJQUF2QyxDQUQvQjtBQUVBRixZQUFRWCxLQUFSLEdBQWdCQSxLQUFoQjs7QUFFQSxRQUFJVyxRQUFRRyxLQUFSLElBQWlCSCxRQUFRSSxPQUE3QixFQUFzQztBQUFBOztBQUFBLDhCQUNwQztBQUNBLFVBQUksQ0FBQ1YsYUFBTCxFQUFvQjtBQUNsQixZQUFNVyxPQUFPbkIsS0FBS2EsSUFBSSxDQUFULENBQWI7QUFDQUwsd0JBQWdCRyxPQUFoQjtBQUNBRix3QkFBZ0JHLE9BQWhCOztBQUVBLFlBQUlPLElBQUosRUFBVTtBQUNSVCxxQkFBV1osUUFBUUMsT0FBUixHQUFrQixDQUFsQixHQUFzQkssYUFBYWUsS0FBS2hCLEtBQUwsQ0FBV2lCLEtBQVgsQ0FBaUIsQ0FBQ3RCLFFBQVFDLE9BQTFCLENBQWIsQ0FBdEIsR0FBeUUsRUFBcEY7QUFDQVMsMkJBQWlCRSxTQUFTVyxNQUExQjtBQUNBWiwyQkFBaUJDLFNBQVNXLE1BQTFCO0FBQ0Q7QUFDRjs7QUFFRDtBQUNBLDZFQUFTcEIsSUFBVCwwTEFBa0JFLE1BQU1FLEdBQU4sQ0FBVSxVQUFTQyxLQUFULEVBQWdCO0FBQzFDLGVBQU8sQ0FBQ1EsUUFBUUcsS0FBUixHQUFnQixHQUFoQixHQUFzQixHQUF2QixJQUE4QlgsS0FBckM7QUFDRCxPQUZpQixDQUFsQjs7QUFJQTtBQUNBLFVBQUlRLFFBQVFHLEtBQVosRUFBbUI7QUFDakJMLG1CQUFXVCxNQUFNa0IsTUFBakI7QUFDRCxPQUZELE1BRU87QUFDTFYsbUJBQVdSLE1BQU1rQixNQUFqQjtBQUNEO0FBQ0YsS0F6QkQsTUF5Qk87QUFDTDtBQUNBLFVBQUliLGFBQUosRUFBbUI7QUFDakI7QUFDQSxZQUFJTCxNQUFNa0IsTUFBTixJQUFnQnZCLFFBQVFDLE9BQVIsR0FBa0IsQ0FBbEMsSUFBdUNjLElBQUliLEtBQUtxQixNQUFMLEdBQWMsQ0FBN0QsRUFBZ0U7QUFBQTs7QUFBQSxrQ0FDOUQ7QUFDQSxrRkFBU3BCLElBQVQsMkxBQWtCRyxhQUFhRCxLQUFiLENBQWxCO0FBQ0QsU0FIRCxNQUdPO0FBQUE7O0FBQUEsa0NBQ0w7QUFDQSxjQUFJbUIsY0FBY0MsS0FBS0MsR0FBTCxDQUFTckIsTUFBTWtCLE1BQWYsRUFBdUJ2QixRQUFRQyxPQUEvQixDQUFsQjtBQUNBLGtGQUFTRSxJQUFULDJMQUFrQkcsYUFBYUQsTUFBTWlCLEtBQU4sQ0FBWSxDQUFaLEVBQWVFLFdBQWYsQ0FBYixDQUFsQjs7QUFFQSxjQUFJRyxPQUFPO0FBQ1RDLHNCQUFVbEIsYUFERDtBQUVUbUIsc0JBQVdoQixVQUFVSCxhQUFWLEdBQTBCYyxXQUY1QjtBQUdUTSxzQkFBVW5CLGFBSEQ7QUFJVG9CLHNCQUFXakIsVUFBVUgsYUFBVixHQUEwQmEsV0FKNUI7QUFLVG5CLG1CQUFPTztBQUxFLFdBQVg7QUFPQSxjQUFJRyxLQUFLYixLQUFLcUIsTUFBTCxHQUFjLENBQW5CLElBQXdCbEIsTUFBTWtCLE1BQU4sSUFBZ0J2QixRQUFRQyxPQUFwRCxFQUE2RDtBQUMzRDtBQUNBLGdCQUFJK0IsZ0JBQWlCLE1BQU1DLElBQU4sQ0FBV3JDLE1BQVgsQ0FBckI7QUFDQSxnQkFBSXNDLGdCQUFpQixNQUFNRCxJQUFOLENBQVdwQyxNQUFYLENBQXJCO0FBQ0EsZ0JBQUlRLE1BQU1rQixNQUFOLElBQWdCLENBQWhCLElBQXFCLENBQUNTLGFBQTFCLEVBQXlDO0FBQ3ZDO0FBQ0FwQix1QkFBU3VCLE1BQVQsQ0FBZ0JSLEtBQUtFLFFBQXJCLEVBQStCLENBQS9CLEVBQWtDLDhCQUFsQztBQUNELGFBSEQsTUFHTyxJQUFJLENBQUNHLGFBQUQsSUFBa0IsQ0FBQ0UsYUFBdkIsRUFBc0M7QUFDM0N0Qix1QkFBU1QsSUFBVCxDQUFjLDhCQUFkO0FBQ0Q7QUFDRjtBQUNETSxnQkFBTU4sSUFBTixDQUFXd0IsSUFBWDs7QUFFQWpCLDBCQUFnQixDQUFoQjtBQUNBQywwQkFBZ0IsQ0FBaEI7QUFDQUMscUJBQVcsRUFBWDtBQUNEO0FBQ0Y7QUFDREMsaUJBQVdSLE1BQU1rQixNQUFqQjtBQUNBVCxpQkFBV1QsTUFBTWtCLE1BQWpCO0FBQ0Q7QUF2Rm9HOztBQWtCdkcsT0FBSyxJQUFJUixJQUFJLENBQWIsRUFBZ0JBLElBQUliLEtBQUtxQixNQUF6QixFQUFpQ1IsR0FBakMsRUFBc0M7QUFBQSwyREFBN0JBLENBQTZCO0FBc0VyQzs7QUFFRCxTQUFPO0FBQ0xyQixpQkFBYUEsV0FEUixFQUNxQkMsYUFBYUEsV0FEbEM7QUFFTEcsZUFBV0EsU0FGTixFQUVpQkMsV0FBV0EsU0FGNUI7QUFHTFUsV0FBT0E7QUFIRixHQUFQO0FBS0Q7O0FBRU0sU0FBU2pCLG1CQUFULENBQTZCRSxXQUE3QixFQUEwQ0MsV0FBMUMsRUFBdURDLE1BQXZELEVBQStEQyxNQUEvRCxFQUF1RUMsU0FBdkUsRUFBa0ZDLFNBQWxGLEVBQTZGQyxPQUE3RixFQUFzRztBQUMzRyxNQUFNRSxPQUFPWCxnQkFBZ0JHLFdBQWhCLEVBQTZCQyxXQUE3QixFQUEwQ0MsTUFBMUMsRUFBa0RDLE1BQWxELEVBQTBEQyxTQUExRCxFQUFxRUMsU0FBckUsRUFBZ0ZDLE9BQWhGLENBQWI7O0FBRUEsTUFBTW9DLE1BQU0sRUFBWjtBQUNBLE1BQUkxQyxlQUFlQyxXQUFuQixFQUFnQztBQUM5QnlDLFFBQUlqQyxJQUFKLENBQVMsWUFBWVQsV0FBckI7QUFDRDtBQUNEMEMsTUFBSWpDLElBQUosQ0FBUyxxRUFBVDtBQUNBaUMsTUFBSWpDLElBQUosQ0FBUyxTQUFTRCxLQUFLUixXQUFkLElBQTZCLE9BQU9RLEtBQUtKLFNBQVosS0FBMEIsV0FBMUIsR0FBd0MsRUFBeEMsR0FBNkMsT0FBT0ksS0FBS0osU0FBdEYsQ0FBVDtBQUNBc0MsTUFBSWpDLElBQUosQ0FBUyxTQUFTRCxLQUFLUCxXQUFkLElBQTZCLE9BQU9PLEtBQUtILFNBQVosS0FBMEIsV0FBMUIsR0FBd0MsRUFBeEMsR0FBNkMsT0FBT0csS0FBS0gsU0FBdEYsQ0FBVDs7QUFFQSxPQUFLLElBQUlnQixJQUFJLENBQWIsRUFBZ0JBLElBQUliLEtBQUtPLEtBQUwsQ0FBV2MsTUFBL0IsRUFBdUNSLEdBQXZDLEVBQTRDO0FBQzFDLFFBQU1ZLE9BQU96QixLQUFLTyxLQUFMLENBQVdNLENBQVgsQ0FBYjtBQUNBcUIsUUFBSWpDLElBQUosQ0FDRSxTQUFTd0IsS0FBS0MsUUFBZCxHQUF5QixHQUF6QixHQUErQkQsS0FBS0UsUUFBcEMsR0FDRSxJQURGLEdBQ1NGLEtBQUtHLFFBRGQsR0FDeUIsR0FEekIsR0FDK0JILEtBQUtJLFFBRHBDLEdBRUUsS0FISjtBQUtBSyxRQUFJakMsSUFBSixDQUFTa0MsS0FBVCxDQUFlRCxHQUFmLEVBQW9CVCxLQUFLdEIsS0FBekI7QUFDRDs7QUFFRCxTQUFPK0IsSUFBSUUsSUFBSixDQUFTLElBQVQsSUFBaUIsSUFBeEI7QUFDRDs7QUFFTSxTQUFTN0MsV0FBVCxDQUFxQjhDLFFBQXJCLEVBQStCM0MsTUFBL0IsRUFBdUNDLE1BQXZDLEVBQStDQyxTQUEvQyxFQUEwREMsU0FBMUQsRUFBcUVDLE9BQXJFLEVBQThFO0FBQ25GLFNBQU9SLG9CQUFvQitDLFFBQXBCLEVBQThCQSxRQUE5QixFQUF3QzNDLE1BQXhDLEVBQWdEQyxNQUFoRCxFQUF3REMsU0FBeEQsRUFBbUVDLFNBQW5FLEVBQThFQyxPQUE5RSxDQUFQO0FBQ0QiLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtkaWZmTGluZXN9IGZyb20gJy4uL2RpZmYvbGluZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJ1Y3R1cmVkUGF0Y2gob2xkRmlsZU5hbWUsIG5ld0ZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAndW5kZWZpbmVkJykge1xuICAgIG9wdGlvbnMuY29udGV4dCA9IDQ7XG4gIH1cblxuICBjb25zdCBkaWZmID0gZGlmZkxpbmVzKG9sZFN0ciwgbmV3U3RyLCBvcHRpb25zKTtcbiAgZGlmZi5wdXNoKHt2YWx1ZTogJycsIGxpbmVzOiBbXX0pOyAgIC8vIEFwcGVuZCBhbiBlbXB0eSB2YWx1ZSB0byBtYWtlIGNsZWFudXAgZWFzaWVyXG5cbiAgZnVuY3Rpb24gY29udGV4dExpbmVzKGxpbmVzKSB7XG4gICAgcmV0dXJuIGxpbmVzLm1hcChmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gJyAnICsgZW50cnk7IH0pO1xuICB9XG5cbiAgbGV0IGh1bmtzID0gW107XG4gIGxldCBvbGRSYW5nZVN0YXJ0ID0gMCwgbmV3UmFuZ2VTdGFydCA9IDAsIGN1clJhbmdlID0gW10sXG4gICAgICBvbGRMaW5lID0gMSwgbmV3TGluZSA9IDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBkaWZmW2ldLFxuICAgICAgICAgIGxpbmVzID0gY3VycmVudC5saW5lcyB8fCBjdXJyZW50LnZhbHVlLnJlcGxhY2UoL1xcbiQvLCAnJykuc3BsaXQoJ1xcbicpO1xuICAgIGN1cnJlbnQubGluZXMgPSBsaW5lcztcblxuICAgIGlmIChjdXJyZW50LmFkZGVkIHx8IGN1cnJlbnQucmVtb3ZlZCkge1xuICAgICAgLy8gSWYgd2UgaGF2ZSBwcmV2aW91cyBjb250ZXh0LCBzdGFydCB3aXRoIHRoYXRcbiAgICAgIGlmICghb2xkUmFuZ2VTdGFydCkge1xuICAgICAgICBjb25zdCBwcmV2ID0gZGlmZltpIC0gMV07XG4gICAgICAgIG9sZFJhbmdlU3RhcnQgPSBvbGRMaW5lO1xuICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gbmV3TGluZTtcblxuICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgIGN1clJhbmdlID0gb3B0aW9ucy5jb250ZXh0ID4gMCA/IGNvbnRleHRMaW5lcyhwcmV2LmxpbmVzLnNsaWNlKC1vcHRpb25zLmNvbnRleHQpKSA6IFtdO1xuICAgICAgICAgIG9sZFJhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICAgIG5ld1JhbmdlU3RhcnQgLT0gY3VyUmFuZ2UubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE91dHB1dCBvdXIgY2hhbmdlc1xuICAgICAgY3VyUmFuZ2UucHVzaCguLi4gbGluZXMubWFwKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAoY3VycmVudC5hZGRlZCA/ICcrJyA6ICctJykgKyBlbnRyeTtcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVHJhY2sgdGhlIHVwZGF0ZWQgZmlsZSBwb3NpdGlvblxuICAgICAgaWYgKGN1cnJlbnQuYWRkZWQpIHtcbiAgICAgICAgbmV3TGluZSArPSBsaW5lcy5sZW5ndGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWRlbnRpY2FsIGNvbnRleHQgbGluZXMuIFRyYWNrIGxpbmUgY2hhbmdlc1xuICAgICAgaWYgKG9sZFJhbmdlU3RhcnQpIHtcbiAgICAgICAgLy8gQ2xvc2Ugb3V0IGFueSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG91dHB1dCAob3Igam9pbiBvdmVybGFwcGluZylcbiAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQgKiAyICYmIGkgPCBkaWZmLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAvLyBPdmVybGFwcGluZ1xuICAgICAgICAgIGN1clJhbmdlLnB1c2goLi4uIGNvbnRleHRMaW5lcyhsaW5lcykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGVuZCB0aGUgcmFuZ2UgYW5kIG91dHB1dFxuICAgICAgICAgIGxldCBjb250ZXh0U2l6ZSA9IE1hdGgubWluKGxpbmVzLmxlbmd0aCwgb3B0aW9ucy5jb250ZXh0KTtcbiAgICAgICAgICBjdXJSYW5nZS5wdXNoKC4uLiBjb250ZXh0TGluZXMobGluZXMuc2xpY2UoMCwgY29udGV4dFNpemUpKSk7XG5cbiAgICAgICAgICBsZXQgaHVuayA9IHtcbiAgICAgICAgICAgIG9sZFN0YXJ0OiBvbGRSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgb2xkTGluZXM6IChvbGRMaW5lIC0gb2xkUmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIG5ld1N0YXJ0OiBuZXdSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgbmV3TGluZXM6IChuZXdMaW5lIC0gbmV3UmFuZ2VTdGFydCArIGNvbnRleHRTaXplKSxcbiAgICAgICAgICAgIGxpbmVzOiBjdXJSYW5nZVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGkgPj0gZGlmZi5sZW5ndGggLSAyICYmIGxpbmVzLmxlbmd0aCA8PSBvcHRpb25zLmNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIEVPRiBpcyBpbnNpZGUgdGhpcyBodW5rXG4gICAgICAgICAgICBsZXQgb2xkRU9GTmV3bGluZSA9ICgvXFxuJC8udGVzdChvbGRTdHIpKTtcbiAgICAgICAgICAgIGxldCBuZXdFT0ZOZXdsaW5lID0gKC9cXG4kLy50ZXN0KG5ld1N0cikpO1xuICAgICAgICAgICAgaWYgKGxpbmVzLmxlbmd0aCA9PSAwICYmICFvbGRFT0ZOZXdsaW5lKSB7XG4gICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogb2xkIGhhcyBubyBlb2wgYW5kIG5vIHRyYWlsaW5nIGNvbnRleHQ7IG5vLW5sIGNhbiBlbmQgdXAgYmVmb3JlIGFkZHNcbiAgICAgICAgICAgICAgY3VyUmFuZ2Uuc3BsaWNlKGh1bmsub2xkTGluZXMsIDAsICdcXFxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9sZEVPRk5ld2xpbmUgfHwgIW5ld0VPRk5ld2xpbmUpIHtcbiAgICAgICAgICAgICAgY3VyUmFuZ2UucHVzaCgnXFxcXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGh1bmtzLnB1c2goaHVuayk7XG5cbiAgICAgICAgICBvbGRSYW5nZVN0YXJ0ID0gMDtcbiAgICAgICAgICBuZXdSYW5nZVN0YXJ0ID0gMDtcbiAgICAgICAgICBjdXJSYW5nZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBvbGRMaW5lICs9IGxpbmVzLmxlbmd0aDtcbiAgICAgIG5ld0xpbmUgKz0gbGluZXMubGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb2xkRmlsZU5hbWU6IG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZTogbmV3RmlsZU5hbWUsXG4gICAgb2xkSGVhZGVyOiBvbGRIZWFkZXIsIG5ld0hlYWRlcjogbmV3SGVhZGVyLFxuICAgIGh1bmtzOiBodW5rc1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVHdvRmlsZXNQYXRjaChvbGRGaWxlTmFtZSwgbmV3RmlsZU5hbWUsIG9sZFN0ciwgbmV3U3RyLCBvbGRIZWFkZXIsIG5ld0hlYWRlciwgb3B0aW9ucykge1xuICBjb25zdCBkaWZmID0gc3RydWN0dXJlZFBhdGNoKG9sZEZpbGVOYW1lLCBuZXdGaWxlTmFtZSwgb2xkU3RyLCBuZXdTdHIsIG9sZEhlYWRlciwgbmV3SGVhZGVyLCBvcHRpb25zKTtcblxuICBjb25zdCByZXQgPSBbXTtcbiAgaWYgKG9sZEZpbGVOYW1lID09IG5ld0ZpbGVOYW1lKSB7XG4gICAgcmV0LnB1c2goJ0luZGV4OiAnICsgb2xkRmlsZU5hbWUpO1xuICB9XG4gIHJldC5wdXNoKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7XG4gIHJldC5wdXNoKCctLS0gJyArIGRpZmYub2xkRmlsZU5hbWUgKyAodHlwZW9mIGRpZmYub2xkSGVhZGVyID09PSAndW5kZWZpbmVkJyA/ICcnIDogJ1xcdCcgKyBkaWZmLm9sZEhlYWRlcikpO1xuICByZXQucHVzaCgnKysrICcgKyBkaWZmLm5ld0ZpbGVOYW1lICsgKHR5cGVvZiBkaWZmLm5ld0hlYWRlciA9PT0gJ3VuZGVmaW5lZCcgPyAnJyA6ICdcXHQnICsgZGlmZi5uZXdIZWFkZXIpKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZmYuaHVua3MubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBodW5rID0gZGlmZi5odW5rc1tpXTtcbiAgICByZXQucHVzaChcbiAgICAgICdAQCAtJyArIGh1bmsub2xkU3RhcnQgKyAnLCcgKyBodW5rLm9sZExpbmVzXG4gICAgICArICcgKycgKyBodW5rLm5ld1N0YXJ0ICsgJywnICsgaHVuay5uZXdMaW5lc1xuICAgICAgKyAnIEBAJ1xuICAgICk7XG4gICAgcmV0LnB1c2guYXBwbHkocmV0LCBodW5rLmxpbmVzKTtcbiAgfVxuXG4gIHJldHVybiByZXQuam9pbignXFxuJykgKyAnXFxuJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhdGNoKGZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGNyZWF0ZVR3b0ZpbGVzUGF0Y2goZmlsZU5hbWUsIGZpbGVOYW1lLCBvbGRTdHIsIG5ld1N0ciwgb2xkSGVhZGVyLCBuZXdIZWFkZXIsIG9wdGlvbnMpO1xufVxuIl19 |
|
|
|
|
|
/***/ }), |
|
/* 15 */ |
|
/***/ (function(module, exports) { |
|
|
|
/*istanbul ignore start*/"use strict"; |
|
|
|
exports.__esModule = true; |
|
exports. /*istanbul ignore end*/arrayEqual = arrayEqual; |
|
/*istanbul ignore start*/exports. /*istanbul ignore end*/arrayStartsWith = arrayStartsWith; |
|
function arrayEqual(a, b) { |
|
if (a.length !== b.length) { |
|
return false; |
|
} |
|
|
|
return arrayStartsWith(a, b); |
|
} |
|
|
|
function arrayStartsWith(array, start) { |
|
if (start.length > array.length) { |
|
return false; |
|
} |
|
|
|
for (var i = 0; i < start.length; i++) { |
|
if (start[i] !== array[i]) { |
|
return false; |
|
} |
|
} |
|
|
|
return true; |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL2FycmF5LmpzIl0sIm5hbWVzIjpbImFycmF5RXF1YWwiLCJhcnJheVN0YXJ0c1dpdGgiLCJhIiwiYiIsImxlbmd0aCIsImFycmF5Iiwic3RhcnQiLCJpIl0sIm1hcHBpbmdzIjoiOzs7Z0NBQWdCQSxVLEdBQUFBLFU7eURBUUFDLGUsR0FBQUEsZTtBQVJULFNBQVNELFVBQVQsQ0FBb0JFLENBQXBCLEVBQXVCQyxDQUF2QixFQUEwQjtBQUMvQixNQUFJRCxFQUFFRSxNQUFGLEtBQWFELEVBQUVDLE1BQW5CLEVBQTJCO0FBQ3pCLFdBQU8sS0FBUDtBQUNEOztBQUVELFNBQU9ILGdCQUFnQkMsQ0FBaEIsRUFBbUJDLENBQW5CLENBQVA7QUFDRDs7QUFFTSxTQUFTRixlQUFULENBQXlCSSxLQUF6QixFQUFnQ0MsS0FBaEMsRUFBdUM7QUFDNUMsTUFBSUEsTUFBTUYsTUFBTixHQUFlQyxNQUFNRCxNQUF6QixFQUFpQztBQUMvQixXQUFPLEtBQVA7QUFDRDs7QUFFRCxPQUFLLElBQUlHLElBQUksQ0FBYixFQUFnQkEsSUFBSUQsTUFBTUYsTUFBMUIsRUFBa0NHLEdBQWxDLEVBQXVDO0FBQ3JDLFFBQUlELE1BQU1DLENBQU4sTUFBYUYsTUFBTUUsQ0FBTixDQUFqQixFQUEyQjtBQUN6QixhQUFPLEtBQVA7QUFDRDtBQUNGOztBQUVELFNBQU8sSUFBUDtBQUNEIiwiZmlsZSI6ImFycmF5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGFycmF5RXF1YWwoYSwgYikge1xuICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5U3RhcnRzV2l0aChhLCBiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5U3RhcnRzV2l0aChhcnJheSwgc3RhcnQpIHtcbiAgaWYgKHN0YXJ0Lmxlbmd0aCA+IGFycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhcnQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc3RhcnRbaV0gIT09IGFycmF5W2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iXX0= |
|
|
|
|
|
/***/ }), |
|
/* 16 */ |
|
/***/ (function(module, exports) { |
|
|
|
/*istanbul ignore start*/"use strict"; |
|
|
|
exports.__esModule = true; |
|
exports. /*istanbul ignore end*/convertChangesToDMP = convertChangesToDMP; |
|
// See: http://code.google.com/p/google-diff-match-patch/wiki/API |
|
function convertChangesToDMP(changes) { |
|
var ret = [], |
|
change = /*istanbul ignore start*/void 0 /*istanbul ignore end*/, |
|
operation = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; |
|
for (var i = 0; i < changes.length; i++) { |
|
change = changes[i]; |
|
if (change.added) { |
|
operation = 1; |
|
} else if (change.removed) { |
|
operation = -1; |
|
} else { |
|
operation = 0; |
|
} |
|
|
|
ret.push([operation, change.value]); |
|
} |
|
return ret; |
|
} |
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb252ZXJ0L2RtcC5qcyJdLCJuYW1lcyI6WyJjb252ZXJ0Q2hhbmdlc1RvRE1QIiwiY2hhbmdlcyIsInJldCIsImNoYW5nZSIsIm9wZXJhdGlvbiIsImkiLCJsZW5ndGgiLCJhZGRlZCIsInJlbW92ZWQiLCJwdXNoIiwidmFsdWUiXSwibWFwcGluZ3MiOiI7OztnQ0FDZ0JBLG1CLEdBQUFBLG1CO0FBRGhCO0FBQ08sU0FBU0EsbUJBQVQsQ0FBNkJDLE9BQTdCLEVBQXNDO0FBQzNDLE1BQUlDLE1BQU0sRUFBVjtBQUFBLE1BQ0lDLHdDQURKO0FBQUEsTUFFSUMsMkNBRko7QUFHQSxPQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUosUUFBUUssTUFBNUIsRUFBb0NELEdBQXBDLEVBQXlDO0FBQ3ZDRixhQUFTRixRQUFRSSxDQUFSLENBQVQ7QUFDQSxRQUFJRixPQUFPSSxLQUFYLEVBQWtCO0FBQ2hCSCxrQkFBWSxDQUFaO0FBQ0QsS0FGRCxNQUVPLElBQUlELE9BQU9LLE9BQVgsRUFBb0I7QUFDekJKLGtCQUFZLENBQUMsQ0FBYjtBQUNELEtBRk0sTUFFQTtBQUNMQSxrQkFBWSxDQUFaO0FBQ0Q7O0FBRURGLFFBQUlPLElBQUosQ0FBUyxDQUFDTCxTQUFELEVBQVlELE9BQU9PLEtBQW5CLENBQVQ7QUFDRDtBQUNELFNBQU9SLEdBQVA7QUFDRCIsImZpbGUiOiJkbXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTZWU6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtZGlmZi1tYXRjaC1wYXRjaC93aWtpL0FQSVxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRDaGFuZ2VzVG9ETVAoY2hhbmdlcykge1xuICBsZXQgcmV0ID0gW10sXG4gICAgICBjaGFuZ2UsXG4gICAgICBvcGVyYXRpb247XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykge1xuICAgIGNoYW5nZSA9IGNoYW5nZXNbaV07XG4gICAgaWYgKGNoYW5nZS5hZGRlZCkge1xuICAgICAgb3BlcmF0aW9uID0gMTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZS5yZW1vdmVkKSB7XG4gICAgICBvcGVyYXRpb24gPSAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3BlcmF0aW9uID0gMDtcbiAgICB9XG5cbiAgICByZXQucHVzaChbb3BlcmF0aW9uLCBjaGFuZ2UudmFsdWVdKTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIl19 |
|
|
|
|
|
/***/ }), |
|
/* 17 */ |
|
/***/ (function(module, exports) { |
|
|
|
/*istanbul ignore start*/'use strict'; |
|
|
|
exports.__esModule = true; |
|
exports. /*istanbul ignore end*/convertChangesToXML = convertChangesToXML; |
|
function convertChangesToXML(changes) { |
|
var ret = []; |
|
for (var i = 0; i < changes.length; i++) { |
|
var change = changes[i]; |
|
if (change.added) { |
|
ret.push('<ins>'); |
|
} else if (change.removed) { |
|
ret.push('<del>'); |
|
} |
|
|
|
ret.push(escapeHTML(change.value)); |
|
|
|
if (change.added) { |
|
ret.push('</ins>'); |
|
} else if (change.removed) { |
|
ret.push('</del>'); |
|
} |
|
} |
|
return ret.join(''); |
|
} |
|
|
|
function escapeHTML(s) { |
|
var n = s; |
|
n = n.replace(/&/g, '&'); |
|
n = n.replace(/</g, '<'); |
|
n = n.replace(/>/g, '>'); |
|
n = n.replace(/"/g, '"'); |
|
|
|
return n; |
|
} |
|
|
|
|
|
/***/ }) |
|
/******/ ]) |
|
}); |
|
; |
|
|
|
/***/ }), |
|
/* 192 */ |
|
/***/ (function(module, exports) { |
|
|
|
(function() { module.exports = this["tinymce"]; }()); |
|
|
|
/***/ }), |
|
/* 193 */ |
|
/***/ (function(module, exports) { |
|
|
|
var traverse = module.exports = function (obj) { |
|
return new Traverse(obj); |
|
}; |
|
|
|
function Traverse (obj) { |
|
this.value = obj; |
|
} |
|
|
|
Traverse.prototype.get = function (ps) { |
|
var node = this.value; |
|
for (var i = 0; i < ps.length; i ++) { |
|
var key = ps[i]; |
|
if (!node || !hasOwnProperty.call(node, key)) { |
|
node = undefined; |
|
break; |
|
} |
|
node = node[key]; |
|
} |
|
return node; |
|
}; |
|
|
|
Traverse.prototype.has = function (ps) { |
|
var node = this.value; |
|
for (var i = 0; i < ps.length; i ++) { |
|
var key = ps[i]; |
|
if (!node || !hasOwnProperty.call(node, key)) { |
|
return false; |
|
} |
|
node = node[key]; |
|
} |
|
return true; |
|
}; |
|
|
|
Traverse.prototype.set = function (ps, value) { |
|
var node = this.value; |
|
for (var i = 0; i < ps.length - 1; i ++) { |
|
var key = ps[i]; |
|
if (!hasOwnProperty.call(node, key)) node[key] = {}; |
|
node = node[key]; |
|
} |
|
node[ps[i]] = value; |
|
return value; |
|
}; |
|
|
|
Traverse.prototype.map = function (cb) { |
|
return walk(this.value, cb, true); |
|
}; |
|
|
|
Traverse.prototype.forEach = function (cb) { |
|
this.value = walk(this.value, cb, false); |
|
return this.value; |
|
}; |
|
|
|
Traverse.prototype.reduce = function (cb, init) { |
|
var skip = arguments.length === 1; |
|
var acc = skip ? this.value : init; |
|
this.forEach(function (x) { |
|
if (!this.isRoot || !skip) { |
|
acc = cb.call(this, acc, x); |
|
} |
|
}); |
|
return acc; |
|
}; |
|
|
|
Traverse.prototype.paths = function () { |
|
var acc = []; |
|
this.forEach(function (x) { |
|
acc.push(this.path); |
|
}); |
|
return acc; |
|
}; |
|
|
|
Traverse.prototype.nodes = function () { |
|
var acc = []; |
|
this.forEach(function (x) { |
|
acc.push(this.node); |
|
}); |
|
return acc; |
|
}; |
|
|
|
Traverse.prototype.clone = function () { |
|
var parents = [], nodes = []; |
|
|
|
return (function clone (src) { |
|
for (var i = 0; i < parents.length; i++) { |
|
if (parents[i] === src) { |
|
return nodes[i]; |
|
} |
|
} |
|
|
|
if (typeof src === 'object' && src !== null) { |
|
var dst = copy(src); |
|
|
|
parents.push(src); |
|
nodes.push(dst); |
|
|
|
forEach(objectKeys(src), function (key) { |
|
dst[key] = clone(src[key]); |
|
}); |
|
|
|
parents.pop(); |
|
nodes.pop(); |
|
return dst; |
|
} |
|
else { |
|
return src; |
|
} |
|
})(this.value); |
|
}; |
|
|
|
function walk (root, cb, immutable) { |
|
var path = []; |
|
var parents = []; |
|
var alive = true; |
|
|
|
return (function walker (node_) { |
|
var node = immutable ? copy(node_) : node_; |
|
var modifiers = {}; |
|
|
|
var keepGoing = true; |
|
|
|
var state = { |
|
node : node, |
|
node_ : node_, |
|
path : [].concat(path), |
|
parent : parents[parents.length - 1], |
|
parents : parents, |
|
key : path.slice(-1)[0], |
|
isRoot : path.length === 0, |
|
level : path.length, |
|
circular : null, |
|
update : function (x, stopHere) { |
|
if (!state.isRoot) { |
|
state.parent.node[state.key] = x; |
|
} |
|
state.node = x; |
|
if (stopHere) keepGoing = false; |
|
}, |
|
'delete' : function (stopHere) { |
|
delete state.parent.node[state.key]; |
|
if (stopHere) keepGoing = false; |
|
}, |
|
remove : function (stopHere) { |
|
if (isArray(state.parent.node)) { |
|
state.parent.node.splice(state.key, 1); |
|
} |
|
else { |
|
delete state.parent.node[state.key]; |
|
} |
|
if (stopHere) keepGoing = false; |
|
}, |
|
keys : null, |
|
before : function (f) { modifiers.before = f }, |
|
after : function (f) { modifiers.after = f }, |
|
pre : function (f) { modifiers.pre = f }, |
|
post : function (f) { modifiers.post = f }, |
|
stop : function () { alive = false }, |
|
block : function () { keepGoing = false } |
|
}; |
|
|
|
if (!alive) return state; |
|
|
|
function updateState() { |
|
if (typeof state.node === 'object' && state.node !== null) { |
|
if (!state.keys || state.node_ !== state.node) { |
|
state.keys = objectKeys(state.node) |
|
} |
|
|
|
state.isLeaf = state.keys.length == 0; |
|
|
|
for (var i = 0; i < parents.length; i++) { |
|
if (parents[i].node_ === node_) { |
|
state.circular = parents[i]; |
|
break; |
|
} |
|
} |
|
} |
|
else { |
|
state.isLeaf = true; |
|
state.keys = null; |
|
} |
|
|
|
state.notLeaf = !state.isLeaf; |
|
state.notRoot = !state.isRoot; |
|
} |
|
|
|
updateState(); |
|
|
|
// use return values to update if defined |
|
var ret = cb.call(state, state.node); |
|
if (ret !== undefined && state.update) state.update(ret); |
|
|
|
if (modifiers.before) modifiers.before.call(state, state.node); |
|
|
|
if (!keepGoing) return state; |
|
|
|
if (typeof state.node == 'object' |
|
&& state.node !== null && !state.circular) { |
|
parents.push(state); |
|
|
|
updateState(); |
|
|
|
forEach(state.keys, function (key, i) { |
|
path.push(key); |
|
|
|
if (modifiers.pre) modifiers.pre.call(state, state.node[key], key); |
|
|
|
var child = walker(state.node[key]); |
|
if (immutable && hasOwnProperty.call(state.node, key)) { |
|
state.node[key] = child.node; |
|
} |
|
|
|
child.isLast = i == state.keys.length - 1; |
|
child.isFirst = i == 0; |
|
|
|
if (modifiers.post) modifiers.post.call(state, child); |
|
|
|
path.pop(); |
|
}); |
|
parents.pop(); |
|
} |
|
|
|
if (modifiers.after) modifiers.after.call(state, state.node); |
|
|
|
return state; |
|
})(root).node; |
|
} |
|
|
|
function copy (src) { |
|
if (typeof src === 'object' && src !== null) { |
|
var dst; |
|
|
|
if (isArray(src)) { |
|
dst = []; |
|
} |
|
else if (isDate(src)) { |
|
dst = new Date(src.getTime ? src.getTime() : src); |
|
} |
|
else if (isRegExp(src)) { |
|
dst = new RegExp(src); |
|
} |
|
else if (isError(src)) { |
|
dst = { message: src.message }; |
|
} |
|
else if (isBoolean(src)) { |
|
dst = new Boolean(src); |
|
} |
|
else if (isNumber(src)) { |
|
dst = new Number(src); |
|
} |
|
else if (isString(src)) { |
|
dst = new String(src); |
|
} |
|
else if (Object.create && Object.getPrototypeOf) { |
|
dst = Object.create(Object.getPrototypeOf(src)); |
|
} |
|
else if (src.constructor === Object) { |
|
dst = {}; |
|
} |
|
else { |
|
var proto = |
|
(src.constructor && src.constructor.prototype) |
|
|| src.__proto__ |
|
|| {} |
|
; |
|
var T = function () {}; |
|
T.prototype = proto; |
|
dst = new T; |
|
} |
|
|
|
forEach(objectKeys(src), function (key) { |
|
dst[key] = src[key]; |
|
}); |
|
return dst; |
|
} |
|
else return src; |
|
} |
|
|
|
var objectKeys = Object.keys || function keys (obj) { |
|
var res = []; |
|
for (var key in obj) res.push(key) |
|
return res; |
|
}; |
|
|
|
function toS (obj) { return Object.prototype.toString.call(obj) } |
|
function isDate (obj) { return toS(obj) === '[object Date]' } |
|
function isRegExp (obj) { return toS(obj) === '[object RegExp]' } |
|
function isError (obj) { return toS(obj) === '[object Error]' } |
|
function isBoolean (obj) { return toS(obj) === '[object Boolean]' } |
|
function isNumber (obj) { return toS(obj) === '[object Number]' } |
|
function isString (obj) { return toS(obj) === '[object String]' } |
|
|
|
var isArray = Array.isArray || function isArray (xs) { |
|
return Object.prototype.toString.call(xs) === '[object Array]'; |
|
}; |
|
|
|
var forEach = function (xs, fn) { |
|
if (xs.forEach) return xs.forEach(fn) |
|
else for (var i = 0; i < xs.length; i++) { |
|
fn(xs[i], i, xs); |
|
} |
|
}; |
|
|
|
forEach(objectKeys(Traverse.prototype), function (key) { |
|
traverse[key] = function (obj) { |
|
var args = [].slice.call(arguments, 1); |
|
var t = new Traverse(obj); |
|
return t[key].apply(t, args); |
|
}; |
|
}); |
|
|
|
var hasOwnProperty = Object.hasOwnProperty || function (obj, key) { |
|
return key in obj; |
|
}; |
|
|
|
|
|
/***/ }), |
|
/* 194 */, |
|
/* 195 */, |
|
/* 196 */, |
|
/* 197 */, |
|
/* 198 */, |
|
/* 199 */, |
|
/* 200 */, |
|
/* 201 */, |
|
/* 202 */, |
|
/* 203 */, |
|
/* 204 */, |
|
/* 205 */, |
|
/* 206 */, |
|
/* 207 */, |
|
/* 208 */, |
|
/* 209 */, |
|
/* 210 */, |
|
/* 211 */, |
|
/* 212 */, |
|
/* 213 */, |
|
/* 214 */, |
|
/* 215 */, |
|
/* 216 */, |
|
/* 217 */, |
|
/* 218 */, |
|
/* 219 */, |
|
/* 220 */, |
|
/* 221 */, |
|
/* 222 */, |
|
/* 223 */, |
|
/* 224 */, |
|
/* 225 */, |
|
/* 226 */, |
|
/* 227 */, |
|
/* 228 */, |
|
/* 229 */, |
|
/* 230 */, |
|
/* 231 */, |
|
/* 232 */, |
|
/* 233 */, |
|
/* 234 */, |
|
/* 235 */, |
|
/* 236 */, |
|
/* 237 */, |
|
/* 238 */, |
|
/* 239 */, |
|
/* 240 */, |
|
/* 241 */, |
|
/* 242 */, |
|
/* 243 */, |
|
/* 244 */, |
|
/* 245 */, |
|
/* 246 */, |
|
/* 247 */, |
|
/* 248 */, |
|
/* 249 */, |
|
/* 250 */, |
|
/* 251 */, |
|
/* 252 */, |
|
/* 253 */, |
|
/* 254 */, |
|
/* 255 */, |
|
/* 256 */, |
|
/* 257 */, |
|
/* 258 */, |
|
/* 259 */, |
|
/* 260 */, |
|
/* 261 */, |
|
/* 262 */, |
|
/* 263 */, |
|
/* 264 */, |
|
/* 265 */, |
|
/* 266 */, |
|
/* 267 */, |
|
/* 268 */, |
|
/* 269 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
|
|
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; |
|
|
|
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } |
|
|
|
var BEGIN = 'BEGIN'; |
|
var COMMIT = 'COMMIT'; |
|
var REVERT = 'REVERT'; |
|
// Array({transactionID: string or null, beforeState: {object}, action: {object}} |
|
var INITIAL_OPTIMIST = []; |
|
|
|
module.exports = optimist; |
|
module.exports.BEGIN = BEGIN; |
|
module.exports.COMMIT = COMMIT; |
|
module.exports.REVERT = REVERT; |
|
function optimist(fn) { |
|
function beginReducer(state, action) { |
|
var _separateState = separateState(state); |
|
|
|
var optimist = _separateState.optimist; |
|
var innerState = _separateState.innerState; |
|
|
|
optimist = optimist.concat([{ beforeState: innerState, action: action }]); |
|
innerState = fn(innerState, action); |
|
validateState(innerState, action); |
|
return _extends({ optimist: optimist }, innerState); |
|
} |
|
function commitReducer(state, action) { |
|
var _separateState2 = separateState(state); |
|
|
|
var optimist = _separateState2.optimist; |
|
var innerState = _separateState2.innerState; |
|
|
|
var newOptimist = [], |
|
started = false, |
|
committed = false; |
|
optimist.forEach(function (entry) { |
|
if (started) { |
|
if (entry.beforeState && matchesTransaction(entry.action, action.optimist.id)) { |
|
committed = true; |
|
newOptimist.push({ action: entry.action }); |
|
} else { |
|
newOptimist.push(entry); |
|
} |
|
} else if (entry.beforeState && !matchesTransaction(entry.action, action.optimist.id)) { |
|
started = true; |
|
newOptimist.push(entry); |
|
} else if (entry.beforeState && matchesTransaction(entry.action, action.optimist.id)) { |
|
committed = true; |
|
} |
|
}); |
|
if (!committed) { |
|
console.error('Cannot commit transaction with id "' + action.optimist.id + '" because it does not exist'); |
|
} |
|
optimist = newOptimist; |
|
return baseReducer(optimist, innerState, action); |
|
} |
|
function revertReducer(state, action) { |
|
var _separateState3 = separateState(state); |
|
|
|
var optimist = _separateState3.optimist; |
|
var innerState = _separateState3.innerState; |
|
|
|
var newOptimist = [], |
|
started = false, |
|
gotInitialState = false, |
|
currentState = innerState; |
|
optimist.forEach(function (entry) { |
|
if (entry.beforeState && matchesTransaction(entry.action, action.optimist.id)) { |
|
currentState = entry.beforeState; |
|
gotInitialState = true; |
|
} |
|
if (!matchesTransaction(entry.action, action.optimist.id)) { |
|
if (entry.beforeState) { |
|
started = true; |
|
} |
|
if (started) { |
|
if (gotInitialState && entry.beforeState) { |
|
newOptimist.push({ |
|
beforeState: currentState, |
|
action: entry.action |
|
}); |
|
} else { |
|
newOptimist.push(entry); |
|
} |
|
} |
|
if (gotInitialState) { |
|
currentState = fn(currentState, entry.action); |
|
validateState(innerState, action); |
|
} |
|
} |
|
}); |
|
if (!gotInitialState) { |
|
console.error('Cannot revert transaction with id "' + action.optimist.id + '" because it does not exist'); |
|
} |
|
optimist = newOptimist; |
|
return baseReducer(optimist, currentState, action); |
|
} |
|
function baseReducer(optimist, innerState, action) { |
|
if (optimist.length) { |
|
optimist = optimist.concat([{ action: action }]); |
|
} |
|
innerState = fn(innerState, action); |
|
validateState(innerState, action); |
|
return _extends({ optimist: optimist }, innerState); |
|
} |
|
return function (state, action) { |
|
if (action.optimist) { |
|
switch (action.optimist.type) { |
|
case BEGIN: |
|
return beginReducer(state, action); |
|
case COMMIT: |
|
return commitReducer(state, action); |
|
case REVERT: |
|
return revertReducer(state, action); |
|
} |
|
} |
|
|
|
var _separateState4 = separateState(state); |
|
|
|
var optimist = _separateState4.optimist; |
|
var innerState = _separateState4.innerState; |
|
|
|
if (state && !optimist.length) { |
|
var nextState = fn(innerState, action); |
|
if (nextState === innerState) { |
|
return state; |
|
} |
|
validateState(nextState, action); |
|
return _extends({ optimist: optimist }, nextState); |
|
} |
|
return baseReducer(optimist, innerState, action); |
|
}; |
|
} |
|
|
|
function matchesTransaction(action, id) { |
|
return action.optimist && action.optimist.id === id; |
|
} |
|
|
|
function validateState(newState, action) { |
|
if (!newState || typeof newState !== 'object' || Array.isArray(newState)) { |
|
throw new TypeError('Error while handling "' + action.type + '": Optimist requires that state is always a plain object.'); |
|
} |
|
} |
|
|
|
function separateState(state) { |
|
if (!state) { |
|
return { optimist: INITIAL_OPTIMIST, innerState: state }; |
|
} else { |
|
var _state$optimist = state.optimist; |
|
|
|
var _optimist = _state$optimist === undefined ? INITIAL_OPTIMIST : _state$optimist; |
|
|
|
var innerState = _objectWithoutProperties(state, ['optimist']); |
|
|
|
return { optimist: _optimist, innerState: innerState }; |
|
} |
|
} |
|
|
|
/***/ }), |
|
/* 270 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
"use strict"; |
|
|
|
var __extends = (this && this.__extends) || (function () { |
|
var extendStatics = Object.setPrototypeOf || |
|
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || |
|
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; |
|
return function (d, b) { |
|
extendStatics(d, b); |
|
function __() { this.constructor = d; } |
|
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); |
|
}; |
|
})(); |
|
var __assign = (this && this.__assign) || Object.assign || function(t) { |
|
for (var s, i = 1, n = arguments.length; i < n; i++) { |
|
s = arguments[i]; |
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) |
|
t[p] = s[p]; |
|
} |
|
return t; |
|
}; |
|
var __rest = (this && this.__rest) || function (s, e) { |
|
var t = {}; |
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) |
|
t[p] = s[p]; |
|
if (s != null && typeof Object.getOwnPropertySymbols === "function") |
|
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) |
|
t[p[i]] = s[p[i]]; |
|
return t; |
|
}; |
|
exports.__esModule = true; |
|
var React = __webpack_require__(26); |
|
var PropTypes = __webpack_require__(29); |
|
var autosize = __webpack_require__(271); |
|
var _getLineHeight = __webpack_require__(272); |
|
var getLineHeight = _getLineHeight; |
|
var UPDATE = 'autosize:update'; |
|
var DESTROY = 'autosize:destroy'; |
|
var RESIZED = 'autosize:resized'; |
|
/** |
|
* A light replacement for built-in textarea component |
|
* which automaticaly adjusts its height to match the content |
|
*/ |
|
var TextareaAutosize = /** @class */ (function (_super) { |
|
__extends(TextareaAutosize, _super); |
|
function TextareaAutosize() { |
|
var _this = _super !== null && _super.apply(this, arguments) || this; |
|
_this.state = { |
|
lineHeight: null |
|
}; |
|
_this.dispatchEvent = function (EVENT_TYPE) { |
|
var event = document.createEvent('Event'); |
|
event.initEvent(EVENT_TYPE, true, false); |
|
_this.textarea.dispatchEvent(event); |
|
}; |
|
_this.updateLineHeight = function () { |
|
_this.setState({ |
|
lineHeight: getLineHeight(_this.textarea) |
|
}); |
|
}; |
|
_this.onChange = function (e) { |
|
var onChange = _this.props.onChange; |
|
_this.currentValue = e.currentTarget.value; |
|
onChange && onChange(e); |
|
}; |
|
_this.saveDOMNodeRef = function (ref) { |
|
var innerRef = _this.props.innerRef; |
|
if (innerRef) { |
|
innerRef(ref); |
|
} |
|
_this.textarea = ref; |
|
}; |
|
_this.getLocals = function () { |
|
var _a = _this, _b = _a.props, onResize = _b.onResize, maxRows = _b.maxRows, onChange = _b.onChange, style = _b.style, innerRef = _b.innerRef, props = __rest(_b, ["onResize", "maxRows", "onChange", "style", "innerRef"]), lineHeight = _a.state.lineHeight, saveDOMNodeRef = _a.saveDOMNodeRef; |
|
var maxHeight = maxRows && lineHeight ? lineHeight * maxRows : null; |
|
return __assign({}, props, { saveDOMNodeRef: saveDOMNodeRef, style: maxHeight ? __assign({}, style, { maxHeight: maxHeight }) : style, onChange: _this.onChange }); |
|
}; |
|
return _this; |
|
} |
|
TextareaAutosize.prototype.componentDidMount = function () { |
|
var _this = this; |
|
var _a = this.props, onResize = _a.onResize, maxRows = _a.maxRows; |
|
if (typeof maxRows === 'number') { |
|
this.updateLineHeight(); |
|
} |
|
/* |
|
the defer is needed to: |
|
- force "autosize" to activate the scrollbar when this.props.maxRows is passed |
|
- support StyledComponents (see #71) |
|
*/ |
|
setTimeout(function () { return autosize(_this.textarea); }); |
|
if (onResize) { |
|
this.textarea.addEventListener(RESIZED, onResize); |
|
} |
|
}; |
|
TextareaAutosize.prototype.componentWillUnmount = function () { |
|
var onResize = this.props.onResize; |
|
if (onResize) { |
|
this.textarea.removeEventListener(RESIZED, onResize); |
|
} |
|
this.dispatchEvent(DESTROY); |
|
}; |
|
TextareaAutosize.prototype.render = function () { |
|
var _a = this.getLocals(), children = _a.children, saveDOMNodeRef = _a.saveDOMNodeRef, locals = __rest(_a, ["children", "saveDOMNodeRef"]); |
|
return (React.createElement("textarea", __assign({}, locals, { ref: saveDOMNodeRef }), children)); |
|
}; |
|
TextareaAutosize.prototype.componentDidUpdate = function (prevProps) { |
|
if (this.props.value !== this.currentValue || this.props.rows !== prevProps.rows) { |
|
this.dispatchEvent(UPDATE); |
|
} |
|
}; |
|
TextareaAutosize.defaultProps = { |
|
rows: 1 |
|
}; |
|
TextareaAutosize.propTypes = { |
|
rows: PropTypes.number, |
|
maxRows: PropTypes.number, |
|
onResize: PropTypes.func, |
|
innerRef: PropTypes.func |
|
}; |
|
return TextareaAutosize; |
|
}(React.Component)); |
|
exports["default"] = TextareaAutosize; |
|
|
|
|
|
/***/ }), |
|
/* 271 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! |
|
autosize 4.0.2 |
|
license: MIT |
|
http://www.jacklmoore.com/autosize |
|
*/ |
|
(function (global, factory) { |
|
if (true) { |
|
!(__WEBPACK_AMD_DEFINE_ARRAY__ = [module, exports], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), |
|
__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? |
|
(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), |
|
__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); |
|
} else { var mod; } |
|
})(this, function (module, exports) { |
|
'use strict'; |
|
|
|
var map = typeof Map === "function" ? new Map() : function () { |
|
var keys = []; |
|
var values = []; |
|
|
|
return { |
|
has: function has(key) { |
|
return keys.indexOf(key) > -1; |
|
}, |
|
get: function get(key) { |
|
return values[keys.indexOf(key)]; |
|
}, |
|
set: function set(key, value) { |
|
if (keys.indexOf(key) === -1) { |
|
keys.push(key); |
|
values.push(value); |
|
} |
|
}, |
|
delete: function _delete(key) { |
|
var index = keys.indexOf(key); |
|
if (index > -1) { |
|
keys.splice(index, 1); |
|
values.splice(index, 1); |
|
} |
|
} |
|
}; |
|
}(); |
|
|
|
var createEvent = function createEvent(name) { |
|
return new Event(name, { bubbles: true }); |
|
}; |
|
try { |
|
new Event('test'); |
|
} catch (e) { |
|
// IE does not support `new Event()` |
|
createEvent = function createEvent(name) { |
|
var evt = document.createEvent('Event'); |
|
evt.initEvent(name, true, false); |
|
return evt; |
|
}; |
|
} |
|
|
|
function assign(ta) { |
|
if (!ta || !ta.nodeName || ta.nodeName !== 'TEXTAREA' || map.has(ta)) return; |
|
|
|
var heightOffset = null; |
|
var clientWidth = null; |
|
var cachedHeight = null; |
|
|
|
function init() { |
|
var style = window.getComputedStyle(ta, null); |
|
|
|
if (style.resize === 'vertical') { |
|
ta.style.resize = 'none'; |
|
} else if (style.resize === 'both') { |
|
ta.style.resize = 'horizontal'; |
|
} |
|
|
|
if (style.boxSizing === 'content-box') { |
|
heightOffset = -(parseFloat(style.paddingTop) + parseFloat(style.paddingBottom)); |
|
} else { |
|
heightOffset = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth); |
|
} |
|
// Fix when a textarea is not on document body and heightOffset is Not a Number |
|
if (isNaN(heightOffset)) { |
|
heightOffset = 0; |
|
} |
|
|
|
update(); |
|
} |
|
|
|
function changeOverflow(value) { |
|
{ |
|
// Chrome/Safari-specific fix: |
|
// When the textarea y-overflow is hidden, Chrome/Safari do not reflow the text to account for the space |
|
// made available by removing the scrollbar. The following forces the necessary text reflow. |
|
var width = ta.style.width; |
|
ta.style.width = '0px'; |
|
// Force reflow: |
|
/* jshint ignore:start */ |
|
ta.offsetWidth; |
|
/* jshint ignore:end */ |
|
ta.style.width = width; |
|
} |
|
|
|
ta.style.overflowY = value; |
|
} |
|
|
|
function getParentOverflows(el) { |
|
var arr = []; |
|
|
|
while (el && el.parentNode && el.parentNode instanceof Element) { |
|
if (el.parentNode.scrollTop) { |
|
arr.push({ |
|
node: el.parentNode, |
|
scrollTop: el.parentNode.scrollTop |
|
}); |
|
} |
|
el = el.parentNode; |
|
} |
|
|
|
return arr; |
|
} |
|
|
|
function resize() { |
|
if (ta.scrollHeight === 0) { |
|
// If the scrollHeight is 0, then the element probably has display:none or is detached from the DOM. |
|
return; |
|
} |
|
|
|
var overflows = getParentOverflows(ta); |
|
var docTop = document.documentElement && document.documentElement.scrollTop; // Needed for Mobile IE (ticket #240) |
|
|
|
ta.style.height = ''; |
|
ta.style.height = ta.scrollHeight + heightOffset + 'px'; |
|
|
|
// used to check if an update is actually necessary on window.resize |
|
clientWidth = ta.clientWidth; |
|
|
|
// prevents scroll-position jumping |
|
overflows.forEach(function (el) { |
|
el.node.scrollTop = el.scrollTop; |
|
}); |
|
|
|
if (docTop) { |
|
document.documentElement.scrollTop = docTop; |
|
} |
|
} |
|
|
|
function update() { |
|
resize(); |
|
|
|
var styleHeight = Math.round(parseFloat(ta.style.height)); |
|
var computed = window.getComputedStyle(ta, null); |
|
|
|
// Using offsetHeight as a replacement for computed.height in IE, because IE does not account use of border-box |
|
var actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(computed.height)) : ta.offsetHeight; |
|
|
|
// The actual height not matching the style height (set via the resize method) indicates that |
|
// the max-height has been exceeded, in which case the overflow should be allowed. |
|
if (actualHeight < styleHeight) { |
|
if (computed.overflowY === 'hidden') { |
|
changeOverflow('scroll'); |
|
resize(); |
|
actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight; |
|
} |
|
} else { |
|
// Normally keep overflow set to hidden, to avoid flash of scrollbar as the textarea expands. |
|
if (computed.overflowY !== 'hidden') { |
|
changeOverflow('hidden'); |
|
resize(); |
|
actualHeight = computed.boxSizing === 'content-box' ? Math.round(parseFloat(window.getComputedStyle(ta, null).height)) : ta.offsetHeight; |
|
} |
|
} |
|
|
|
if (cachedHeight !== actualHeight) { |
|
cachedHeight = actualHeight; |
|
var evt = createEvent('autosize:resized'); |
|
try { |
|
ta.dispatchEvent(evt); |
|
} catch (err) { |
|
// Firefox will throw an error on dispatchEvent for a detached element |
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=889376 |
|
} |
|
} |
|
} |
|
|
|
var pageResize = function pageResize() { |
|
if (ta.clientWidth !== clientWidth) { |
|
update(); |
|
} |
|
}; |
|
|
|
var destroy = function (style) { |
|
window.removeEventListener('resize', pageResize, false); |
|
ta.removeEventListener('input', update, false); |
|
ta.removeEventListener('keyup', update, false); |
|
ta.removeEventListener('autosize:destroy', destroy, false); |
|
ta.removeEventListener('autosize:update', update, false); |
|
|
|
Object.keys(style).forEach(function (key) { |
|
ta.style[key] = style[key]; |
|
}); |
|
|
|
map.delete(ta); |
|
}.bind(ta, { |
|
height: ta.style.height, |
|
resize: ta.style.resize, |
|
overflowY: ta.style.overflowY, |
|
overflowX: ta.style.overflowX, |
|
wordWrap: ta.style.wordWrap |
|
}); |
|
|
|
ta.addEventListener('autosize:destroy', destroy, false); |
|
|
|
// IE9 does not fire onpropertychange or oninput for deletions, |
|
// so binding to onkeyup to catch most of those events. |
|
// There is no way that I know of to detect something like 'cut' in IE9. |
|
if ('onpropertychange' in ta && 'oninput' in ta) { |
|
ta.addEventListener('keyup', update, false); |
|
} |
|
|
|
window.addEventListener('resize', pageResize, false); |
|
ta.addEventListener('input', update, false); |
|
ta.addEventListener('autosize:update', update, false); |
|
ta.style.overflowX = 'hidden'; |
|
ta.style.wordWrap = 'break-word'; |
|
|
|
map.set(ta, { |
|
destroy: destroy, |
|
update: update |
|
}); |
|
|
|
init(); |
|
} |
|
|
|
function destroy(ta) { |
|
var methods = map.get(ta); |
|
if (methods) { |
|
methods.destroy(); |
|
} |
|
} |
|
|
|
function update(ta) { |
|
var methods = map.get(ta); |
|
if (methods) { |
|
methods.update(); |
|
} |
|
} |
|
|
|
var autosize = null; |
|
|
|
// Do nothing in Node.js environment and IE8 (or lower) |
|
if (typeof window === 'undefined' || typeof window.getComputedStyle !== 'function') { |
|
autosize = function autosize(el) { |
|
return el; |
|
}; |
|
autosize.destroy = function (el) { |
|
return el; |
|
}; |
|
autosize.update = function (el) { |
|
return el; |
|
}; |
|
} else { |
|
autosize = function autosize(el, options) { |
|
if (el) { |
|
Array.prototype.forEach.call(el.length ? el : [el], function (x) { |
|
return assign(x, options); |
|
}); |
|
} |
|
return el; |
|
}; |
|
autosize.destroy = function (el) { |
|
if (el) { |
|
Array.prototype.forEach.call(el.length ? el : [el], destroy); |
|
} |
|
return el; |
|
}; |
|
autosize.update = function (el) { |
|
if (el) { |
|
Array.prototype.forEach.call(el.length ? el : [el], update); |
|
} |
|
return el; |
|
}; |
|
} |
|
|
|
exports.default = autosize; |
|
module.exports = exports['default']; |
|
}); |
|
|
|
/***/ }), |
|
/* 272 */ |
|
/***/ (function(module, exports, __webpack_require__) { |
|
|
|
// Load in dependencies |
|
var computedStyle = __webpack_require__(273); |
|
|
|
/** |
|
* Calculate the `line-height` of a given node |
|
* @param {HTMLElement} node Element to calculate line height of. Must be in the DOM. |
|
* @returns {Number} `line-height` of the element in pixels |
|
*/ |
|
function lineHeight(node) { |
|
// Grab the line-height via style |
|
var lnHeightStr = computedStyle(node, 'line-height'); |
|
var lnHeight = parseFloat(lnHeightStr, 10); |
|
|
|
// If the lineHeight did not contain a unit (i.e. it was numeric), convert it to ems (e.g. '2.3' === '2.3em') |
|
if (lnHeightStr === lnHeight + '') { |
|
// Save the old lineHeight style and update the em unit to the element |
|
var _lnHeightStyle = node.style.lineHeight; |
|
node.style.lineHeight = lnHeightStr + 'em'; |
|
|
|
// Calculate the em based height |
|
lnHeightStr = computedStyle(node, 'line-height'); |
|
lnHeight = parseFloat(lnHeightStr, 10); |
|
|
|
// Revert the lineHeight style |
|
if (_lnHeightStyle) { |
|
node.style.lineHeight = _lnHeightStyle; |
|
} else { |
|
delete node.style.lineHeight; |
|
} |
|
} |
|
|
|
// If the lineHeight is in `pt`, convert it to pixels (4px for 3pt) |
|
// DEV: `em` units are converted to `pt` in IE6 |
|
// Conversion ratio from https://developer.mozilla.org/en-US/docs/Web/CSS/length |
|
if (lnHeightStr.indexOf('pt') !== -1) { |
|
lnHeight *= 4; |
|
lnHeight /= 3; |
|
// Otherwise, if the lineHeight is in `mm`, convert it to pixels (96px for 25.4mm) |
|
} else if (lnHeightStr.indexOf('mm') !== -1) { |
|
lnHeight *= 96; |
|
lnHeight /= 25.4; |
|
// Otherwise, if the lineHeight is in `cm`, convert it to pixels (96px for 2.54cm) |
|
} else if (lnHeightStr.indexOf('cm') !== -1) { |
|
lnHeight *= 96; |
|
lnHeight /= 2.54; |
|
// Otherwise, if the lineHeight is in `in`, convert it to pixels (96px for 1in) |
|
} else if (lnHeightStr.indexOf('in') !== -1) { |
|
lnHeight *= 96; |
|
// Otherwise, if the lineHeight is in `pc`, convert it to pixels (12pt for 1pc) |
|
} else if (lnHeightStr.indexOf('pc') !== -1) { |
|
lnHeight *= 16; |
|
} |
|
|
|
// Continue our computation |
|
lnHeight = Math.round(lnHeight); |
|
|
|
// If the line-height is "normal", calculate by font-size |
|
if (lnHeightStr === 'normal') { |
|
// Create a temporary node |
|
var nodeName = node.nodeName; |
|
var _node = document.createElement(nodeName); |
|
_node.innerHTML = ' '; |
|
|
|
// If we have a text area, reset it to only 1 row |
|
// https://github.com/twolfson/line-height/issues/4 |
|
if (nodeName.toUpperCase() === 'TEXTAREA') { |
|
_node.setAttribute('rows', '1'); |
|
} |
|
|
|
// Set the font-size of the element |
|
var fontSizeStr = computedStyle(node, 'font-size'); |
|
_node.style.fontSize = fontSizeStr; |
|
|
|
// Remove default padding/border which can affect offset height |
|
// https://github.com/twolfson/line-height/issues/4 |
|
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetHeight |
|
_node.style.padding = '0px'; |
|
_node.style.border = '0px'; |
|
|
|
// Append it to the body |
|
var body = document.body; |
|
body.appendChild(_node); |
|
|
|
// Assume the line height of the element is the height |
|
var height = _node.offsetHeight; |
|
lnHeight = height; |
|
|
|
// Remove our child from the DOM |
|
body.removeChild(_node); |
|
} |
|
|
|
// Return the calculated height |
|
return lnHeight; |
|
} |
|
|
|
// Export lineHeight |
|
module.exports = lineHeight; |
|
|
|
|
|
/***/ }), |
|
/* 273 */ |
|
/***/ (function(module, exports) { |
|
|
|
// This code has been refactored for 140 bytes |
|
// You can see the original here: https://github.com/twolfson/computedStyle/blob/04cd1da2e30fa45844f95f5cb1ac898e9b9ef050/lib/computedStyle.js |
|
var computedStyle = function (el, prop, getComputedStyle) { |
|
getComputedStyle = window.getComputedStyle; |
|
|
|
// In one fell swoop |
|
return ( |
|
// If we have getComputedStyle |
|
getComputedStyle ? |
|
// Query it |
|
// TODO: From CSS-Query notes, we might need (node, null) for FF |
|
getComputedStyle(el) : |
|
|
|
// Otherwise, we are in IE and use currentStyle |
|
el.currentStyle |
|
)[ |
|
// Switch to camelCase for CSSOM |
|
// DEV: Grabbed from jQuery |
|
// https://github.com/jquery/jquery/blob/1.9-stable/src/css.js#L191-L194 |
|
// https://github.com/jquery/jquery/blob/1.9-stable/src/core.js#L593-L597 |
|
prop.replace(/-(\w)/gi, function (word, letter) { |
|
return letter.toUpperCase(); |
|
}) |
|
]; |
|
}; |
|
|
|
module.exports = computedStyle; |
|
|
|
|
|
/***/ }), |
|
/* 274 */, |
|
/* 275 */, |
|
/* 276 */, |
|
/* 277 */, |
|
/* 278 */, |
|
/* 279 */, |
|
/* 280 */, |
|
/* 281 */, |
|
/* 282 */, |
|
/* 283 */, |
|
/* 284 */, |
|
/* 285 */, |
|
/* 286 */, |
|
/* 287 */, |
|
/* 288 */, |
|
/* 289 */, |
|
/* 290 */, |
|
/* 291 */, |
|
/* 292 */, |
|
/* 293 */, |
|
/* 294 */, |
|
/* 295 */, |
|
/* 296 */, |
|
/* 297 */, |
|
/* 298 */, |
|
/* 299 */, |
|
/* 300 */, |
|
/* 301 */, |
|
/* 302 */ |
|
/***/ (function(module, __webpack_exports__, __webpack_require__) { |
|
|
|
"use strict"; |
|
__webpack_require__.r(__webpack_exports__); |
|
var actions_namespaceObject = {}; |
|
__webpack_require__.r(actions_namespaceObject); |
|
__webpack_require__.d(actions_namespaceObject, "setupEditor", function() { return setupEditor; }); |
|
__webpack_require__.d(actions_namespaceObject, "resetPost", function() { return resetPost; }); |
|
__webpack_require__.d(actions_namespaceObject, "resetAutosave", function() { return resetAutosave; }); |
|
__webpack_require__.d(actions_namespaceObject, "updatePost", function() { return updatePost; }); |
|
__webpack_require__.d(actions_namespaceObject, "setupEditorState", function() { return setupEditorState; }); |
|
__webpack_require__.d(actions_namespaceObject, "resetBlocks", function() { return actions_resetBlocks; }); |
|
__webpack_require__.d(actions_namespaceObject, "receiveBlocks", function() { return receiveBlocks; }); |
|
__webpack_require__.d(actions_namespaceObject, "updateBlockAttributes", function() { return updateBlockAttributes; }); |
|
__webpack_require__.d(actions_namespaceObject, "updateBlock", function() { return updateBlock; }); |
|
__webpack_require__.d(actions_namespaceObject, "selectBlock", function() { return actions_selectBlock; }); |
|
__webpack_require__.d(actions_namespaceObject, "startMultiSelect", function() { return startMultiSelect; }); |
|
__webpack_require__.d(actions_namespaceObject, "stopMultiSelect", function() { return stopMultiSelect; }); |
|
__webpack_require__.d(actions_namespaceObject, "multiSelect", function() { return actions_multiSelect; }); |
|
__webpack_require__.d(actions_namespaceObject, "clearSelectedBlock", function() { return clearSelectedBlock; }); |
|
__webpack_require__.d(actions_namespaceObject, "toggleSelection", function() { return toggleSelection; }); |
|
__webpack_require__.d(actions_namespaceObject, "replaceBlocks", function() { return actions_replaceBlocks; }); |
|
__webpack_require__.d(actions_namespaceObject, "replaceBlock", function() { return replaceBlock; }); |
|
__webpack_require__.d(actions_namespaceObject, "moveBlocksDown", function() { return actions_moveBlocksDown; }); |
|
__webpack_require__.d(actions_namespaceObject, "moveBlocksUp", function() { return actions_moveBlocksUp; }); |
|
__webpack_require__.d(actions_namespaceObject, "moveBlockToPosition", function() { return moveBlockToPosition; }); |
|
__webpack_require__.d(actions_namespaceObject, "insertBlock", function() { return actions_insertBlock; }); |
|
__webpack_require__.d(actions_namespaceObject, "insertBlocks", function() { return actions_insertBlocks; }); |
|
__webpack_require__.d(actions_namespaceObject, "showInsertionPoint", function() { return actions_showInsertionPoint; }); |
|
__webpack_require__.d(actions_namespaceObject, "hideInsertionPoint", function() { return actions_hideInsertionPoint; }); |
|
__webpack_require__.d(actions_namespaceObject, "setTemplateValidity", function() { return setTemplateValidity; }); |
|
__webpack_require__.d(actions_namespaceObject, "synchronizeTemplate", function() { return synchronizeTemplate; }); |
|
__webpack_require__.d(actions_namespaceObject, "editPost", function() { return actions_editPost; }); |
|
__webpack_require__.d(actions_namespaceObject, "savePost", function() { return savePost; }); |
|
__webpack_require__.d(actions_namespaceObject, "refreshPost", function() { return refreshPost; }); |
|
__webpack_require__.d(actions_namespaceObject, "trashPost", function() { return trashPost; }); |
|
__webpack_require__.d(actions_namespaceObject, "mergeBlocks", function() { return mergeBlocks; }); |
|
__webpack_require__.d(actions_namespaceObject, "autosave", function() { return actions_autosave; }); |
|
__webpack_require__.d(actions_namespaceObject, "redo", function() { return actions_redo; }); |
|
__webpack_require__.d(actions_namespaceObject, "undo", function() { return actions_undo; }); |
|
__webpack_require__.d(actions_namespaceObject, "createUndoLevel", function() { return createUndoLevel; }); |
|
__webpack_require__.d(actions_namespaceObject, "removeBlocks", function() { return actions_removeBlocks; }); |
|
__webpack_require__.d(actions_namespaceObject, "removeBlock", function() { return removeBlock; }); |
|
__webpack_require__.d(actions_namespaceObject, "toggleBlockMode", function() { return toggleBlockMode; }); |
|
__webpack_require__.d(actions_namespaceObject, "startTyping", function() { return startTyping; }); |
|
__webpack_require__.d(actions_namespaceObject, "stopTyping", function() { return stopTyping; }); |
|
__webpack_require__.d(actions_namespaceObject, "enterFormattedText", function() { return enterFormattedText; }); |
|
__webpack_require__.d(actions_namespaceObject, "exitFormattedText", function() { return exitFormattedText; }); |
|
__webpack_require__.d(actions_namespaceObject, "updatePostLock", function() { return updatePostLock; }); |
|
__webpack_require__.d(actions_namespaceObject, "__experimentalFetchReusableBlocks", function() { return __experimentalFetchReusableBlocks; }); |
|
__webpack_require__.d(actions_namespaceObject, "__experimentalReceiveReusableBlocks", function() { return __experimentalReceiveReusableBlocks; }); |
|
__webpack_require__.d(actions_namespaceObject, "__experimentalSaveReusableBlock", function() { return __experimentalSaveReusableBlock; }); |
|
__webpack_require__.d(actions_namespaceObject, "__experimentalDeleteReusableBlock", function() { return __experimentalDeleteReusableBlock; }); |
|
__webpack_require__.d(actions_namespaceObject, "__experimentalUpdateReusableBlockTitle", function() { return __experimentalUpdateReusableBlockTitle; }); |
|
__webpack_require__.d(actions_namespaceObject, "__experimentalConvertBlockToStatic", function() { return __experimentalConvertBlockToStatic; }); |
|
__webpack_require__.d(actions_namespaceObject, "__experimentalConvertBlockToReusable", function() { return __experimentalConvertBlockToReusable; }); |
|
__webpack_require__.d(actions_namespaceObject, "insertDefaultBlock", function() { return actions_insertDefaultBlock; }); |
|
__webpack_require__.d(actions_namespaceObject, "updateBlockListSettings", function() { return actions_updateBlockListSettings; }); |
|
__webpack_require__.d(actions_namespaceObject, "updateEditorSettings", function() { return updateEditorSettings; }); |
|
__webpack_require__.d(actions_namespaceObject, "enablePublishSidebar", function() { return enablePublishSidebar; }); |
|
__webpack_require__.d(actions_namespaceObject, "disablePublishSidebar", function() { return disablePublishSidebar; }); |
|
__webpack_require__.d(actions_namespaceObject, "lockPostSaving", function() { return lockPostSaving; }); |
|
__webpack_require__.d(actions_namespaceObject, "unlockPostSaving", function() { return unlockPostSaving; }); |
|
var selectors_namespaceObject = {}; |
|
__webpack_require__.r(selectors_namespaceObject); |
|
__webpack_require__.d(selectors_namespaceObject, "POST_UPDATE_TRANSACTION_ID", function() { return POST_UPDATE_TRANSACTION_ID; }); |
|
__webpack_require__.d(selectors_namespaceObject, "INSERTER_UTILITY_HIGH", function() { return INSERTER_UTILITY_HIGH; }); |
|
__webpack_require__.d(selectors_namespaceObject, "INSERTER_UTILITY_MEDIUM", function() { return INSERTER_UTILITY_MEDIUM; }); |
|
__webpack_require__.d(selectors_namespaceObject, "INSERTER_UTILITY_LOW", function() { return INSERTER_UTILITY_LOW; }); |
|
__webpack_require__.d(selectors_namespaceObject, "INSERTER_UTILITY_NONE", function() { return INSERTER_UTILITY_NONE; }); |
|
__webpack_require__.d(selectors_namespaceObject, "hasEditorUndo", function() { return hasEditorUndo; }); |
|
__webpack_require__.d(selectors_namespaceObject, "hasEditorRedo", function() { return hasEditorRedo; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isEditedPostNew", function() { return isEditedPostNew; }); |
|
__webpack_require__.d(selectors_namespaceObject, "hasChangedContent", function() { return hasChangedContent; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isEditedPostDirty", function() { return selectors_isEditedPostDirty; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isCleanNewPost", function() { return selectors_isCleanNewPost; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getCurrentPost", function() { return selectors_getCurrentPost; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getCurrentPostType", function() { return selectors_getCurrentPostType; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getCurrentPostId", function() { return selectors_getCurrentPostId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getCurrentPostRevisionsCount", function() { return getCurrentPostRevisionsCount; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getCurrentPostLastRevisionId", function() { return getCurrentPostLastRevisionId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getPostEdits", function() { return getPostEdits; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getReferenceByDistinctEdits", function() { return getReferenceByDistinctEdits; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getCurrentPostAttribute", function() { return selectors_getCurrentPostAttribute; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getEditedPostAttribute", function() { return selectors_getEditedPostAttribute; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getAutosaveAttribute", function() { return getAutosaveAttribute; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getEditedPostVisibility", function() { return selectors_getEditedPostVisibility; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isCurrentPostPending", function() { return isCurrentPostPending; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isCurrentPostPublished", function() { return selectors_isCurrentPostPublished; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isCurrentPostScheduled", function() { return selectors_isCurrentPostScheduled; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isEditedPostPublishable", function() { return selectors_isEditedPostPublishable; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isEditedPostSaveable", function() { return selectors_isEditedPostSaveable; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isEditedPostEmpty", function() { return isEditedPostEmpty; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isEditedPostAutosaveable", function() { return selectors_isEditedPostAutosaveable; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getAutosave", function() { return getAutosave; }); |
|
__webpack_require__.d(selectors_namespaceObject, "hasAutosave", function() { return hasAutosave; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isEditedPostBeingScheduled", function() { return selectors_isEditedPostBeingScheduled; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isEditedPostDateFloating", function() { return isEditedPostDateFloating; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockDependantsCacheBust", function() { return getBlockDependantsCacheBust; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockName", function() { return selectors_getBlockName; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isBlockValid", function() { return selectors_isBlockValid; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockAttributes", function() { return getBlockAttributes; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlock", function() { return selectors_getBlock; }); |
|
__webpack_require__.d(selectors_namespaceObject, "__unstableGetBlockWithoutInnerBlocks", function() { return selectors_unstableGetBlockWithoutInnerBlocks; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlocks", function() { return selectors_getBlocks; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getClientIdsOfDescendants", function() { return selectors_getClientIdsOfDescendants; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getClientIdsWithDescendants", function() { return getClientIdsWithDescendants; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getGlobalBlockCount", function() { return getGlobalBlockCount; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlocksByClientId", function() { return selectors_getBlocksByClientId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockCount", function() { return selectors_getBlockCount; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockSelectionStart", function() { return getBlockSelectionStart; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockSelectionEnd", function() { return getBlockSelectionEnd; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getSelectedBlockCount", function() { return selectors_getSelectedBlockCount; }); |
|
__webpack_require__.d(selectors_namespaceObject, "hasSelectedBlock", function() { return hasSelectedBlock; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getSelectedBlockClientId", function() { return selectors_getSelectedBlockClientId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getSelectedBlock", function() { return getSelectedBlock; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockRootClientId", function() { return selectors_getBlockRootClientId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockHierarchyRootClientId", function() { return getBlockHierarchyRootClientId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getAdjacentBlockClientId", function() { return getAdjacentBlockClientId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getPreviousBlockClientId", function() { return selectors_getPreviousBlockClientId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getNextBlockClientId", function() { return selectors_getNextBlockClientId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getSelectedBlocksInitialCaretPosition", function() { return selectors_getSelectedBlocksInitialCaretPosition; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getMultiSelectedBlockClientIds", function() { return selectors_getMultiSelectedBlockClientIds; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getMultiSelectedBlocks", function() { return getMultiSelectedBlocks; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getFirstMultiSelectedBlockClientId", function() { return getFirstMultiSelectedBlockClientId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getLastMultiSelectedBlockClientId", function() { return getLastMultiSelectedBlockClientId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isFirstMultiSelectedBlock", function() { return selectors_isFirstMultiSelectedBlock; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isBlockMultiSelected", function() { return selectors_isBlockMultiSelected; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isAncestorMultiSelected", function() { return selectors_isAncestorMultiSelected; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getMultiSelectedBlocksStartClientId", function() { return getMultiSelectedBlocksStartClientId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getMultiSelectedBlocksEndClientId", function() { return getMultiSelectedBlocksEndClientId; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockOrder", function() { return selectors_getBlockOrder; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockIndex", function() { return selectors_getBlockIndex; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isBlockSelected", function() { return selectors_isBlockSelected; }); |
|
__webpack_require__.d(selectors_namespaceObject, "hasSelectedInnerBlock", function() { return selectors_hasSelectedInnerBlock; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isBlockWithinSelection", function() { return isBlockWithinSelection; }); |
|
__webpack_require__.d(selectors_namespaceObject, "hasMultiSelection", function() { return selectors_hasMultiSelection; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isMultiSelecting", function() { return selectors_isMultiSelecting; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isSelectionEnabled", function() { return selectors_isSelectionEnabled; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockMode", function() { return selectors_getBlockMode; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isTyping", function() { return selectors_isTyping; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isCaretWithinFormattedText", function() { return selectors_isCaretWithinFormattedText; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockInsertionPoint", function() { return getBlockInsertionPoint; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isBlockInsertionPointVisible", function() { return isBlockInsertionPointVisible; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isValidTemplate", function() { return isValidTemplate; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getTemplate", function() { return getTemplate; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getTemplateLock", function() { return selectors_getTemplateLock; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isSavingPost", function() { return selectors_isSavingPost; }); |
|
__webpack_require__.d(selectors_namespaceObject, "didPostSaveRequestSucceed", function() { return didPostSaveRequestSucceed; }); |
|
__webpack_require__.d(selectors_namespaceObject, "didPostSaveRequestFail", function() { return didPostSaveRequestFail; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isAutosavingPost", function() { return selectors_isAutosavingPost; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isPreviewingPost", function() { return isPreviewingPost; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getEditedPostPreviewLink", function() { return selectors_getEditedPostPreviewLink; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getSuggestedPostFormat", function() { return selectors_getSuggestedPostFormat; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlocksForSerialization", function() { return getBlocksForSerialization; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getEditedPostContent", function() { return getEditedPostContent; }); |
|
__webpack_require__.d(selectors_namespaceObject, "canInsertBlockType", function() { return selectors_canInsertBlockType; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getInserterItems", function() { return selectors_getInserterItems; }); |
|
__webpack_require__.d(selectors_namespaceObject, "hasInserterItems", function() { return hasInserterItems; }); |
|
__webpack_require__.d(selectors_namespaceObject, "__experimentalGetReusableBlock", function() { return __experimentalGetReusableBlock; }); |
|
__webpack_require__.d(selectors_namespaceObject, "__experimentalIsSavingReusableBlock", function() { return __experimentalIsSavingReusableBlock; }); |
|
__webpack_require__.d(selectors_namespaceObject, "__experimentalIsFetchingReusableBlock", function() { return __experimentalIsFetchingReusableBlock; }); |
|
__webpack_require__.d(selectors_namespaceObject, "__experimentalGetReusableBlocks", function() { return __experimentalGetReusableBlocks; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getStateBeforeOptimisticTransaction", function() { return getStateBeforeOptimisticTransaction; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isPublishingPost", function() { return selectors_isPublishingPost; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isPermalinkEditable", function() { return isPermalinkEditable; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getPermalink", function() { return getPermalink; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getPermalinkParts", function() { return getPermalinkParts; }); |
|
__webpack_require__.d(selectors_namespaceObject, "inSomeHistory", function() { return inSomeHistory; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getBlockListSettings", function() { return getBlockListSettings; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getEditorSettings", function() { return selectors_getEditorSettings; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getTokenSettings", function() { return getTokenSettings; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isPostLocked", function() { return isPostLocked; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isPostSavingLocked", function() { return selectors_isPostSavingLocked; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isPostLockTakeover", function() { return isPostLockTakeover; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getPostLockUser", function() { return getPostLockUser; }); |
|
__webpack_require__.d(selectors_namespaceObject, "getActivePostLock", function() { return getActivePostLock; }); |
|
__webpack_require__.d(selectors_namespaceObject, "canUserUseUnfilteredHTML", function() { return canUserUseUnfilteredHTML; }); |
|
__webpack_require__.d(selectors_namespaceObject, "isPublishSidebarEnabled", function() { return selectors_isPublishSidebarEnabled; }); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","blocks"]} |
|
var external_this_wp_blocks_ = __webpack_require__(11); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","coreData"]} |
|
var external_this_wp_coreData_ = __webpack_require__(79); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","notices"]} |
|
var external_this_wp_notices_ = __webpack_require__(121); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","nux"]} |
|
var external_this_wp_nux_ = __webpack_require__(52); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","richText"]} |
|
var external_this_wp_richText_ = __webpack_require__(20); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","viewport"]} |
|
var external_this_wp_viewport_ = __webpack_require__(37); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","data"]} |
|
var external_this_wp_data_ = __webpack_require__(5); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js + 1 modules |
|
var slicedToArray = __webpack_require__(25); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/objectSpread.js |
|
var objectSpread = __webpack_require__(8); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js + 1 modules |
|
var objectWithoutProperties = __webpack_require__(21); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js + 2 modules |
|
var toConsumableArray = __webpack_require__(19); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js |
|
var defineProperty = __webpack_require__(15); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/typeof.js |
|
var esm_typeof = __webpack_require__(28); |
|
|
|
// EXTERNAL MODULE: ./node_modules/redux-optimist/index.js |
|
var redux_optimist = __webpack_require__(53); |
|
var redux_optimist_default = /*#__PURE__*/__webpack_require__.n(redux_optimist); |
|
|
|
// EXTERNAL MODULE: external "lodash" |
|
var external_lodash_ = __webpack_require__(2); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","url"]} |
|
var external_this_wp_url_ = __webpack_require__(24); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/with-history/index.js |
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* Default options for withHistory reducer enhancer. Refer to withHistory |
|
* documentation for options explanation. |
|
* |
|
* @see withHistory |
|
* |
|
* @type {Object} |
|
*/ |
|
|
|
var DEFAULT_OPTIONS = { |
|
resetTypes: [], |
|
ignoreTypes: [], |
|
shouldOverwriteState: function shouldOverwriteState() { |
|
return false; |
|
} |
|
}; |
|
/** |
|
* Higher-order reducer creator which transforms the result of the original |
|
* reducer into an object tracking its own history (past, present, future). |
|
* |
|
* @param {?Object} options Optional options. |
|
* @param {?Array} options.resetTypes Action types upon which to |
|
* clear past. |
|
* @param {?Array} options.ignoreTypes Action types upon which to |
|
* avoid history tracking. |
|
* @param {?Function} options.shouldOverwriteState Function receiving last and |
|
* current actions, returning |
|
* boolean indicating whether |
|
* present should be merged, |
|
* rather than add undo level. |
|
* |
|
* @return {Function} Higher-order reducer. |
|
*/ |
|
|
|
var with_history_withHistory = function withHistory() { |
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
return function (reducer) { |
|
options = Object(objectSpread["a" /* default */])({}, DEFAULT_OPTIONS, options); // `ignoreTypes` is simply a convenience for `shouldOverwriteState` |
|
|
|
options.shouldOverwriteState = Object(external_lodash_["overSome"])([options.shouldOverwriteState, function (action) { |
|
return Object(external_lodash_["includes"])(options.ignoreTypes, action.type); |
|
}]); |
|
var initialState = { |
|
past: [], |
|
present: reducer(undefined, {}), |
|
future: [], |
|
lastAction: null, |
|
shouldCreateUndoLevel: false |
|
}; |
|
var _options = options, |
|
_options$resetTypes = _options.resetTypes, |
|
resetTypes = _options$resetTypes === void 0 ? [] : _options$resetTypes, |
|
_options$shouldOverwr = _options.shouldOverwriteState, |
|
shouldOverwriteState = _options$shouldOverwr === void 0 ? function () { |
|
return false; |
|
} : _options$shouldOverwr; |
|
return function () { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
var past = state.past, |
|
present = state.present, |
|
future = state.future, |
|
lastAction = state.lastAction, |
|
shouldCreateUndoLevel = state.shouldCreateUndoLevel; |
|
var previousAction = lastAction; |
|
|
|
switch (action.type) { |
|
case 'UNDO': |
|
// Can't undo if no past. |
|
if (!past.length) { |
|
return state; |
|
} |
|
|
|
return { |
|
past: Object(external_lodash_["dropRight"])(past), |
|
present: Object(external_lodash_["last"])(past), |
|
future: [present].concat(Object(toConsumableArray["a" /* default */])(future)), |
|
lastAction: null, |
|
shouldCreateUndoLevel: false |
|
}; |
|
|
|
case 'REDO': |
|
// Can't redo if no future. |
|
if (!future.length) { |
|
return state; |
|
} |
|
|
|
return { |
|
past: Object(toConsumableArray["a" /* default */])(past).concat([present]), |
|
present: Object(external_lodash_["first"])(future), |
|
future: Object(external_lodash_["drop"])(future), |
|
lastAction: null, |
|
shouldCreateUndoLevel: false |
|
}; |
|
|
|
case 'CREATE_UNDO_LEVEL': |
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
lastAction: null, |
|
shouldCreateUndoLevel: true |
|
}); |
|
} |
|
|
|
var nextPresent = reducer(present, action); |
|
|
|
if (Object(external_lodash_["includes"])(resetTypes, action.type)) { |
|
return { |
|
past: [], |
|
present: nextPresent, |
|
future: [], |
|
lastAction: null, |
|
shouldCreateUndoLevel: false |
|
}; |
|
} |
|
|
|
if (present === nextPresent) { |
|
return state; |
|
} |
|
|
|
var nextPast = past; // The `lastAction` property is used to compare actions in the |
|
// `shouldOverwriteState` option. If an action should be ignored, do not |
|
// submit that action as the last action, otherwise the ability to |
|
// compare subsequent actions will break. |
|
|
|
var lastActionToSubmit = previousAction; |
|
|
|
if (shouldCreateUndoLevel || !past.length || !shouldOverwriteState(action, previousAction)) { |
|
nextPast = Object(toConsumableArray["a" /* default */])(past).concat([present]); |
|
lastActionToSubmit = action; |
|
} |
|
|
|
return { |
|
past: nextPast, |
|
present: nextPresent, |
|
future: [], |
|
shouldCreateUndoLevel: false, |
|
lastAction: lastActionToSubmit |
|
}; |
|
}; |
|
}; |
|
}; |
|
|
|
/* harmony default export */ var with_history = (with_history_withHistory); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/with-change-detection/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* Higher-order reducer creator for tracking changes to state over time. The |
|
* returned reducer will include a `isDirty` property on the object reflecting |
|
* whether the original reference of the reducer has changed. |
|
* |
|
* @param {?Object} options Optional options. |
|
* @param {?Array} options.ignoreTypes Action types upon which to skip check. |
|
* @param {?Array} options.resetTypes Action types upon which to reset dirty. |
|
* |
|
* @return {Function} Higher-order reducer. |
|
*/ |
|
|
|
var with_change_detection_withChangeDetection = function withChangeDetection() { |
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
return function (reducer) { |
|
return function (state, action) { |
|
var nextState = reducer(state, action); // Reset at: |
|
// - Initial state |
|
// - Reset types |
|
|
|
var isReset = state === undefined || Object(external_lodash_["includes"])(options.resetTypes, action.type); |
|
var isChanging = state !== nextState; // If not intending to update dirty flag, return early and avoid clone. |
|
|
|
if (!isChanging && !isReset) { |
|
return state; |
|
} // Avoid mutating state, unless it's already changing by original |
|
// reducer and not initial. |
|
|
|
|
|
if (!isChanging || state === undefined) { |
|
nextState = Object(objectSpread["a" /* default */])({}, nextState); |
|
} |
|
|
|
var isIgnored = Object(external_lodash_["includes"])(options.ignoreTypes, action.type); |
|
|
|
if (isIgnored) { |
|
// Preserve the original value if ignored. |
|
nextState.isDirty = state.isDirty; |
|
} else { |
|
nextState.isDirty = !isReset && isChanging; |
|
} |
|
|
|
return nextState; |
|
}; |
|
}; |
|
}; |
|
|
|
/* harmony default export */ var with_change_detection = (with_change_detection_withChangeDetection); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","i18n"]} |
|
var external_this_wp_i18n_ = __webpack_require__(1); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/defaults.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
var PREFERENCES_DEFAULTS = { |
|
insertUsage: {}, |
|
isPublishSidebarEnabled: true |
|
}; |
|
/** |
|
* The default editor settings |
|
* |
|
* alignWide boolean Enable/Disable Wide/Full Alignments |
|
* colors Array Palette colors |
|
* fontSizes Array Available font sizes |
|
* imageSizes Array Available image sizes |
|
* maxWidth number Max width to constraint resizing |
|
* blockTypes boolean|Array Allowed block types |
|
* hasFixedToolbar boolean Whether or not the editor toolbar is fixed |
|
* focusMode boolean Whether the focus mode is enabled or not |
|
* richEditingEnabled boolean Whether rich editing is enabled or not |
|
*/ |
|
|
|
var EDITOR_SETTINGS_DEFAULTS = { |
|
alignWide: false, |
|
colors: [{ |
|
name: Object(external_this_wp_i18n_["__"])('Pale pink'), |
|
slug: 'pale-pink', |
|
color: '#f78da7' |
|
}, { |
|
name: Object(external_this_wp_i18n_["__"])('Vivid red'), |
|
slug: 'vivid-red', |
|
color: '#cf2e2e' |
|
}, { |
|
name: Object(external_this_wp_i18n_["__"])('Luminous vivid orange'), |
|
slug: 'luminous-vivid-orange', |
|
color: '#ff6900' |
|
}, { |
|
name: Object(external_this_wp_i18n_["__"])('Luminous vivid amber'), |
|
slug: 'luminous-vivid-amber', |
|
color: '#fcb900' |
|
}, { |
|
name: Object(external_this_wp_i18n_["__"])('Light green cyan'), |
|
slug: 'light-green-cyan', |
|
color: '#7bdcb5' |
|
}, { |
|
name: Object(external_this_wp_i18n_["__"])('Vivid green cyan'), |
|
slug: 'vivid-green-cyan', |
|
color: '#00d084' |
|
}, { |
|
name: Object(external_this_wp_i18n_["__"])('Pale cyan blue'), |
|
slug: 'pale-cyan-blue', |
|
color: '#8ed1fc' |
|
}, { |
|
name: Object(external_this_wp_i18n_["__"])('Vivid cyan blue'), |
|
slug: 'vivid-cyan-blue', |
|
color: '#0693e3' |
|
}, { |
|
name: Object(external_this_wp_i18n_["__"])('Very light gray'), |
|
slug: 'very-light-gray', |
|
color: '#eeeeee' |
|
}, { |
|
name: Object(external_this_wp_i18n_["__"])('Cyan bluish gray'), |
|
slug: 'cyan-bluish-gray', |
|
color: '#abb8c3' |
|
}, { |
|
name: Object(external_this_wp_i18n_["__"])('Very dark gray'), |
|
slug: 'very-dark-gray', |
|
color: '#313131' |
|
}], |
|
fontSizes: [{ |
|
name: Object(external_this_wp_i18n_["_x"])('Small', 'font size name'), |
|
size: 13, |
|
slug: 'small' |
|
}, { |
|
name: Object(external_this_wp_i18n_["_x"])('Normal', 'font size name'), |
|
size: 16, |
|
slug: 'normal' |
|
}, { |
|
name: Object(external_this_wp_i18n_["_x"])('Medium', 'font size name'), |
|
size: 20, |
|
slug: 'medium' |
|
}, { |
|
name: Object(external_this_wp_i18n_["_x"])('Large', 'font size name'), |
|
size: 36, |
|
slug: 'large' |
|
}, { |
|
name: Object(external_this_wp_i18n_["_x"])('Huge', 'font size name'), |
|
size: 48, |
|
slug: 'huge' |
|
}], |
|
imageSizes: [{ |
|
slug: 'thumbnail', |
|
label: Object(external_this_wp_i18n_["__"])('Thumbnail') |
|
}, { |
|
slug: 'medium', |
|
label: Object(external_this_wp_i18n_["__"])('Medium') |
|
}, { |
|
slug: 'large', |
|
label: Object(external_this_wp_i18n_["__"])('Large') |
|
}, { |
|
slug: 'full', |
|
label: Object(external_this_wp_i18n_["__"])('Full Size') |
|
}], |
|
// This is current max width of the block inner area |
|
// It's used to constraint image resizing and this value could be overridden later by themes |
|
maxWidth: 580, |
|
// Allowed block types for the editor, defaulting to true (all supported). |
|
allowedBlockTypes: true, |
|
// Maximum upload size in bytes allowed for the site. |
|
maxUploadFileSize: 0, |
|
// List of allowed mime types and file extensions. |
|
allowedMimeTypes: null, |
|
// Whether richs editing is enabled or not. |
|
richEditingEnabled: true |
|
}; |
|
/** |
|
* Default initial edits state. |
|
* |
|
* @type {Object} |
|
*/ |
|
|
|
var INITIAL_EDITS_DEFAULTS = {}; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/array.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* Insert one or multiple elements into a given position of an array. |
|
* |
|
* @param {Array} array Source array. |
|
* @param {*} elements Elements to insert. |
|
* @param {number} index Insert Position. |
|
* |
|
* @return {Array} Result. |
|
*/ |
|
|
|
function insertAt(array, elements, index) { |
|
return Object(toConsumableArray["a" /* default */])(array.slice(0, index)).concat(Object(toConsumableArray["a" /* default */])(Object(external_lodash_["castArray"])(elements)), Object(toConsumableArray["a" /* default */])(array.slice(index))); |
|
} |
|
/** |
|
* Moves an element in an array. |
|
* |
|
* @param {Array} array Source array. |
|
* @param {number} from Source index. |
|
* @param {number} to Destination index. |
|
* @param {number} count Number of elements to move. |
|
* |
|
* @return {Array} Result. |
|
*/ |
|
|
|
function moveTo(array, from, to) { |
|
var count = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1; |
|
|
|
var withoutMovedElements = Object(toConsumableArray["a" /* default */])(array); |
|
|
|
withoutMovedElements.splice(from, count); |
|
return insertAt(withoutMovedElements, array.slice(from, from + count), to); |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/constants.js |
|
/** |
|
* Set of post properties for which edits should assume a merging behavior, |
|
* assuming an object value. |
|
* |
|
* @type {Set} |
|
*/ |
|
var EDIT_MERGE_PROPERTIES = new Set(['meta']); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/reducer.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Returns a post attribute value, flattening nested rendered content using its |
|
* raw value in place of its original object form. |
|
* |
|
* @param {*} value Original value. |
|
* |
|
* @return {*} Raw value. |
|
*/ |
|
|
|
function getPostRawValue(value) { |
|
if (value && 'object' === Object(esm_typeof["a" /* default */])(value) && 'raw' in value) { |
|
return value.raw; |
|
} |
|
|
|
return value; |
|
} |
|
/** |
|
* Given an array of blocks, returns an object where each key is a nesting |
|
* context, the value of which is an array of block client IDs existing within |
|
* that nesting context. |
|
* |
|
* @param {Array} blocks Blocks to map. |
|
* @param {?string} rootClientId Assumed root client ID. |
|
* |
|
* @return {Object} Block order map object. |
|
*/ |
|
|
|
function mapBlockOrder(blocks) { |
|
var rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; |
|
|
|
var result = Object(defineProperty["a" /* default */])({}, rootClientId, []); |
|
|
|
blocks.forEach(function (block) { |
|
var clientId = block.clientId, |
|
innerBlocks = block.innerBlocks; |
|
result[rootClientId].push(clientId); |
|
Object.assign(result, mapBlockOrder(innerBlocks, clientId)); |
|
}); |
|
return result; |
|
} |
|
/** |
|
* Given an array of blocks, returns an object containing all blocks, recursing |
|
* into inner blocks. Keys correspond to the block client ID, the value of |
|
* which is the block object. |
|
* |
|
* @param {Array} blocks Blocks to flatten. |
|
* |
|
* @return {Object} Flattened blocks object. |
|
*/ |
|
|
|
|
|
function getFlattenedBlocks(blocks) { |
|
var flattenedBlocks = {}; |
|
|
|
var stack = Object(toConsumableArray["a" /* default */])(blocks); |
|
|
|
while (stack.length) { |
|
// `innerBlocks` is redundant data which can fall out of sync, since |
|
// this is reflected in `blocks.order`, so exclude from appended block. |
|
var _stack$shift = stack.shift(), |
|
innerBlocks = _stack$shift.innerBlocks, |
|
block = Object(objectWithoutProperties["a" /* default */])(_stack$shift, ["innerBlocks"]); |
|
|
|
stack.push.apply(stack, Object(toConsumableArray["a" /* default */])(innerBlocks)); |
|
flattenedBlocks[block.clientId] = block; |
|
} |
|
|
|
return flattenedBlocks; |
|
} |
|
/** |
|
* Given a block order map object, returns *all* of the block client IDs that are |
|
* a descendant of the given root client ID. |
|
* |
|
* Calling this with `rootClientId` set to `''` results in a list of client IDs |
|
* that are in the post. That is, it excludes blocks like fetched reusable |
|
* blocks which are stored into state but not visible. |
|
* |
|
* @param {Object} blocksOrder Object that maps block client IDs to a list of |
|
* nested block client IDs. |
|
* @param {?string} rootClientId The root client ID to search. Defaults to ''. |
|
* |
|
* @return {Array} List of descendant client IDs. |
|
*/ |
|
|
|
|
|
function getNestedBlockClientIds(blocksOrder) { |
|
var rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; |
|
return Object(external_lodash_["reduce"])(blocksOrder[rootClientId], function (result, clientId) { |
|
return Object(toConsumableArray["a" /* default */])(result).concat([clientId], Object(toConsumableArray["a" /* default */])(getNestedBlockClientIds(blocksOrder, clientId))); |
|
}, []); |
|
} |
|
/** |
|
* Returns an object against which it is safe to perform mutating operations, |
|
* given the original object and its current working copy. |
|
* |
|
* @param {Object} original Original object. |
|
* @param {Object} working Working object. |
|
* |
|
* @return {Object} Mutation-safe object. |
|
*/ |
|
|
|
|
|
function getMutateSafeObject(original, working) { |
|
if (original === working) { |
|
return Object(objectSpread["a" /* default */])({}, original); |
|
} |
|
|
|
return working; |
|
} |
|
/** |
|
* Returns true if the two object arguments have the same keys, or false |
|
* otherwise. |
|
* |
|
* @param {Object} a First object. |
|
* @param {Object} b Second object. |
|
* |
|
* @return {boolean} Whether the two objects have the same keys. |
|
*/ |
|
|
|
|
|
function hasSameKeys(a, b) { |
|
return Object(external_lodash_["isEqual"])(Object(external_lodash_["keys"])(a), Object(external_lodash_["keys"])(b)); |
|
} |
|
/** |
|
* Returns true if, given the currently dispatching action and the previously |
|
* dispatched action, the two actions are updating the same block attribute, or |
|
* false otherwise. |
|
* |
|
* @param {Object} action Currently dispatching action. |
|
* @param {Object} previousAction Previously dispatched action. |
|
* |
|
* @return {boolean} Whether actions are updating the same block attribute. |
|
*/ |
|
|
|
function isUpdatingSameBlockAttribute(action, previousAction) { |
|
return action.type === 'UPDATE_BLOCK_ATTRIBUTES' && action.clientId === previousAction.clientId && hasSameKeys(action.attributes, previousAction.attributes); |
|
} |
|
/** |
|
* Returns true if, given the currently dispatching action and the previously |
|
* dispatched action, the two actions are editing the same post property, or |
|
* false otherwise. |
|
* |
|
* @param {Object} action Currently dispatching action. |
|
* @param {Object} previousAction Previously dispatched action. |
|
* |
|
* @return {boolean} Whether actions are updating the same post property. |
|
*/ |
|
|
|
function isUpdatingSamePostProperty(action, previousAction) { |
|
return action.type === 'EDIT_POST' && hasSameKeys(action.edits, previousAction.edits); |
|
} |
|
/** |
|
* Returns true if, given the currently dispatching action and the previously |
|
* dispatched action, the two actions are modifying the same property such that |
|
* undo history should be batched. |
|
* |
|
* @param {Object} action Currently dispatching action. |
|
* @param {Object} previousAction Previously dispatched action. |
|
* |
|
* @return {boolean} Whether to overwrite present state. |
|
*/ |
|
|
|
function reducer_shouldOverwriteState(action, previousAction) { |
|
if (!previousAction || action.type !== previousAction.type) { |
|
return false; |
|
} |
|
|
|
return Object(external_lodash_["overSome"])([isUpdatingSameBlockAttribute, isUpdatingSamePostProperty])(action, previousAction); |
|
} |
|
/** |
|
* Higher-order reducer targeting the combined editor reducer, augmenting |
|
* block client IDs in remove action to include cascade of inner blocks. |
|
* |
|
* @param {Function} reducer Original reducer function. |
|
* |
|
* @return {Function} Enhanced reducer function. |
|
*/ |
|
|
|
var reducer_withInnerBlocksRemoveCascade = function withInnerBlocksRemoveCascade(reducer) { |
|
return function (state, action) { |
|
if (state && action.type === 'REMOVE_BLOCKS') { |
|
var clientIds = Object(toConsumableArray["a" /* default */])(action.clientIds); // For each removed client ID, include its inner blocks to remove, |
|
// recursing into those so long as inner blocks exist. |
|
|
|
|
|
for (var i = 0; i < clientIds.length; i++) { |
|
clientIds.push.apply(clientIds, Object(toConsumableArray["a" /* default */])(state.blocks.order[clientIds[i]])); |
|
} |
|
|
|
action = Object(objectSpread["a" /* default */])({}, action, { |
|
clientIds: clientIds |
|
}); |
|
} |
|
|
|
return reducer(state, action); |
|
}; |
|
}; |
|
/** |
|
* Higher-order reducer which targets the combined blocks reducer and handles |
|
* the `RESET_BLOCKS` action. When dispatched, this action will replace all |
|
* blocks that exist in the post, leaving blocks that exist only in state (e.g. |
|
* reusable blocks) alone. |
|
* |
|
* @param {Function} reducer Original reducer function. |
|
* |
|
* @return {Function} Enhanced reducer function. |
|
*/ |
|
|
|
|
|
var reducer_withBlockReset = function withBlockReset(reducer) { |
|
return function (state, action) { |
|
if (state && action.type === 'RESET_BLOCKS') { |
|
var visibleClientIds = getNestedBlockClientIds(state.order); |
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
byClientId: Object(objectSpread["a" /* default */])({}, Object(external_lodash_["omit"])(state.byClientId, visibleClientIds), getFlattenedBlocks(action.blocks)), |
|
order: Object(objectSpread["a" /* default */])({}, Object(external_lodash_["omit"])(state.order, visibleClientIds), mapBlockOrder(action.blocks)) |
|
}); |
|
} |
|
|
|
return reducer(state, action); |
|
}; |
|
}; |
|
/** |
|
* Undoable reducer returning the editor post state, including blocks parsed |
|
* from current HTML markup. |
|
* |
|
* Handles the following state keys: |
|
* - edits: an object describing changes to be made to the current post, in |
|
* the format accepted by the WP REST API |
|
* - blocks: post content blocks |
|
* |
|
* @param {Object} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @returns {Object} Updated state. |
|
*/ |
|
|
|
|
|
var reducer_editor = Object(external_lodash_["flow"])([external_this_wp_data_["combineReducers"], reducer_withInnerBlocksRemoveCascade, // Track undo history, starting at editor initialization. |
|
with_history({ |
|
resetTypes: ['SETUP_EDITOR_STATE'], |
|
ignoreTypes: ['RECEIVE_BLOCKS', 'RESET_POST', 'UPDATE_POST'], |
|
shouldOverwriteState: reducer_shouldOverwriteState |
|
})])({ |
|
edits: function edits() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'EDIT_POST': |
|
return Object(external_lodash_["reduce"])(action.edits, function (result, value, key) { |
|
// Only assign into result if not already same value |
|
if (value !== state[key]) { |
|
result = getMutateSafeObject(state, result); |
|
|
|
if (EDIT_MERGE_PROPERTIES.has(key)) { |
|
// Merge properties should assign to current value. |
|
result[key] = Object(objectSpread["a" /* default */])({}, result[key], value); |
|
} else { |
|
// Otherwise override. |
|
result[key] = value; |
|
} |
|
} |
|
|
|
return result; |
|
}, state); |
|
|
|
case 'RESET_BLOCKS': |
|
if ('content' in state) { |
|
return Object(external_lodash_["omit"])(state, 'content'); |
|
} |
|
|
|
return state; |
|
|
|
case 'UPDATE_POST': |
|
case 'RESET_POST': |
|
var getCanonicalValue = action.type === 'UPDATE_POST' ? function (key) { |
|
return action.edits[key]; |
|
} : function (key) { |
|
return getPostRawValue(action.post[key]); |
|
}; |
|
return Object(external_lodash_["reduce"])(state, function (result, value, key) { |
|
if (!Object(external_lodash_["isEqual"])(value, getCanonicalValue(key))) { |
|
return result; |
|
} |
|
|
|
result = getMutateSafeObject(state, result); |
|
delete result[key]; |
|
return result; |
|
}, state); |
|
} |
|
|
|
return state; |
|
}, |
|
blocks: Object(external_lodash_["flow"])([external_this_wp_data_["combineReducers"], reducer_withBlockReset, // Track whether changes exist, resetting at each post save. Relies on |
|
// editor initialization firing post reset as an effect. |
|
with_change_detection({ |
|
resetTypes: ['SETUP_EDITOR_STATE', 'REQUEST_POST_UPDATE_START'], |
|
ignoreTypes: ['RECEIVE_BLOCKS', 'RESET_POST', 'UPDATE_POST'] |
|
})])({ |
|
byClientId: function byClientId() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'SETUP_EDITOR_STATE': |
|
return getFlattenedBlocks(action.blocks); |
|
|
|
case 'RECEIVE_BLOCKS': |
|
return Object(objectSpread["a" /* default */])({}, state, getFlattenedBlocks(action.blocks)); |
|
|
|
case 'UPDATE_BLOCK_ATTRIBUTES': |
|
// Ignore updates if block isn't known |
|
if (!state[action.clientId]) { |
|
return state; |
|
} // Consider as updates only changed values |
|
|
|
|
|
var nextAttributes = Object(external_lodash_["reduce"])(action.attributes, function (result, value, key) { |
|
if (value !== result[key]) { |
|
result = getMutateSafeObject(state[action.clientId].attributes, result); |
|
result[key] = value; |
|
} |
|
|
|
return result; |
|
}, state[action.clientId].attributes); // Skip update if nothing has been changed. The reference will |
|
// match the original block if `reduce` had no changed values. |
|
|
|
if (nextAttributes === state[action.clientId].attributes) { |
|
return state; |
|
} // Otherwise merge attributes into state |
|
|
|
|
|
return Object(objectSpread["a" /* default */])({}, state, Object(defineProperty["a" /* default */])({}, action.clientId, Object(objectSpread["a" /* default */])({}, state[action.clientId], { |
|
attributes: nextAttributes |
|
}))); |
|
|
|
case 'UPDATE_BLOCK': |
|
// Ignore updates if block isn't known |
|
if (!state[action.clientId]) { |
|
return state; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, Object(defineProperty["a" /* default */])({}, action.clientId, Object(objectSpread["a" /* default */])({}, state[action.clientId], action.updates))); |
|
|
|
case 'INSERT_BLOCKS': |
|
return Object(objectSpread["a" /* default */])({}, state, getFlattenedBlocks(action.blocks)); |
|
|
|
case 'REPLACE_BLOCKS': |
|
if (!action.blocks) { |
|
return state; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, Object(external_lodash_["omit"])(state, action.clientIds), getFlattenedBlocks(action.blocks)); |
|
|
|
case 'REMOVE_BLOCKS': |
|
return Object(external_lodash_["omit"])(state, action.clientIds); |
|
|
|
case 'SAVE_REUSABLE_BLOCK_SUCCESS': |
|
{ |
|
var id = action.id, |
|
updatedId = action.updatedId; // If a temporary reusable block is saved, we swap the temporary id with the final one |
|
|
|
if (id === updatedId) { |
|
return state; |
|
} |
|
|
|
return Object(external_lodash_["mapValues"])(state, function (block) { |
|
if (block.name === 'core/block' && block.attributes.ref === id) { |
|
return Object(objectSpread["a" /* default */])({}, block, { |
|
attributes: Object(objectSpread["a" /* default */])({}, block.attributes, { |
|
ref: updatedId |
|
}) |
|
}); |
|
} |
|
|
|
return block; |
|
}); |
|
} |
|
} |
|
|
|
return state; |
|
}, |
|
order: function order() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'SETUP_EDITOR_STATE': |
|
return mapBlockOrder(action.blocks); |
|
|
|
case 'RECEIVE_BLOCKS': |
|
return Object(objectSpread["a" /* default */])({}, state, Object(external_lodash_["omit"])(mapBlockOrder(action.blocks), '')); |
|
|
|
case 'INSERT_BLOCKS': |
|
{ |
|
var _action$rootClientId = action.rootClientId, |
|
rootClientId = _action$rootClientId === void 0 ? '' : _action$rootClientId, |
|
blocks = action.blocks; |
|
var subState = state[rootClientId] || []; |
|
var mappedBlocks = mapBlockOrder(blocks, rootClientId); |
|
var _action$index = action.index, |
|
index = _action$index === void 0 ? subState.length : _action$index; |
|
return Object(objectSpread["a" /* default */])({}, state, mappedBlocks, Object(defineProperty["a" /* default */])({}, rootClientId, insertAt(subState, mappedBlocks[rootClientId], index))); |
|
} |
|
|
|
case 'MOVE_BLOCK_TO_POSITION': |
|
{ |
|
var _objectSpread6; |
|
|
|
var _action$fromRootClien = action.fromRootClientId, |
|
fromRootClientId = _action$fromRootClien === void 0 ? '' : _action$fromRootClien, |
|
_action$toRootClientI = action.toRootClientId, |
|
toRootClientId = _action$toRootClientI === void 0 ? '' : _action$toRootClientI, |
|
clientId = action.clientId; |
|
|
|
var _action$index2 = action.index, |
|
_index = _action$index2 === void 0 ? state[toRootClientId].length : _action$index2; // Moving inside the same parent block |
|
|
|
|
|
if (fromRootClientId === toRootClientId) { |
|
var _subState = state[toRootClientId]; |
|
|
|
var fromIndex = _subState.indexOf(clientId); |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, Object(defineProperty["a" /* default */])({}, toRootClientId, moveTo(state[toRootClientId], fromIndex, _index))); |
|
} // Moving from a parent block to another |
|
|
|
|
|
return Object(objectSpread["a" /* default */])({}, state, (_objectSpread6 = {}, Object(defineProperty["a" /* default */])(_objectSpread6, fromRootClientId, Object(external_lodash_["without"])(state[fromRootClientId], clientId)), Object(defineProperty["a" /* default */])(_objectSpread6, toRootClientId, insertAt(state[toRootClientId], clientId, _index)), _objectSpread6)); |
|
} |
|
|
|
case 'MOVE_BLOCKS_UP': |
|
{ |
|
var clientIds = action.clientIds, |
|
_action$rootClientId2 = action.rootClientId, |
|
_rootClientId = _action$rootClientId2 === void 0 ? '' : _action$rootClientId2; |
|
|
|
var firstClientId = Object(external_lodash_["first"])(clientIds); |
|
var _subState2 = state[_rootClientId]; |
|
|
|
if (!_subState2.length || firstClientId === Object(external_lodash_["first"])(_subState2)) { |
|
return state; |
|
} |
|
|
|
var firstIndex = _subState2.indexOf(firstClientId); |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, Object(defineProperty["a" /* default */])({}, _rootClientId, moveTo(_subState2, firstIndex, firstIndex - 1, clientIds.length))); |
|
} |
|
|
|
case 'MOVE_BLOCKS_DOWN': |
|
{ |
|
var _clientIds = action.clientIds, |
|
_action$rootClientId3 = action.rootClientId, |
|
_rootClientId2 = _action$rootClientId3 === void 0 ? '' : _action$rootClientId3; |
|
|
|
var _firstClientId = Object(external_lodash_["first"])(_clientIds); |
|
|
|
var lastClientId = Object(external_lodash_["last"])(_clientIds); |
|
var _subState3 = state[_rootClientId2]; |
|
|
|
if (!_subState3.length || lastClientId === Object(external_lodash_["last"])(_subState3)) { |
|
return state; |
|
} |
|
|
|
var _firstIndex = _subState3.indexOf(_firstClientId); |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, Object(defineProperty["a" /* default */])({}, _rootClientId2, moveTo(_subState3, _firstIndex, _firstIndex + 1, _clientIds.length))); |
|
} |
|
|
|
case 'REPLACE_BLOCKS': |
|
{ |
|
var _blocks = action.blocks, |
|
_clientIds2 = action.clientIds; |
|
|
|
if (!_blocks) { |
|
return state; |
|
} |
|
|
|
var _mappedBlocks = mapBlockOrder(_blocks); |
|
|
|
return Object(external_lodash_["flow"])([function (nextState) { |
|
return Object(external_lodash_["omit"])(nextState, _clientIds2); |
|
}, function (nextState) { |
|
return Object(objectSpread["a" /* default */])({}, nextState, Object(external_lodash_["omit"])(_mappedBlocks, '')); |
|
}, function (nextState) { |
|
return Object(external_lodash_["mapValues"])(nextState, function (subState) { |
|
return Object(external_lodash_["reduce"])(subState, function (result, clientId) { |
|
if (clientId === _clientIds2[0]) { |
|
return Object(toConsumableArray["a" /* default */])(result).concat(Object(toConsumableArray["a" /* default */])(_mappedBlocks[''])); |
|
} |
|
|
|
if (_clientIds2.indexOf(clientId) === -1) { |
|
result.push(clientId); |
|
} |
|
|
|
return result; |
|
}, []); |
|
}); |
|
}])(state); |
|
} |
|
|
|
case 'REMOVE_BLOCKS': |
|
return Object(external_lodash_["flow"])([// Remove inner block ordering for removed blocks |
|
function (nextState) { |
|
return Object(external_lodash_["omit"])(nextState, action.clientIds); |
|
}, // Remove deleted blocks from other blocks' orderings |
|
function (nextState) { |
|
return Object(external_lodash_["mapValues"])(nextState, function (subState) { |
|
return external_lodash_["without"].apply(void 0, [subState].concat(Object(toConsumableArray["a" /* default */])(action.clientIds))); |
|
}); |
|
}])(state); |
|
} |
|
|
|
return state; |
|
} |
|
}) |
|
}); |
|
/** |
|
* Reducer returning the initial edits state. With matching shape to that of |
|
* `editor.edits`, the initial edits are those applied programmatically, are |
|
* not considered in prmopting the user for unsaved changes, and are included |
|
* in (and reset by) the next save payload. |
|
* |
|
* @param {Object} state Current state. |
|
* @param {Object} action Action object. |
|
* |
|
* @return {Object} Next state. |
|
*/ |
|
|
|
function initialEdits() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : INITIAL_EDITS_DEFAULTS; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'SETUP_EDITOR': |
|
if (!action.edits) { |
|
break; |
|
} |
|
|
|
return action.edits; |
|
|
|
case 'SETUP_EDITOR_STATE': |
|
if ('content' in state) { |
|
return Object(external_lodash_["omit"])(state, 'content'); |
|
} |
|
|
|
return state; |
|
|
|
case 'UPDATE_POST': |
|
return Object(external_lodash_["reduce"])(action.edits, function (result, value, key) { |
|
if (!result.hasOwnProperty(key)) { |
|
return result; |
|
} |
|
|
|
result = getMutateSafeObject(state, result); |
|
delete result[key]; |
|
return result; |
|
}, state); |
|
|
|
case 'RESET_POST': |
|
return INITIAL_EDITS_DEFAULTS; |
|
} |
|
|
|
return state; |
|
} |
|
/** |
|
* Reducer returning the last-known state of the current post, in the format |
|
* returned by the WP REST API. |
|
* |
|
* @param {Object} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {Object} Updated state. |
|
*/ |
|
|
|
function currentPost() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'SETUP_EDITOR_STATE': |
|
case 'RESET_POST': |
|
case 'UPDATE_POST': |
|
var post; |
|
|
|
if (action.post) { |
|
post = action.post; |
|
} else if (action.edits) { |
|
post = Object(objectSpread["a" /* default */])({}, state, action.edits); |
|
} else { |
|
return state; |
|
} |
|
|
|
return Object(external_lodash_["mapValues"])(post, getPostRawValue); |
|
} |
|
|
|
return state; |
|
} |
|
/** |
|
* Reducer returning typing state. |
|
* |
|
* @param {boolean} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {boolean} Updated state. |
|
*/ |
|
|
|
function reducer_isTyping() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'START_TYPING': |
|
return true; |
|
|
|
case 'STOP_TYPING': |
|
return false; |
|
} |
|
|
|
return state; |
|
} |
|
/** |
|
* Reducer returning whether the caret is within formatted text. |
|
* |
|
* @param {boolean} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {boolean} Updated state. |
|
*/ |
|
|
|
function reducer_isCaretWithinFormattedText() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'ENTER_FORMATTED_TEXT': |
|
return true; |
|
|
|
case 'EXIT_FORMATTED_TEXT': |
|
return false; |
|
} |
|
|
|
return state; |
|
} |
|
/** |
|
* Reducer returning the block selection's state. |
|
* |
|
* @param {Object} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {Object} Updated state. |
|
*/ |
|
|
|
function blockSelection() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { |
|
start: null, |
|
end: null, |
|
isMultiSelecting: false, |
|
isEnabled: true, |
|
initialPosition: null |
|
}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'CLEAR_SELECTED_BLOCK': |
|
if (state.start === null && state.end === null && !state.isMultiSelecting) { |
|
return state; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
start: null, |
|
end: null, |
|
isMultiSelecting: false, |
|
initialPosition: null |
|
}); |
|
|
|
case 'START_MULTI_SELECT': |
|
if (state.isMultiSelecting) { |
|
return state; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
isMultiSelecting: true, |
|
initialPosition: null |
|
}); |
|
|
|
case 'STOP_MULTI_SELECT': |
|
if (!state.isMultiSelecting) { |
|
return state; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
isMultiSelecting: false, |
|
initialPosition: null |
|
}); |
|
|
|
case 'MULTI_SELECT': |
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
start: action.start, |
|
end: action.end, |
|
initialPosition: null |
|
}); |
|
|
|
case 'SELECT_BLOCK': |
|
if (action.clientId === state.start && action.clientId === state.end) { |
|
return state; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
start: action.clientId, |
|
end: action.clientId, |
|
initialPosition: action.initialPosition |
|
}); |
|
|
|
case 'INSERT_BLOCKS': |
|
{ |
|
if (action.updateSelection) { |
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
start: action.blocks[0].clientId, |
|
end: action.blocks[0].clientId, |
|
initialPosition: null, |
|
isMultiSelecting: false |
|
}); |
|
} |
|
|
|
return state; |
|
} |
|
|
|
case 'REMOVE_BLOCKS': |
|
if (!action.clientIds || !action.clientIds.length || action.clientIds.indexOf(state.start) === -1) { |
|
return state; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
start: null, |
|
end: null, |
|
initialPosition: null, |
|
isMultiSelecting: false |
|
}); |
|
|
|
case 'REPLACE_BLOCKS': |
|
if (action.clientIds.indexOf(state.start) === -1) { |
|
return state; |
|
} // If there is replacement block(s), assign first's client ID as |
|
// the next selected block. If empty replacement, reset to null. |
|
|
|
|
|
var nextSelectedBlockClientId = Object(external_lodash_["get"])(action.blocks, [0, 'clientId'], null); |
|
|
|
if (nextSelectedBlockClientId === state.start && nextSelectedBlockClientId === state.end) { |
|
return state; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
start: nextSelectedBlockClientId, |
|
end: nextSelectedBlockClientId, |
|
initialPosition: null, |
|
isMultiSelecting: false |
|
}); |
|
|
|
case 'TOGGLE_SELECTION': |
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
isEnabled: action.isSelectionEnabled |
|
}); |
|
} |
|
|
|
return state; |
|
} |
|
function blocksMode() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
if (action.type === 'TOGGLE_BLOCK_MODE') { |
|
var clientId = action.clientId; |
|
return Object(objectSpread["a" /* default */])({}, state, Object(defineProperty["a" /* default */])({}, clientId, state[clientId] && state[clientId] === 'html' ? 'visual' : 'html')); |
|
} |
|
|
|
return state; |
|
} |
|
/** |
|
* Reducer returning the block insertion point visibility, either null if there |
|
* is not an explicit insertion point assigned, or an object of its `index` and |
|
* `rootClientId`. |
|
* |
|
* @param {Object} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {Object} Updated state. |
|
*/ |
|
|
|
function insertionPoint() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'SHOW_INSERTION_POINT': |
|
var rootClientId = action.rootClientId, |
|
index = action.index; |
|
return { |
|
rootClientId: rootClientId, |
|
index: index |
|
}; |
|
|
|
case 'HIDE_INSERTION_POINT': |
|
return null; |
|
} |
|
|
|
return state; |
|
} |
|
/** |
|
* Reducer returning whether the post blocks match the defined template or not. |
|
* |
|
* @param {Object} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {boolean} Updated state. |
|
*/ |
|
|
|
function reducer_template() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { |
|
isValid: true |
|
}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'SET_TEMPLATE_VALIDITY': |
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
isValid: action.isValid |
|
}); |
|
} |
|
|
|
return state; |
|
} |
|
/** |
|
* Reducer returning the editor setting. |
|
* |
|
* @param {Object} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {Object} Updated state. |
|
*/ |
|
|
|
function reducer_settings() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : EDITOR_SETTINGS_DEFAULTS; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'UPDATE_EDITOR_SETTINGS': |
|
return Object(objectSpread["a" /* default */])({}, state, action.settings); |
|
} |
|
|
|
return state; |
|
} |
|
/** |
|
* Reducer returning the user preferences. |
|
* |
|
* @param {Object} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {string} Updated state. |
|
*/ |
|
|
|
function preferences() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : PREFERENCES_DEFAULTS; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'INSERT_BLOCKS': |
|
case 'REPLACE_BLOCKS': |
|
return action.blocks.reduce(function (prevState, block) { |
|
var id = block.name; |
|
var insert = { |
|
name: block.name |
|
}; |
|
|
|
if (Object(external_this_wp_blocks_["isReusableBlock"])(block)) { |
|
insert.ref = block.attributes.ref; |
|
id += '/' + block.attributes.ref; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, prevState, { |
|
insertUsage: Object(objectSpread["a" /* default */])({}, prevState.insertUsage, Object(defineProperty["a" /* default */])({}, id, { |
|
time: action.time, |
|
count: prevState.insertUsage[id] ? prevState.insertUsage[id].count + 1 : 1, |
|
insert: insert |
|
})) |
|
}); |
|
}, state); |
|
|
|
case 'REMOVE_REUSABLE_BLOCK': |
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
insertUsage: Object(external_lodash_["omitBy"])(state.insertUsage, function (_ref) { |
|
var insert = _ref.insert; |
|
return insert.ref === action.id; |
|
}) |
|
}); |
|
|
|
case 'ENABLE_PUBLISH_SIDEBAR': |
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
isPublishSidebarEnabled: true |
|
}); |
|
|
|
case 'DISABLE_PUBLISH_SIDEBAR': |
|
return Object(objectSpread["a" /* default */])({}, state, { |
|
isPublishSidebarEnabled: false |
|
}); |
|
} |
|
|
|
return state; |
|
} |
|
/** |
|
* Reducer returning current network request state (whether a request to |
|
* the WP REST API is in progress, successful, or failed). |
|
* |
|
* @param {Object} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {Object} Updated state. |
|
*/ |
|
|
|
function saving() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'REQUEST_POST_UPDATE_START': |
|
return { |
|
requesting: true, |
|
successful: false, |
|
error: null, |
|
options: action.options || {} |
|
}; |
|
|
|
case 'REQUEST_POST_UPDATE_SUCCESS': |
|
return { |
|
requesting: false, |
|
successful: true, |
|
error: null, |
|
options: action.options || {} |
|
}; |
|
|
|
case 'REQUEST_POST_UPDATE_FAILURE': |
|
return { |
|
requesting: false, |
|
successful: false, |
|
error: action.error, |
|
options: action.options || {} |
|
}; |
|
} |
|
|
|
return state; |
|
} |
|
/** |
|
* Post Lock State. |
|
* |
|
* @typedef {Object} PostLockState |
|
* |
|
* @property {boolean} isLocked Whether the post is locked. |
|
* @property {?boolean} isTakeover Whether the post editing has been taken over. |
|
* @property {?boolean} activePostLock Active post lock value. |
|
* @property {?Object} user User that took over the post. |
|
*/ |
|
|
|
/** |
|
* Reducer returning the post lock status. |
|
* |
|
* @param {PostLockState} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {PostLockState} Updated state. |
|
*/ |
|
|
|
function postLock() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { |
|
isLocked: false |
|
}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'UPDATE_POST_LOCK': |
|
return action.lock; |
|
} |
|
|
|
return state; |
|
} |
|
/** |
|
* Post saving lock. |
|
* |
|
* When post saving is locked, the post cannot be published or updated. |
|
* |
|
* @param {PostSavingLockState} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {PostLockState} Updated state. |
|
*/ |
|
|
|
function postSavingLock() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'LOCK_POST_SAVING': |
|
return Object(objectSpread["a" /* default */])({}, state, Object(defineProperty["a" /* default */])({}, action.lockName, true)); |
|
|
|
case 'UNLOCK_POST_SAVING': |
|
return Object(external_lodash_["omit"])(state, action.lockName); |
|
} |
|
|
|
return state; |
|
} |
|
var reusableBlocks = Object(external_this_wp_data_["combineReducers"])({ |
|
data: function data() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'RECEIVE_REUSABLE_BLOCKS': |
|
{ |
|
return Object(external_lodash_["reduce"])(action.results, function (nextState, result) { |
|
var _result$reusableBlock = result.reusableBlock, |
|
id = _result$reusableBlock.id, |
|
title = _result$reusableBlock.title; |
|
var clientId = result.parsedBlock.clientId; |
|
var value = { |
|
clientId: clientId, |
|
title: title |
|
}; |
|
|
|
if (!Object(external_lodash_["isEqual"])(nextState[id], value)) { |
|
nextState = getMutateSafeObject(state, nextState); |
|
nextState[id] = value; |
|
} |
|
|
|
return nextState; |
|
}, state); |
|
} |
|
|
|
case 'UPDATE_REUSABLE_BLOCK_TITLE': |
|
{ |
|
var id = action.id, |
|
title = action.title; |
|
|
|
if (!state[id] || state[id].title === title) { |
|
return state; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, Object(defineProperty["a" /* default */])({}, id, Object(objectSpread["a" /* default */])({}, state[id], { |
|
title: title |
|
}))); |
|
} |
|
|
|
case 'SAVE_REUSABLE_BLOCK_SUCCESS': |
|
{ |
|
var _id = action.id, |
|
updatedId = action.updatedId; // If a temporary reusable block is saved, we swap the temporary id with the final one |
|
|
|
if (_id === updatedId) { |
|
return state; |
|
} |
|
|
|
var value = state[_id]; |
|
return Object(objectSpread["a" /* default */])({}, Object(external_lodash_["omit"])(state, _id), Object(defineProperty["a" /* default */])({}, updatedId, value)); |
|
} |
|
|
|
case 'REMOVE_REUSABLE_BLOCK': |
|
{ |
|
var _id2 = action.id; |
|
return Object(external_lodash_["omit"])(state, _id2); |
|
} |
|
} |
|
|
|
return state; |
|
}, |
|
isFetching: function isFetching() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'FETCH_REUSABLE_BLOCKS': |
|
{ |
|
var id = action.id; |
|
|
|
if (!id) { |
|
return state; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, Object(defineProperty["a" /* default */])({}, id, true)); |
|
} |
|
|
|
case 'FETCH_REUSABLE_BLOCKS_SUCCESS': |
|
case 'FETCH_REUSABLE_BLOCKS_FAILURE': |
|
{ |
|
var _id3 = action.id; |
|
return Object(external_lodash_["omit"])(state, _id3); |
|
} |
|
} |
|
|
|
return state; |
|
}, |
|
isSaving: function isSaving() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'SAVE_REUSABLE_BLOCK': |
|
return Object(objectSpread["a" /* default */])({}, state, Object(defineProperty["a" /* default */])({}, action.id, true)); |
|
|
|
case 'SAVE_REUSABLE_BLOCK_SUCCESS': |
|
case 'SAVE_REUSABLE_BLOCK_FAILURE': |
|
{ |
|
var id = action.id; |
|
return Object(external_lodash_["omit"])(state, id); |
|
} |
|
} |
|
|
|
return state; |
|
} |
|
}); |
|
/** |
|
* Reducer returning an object where each key is a block client ID, its value |
|
* representing the settings for its nested blocks. |
|
* |
|
* @param {Object} state Current state. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {Object} Updated state. |
|
*/ |
|
|
|
var reducer_blockListSettings = function blockListSettings() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
// Even if the replaced blocks have the same client ID, our logic |
|
// should correct the state. |
|
case 'REPLACE_BLOCKS': |
|
case 'REMOVE_BLOCKS': |
|
{ |
|
return Object(external_lodash_["omit"])(state, action.clientIds); |
|
} |
|
|
|
case 'UPDATE_BLOCK_LIST_SETTINGS': |
|
{ |
|
var clientId = action.clientId; |
|
|
|
if (!action.settings) { |
|
if (state.hasOwnProperty(clientId)) { |
|
return Object(external_lodash_["omit"])(state, clientId); |
|
} |
|
|
|
return state; |
|
} |
|
|
|
if (Object(external_lodash_["isEqual"])(state[clientId], action.settings)) { |
|
return state; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, state, Object(defineProperty["a" /* default */])({}, clientId, action.settings)); |
|
} |
|
} |
|
|
|
return state; |
|
}; |
|
/** |
|
* Reducer returning the most recent autosave. |
|
* |
|
* @param {Object} state The autosave object. |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {Object} Updated state. |
|
*/ |
|
|
|
function autosave() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'RESET_AUTOSAVE': |
|
var post = action.post; |
|
|
|
var _map = ['title', 'excerpt', 'content'].map(function (field) { |
|
return getPostRawValue(post[field]); |
|
}), |
|
_map2 = Object(slicedToArray["a" /* default */])(_map, 3), |
|
title = _map2[0], |
|
excerpt = _map2[1], |
|
content = _map2[2]; |
|
|
|
return { |
|
title: title, |
|
excerpt: excerpt, |
|
content: content |
|
}; |
|
} |
|
|
|
return state; |
|
} |
|
/** |
|
* Reducer returning the poost preview link |
|
* |
|
* @param {string?} state The preview link |
|
* @param {Object} action Dispatched action. |
|
* |
|
* @return {string?} Updated state. |
|
*/ |
|
|
|
function reducer_previewLink() { |
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; |
|
var action = arguments.length > 1 ? arguments[1] : undefined; |
|
|
|
switch (action.type) { |
|
case 'REQUEST_POST_UPDATE_SUCCESS': |
|
return action.post.preview_link || Object(external_this_wp_url_["addQueryArgs"])(action.post.link, { |
|
preview: true |
|
}); |
|
|
|
case 'REQUEST_POST_UPDATE_START': |
|
// Invalidate known preview link when autosave starts. |
|
if (state && action.options.isPreview) { |
|
return null; |
|
} |
|
|
|
break; |
|
} |
|
|
|
return state; |
|
} |
|
/* harmony default export */ var store_reducer = (redux_optimist_default()(Object(external_this_wp_data_["combineReducers"])({ |
|
editor: reducer_editor, |
|
initialEdits: initialEdits, |
|
currentPost: currentPost, |
|
isTyping: reducer_isTyping, |
|
isCaretWithinFormattedText: reducer_isCaretWithinFormattedText, |
|
blockSelection: blockSelection, |
|
blocksMode: blocksMode, |
|
blockListSettings: reducer_blockListSettings, |
|
insertionPoint: insertionPoint, |
|
preferences: preferences, |
|
saving: saving, |
|
postLock: postLock, |
|
reusableBlocks: reusableBlocks, |
|
template: reducer_template, |
|
autosave: autosave, |
|
previewLink: reducer_previewLink, |
|
settings: reducer_settings, |
|
postSavingLock: postSavingLock |
|
}))); |
|
|
|
// EXTERNAL MODULE: ./node_modules/refx/refx.js |
|
var refx = __webpack_require__(87); |
|
var refx_default = /*#__PURE__*/__webpack_require__.n(refx); |
|
|
|
// EXTERNAL MODULE: ./node_modules/redux-multi/lib/index.js |
|
var lib = __webpack_require__(190); |
|
var lib_default = /*#__PURE__*/__webpack_require__.n(lib); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","a11y"]} |
|
var external_this_wp_a11y_ = __webpack_require__(44); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/actions.js |
|
|
|
|
|
/** |
|
* External Dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Returns an action object used in signalling that editor has initialized with |
|
* the specified post object and editor settings. |
|
* |
|
* @param {Object} post Post object. |
|
* @param {Object} edits Initial edited attributes object. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function setupEditor(post, edits) { |
|
return { |
|
type: 'SETUP_EDITOR', |
|
post: post, |
|
edits: edits |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the latest version of the |
|
* post has been received, either by initialization or save. |
|
* |
|
* @param {Object} post Post object. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function resetPost(post) { |
|
return { |
|
type: 'RESET_POST', |
|
post: post |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the latest autosave of the |
|
* post has been received, by initialization or autosave. |
|
* |
|
* @param {Object} post Autosave post object. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function resetAutosave(post) { |
|
return { |
|
type: 'RESET_AUTOSAVE', |
|
post: post |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that a patch of updates for the |
|
* latest version of the post have been received. |
|
* |
|
* @param {Object} edits Updated post fields. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function updatePost(edits) { |
|
return { |
|
type: 'UPDATE_POST', |
|
edits: edits |
|
}; |
|
} |
|
/** |
|
* Returns an action object used to setup the editor state when first opening an editor. |
|
* |
|
* @param {Object} post Post object. |
|
* @param {Array} blocks Array of blocks. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function setupEditorState(post, blocks) { |
|
return { |
|
type: 'SETUP_EDITOR_STATE', |
|
post: post, |
|
blocks: blocks |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that blocks state should be |
|
* reset to the specified array of blocks, taking precedence over any other |
|
* content reflected as an edit in state. |
|
* |
|
* @param {Array} blocks Array of blocks. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function actions_resetBlocks(blocks) { |
|
return { |
|
type: 'RESET_BLOCKS', |
|
blocks: blocks |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that blocks have been received. |
|
* Unlike resetBlocks, these should be appended to the existing known set, not |
|
* replacing. |
|
* |
|
* @param {Object[]} blocks Array of block objects. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function receiveBlocks(blocks) { |
|
return { |
|
type: 'RECEIVE_BLOCKS', |
|
blocks: blocks |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the block attributes with |
|
* the specified client ID has been updated. |
|
* |
|
* @param {string} clientId Block client ID. |
|
* @param {Object} attributes Block attributes to be merged. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function updateBlockAttributes(clientId, attributes) { |
|
return { |
|
type: 'UPDATE_BLOCK_ATTRIBUTES', |
|
clientId: clientId, |
|
attributes: attributes |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the block with the |
|
* specified client ID has been updated. |
|
* |
|
* @param {string} clientId Block client ID. |
|
* @param {Object} updates Block attributes to be merged. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function updateBlock(clientId, updates) { |
|
return { |
|
type: 'UPDATE_BLOCK', |
|
clientId: clientId, |
|
updates: updates |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the block with the |
|
* specified client ID has been selected, optionally accepting a position |
|
* value reflecting its selection directionality. An initialPosition of -1 |
|
* reflects a reverse selection. |
|
* |
|
* @param {string} clientId Block client ID. |
|
* @param {?number} initialPosition Optional initial position. Pass as -1 to |
|
* reflect reverse selection. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function actions_selectBlock(clientId) { |
|
var initialPosition = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; |
|
return { |
|
type: 'SELECT_BLOCK', |
|
initialPosition: initialPosition, |
|
clientId: clientId |
|
}; |
|
} |
|
function startMultiSelect() { |
|
return { |
|
type: 'START_MULTI_SELECT' |
|
}; |
|
} |
|
function stopMultiSelect() { |
|
return { |
|
type: 'STOP_MULTI_SELECT' |
|
}; |
|
} |
|
function actions_multiSelect(start, end) { |
|
return { |
|
type: 'MULTI_SELECT', |
|
start: start, |
|
end: end |
|
}; |
|
} |
|
function clearSelectedBlock() { |
|
return { |
|
type: 'CLEAR_SELECTED_BLOCK' |
|
}; |
|
} |
|
/** |
|
* Returns an action object that enables or disables block selection. |
|
* |
|
* @param {boolean} [isSelectionEnabled=true] Whether block selection should |
|
* be enabled. |
|
|
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function toggleSelection() { |
|
var isSelectionEnabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; |
|
return { |
|
type: 'TOGGLE_SELECTION', |
|
isSelectionEnabled: isSelectionEnabled |
|
}; |
|
} |
|
/** |
|
* Returns an action object signalling that a blocks should be replaced with |
|
* one or more replacement blocks. |
|
* |
|
* @param {(string|string[])} clientIds Block client ID(s) to replace. |
|
* @param {(Object|Object[])} blocks Replacement block(s). |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function actions_replaceBlocks(clientIds, blocks) { |
|
return { |
|
type: 'REPLACE_BLOCKS', |
|
clientIds: Object(external_lodash_["castArray"])(clientIds), |
|
blocks: Object(external_lodash_["castArray"])(blocks), |
|
time: Date.now() |
|
}; |
|
} |
|
/** |
|
* Returns an action object signalling that a single block should be replaced |
|
* with one or more replacement blocks. |
|
* |
|
* @param {(string|string[])} clientId Block client ID to replace. |
|
* @param {(Object|Object[])} block Replacement block(s). |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function replaceBlock(clientId, block) { |
|
return actions_replaceBlocks(clientId, block); |
|
} |
|
/** |
|
* Higher-order action creator which, given the action type to dispatch creates |
|
* an action creator for managing block movement. |
|
* |
|
* @param {string} type Action type to dispatch. |
|
* |
|
* @return {Function} Action creator. |
|
*/ |
|
|
|
function createOnMove(type) { |
|
return function (clientIds, rootClientId) { |
|
return { |
|
clientIds: Object(external_lodash_["castArray"])(clientIds), |
|
type: type, |
|
rootClientId: rootClientId |
|
}; |
|
}; |
|
} |
|
|
|
var actions_moveBlocksDown = createOnMove('MOVE_BLOCKS_DOWN'); |
|
var actions_moveBlocksUp = createOnMove('MOVE_BLOCKS_UP'); |
|
/** |
|
* Returns an action object signalling that an indexed block should be moved |
|
* to a new index. |
|
* |
|
* @param {?string} clientId The client ID of the block. |
|
* @param {?string} fromRootClientId Root client ID source. |
|
* @param {?string} toRootClientId Root client ID destination. |
|
* @param {number} index The index to move the block into. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function moveBlockToPosition(clientId, fromRootClientId, toRootClientId, index) { |
|
return { |
|
type: 'MOVE_BLOCK_TO_POSITION', |
|
fromRootClientId: fromRootClientId, |
|
toRootClientId: toRootClientId, |
|
clientId: clientId, |
|
index: index |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that a single block should be |
|
* inserted, optionally at a specific index respective a root block list. |
|
* |
|
* @param {Object} block Block object to insert. |
|
* @param {?number} index Index at which block should be inserted. |
|
* @param {?string} rootClientId Optional root client ID of block list on which to insert. |
|
* @param {?boolean} updateSelection If true block selection will be updated. If false, block selection will not change. Defaults to true. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function actions_insertBlock(block, index, rootClientId) { |
|
var updateSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; |
|
return actions_insertBlocks([block], index, rootClientId, updateSelection); |
|
} |
|
/** |
|
* Returns an action object used in signalling that an array of blocks should |
|
* be inserted, optionally at a specific index respective a root block list. |
|
* |
|
* @param {Object[]} blocks Block objects to insert. |
|
* @param {?number} index Index at which block should be inserted. |
|
* @param {?string} rootClientId Optional root cliente ID of block list on which to insert. |
|
* @param {?boolean} updateSelection If true block selection will be updated. If false, block selection will not change. Defaults to true. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function actions_insertBlocks(blocks, index, rootClientId) { |
|
var updateSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; |
|
return { |
|
type: 'INSERT_BLOCKS', |
|
blocks: Object(external_lodash_["castArray"])(blocks), |
|
index: index, |
|
rootClientId: rootClientId, |
|
time: Date.now(), |
|
updateSelection: updateSelection |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the insertion point should |
|
* be shown. |
|
* |
|
* @param {?string} rootClientId Optional root client ID of block list on |
|
* which to insert. |
|
* @param {?number} index Index at which block should be inserted. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function actions_showInsertionPoint(rootClientId, index) { |
|
return { |
|
type: 'SHOW_INSERTION_POINT', |
|
rootClientId: rootClientId, |
|
index: index |
|
}; |
|
} |
|
/** |
|
* Returns an action object hiding the insertion point. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function actions_hideInsertionPoint() { |
|
return { |
|
type: 'HIDE_INSERTION_POINT' |
|
}; |
|
} |
|
/** |
|
* Returns an action object resetting the template validity. |
|
* |
|
* @param {boolean} isValid template validity flag. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function setTemplateValidity(isValid) { |
|
return { |
|
type: 'SET_TEMPLATE_VALIDITY', |
|
isValid: isValid |
|
}; |
|
} |
|
/** |
|
* Returns an action object synchronize the template with the list of blocks |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function synchronizeTemplate() { |
|
return { |
|
type: 'SYNCHRONIZE_TEMPLATE' |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that attributes of the post have |
|
* been edited. |
|
* |
|
* @param {Object} edits Post attributes to edit. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function actions_editPost(edits) { |
|
return { |
|
type: 'EDIT_POST', |
|
edits: edits |
|
}; |
|
} |
|
/** |
|
* Returns an action object to save the post. |
|
* |
|
* @param {Object} options Options for the save. |
|
* @param {boolean} options.isAutosave Perform an autosave if true. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function savePost() { |
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
return { |
|
type: 'REQUEST_POST_UPDATE', |
|
options: options |
|
}; |
|
} |
|
function refreshPost() { |
|
return { |
|
type: 'REFRESH_POST' |
|
}; |
|
} |
|
function trashPost(postId, postType) { |
|
return { |
|
type: 'TRASH_POST', |
|
postId: postId, |
|
postType: postType |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that two blocks should be merged |
|
* |
|
* @param {string} firstBlockClientId Client ID of the first block to merge. |
|
* @param {string} secondBlockClientId Client ID of the second block to merge. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function mergeBlocks(firstBlockClientId, secondBlockClientId) { |
|
return { |
|
type: 'MERGE_BLOCKS', |
|
blocks: [firstBlockClientId, secondBlockClientId] |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the post should autosave. |
|
* |
|
* @param {Object?} options Extra flags to identify the autosave. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function actions_autosave(options) { |
|
return savePost(Object(objectSpread["a" /* default */])({ |
|
isAutosave: true |
|
}, options)); |
|
} |
|
/** |
|
* Returns an action object used in signalling that undo history should |
|
* restore last popped state. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function actions_redo() { |
|
return { |
|
type: 'REDO' |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that undo history should pop. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function actions_undo() { |
|
return { |
|
type: 'UNDO' |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that undo history record should |
|
* be created. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function createUndoLevel() { |
|
return { |
|
type: 'CREATE_UNDO_LEVEL' |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the blocks corresponding to |
|
* the set of specified client IDs are to be removed. |
|
* |
|
* @param {string|string[]} clientIds Client IDs of blocks to remove. |
|
* @param {boolean} selectPrevious True if the previous block should be |
|
* selected when a block is removed. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function actions_removeBlocks(clientIds) { |
|
var selectPrevious = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; |
|
return { |
|
type: 'REMOVE_BLOCKS', |
|
clientIds: Object(external_lodash_["castArray"])(clientIds), |
|
selectPrevious: selectPrevious |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the block with the |
|
* specified client ID is to be removed. |
|
* |
|
* @param {string} clientId Client ID of block to remove. |
|
* @param {boolean} selectPrevious True if the previous block should be |
|
* selected when a block is removed. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function removeBlock(clientId, selectPrevious) { |
|
return actions_removeBlocks([clientId], selectPrevious); |
|
} |
|
/** |
|
* Returns an action object used to toggle the block editing mode between |
|
* visual and HTML modes. |
|
* |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function toggleBlockMode(clientId) { |
|
return { |
|
type: 'TOGGLE_BLOCK_MODE', |
|
clientId: clientId |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the user has begun to type. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function startTyping() { |
|
return { |
|
type: 'START_TYPING' |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the user has stopped typing. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function stopTyping() { |
|
return { |
|
type: 'STOP_TYPING' |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the caret has entered formatted text. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function enterFormattedText() { |
|
return { |
|
type: 'ENTER_FORMATTED_TEXT' |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the user caret has exited formatted text. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function exitFormattedText() { |
|
return { |
|
type: 'EXIT_FORMATTED_TEXT' |
|
}; |
|
} |
|
/** |
|
* Returns an action object used to lock the editor. |
|
* |
|
* @param {Object} lock Details about the post lock status, user, and nonce. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function updatePostLock(lock) { |
|
return { |
|
type: 'UPDATE_POST_LOCK', |
|
lock: lock |
|
}; |
|
} |
|
/** |
|
* Returns an action object used to fetch a single reusable block or all |
|
* reusable blocks from the REST API into the store. |
|
* |
|
* @param {?string} id If given, only a single reusable block with this ID will |
|
* be fetched. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function __experimentalFetchReusableBlocks(id) { |
|
return { |
|
type: 'FETCH_REUSABLE_BLOCKS', |
|
id: id |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that reusable blocks have been |
|
* received. `results` is an array of objects containing: |
|
* - `reusableBlock` - Details about how the reusable block is persisted. |
|
* - `parsedBlock` - The original block. |
|
* |
|
* @param {Object[]} results Reusable blocks received. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function __experimentalReceiveReusableBlocks(results) { |
|
return { |
|
type: 'RECEIVE_REUSABLE_BLOCKS', |
|
results: results |
|
}; |
|
} |
|
/** |
|
* Returns an action object used to save a reusable block that's in the store to |
|
* the REST API. |
|
* |
|
* @param {Object} id The ID of the reusable block to save. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function __experimentalSaveReusableBlock(id) { |
|
return { |
|
type: 'SAVE_REUSABLE_BLOCK', |
|
id: id |
|
}; |
|
} |
|
/** |
|
* Returns an action object used to delete a reusable block via the REST API. |
|
* |
|
* @param {number} id The ID of the reusable block to delete. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function __experimentalDeleteReusableBlock(id) { |
|
return { |
|
type: 'DELETE_REUSABLE_BLOCK', |
|
id: id |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that a reusable block's title is |
|
* to be updated. |
|
* |
|
* @param {number} id The ID of the reusable block to update. |
|
* @param {string} title The new title. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function __experimentalUpdateReusableBlockTitle(id, title) { |
|
return { |
|
type: 'UPDATE_REUSABLE_BLOCK_TITLE', |
|
id: id, |
|
title: title |
|
}; |
|
} |
|
/** |
|
* Returns an action object used to convert a reusable block into a static block. |
|
* |
|
* @param {string} clientId The client ID of the block to attach. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function __experimentalConvertBlockToStatic(clientId) { |
|
return { |
|
type: 'CONVERT_BLOCK_TO_STATIC', |
|
clientId: clientId |
|
}; |
|
} |
|
/** |
|
* Returns an action object used to convert a static block into a reusable block. |
|
* |
|
* @param {string} clientIds The client IDs of the block to detach. |
|
* |
|
* @return {Object} Action object. |
|
*/ |
|
|
|
function __experimentalConvertBlockToReusable(clientIds) { |
|
return { |
|
type: 'CONVERT_BLOCK_TO_REUSABLE', |
|
clientIds: Object(external_lodash_["castArray"])(clientIds) |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that a new block of the default |
|
* type should be added to the block list. |
|
* |
|
* @param {?Object} attributes Optional attributes of the block to assign. |
|
* @param {?string} rootClientId Optional root client ID of block list on which |
|
* to append. |
|
* @param {?number} index Optional index where to insert the default block |
|
* |
|
* @return {Object} Action object |
|
*/ |
|
|
|
function actions_insertDefaultBlock(attributes, rootClientId, index) { |
|
var block = Object(external_this_wp_blocks_["createBlock"])(Object(external_this_wp_blocks_["getDefaultBlockName"])(), attributes); |
|
return actions_insertBlock(block, index, rootClientId); |
|
} |
|
/** |
|
* Returns an action object that changes the nested settings of a given block. |
|
* |
|
* @param {string} clientId Client ID of the block whose nested setting are |
|
* being received. |
|
* @param {Object} settings Object with the new settings for the nested block. |
|
* |
|
* @return {Object} Action object |
|
*/ |
|
|
|
function actions_updateBlockListSettings(clientId, settings) { |
|
return { |
|
type: 'UPDATE_BLOCK_LIST_SETTINGS', |
|
clientId: clientId, |
|
settings: settings |
|
}; |
|
} |
|
/* |
|
* Returns an action object used in signalling that the editor settings have been updated. |
|
* |
|
* @param {Object} settings Updated settings |
|
* |
|
* @return {Object} Action object |
|
*/ |
|
|
|
function updateEditorSettings(settings) { |
|
return { |
|
type: 'UPDATE_EDITOR_SETTINGS', |
|
settings: settings |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the user has enabled the publish sidebar. |
|
* |
|
* @return {Object} Action object |
|
*/ |
|
|
|
function enablePublishSidebar() { |
|
return { |
|
type: 'ENABLE_PUBLISH_SIDEBAR' |
|
}; |
|
} |
|
/** |
|
* Returns an action object used in signalling that the user has disabled the publish sidebar. |
|
* |
|
* @return {Object} Action object |
|
*/ |
|
|
|
function disablePublishSidebar() { |
|
return { |
|
type: 'DISABLE_PUBLISH_SIDEBAR' |
|
}; |
|
} |
|
/** |
|
* Returns an action object used to signal that post saving is locked. |
|
* |
|
* @param {string} lockName The lock name. |
|
* |
|
* @return {Object} Action object |
|
*/ |
|
|
|
function lockPostSaving(lockName) { |
|
return { |
|
type: 'LOCK_POST_SAVING', |
|
lockName: lockName |
|
}; |
|
} |
|
/** |
|
* Returns an action object used to signal that post saving is unlocked. |
|
* |
|
* @param {string} lockName The lock name. |
|
* |
|
* @return {Object} Action object |
|
*/ |
|
|
|
function unlockPostSaving(lockName) { |
|
return { |
|
type: 'UNLOCK_POST_SAVING', |
|
lockName: lockName |
|
}; |
|
} |
|
|
|
// EXTERNAL MODULE: ./node_modules/rememo/es/rememo.js |
|
var rememo = __webpack_require__(31); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","date"]} |
|
var external_this_wp_date_ = __webpack_require__(46); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","autop"]} |
|
var external_this_wp_autop_ = __webpack_require__(58); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/selectors.js |
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
/*** |
|
* Module constants |
|
*/ |
|
|
|
var POST_UPDATE_TRANSACTION_ID = 'post-update'; |
|
var PERMALINK_POSTNAME_REGEX = /%(?:postname|pagename)%/; |
|
var INSERTER_UTILITY_HIGH = 3; |
|
var INSERTER_UTILITY_MEDIUM = 2; |
|
var INSERTER_UTILITY_LOW = 1; |
|
var INSERTER_UTILITY_NONE = 0; |
|
var MILLISECONDS_PER_HOUR = 3600 * 1000; |
|
var MILLISECONDS_PER_DAY = 24 * 3600 * 1000; |
|
var MILLISECONDS_PER_WEEK = 7 * 24 * 3600 * 1000; |
|
var ONE_MINUTE_IN_MS = 60 * 1000; |
|
/** |
|
* Shared reference to an empty array for cases where it is important to avoid |
|
* returning a new array reference on every invocation, as in a connected or |
|
* other pure component which performs `shouldComponentUpdate` check on props. |
|
* This should be used as a last resort, since the normalized data should be |
|
* maintained by the reducer result in state. |
|
* |
|
* @type {Array} |
|
*/ |
|
|
|
var EMPTY_ARRAY = []; |
|
/** |
|
* Returns true if any past editor history snapshots exist, or false otherwise. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether undo history exists. |
|
*/ |
|
|
|
function hasEditorUndo(state) { |
|
return state.editor.past.length > 0; |
|
} |
|
/** |
|
* Returns true if any future editor history snapshots exist, or false |
|
* otherwise. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether redo history exists. |
|
*/ |
|
|
|
function hasEditorRedo(state) { |
|
return state.editor.future.length > 0; |
|
} |
|
/** |
|
* Returns true if the currently edited post is yet to be saved, or false if |
|
* the post has been saved. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether the post is new. |
|
*/ |
|
|
|
function isEditedPostNew(state) { |
|
return selectors_getCurrentPost(state).status === 'auto-draft'; |
|
} |
|
/** |
|
* Returns true if content includes unsaved changes, or false otherwise. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {boolean} Whether content includes unsaved changes. |
|
*/ |
|
|
|
function hasChangedContent(state) { |
|
return state.editor.present.blocks.isDirty || // `edits` is intended to contain only values which are different from |
|
// the saved post, so the mere presence of a property is an indicator |
|
// that the value is different than what is known to be saved. While |
|
// content in Visual mode is represented by the blocks state, in Text |
|
// mode it is tracked by `edits.content`. |
|
'content' in state.editor.present.edits; |
|
} |
|
/** |
|
* Returns true if there are unsaved values for the current edit session, or |
|
* false if the editing state matches the saved or new post. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether unsaved values exist. |
|
*/ |
|
|
|
function selectors_isEditedPostDirty(state) { |
|
if (hasChangedContent(state)) { |
|
return true; |
|
} // Edits should contain only fields which differ from the saved post (reset |
|
// at initial load and save complete). Thus, a non-empty edits state can be |
|
// inferred to contain unsaved values. |
|
|
|
|
|
if (Object.keys(state.editor.present.edits).length > 0) { |
|
return true; |
|
} // Edits and change detectiona are reset at the start of a save, but a post |
|
// is still considered dirty until the point at which the save completes. |
|
// Because the save is performed optimistically, the prior states are held |
|
// until committed. These can be referenced to determine whether there's a |
|
// chance that state may be reverted into one considered dirty. |
|
|
|
|
|
return inSomeHistory(state, selectors_isEditedPostDirty); |
|
} |
|
/** |
|
* Returns true if there are no unsaved values for the current edit session and |
|
* if the currently edited post is new (has never been saved before). |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether new post and unsaved values exist. |
|
*/ |
|
|
|
function selectors_isCleanNewPost(state) { |
|
return !selectors_isEditedPostDirty(state) && isEditedPostNew(state); |
|
} |
|
/** |
|
* Returns the post currently being edited in its last known saved state, not |
|
* including unsaved edits. Returns an object containing relevant default post |
|
* values if the post has not yet been saved. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {Object} Post object. |
|
*/ |
|
|
|
function selectors_getCurrentPost(state) { |
|
return state.currentPost; |
|
} |
|
/** |
|
* Returns the post type of the post currently being edited. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {string} Post type. |
|
*/ |
|
|
|
function selectors_getCurrentPostType(state) { |
|
return state.currentPost.type; |
|
} |
|
/** |
|
* Returns the ID of the post currently being edited, or null if the post has |
|
* not yet been saved. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {?number} ID of current post. |
|
*/ |
|
|
|
function selectors_getCurrentPostId(state) { |
|
return selectors_getCurrentPost(state).id || null; |
|
} |
|
/** |
|
* Returns the number of revisions of the post currently being edited. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {number} Number of revisions. |
|
*/ |
|
|
|
function getCurrentPostRevisionsCount(state) { |
|
return Object(external_lodash_["get"])(selectors_getCurrentPost(state), ['_links', 'version-history', 0, 'count'], 0); |
|
} |
|
/** |
|
* Returns the last revision ID of the post currently being edited, |
|
* or null if the post has no revisions. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {?number} ID of the last revision. |
|
*/ |
|
|
|
function getCurrentPostLastRevisionId(state) { |
|
return Object(external_lodash_["get"])(selectors_getCurrentPost(state), ['_links', 'predecessor-version', 0, 'id'], null); |
|
} |
|
/** |
|
* Returns any post values which have been changed in the editor but not yet |
|
* been saved. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {Object} Object of key value pairs comprising unsaved edits. |
|
*/ |
|
|
|
var getPostEdits = Object(rememo["a" /* default */])(function (state) { |
|
return Object(objectSpread["a" /* default */])({}, state.initialEdits, state.editor.present.edits); |
|
}, function (state) { |
|
return [state.editor.present.edits, state.initialEdits]; |
|
}); |
|
/** |
|
* Returns a new reference when edited values have changed. This is useful in |
|
* inferring where an edit has been made between states by comparison of the |
|
* return values using strict equality. |
|
* |
|
* @example |
|
* |
|
* ``` |
|
* const hasEditOccurred = ( |
|
* getReferenceByDistinctEdits( beforeState ) !== |
|
* getReferenceByDistinctEdits( afterState ) |
|
* ); |
|
* ``` |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {*} A value whose reference will change only when an edit occurs. |
|
*/ |
|
|
|
var getReferenceByDistinctEdits = Object(rememo["a" /* default */])(function () { |
|
return []; |
|
}, function (state) { |
|
return [state.editor]; |
|
}); |
|
/** |
|
* Returns an attribute value of the saved post. |
|
* |
|
* @param {Object} state Global application state. |
|
* @param {string} attributeName Post attribute name. |
|
* |
|
* @return {*} Post attribute value. |
|
*/ |
|
|
|
function selectors_getCurrentPostAttribute(state, attributeName) { |
|
var post = selectors_getCurrentPost(state); |
|
|
|
if (post.hasOwnProperty(attributeName)) { |
|
return post[attributeName]; |
|
} |
|
} |
|
/** |
|
* Returns a single attribute of the post being edited, preferring the unsaved |
|
* edit if one exists, but falling back to the attribute for the last known |
|
* saved state of the post. |
|
* |
|
* @param {Object} state Global application state. |
|
* @param {string} attributeName Post attribute name. |
|
* |
|
* @return {*} Post attribute value. |
|
*/ |
|
|
|
function selectors_getEditedPostAttribute(state, attributeName) { |
|
var edits = getPostEdits(state); // Special cases |
|
|
|
switch (attributeName) { |
|
case 'content': |
|
return getEditedPostContent(state); |
|
} // Fall back to saved post value if not edited. |
|
|
|
|
|
if (!edits.hasOwnProperty(attributeName)) { |
|
return selectors_getCurrentPostAttribute(state, attributeName); |
|
} // Merge properties are objects which contain only the patch edit in state, |
|
// and thus must be merged with the current post attribute. |
|
|
|
|
|
if (EDIT_MERGE_PROPERTIES.has(attributeName)) { |
|
// [TODO]: Since this will return a new reference on each invocation, |
|
// consider caching in a way which would not impact non-merged property |
|
// derivation. Alternatively, introduce a new selector for meta lookup. |
|
return Object(objectSpread["a" /* default */])({}, selectors_getCurrentPostAttribute(state, attributeName), edits[attributeName]); |
|
} |
|
|
|
return edits[attributeName]; |
|
} |
|
/** |
|
* Returns an attribute value of the current autosave revision for a post, or |
|
* null if there is no autosave for the post. |
|
* |
|
* @param {Object} state Global application state. |
|
* @param {string} attributeName Autosave attribute name. |
|
* |
|
* @return {*} Autosave attribute value. |
|
*/ |
|
|
|
function getAutosaveAttribute(state, attributeName) { |
|
if (!hasAutosave(state)) { |
|
return null; |
|
} |
|
|
|
var autosave = getAutosave(state); |
|
|
|
if (autosave.hasOwnProperty(attributeName)) { |
|
return autosave[attributeName]; |
|
} |
|
} |
|
/** |
|
* Returns the current visibility of the post being edited, preferring the |
|
* unsaved value if different than the saved post. The return value is one of |
|
* "private", "password", or "public". |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {string} Post visibility. |
|
*/ |
|
|
|
function selectors_getEditedPostVisibility(state) { |
|
var status = selectors_getEditedPostAttribute(state, 'status'); |
|
var password = selectors_getEditedPostAttribute(state, 'password'); |
|
|
|
if (status === 'private') { |
|
return 'private'; |
|
} else if (password) { |
|
return 'password'; |
|
} |
|
|
|
return 'public'; |
|
} |
|
/** |
|
* Returns true if post is pending review. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether current post is pending review. |
|
*/ |
|
|
|
function isCurrentPostPending(state) { |
|
return selectors_getCurrentPost(state).status === 'pending'; |
|
} |
|
/** |
|
* Return true if the current post has already been published. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether the post has been published. |
|
*/ |
|
|
|
function selectors_isCurrentPostPublished(state) { |
|
var post = selectors_getCurrentPost(state); |
|
return ['publish', 'private'].indexOf(post.status) !== -1 || post.status === 'future' && !Object(external_this_wp_date_["isInTheFuture"])(new Date(Number(Object(external_this_wp_date_["getDate"])(post.date)) - ONE_MINUTE_IN_MS)); |
|
} |
|
/** |
|
* Returns true if post is already scheduled. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether current post is scheduled to be posted. |
|
*/ |
|
|
|
function selectors_isCurrentPostScheduled(state) { |
|
return selectors_getCurrentPost(state).status === 'future' && !selectors_isCurrentPostPublished(state); |
|
} |
|
/** |
|
* Return true if the post being edited can be published. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether the post can been published. |
|
*/ |
|
|
|
function selectors_isEditedPostPublishable(state) { |
|
var post = selectors_getCurrentPost(state); // TODO: Post being publishable should be superset of condition of post |
|
// being saveable. Currently this restriction is imposed at UI. |
|
// |
|
// See: <PostPublishButton /> (`isButtonEnabled` assigned by `isSaveable`) |
|
|
|
return selectors_isEditedPostDirty(state) || ['publish', 'private', 'future'].indexOf(post.status) === -1; |
|
} |
|
/** |
|
* Returns true if the post can be saved, or false otherwise. A post must |
|
* contain a title, an excerpt, or non-empty content to be valid for save. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether the post can be saved. |
|
*/ |
|
|
|
function selectors_isEditedPostSaveable(state) { |
|
if (selectors_isSavingPost(state)) { |
|
return false; |
|
} // TODO: Post should not be saveable if not dirty. Cannot be added here at |
|
// this time since posts where meta boxes are present can be saved even if |
|
// the post is not dirty. Currently this restriction is imposed at UI, but |
|
// should be moved here. |
|
// |
|
// See: `isEditedPostPublishable` (includes `isEditedPostDirty` condition) |
|
// See: <PostSavedState /> (`forceIsDirty` prop) |
|
// See: <PostPublishButton /> (`forceIsDirty` prop) |
|
// See: https://github.com/WordPress/gutenberg/pull/4184 |
|
|
|
|
|
return !!selectors_getEditedPostAttribute(state, 'title') || !!selectors_getEditedPostAttribute(state, 'excerpt') || !isEditedPostEmpty(state); |
|
} |
|
/** |
|
* Returns true if the edited post has content. A post has content if it has at |
|
* least one saveable block or otherwise has a non-empty content property |
|
* assigned. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether post has content. |
|
*/ |
|
|
|
function isEditedPostEmpty(state) { |
|
var blocks = getBlocksForSerialization(state); // While the condition of truthy content string is sufficient to determine |
|
// emptiness, testing saveable blocks length is a trivial operation. Since |
|
// this function can be called frequently, optimize for the fast case as a |
|
// condition of the mere existence of blocks. Note that the value of edited |
|
// content is used in place of blocks, thus allowed to fall through. |
|
|
|
if (blocks.length && !('content' in getPostEdits(state))) { |
|
// Pierce the abstraction of the serializer in knowing that blocks are |
|
// joined with with newlines such that even if every individual block |
|
// produces an empty save result, the serialized content is non-empty. |
|
if (blocks.length > 1) { |
|
return false; |
|
} // Freeform and unregistered blocks omit comment delimiters in their |
|
// output. The freeform block specifically may produce an empty string |
|
// to save. In the case of a single freeform block, fall through to the |
|
// full serialize. Otherwise, the single block is assumed non-empty by |
|
// virtue of its comment delimiters. |
|
|
|
|
|
if (blocks[0].name !== Object(external_this_wp_blocks_["getFreeformContentHandlerName"])()) { |
|
return false; |
|
} |
|
} |
|
|
|
return !getEditedPostContent(state); |
|
} |
|
/** |
|
* Returns true if the post can be autosaved, or false otherwise. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether the post can be autosaved. |
|
*/ |
|
|
|
function selectors_isEditedPostAutosaveable(state) { |
|
// A post must contain a title, an excerpt, or non-empty content to be valid for autosaving. |
|
if (!selectors_isEditedPostSaveable(state)) { |
|
return false; |
|
} // If we don't already have an autosave, the post is autosaveable. |
|
|
|
|
|
if (!hasAutosave(state)) { |
|
return true; |
|
} // To avoid an expensive content serialization, use the content dirtiness |
|
// flag in place of content field comparison against the known autosave. |
|
// This is not strictly accurate, and relies on a tolerance toward autosave |
|
// request failures for unnecessary saves. |
|
|
|
|
|
if (hasChangedContent(state)) { |
|
return true; |
|
} // If the title, excerpt or content has changed, the post is autosaveable. |
|
|
|
|
|
var autosave = getAutosave(state); |
|
return ['title', 'excerpt'].some(function (field) { |
|
return autosave[field] !== selectors_getEditedPostAttribute(state, field); |
|
}); |
|
} |
|
/** |
|
* Returns the current autosave, or null if one is not set (i.e. if the post |
|
* has yet to be autosaved, or has been saved or published since the last |
|
* autosave). |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {?Object} Current autosave, if exists. |
|
*/ |
|
|
|
function getAutosave(state) { |
|
return state.autosave; |
|
} |
|
/** |
|
* Returns the true if there is an existing autosave, otherwise false. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether there is an existing autosave. |
|
*/ |
|
|
|
function hasAutosave(state) { |
|
return !!getAutosave(state); |
|
} |
|
/** |
|
* Return true if the post being edited is being scheduled. Preferring the |
|
* unsaved status values. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether the post has been published. |
|
*/ |
|
|
|
function selectors_isEditedPostBeingScheduled(state) { |
|
var date = selectors_getEditedPostAttribute(state, 'date'); // Offset the date by one minute (network latency) |
|
|
|
var checkedDate = new Date(Number(Object(external_this_wp_date_["getDate"])(date)) - ONE_MINUTE_IN_MS); |
|
return Object(external_this_wp_date_["isInTheFuture"])(checkedDate); |
|
} |
|
/** |
|
* Returns whether the current post should be considered to have a "floating" |
|
* date (i.e. that it would publish "Immediately" rather than at a set time). |
|
* |
|
* Unlike in the PHP backend, the REST API returns a full date string for posts |
|
* where the 0000-00-00T00:00:00 placeholder is present in the database. To |
|
* infer that a post is set to publish "Immediately" we check whether the date |
|
* and modified date are the same. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {boolean} Whether the edited post has a floating date value. |
|
*/ |
|
|
|
function isEditedPostDateFloating(state) { |
|
var date = selectors_getEditedPostAttribute(state, 'date'); |
|
var modified = selectors_getEditedPostAttribute(state, 'modified'); |
|
var status = selectors_getEditedPostAttribute(state, 'status'); |
|
|
|
if (status === 'draft' || status === 'auto-draft') { |
|
return date === modified; |
|
} |
|
|
|
return false; |
|
} |
|
/** |
|
* Returns a new reference when the inner blocks of a given block client ID |
|
* change. This is used exclusively as a memoized selector dependant, relying |
|
* on this selector's shared return value and recursively those of its inner |
|
* blocks defined as dependencies. This abuses mechanics of the selector |
|
* memoization to return from the original selector function only when |
|
* dependants change. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {*} A value whose reference will change only when inner blocks of |
|
* the given block client ID change. |
|
*/ |
|
|
|
var getBlockDependantsCacheBust = Object(rememo["a" /* default */])(function () { |
|
return []; |
|
}, function (state, clientId) { |
|
return Object(external_lodash_["map"])(selectors_getBlockOrder(state, clientId), function (innerBlockClientId) { |
|
return selectors_getBlock(state, innerBlockClientId); |
|
}); |
|
}); |
|
/** |
|
* Returns a block's name given its client ID, or null if no block exists with |
|
* the client ID. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {string} Block name. |
|
*/ |
|
|
|
function selectors_getBlockName(state, clientId) { |
|
var block = state.editor.present.blocks.byClientId[clientId]; |
|
return block ? block.name : null; |
|
} |
|
/** |
|
* Returns whether a block is valid or not. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {boolean} Is Valid. |
|
*/ |
|
|
|
function selectors_isBlockValid(state, clientId) { |
|
var block = state.editor.present.blocks.byClientId[clientId]; |
|
return !!block && block.isValid; |
|
} |
|
/** |
|
* Returns a block's attributes given its client ID, or null if no block exists with |
|
* the client ID. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {Object?} Block attributes. |
|
*/ |
|
|
|
var getBlockAttributes = Object(rememo["a" /* default */])(function (state, clientId) { |
|
var block = state.editor.present.blocks.byClientId[clientId]; |
|
|
|
if (!block) { |
|
return null; |
|
} |
|
|
|
var attributes = block.attributes; // Inject custom source attribute values. |
|
// |
|
// TODO: Create generic external sourcing pattern, not explicitly |
|
// targeting meta attributes. |
|
|
|
var type = Object(external_this_wp_blocks_["getBlockType"])(block.name); |
|
|
|
if (type) { |
|
attributes = Object(external_lodash_["reduce"])(type.attributes, function (result, value, key) { |
|
if (value.source === 'meta') { |
|
if (result === attributes) { |
|
result = Object(objectSpread["a" /* default */])({}, result); |
|
} |
|
|
|
result[key] = getPostMeta(state, value.meta); |
|
} |
|
|
|
return result; |
|
}, attributes); |
|
} |
|
|
|
return attributes; |
|
}, function (state, clientId) { |
|
return [state.editor.present.blocks.byClientId[clientId], state.editor.present.edits.meta, state.initialEdits.meta, state.currentPost.meta]; |
|
}); |
|
/** |
|
* Returns a block given its client ID. This is a parsed copy of the block, |
|
* containing its `blockName`, `clientId`, and current `attributes` state. This |
|
* is not the block's registration settings, which must be retrieved from the |
|
* blocks module registration store. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {Object} Parsed block object. |
|
*/ |
|
|
|
var selectors_getBlock = Object(rememo["a" /* default */])(function (state, clientId) { |
|
var block = state.editor.present.blocks.byClientId[clientId]; |
|
|
|
if (!block) { |
|
return null; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, block, { |
|
attributes: getBlockAttributes(state, clientId), |
|
innerBlocks: selectors_getBlocks(state, clientId) |
|
}); |
|
}, function (state, clientId) { |
|
return [state.editor.present.blocks.byClientId[clientId], getBlockDependantsCacheBust(state, clientId)].concat(Object(toConsumableArray["a" /* default */])(getBlockAttributes.getDependants(state, clientId))); |
|
}); |
|
var selectors_unstableGetBlockWithoutInnerBlocks = Object(rememo["a" /* default */])(function (state, clientId) { |
|
var block = state.editor.present.blocks.byClientId[clientId]; |
|
|
|
if (!block) { |
|
return null; |
|
} |
|
|
|
return Object(objectSpread["a" /* default */])({}, block, { |
|
attributes: getBlockAttributes(state, clientId) |
|
}); |
|
}, function (state, clientId) { |
|
return [state.editor.present.blocks.byClientId[clientId]].concat(Object(toConsumableArray["a" /* default */])(getBlockAttributes.getDependants(state, clientId))); |
|
}); |
|
|
|
function getPostMeta(state, key) { |
|
return Object(external_lodash_["has"])(state, ['editor', 'present', 'edits', 'meta', key]) ? Object(external_lodash_["get"])(state, ['editor', 'present', 'edits', 'meta', key]) : Object(external_lodash_["get"])(state, ['currentPost', 'meta', key]); |
|
} |
|
/** |
|
* Returns all block objects for the current post being edited as an array in |
|
* the order they appear in the post. |
|
* |
|
* Note: It's important to memoize this selector to avoid return a new instance |
|
* on each call |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {?String} rootClientId Optional root client ID of block list. |
|
* |
|
* @return {Object[]} Post blocks. |
|
*/ |
|
|
|
|
|
var selectors_getBlocks = Object(rememo["a" /* default */])(function (state, rootClientId) { |
|
return Object(external_lodash_["map"])(selectors_getBlockOrder(state, rootClientId), function (clientId) { |
|
return selectors_getBlock(state, clientId); |
|
}); |
|
}, function (state) { |
|
return [state.editor.present.blocks]; |
|
}); |
|
/** |
|
* Returns an array containing the clientIds of all descendants |
|
* of the blocks given. |
|
* |
|
* @param {Object} state Global application state. |
|
* @param {Array} clientIds Array of blocks to inspect. |
|
* |
|
* @return {Array} ids of descendants. |
|
*/ |
|
|
|
var selectors_getClientIdsOfDescendants = function getClientIdsOfDescendants(state, clientIds) { |
|
return Object(external_lodash_["flatMap"])(clientIds, function (clientId) { |
|
var descendants = selectors_getBlockOrder(state, clientId); |
|
return Object(toConsumableArray["a" /* default */])(descendants).concat(Object(toConsumableArray["a" /* default */])(getClientIdsOfDescendants(state, descendants))); |
|
}); |
|
}; |
|
/** |
|
* Returns an array containing the clientIds of the top-level blocks |
|
* and their descendants of any depth (for nested blocks). |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {Array} ids of top-level and descendant blocks. |
|
*/ |
|
|
|
var getClientIdsWithDescendants = Object(rememo["a" /* default */])(function (state) { |
|
var topLevelIds = selectors_getBlockOrder(state); |
|
return Object(toConsumableArray["a" /* default */])(topLevelIds).concat(Object(toConsumableArray["a" /* default */])(selectors_getClientIdsOfDescendants(state, topLevelIds))); |
|
}, function (state) { |
|
return [state.editor.present.blocks.order]; |
|
}); |
|
/** |
|
* Returns the total number of blocks, or the total number of blocks with a specific name in a post. |
|
* The number returned includes nested blocks. |
|
* |
|
* @param {Object} state Global application state. |
|
* @param {?String} blockName Optional block name, if specified only blocks of that type will be counted. |
|
* |
|
* @return {number} Number of blocks in the post, or number of blocks with name equal to blockName. |
|
*/ |
|
|
|
var getGlobalBlockCount = Object(rememo["a" /* default */])(function (state, blockName) { |
|
var clientIds = getClientIdsWithDescendants(state); |
|
|
|
if (!blockName) { |
|
return clientIds.length; |
|
} |
|
|
|
return Object(external_lodash_["reduce"])(clientIds, function (count, clientId) { |
|
var block = state.editor.present.blocks.byClientId[clientId]; |
|
return block.name === blockName ? count + 1 : count; |
|
}, 0); |
|
}, function (state) { |
|
return [state.editor.present.blocks.order, state.editor.present.blocks.byClientId]; |
|
}); |
|
/** |
|
* Given an array of block client IDs, returns the corresponding array of block |
|
* objects. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string[]} clientIds Client IDs for which blocks are to be returned. |
|
* |
|
* @return {WPBlock[]} Block objects. |
|
*/ |
|
|
|
var selectors_getBlocksByClientId = Object(rememo["a" /* default */])(function (state, clientIds) { |
|
return Object(external_lodash_["map"])(Object(external_lodash_["castArray"])(clientIds), function (clientId) { |
|
return selectors_getBlock(state, clientId); |
|
}); |
|
}, function (state) { |
|
return [state.editor.present.edits.meta, state.initialEdits.meta, state.currentPost.meta, state.editor.present.blocks]; |
|
}); |
|
/** |
|
* Returns the number of blocks currently present in the post. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {?string} rootClientId Optional root client ID of block list. |
|
* |
|
* @return {number} Number of blocks in the post. |
|
*/ |
|
|
|
function selectors_getBlockCount(state, rootClientId) { |
|
return selectors_getBlockOrder(state, rootClientId).length; |
|
} |
|
/** |
|
* Returns the current block selection start. This value may be null, and it |
|
* may represent either a singular block selection or multi-selection start. |
|
* A selection is singular if its start and end match. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {?string} Client ID of block selection start. |
|
*/ |
|
|
|
function getBlockSelectionStart(state) { |
|
return state.blockSelection.start; |
|
} |
|
/** |
|
* Returns the current block selection end. This value may be null, and it |
|
* may represent either a singular block selection or multi-selection end. |
|
* A selection is singular if its start and end match. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {?string} Client ID of block selection end. |
|
*/ |
|
|
|
function getBlockSelectionEnd(state) { |
|
return state.blockSelection.end; |
|
} |
|
/** |
|
* Returns the number of blocks currently selected in the post. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {number} Number of blocks selected in the post. |
|
*/ |
|
|
|
function selectors_getSelectedBlockCount(state) { |
|
var multiSelectedBlockCount = selectors_getMultiSelectedBlockClientIds(state).length; |
|
|
|
if (multiSelectedBlockCount) { |
|
return multiSelectedBlockCount; |
|
} |
|
|
|
return state.blockSelection.start ? 1 : 0; |
|
} |
|
/** |
|
* Returns true if there is a single selected block, or false otherwise. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {boolean} Whether a single block is selected. |
|
*/ |
|
|
|
function hasSelectedBlock(state) { |
|
var _state$blockSelection = state.blockSelection, |
|
start = _state$blockSelection.start, |
|
end = _state$blockSelection.end; |
|
return !!start && start === end; |
|
} |
|
/** |
|
* Returns the currently selected block client ID, or null if there is no |
|
* selected block. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {?string} Selected block client ID. |
|
*/ |
|
|
|
function selectors_getSelectedBlockClientId(state) { |
|
var _state$blockSelection2 = state.blockSelection, |
|
start = _state$blockSelection2.start, |
|
end = _state$blockSelection2.end; // We need to check the block exists because the current state.blockSelection reducer |
|
// doesn't take into account the UNDO / REDO actions to update selection. |
|
// To be removed when that's fixed. |
|
|
|
return start && start === end && !!state.editor.present.blocks.byClientId[start] ? start : null; |
|
} |
|
/** |
|
* Returns the currently selected block, or null if there is no selected block. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {?Object} Selected block. |
|
*/ |
|
|
|
function getSelectedBlock(state) { |
|
var clientId = selectors_getSelectedBlockClientId(state); |
|
return clientId ? selectors_getBlock(state, clientId) : null; |
|
} |
|
/** |
|
* Given a block client ID, returns the root block from which the block is |
|
* nested, an empty string for top-level blocks, or null if the block does not |
|
* exist. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block from which to find root client ID. |
|
* |
|
* @return {?string} Root client ID, if exists |
|
*/ |
|
|
|
var selectors_getBlockRootClientId = Object(rememo["a" /* default */])(function (state, clientId) { |
|
var order = state.editor.present.blocks.order; |
|
|
|
for (var rootClientId in order) { |
|
if (Object(external_lodash_["includes"])(order[rootClientId], clientId)) { |
|
return rootClientId; |
|
} |
|
} |
|
|
|
return null; |
|
}, function (state) { |
|
return [state.editor.present.blocks.order]; |
|
}); |
|
/** |
|
* Given a block client ID, returns the root of the hierarchy from which the block is nested, return the block itself for root level blocks. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block from which to find root client ID. |
|
* |
|
* @return {string} Root client ID |
|
*/ |
|
|
|
var getBlockHierarchyRootClientId = Object(rememo["a" /* default */])(function (state, clientId) { |
|
var rootClientId = clientId; |
|
var current = clientId; |
|
|
|
while (rootClientId) { |
|
current = rootClientId; |
|
rootClientId = selectors_getBlockRootClientId(state, current); |
|
} |
|
|
|
return current; |
|
}, function (state) { |
|
return [state.editor.present.blocks.order]; |
|
}); |
|
/** |
|
* Returns the client ID of the block adjacent one at the given reference |
|
* startClientId and modifier directionality. Defaults start startClientId to |
|
* the selected block, and direction as next block. Returns null if there is no |
|
* adjacent block. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {?string} startClientId Optional client ID of block from which to |
|
* search. |
|
* @param {?number} modifier Directionality multiplier (1 next, -1 |
|
* previous). |
|
* |
|
* @return {?string} Return the client ID of the block, or null if none exists. |
|
*/ |
|
|
|
function getAdjacentBlockClientId(state, startClientId) { |
|
var modifier = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1; |
|
|
|
// Default to selected block. |
|
if (startClientId === undefined) { |
|
startClientId = selectors_getSelectedBlockClientId(state); |
|
} // Try multi-selection starting at extent based on modifier. |
|
|
|
|
|
if (startClientId === undefined) { |
|
if (modifier < 0) { |
|
startClientId = getFirstMultiSelectedBlockClientId(state); |
|
} else { |
|
startClientId = getLastMultiSelectedBlockClientId(state); |
|
} |
|
} // Validate working start client ID. |
|
|
|
|
|
if (!startClientId) { |
|
return null; |
|
} // Retrieve start block root client ID, being careful to allow the falsey |
|
// empty string top-level root by explicitly testing against null. |
|
|
|
|
|
var rootClientId = selectors_getBlockRootClientId(state, startClientId); |
|
|
|
if (rootClientId === null) { |
|
return null; |
|
} |
|
|
|
var order = state.editor.present.blocks.order; |
|
var orderSet = order[rootClientId]; |
|
var index = orderSet.indexOf(startClientId); |
|
var nextIndex = index + 1 * modifier; // Block was first in set and we're attempting to get previous. |
|
|
|
if (nextIndex < 0) { |
|
return null; |
|
} // Block was last in set and we're attempting to get next. |
|
|
|
|
|
if (nextIndex === orderSet.length) { |
|
return null; |
|
} // Assume incremented index is within the set. |
|
|
|
|
|
return orderSet[nextIndex]; |
|
} |
|
/** |
|
* Returns the previous block's client ID from the given reference start ID. |
|
* Defaults start to the selected block. Returns null if there is no previous |
|
* block. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {?string} startClientId Optional client ID of block from which to |
|
* search. |
|
* |
|
* @return {?string} Adjacent block's client ID, or null if none exists. |
|
*/ |
|
|
|
function selectors_getPreviousBlockClientId(state, startClientId) { |
|
return getAdjacentBlockClientId(state, startClientId, -1); |
|
} |
|
/** |
|
* Returns the next block's client ID from the given reference start ID. |
|
* Defaults start to the selected block. Returns null if there is no next |
|
* block. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {?string} startClientId Optional client ID of block from which to |
|
* search. |
|
* |
|
* @return {?string} Adjacent block's client ID, or null if none exists. |
|
*/ |
|
|
|
function selectors_getNextBlockClientId(state, startClientId) { |
|
return getAdjacentBlockClientId(state, startClientId, 1); |
|
} |
|
/** |
|
* Returns the initial caret position for the selected block. |
|
* This position is to used to position the caret properly when the selected block changes. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {?Object} Selected block. |
|
*/ |
|
|
|
function selectors_getSelectedBlocksInitialCaretPosition(state) { |
|
var _state$blockSelection3 = state.blockSelection, |
|
start = _state$blockSelection3.start, |
|
end = _state$blockSelection3.end; |
|
|
|
if (start !== end || !start) { |
|
return null; |
|
} |
|
|
|
return state.blockSelection.initialPosition; |
|
} |
|
/** |
|
* Returns the current multi-selection set of block client IDs, or an empty |
|
* array if there is no multi-selection. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {Array} Multi-selected block client IDs. |
|
*/ |
|
|
|
var selectors_getMultiSelectedBlockClientIds = Object(rememo["a" /* default */])(function (state) { |
|
var _state$blockSelection4 = state.blockSelection, |
|
start = _state$blockSelection4.start, |
|
end = _state$blockSelection4.end; |
|
|
|
if (start === end) { |
|
return []; |
|
} // Retrieve root client ID to aid in retrieving relevant nested block |
|
// order, being careful to allow the falsey empty string top-level root |
|
// by explicitly testing against null. |
|
|
|
|
|
var rootClientId = selectors_getBlockRootClientId(state, start); |
|
|
|
if (rootClientId === null) { |
|
return []; |
|
} |
|
|
|
var blockOrder = selectors_getBlockOrder(state, rootClientId); |
|
var startIndex = blockOrder.indexOf(start); |
|
var endIndex = blockOrder.indexOf(end); |
|
|
|
if (startIndex > endIndex) { |
|
return blockOrder.slice(endIndex, startIndex + 1); |
|
} |
|
|
|
return blockOrder.slice(startIndex, endIndex + 1); |
|
}, function (state) { |
|
return [state.editor.present.blocks.order, state.blockSelection.start, state.blockSelection.end]; |
|
}); |
|
/** |
|
* Returns the current multi-selection set of blocks, or an empty array if |
|
* there is no multi-selection. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {Array} Multi-selected block objects. |
|
*/ |
|
|
|
var getMultiSelectedBlocks = Object(rememo["a" /* default */])(function (state) { |
|
var multiSelectedBlockClientIds = selectors_getMultiSelectedBlockClientIds(state); |
|
|
|
if (!multiSelectedBlockClientIds.length) { |
|
return EMPTY_ARRAY; |
|
} |
|
|
|
return multiSelectedBlockClientIds.map(function (clientId) { |
|
return selectors_getBlock(state, clientId); |
|
}); |
|
}, function (state) { |
|
return [state.editor.present.blocks.order, state.blockSelection.start, state.blockSelection.end, state.editor.present.blocks.byClientId, state.editor.present.edits.meta, state.initialEdits.meta, state.currentPost.meta]; |
|
}); |
|
/** |
|
* Returns the client ID of the first block in the multi-selection set, or null |
|
* if there is no multi-selection. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {?string} First block client ID in the multi-selection set. |
|
*/ |
|
|
|
function getFirstMultiSelectedBlockClientId(state) { |
|
return Object(external_lodash_["first"])(selectors_getMultiSelectedBlockClientIds(state)) || null; |
|
} |
|
/** |
|
* Returns the client ID of the last block in the multi-selection set, or null |
|
* if there is no multi-selection. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {?string} Last block client ID in the multi-selection set. |
|
*/ |
|
|
|
function getLastMultiSelectedBlockClientId(state) { |
|
return Object(external_lodash_["last"])(selectors_getMultiSelectedBlockClientIds(state)) || null; |
|
} |
|
/** |
|
* Checks if possibleAncestorId is an ancestor of possibleDescendentId. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} possibleAncestorId Possible ancestor client ID. |
|
* @param {string} possibleDescendentId Possible descent client ID. |
|
* |
|
* @return {boolean} True if possibleAncestorId is an ancestor |
|
* of possibleDescendentId, and false otherwise. |
|
*/ |
|
|
|
var isAncestorOf = Object(rememo["a" /* default */])(function (state, possibleAncestorId, possibleDescendentId) { |
|
var idToCheck = possibleDescendentId; |
|
|
|
while (possibleAncestorId !== idToCheck && idToCheck) { |
|
idToCheck = selectors_getBlockRootClientId(state, idToCheck); |
|
} |
|
|
|
return possibleAncestorId === idToCheck; |
|
}, function (state) { |
|
return [state.editor.present.blocks]; |
|
}); |
|
/** |
|
* Returns true if a multi-selection exists, and the block corresponding to the |
|
* specified client ID is the first block of the multi-selection set, or false |
|
* otherwise. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {boolean} Whether block is first in multi-selection. |
|
*/ |
|
|
|
function selectors_isFirstMultiSelectedBlock(state, clientId) { |
|
return getFirstMultiSelectedBlockClientId(state) === clientId; |
|
} |
|
/** |
|
* Returns true if the client ID occurs within the block multi-selection, or |
|
* false otherwise. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {boolean} Whether block is in multi-selection set. |
|
*/ |
|
|
|
function selectors_isBlockMultiSelected(state, clientId) { |
|
return selectors_getMultiSelectedBlockClientIds(state).indexOf(clientId) !== -1; |
|
} |
|
/** |
|
* Returns true if an ancestor of the block is multi-selected, or false |
|
* otherwise. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {boolean} Whether an ancestor of the block is in multi-selection |
|
* set. |
|
*/ |
|
|
|
var selectors_isAncestorMultiSelected = Object(rememo["a" /* default */])(function (state, clientId) { |
|
var ancestorClientId = clientId; |
|
var isMultiSelected = false; |
|
|
|
while (ancestorClientId && !isMultiSelected) { |
|
ancestorClientId = selectors_getBlockRootClientId(state, ancestorClientId); |
|
isMultiSelected = selectors_isBlockMultiSelected(state, ancestorClientId); |
|
} |
|
|
|
return isMultiSelected; |
|
}, function (state) { |
|
return [state.editor.present.blocks.order, state.blockSelection.start, state.blockSelection.end]; |
|
}); |
|
/** |
|
* Returns the client ID of the block which begins the multi-selection set, or |
|
* null if there is no multi-selection. |
|
* |
|
* This is not necessarily the first client ID in the selection. |
|
* |
|
* @see getFirstMultiSelectedBlockClientId |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {?string} Client ID of block beginning multi-selection. |
|
*/ |
|
|
|
function getMultiSelectedBlocksStartClientId(state) { |
|
var _state$blockSelection5 = state.blockSelection, |
|
start = _state$blockSelection5.start, |
|
end = _state$blockSelection5.end; |
|
|
|
if (start === end) { |
|
return null; |
|
} |
|
|
|
return start || null; |
|
} |
|
/** |
|
* Returns the client ID of the block which ends the multi-selection set, or |
|
* null if there is no multi-selection. |
|
* |
|
* This is not necessarily the last client ID in the selection. |
|
* |
|
* @see getLastMultiSelectedBlockClientId |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {?string} Client ID of block ending multi-selection. |
|
*/ |
|
|
|
function getMultiSelectedBlocksEndClientId(state) { |
|
var _state$blockSelection6 = state.blockSelection, |
|
start = _state$blockSelection6.start, |
|
end = _state$blockSelection6.end; |
|
|
|
if (start === end) { |
|
return null; |
|
} |
|
|
|
return end || null; |
|
} |
|
/** |
|
* Returns an array containing all block client IDs in the editor in the order |
|
* they appear. Optionally accepts a root client ID of the block list for which |
|
* the order should be returned, defaulting to the top-level block order. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {?string} rootClientId Optional root client ID of block list. |
|
* |
|
* @return {Array} Ordered client IDs of editor blocks. |
|
*/ |
|
|
|
function selectors_getBlockOrder(state, rootClientId) { |
|
return state.editor.present.blocks.order[rootClientId || ''] || EMPTY_ARRAY; |
|
} |
|
/** |
|
* Returns the index at which the block corresponding to the specified client |
|
* ID occurs within the block order, or `-1` if the block does not exist. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* @param {?string} rootClientId Optional root client ID of block list. |
|
* |
|
* @return {number} Index at which block exists in order. |
|
*/ |
|
|
|
function selectors_getBlockIndex(state, clientId, rootClientId) { |
|
return selectors_getBlockOrder(state, rootClientId).indexOf(clientId); |
|
} |
|
/** |
|
* Returns true if the block corresponding to the specified client ID is |
|
* currently selected and no multi-selection exists, or false otherwise. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {boolean} Whether block is selected and multi-selection exists. |
|
*/ |
|
|
|
function selectors_isBlockSelected(state, clientId) { |
|
var _state$blockSelection7 = state.blockSelection, |
|
start = _state$blockSelection7.start, |
|
end = _state$blockSelection7.end; |
|
|
|
if (start !== end) { |
|
return false; |
|
} |
|
|
|
return start === clientId; |
|
} |
|
/** |
|
* Returns true if one of the block's inner blocks is selected. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* @param {boolean} deep Perform a deep check. |
|
* |
|
* @return {boolean} Whether the block as an inner block selected |
|
*/ |
|
|
|
function selectors_hasSelectedInnerBlock(state, clientId) { |
|
var deep = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; |
|
return Object(external_lodash_["some"])(selectors_getBlockOrder(state, clientId), function (innerClientId) { |
|
return selectors_isBlockSelected(state, innerClientId) || selectors_isBlockMultiSelected(state, innerClientId) || deep && selectors_hasSelectedInnerBlock(state, innerClientId, deep); |
|
}); |
|
} |
|
/** |
|
* Returns true if the block corresponding to the specified client ID is |
|
* currently selected but isn't the last of the selected blocks. Here "last" |
|
* refers to the block sequence in the document, _not_ the sequence of |
|
* multi-selection, which is why `state.blockSelection.end` isn't used. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {boolean} Whether block is selected and not the last in the |
|
* selection. |
|
*/ |
|
|
|
function isBlockWithinSelection(state, clientId) { |
|
if (!clientId) { |
|
return false; |
|
} |
|
|
|
var clientIds = selectors_getMultiSelectedBlockClientIds(state); |
|
var index = clientIds.indexOf(clientId); |
|
return index > -1 && index < clientIds.length - 1; |
|
} |
|
/** |
|
* Returns true if a multi-selection has been made, or false otherwise. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {boolean} Whether multi-selection has been made. |
|
*/ |
|
|
|
function selectors_hasMultiSelection(state) { |
|
var _state$blockSelection8 = state.blockSelection, |
|
start = _state$blockSelection8.start, |
|
end = _state$blockSelection8.end; |
|
return start !== end; |
|
} |
|
/** |
|
* Whether in the process of multi-selecting or not. This flag is only true |
|
* while the multi-selection is being selected (by mouse move), and is false |
|
* once the multi-selection has been settled. |
|
* |
|
* @see hasMultiSelection |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} True if multi-selecting, false if not. |
|
*/ |
|
|
|
function selectors_isMultiSelecting(state) { |
|
return state.blockSelection.isMultiSelecting; |
|
} |
|
/** |
|
* Selector that returns if multi-selection is enabled or not. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} True if it should be possible to multi-select blocks, false if multi-selection is disabled. |
|
*/ |
|
|
|
function selectors_isSelectionEnabled(state) { |
|
return state.blockSelection.isEnabled; |
|
} |
|
/** |
|
* Returns the block's editing mode, defaulting to "visual" if not explicitly |
|
* assigned. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {Object} Block editing mode. |
|
*/ |
|
|
|
function selectors_getBlockMode(state, clientId) { |
|
return state.blocksMode[clientId] || 'visual'; |
|
} |
|
/** |
|
* Returns true if the user is typing, or false otherwise. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether user is typing. |
|
*/ |
|
|
|
function selectors_isTyping(state) { |
|
return state.isTyping; |
|
} |
|
/** |
|
* Returns true if the caret is within formatted text, or false otherwise. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether the caret is within formatted text. |
|
*/ |
|
|
|
function selectors_isCaretWithinFormattedText(state) { |
|
return state.isCaretWithinFormattedText; |
|
} |
|
/** |
|
* Returns the insertion point, the index at which the new inserted block would |
|
* be placed. Defaults to the last index. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {Object} Insertion point object with `rootClientId`, `index`. |
|
*/ |
|
|
|
function getBlockInsertionPoint(state) { |
|
var rootClientId, index; |
|
var insertionPoint = state.insertionPoint, |
|
blockSelection = state.blockSelection; |
|
|
|
if (insertionPoint !== null) { |
|
return insertionPoint; |
|
} |
|
|
|
var end = blockSelection.end; |
|
|
|
if (end) { |
|
rootClientId = selectors_getBlockRootClientId(state, end) || undefined; |
|
index = selectors_getBlockIndex(state, end, rootClientId) + 1; |
|
} else { |
|
index = selectors_getBlockOrder(state).length; |
|
} |
|
|
|
return { |
|
rootClientId: rootClientId, |
|
index: index |
|
}; |
|
} |
|
/** |
|
* Returns true if we should show the block insertion point. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {?boolean} Whether the insertion point is visible or not. |
|
*/ |
|
|
|
function isBlockInsertionPointVisible(state) { |
|
return state.insertionPoint !== null; |
|
} |
|
/** |
|
* Returns whether the blocks matches the template or not. |
|
* |
|
* @param {boolean} state |
|
* @return {?boolean} Whether the template is valid or not. |
|
*/ |
|
|
|
function isValidTemplate(state) { |
|
return state.template.isValid; |
|
} |
|
/** |
|
* Returns the defined block template |
|
* |
|
* @param {boolean} state |
|
* @return {?Array} Block Template |
|
*/ |
|
|
|
function getTemplate(state) { |
|
return state.settings.template; |
|
} |
|
/** |
|
* Returns the defined block template lock. Optionally accepts a root block |
|
* client ID as context, otherwise defaulting to the global context. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {?string} rootClientId Optional block root client ID. |
|
* |
|
* @return {?string} Block Template Lock |
|
*/ |
|
|
|
function selectors_getTemplateLock(state, rootClientId) { |
|
if (!rootClientId) { |
|
return state.settings.templateLock; |
|
} |
|
|
|
var blockListSettings = getBlockListSettings(state, rootClientId); |
|
|
|
if (!blockListSettings) { |
|
return null; |
|
} |
|
|
|
return blockListSettings.templateLock; |
|
} |
|
/** |
|
* Returns true if the post is currently being saved, or false otherwise. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether post is being saved. |
|
*/ |
|
|
|
function selectors_isSavingPost(state) { |
|
return state.saving.requesting; |
|
} |
|
/** |
|
* Returns true if a previous post save was attempted successfully, or false |
|
* otherwise. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether the post was saved successfully. |
|
*/ |
|
|
|
function didPostSaveRequestSucceed(state) { |
|
return state.saving.successful; |
|
} |
|
/** |
|
* Returns true if a previous post save was attempted but failed, or false |
|
* otherwise. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether the post save failed. |
|
*/ |
|
|
|
function didPostSaveRequestFail(state) { |
|
return !!state.saving.error; |
|
} |
|
/** |
|
* Returns true if the post is autosaving, or false otherwise. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether the post is autosaving. |
|
*/ |
|
|
|
function selectors_isAutosavingPost(state) { |
|
return selectors_isSavingPost(state) && !!state.saving.options.isAutosave; |
|
} |
|
/** |
|
* Returns true if the post is being previewed, or false otherwise. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether the post is being previewed. |
|
*/ |
|
|
|
function isPreviewingPost(state) { |
|
return selectors_isSavingPost(state) && !!state.saving.options.isPreview; |
|
} |
|
/** |
|
* Returns the post preview link |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {string?} Preview Link. |
|
*/ |
|
|
|
function selectors_getEditedPostPreviewLink(state) { |
|
var featuredImageId = selectors_getEditedPostAttribute(state, 'featured_media'); |
|
var previewLink = state.previewLink; |
|
|
|
if (previewLink && featuredImageId) { |
|
return Object(external_this_wp_url_["addQueryArgs"])(previewLink, { |
|
_thumbnail_id: featuredImageId |
|
}); |
|
} |
|
|
|
return previewLink; |
|
} |
|
/** |
|
* Returns a suggested post format for the current post, inferred only if there |
|
* is a single block within the post and it is of a type known to match a |
|
* default post format. Returns null if the format cannot be determined. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {?string} Suggested post format. |
|
*/ |
|
|
|
function selectors_getSuggestedPostFormat(state) { |
|
var blocks = selectors_getBlockOrder(state); |
|
var name; // If there is only one block in the content of the post grab its name |
|
// so we can derive a suitable post format from it. |
|
|
|
if (blocks.length === 1) { |
|
name = selectors_getBlockName(state, blocks[0]); |
|
} // If there are two blocks in the content and the last one is a text blocks |
|
// grab the name of the first one to also suggest a post format from it. |
|
|
|
|
|
if (blocks.length === 2) { |
|
if (selectors_getBlockName(state, blocks[1]) === 'core/paragraph') { |
|
name = selectors_getBlockName(state, blocks[0]); |
|
} |
|
} // We only convert to default post formats in core. |
|
|
|
|
|
switch (name) { |
|
case 'core/image': |
|
return 'image'; |
|
|
|
case 'core/quote': |
|
case 'core/pullquote': |
|
return 'quote'; |
|
|
|
case 'core/gallery': |
|
return 'gallery'; |
|
|
|
case 'core/video': |
|
case 'core-embed/youtube': |
|
case 'core-embed/vimeo': |
|
return 'video'; |
|
|
|
case 'core/audio': |
|
case 'core-embed/spotify': |
|
case 'core-embed/soundcloud': |
|
return 'audio'; |
|
} |
|
|
|
return null; |
|
} |
|
/** |
|
* Returns a set of blocks which are to be used in consideration of the post's |
|
* generated save content. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {WPBlock[]} Filtered set of blocks for save. |
|
*/ |
|
|
|
function getBlocksForSerialization(state) { |
|
var blocks = selectors_getBlocks(state); // A single unmodified default block is assumed to be equivalent to an |
|
// empty post. |
|
|
|
var isSingleUnmodifiedDefaultBlock = blocks.length === 1 && Object(external_this_wp_blocks_["isUnmodifiedDefaultBlock"])(blocks[0]); |
|
|
|
if (isSingleUnmodifiedDefaultBlock) { |
|
return []; |
|
} |
|
|
|
return blocks; |
|
} |
|
/** |
|
* Returns the content of the post being edited, preferring raw string edit |
|
* before falling back to serialization of block state. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {string} Post content. |
|
*/ |
|
|
|
var getEditedPostContent = Object(rememo["a" /* default */])(function (state) { |
|
var edits = getPostEdits(state); |
|
|
|
if ('content' in edits) { |
|
return edits.content; |
|
} |
|
|
|
var blocks = getBlocksForSerialization(state); |
|
var content = Object(external_this_wp_blocks_["serialize"])(blocks); // For compatibility purposes, treat a post consisting of a single |
|
// freeform block as legacy content and downgrade to a pre-block-editor |
|
// removep'd content format. |
|
|
|
var isSingleFreeformBlock = blocks.length === 1 && blocks[0].name === Object(external_this_wp_blocks_["getFreeformContentHandlerName"])(); |
|
|
|
if (isSingleFreeformBlock) { |
|
return Object(external_this_wp_autop_["removep"])(content); |
|
} |
|
|
|
return content; |
|
}, function (state) { |
|
return [state.editor.present.blocks, state.editor.present.edits.content, state.initialEdits.content]; |
|
}); |
|
/** |
|
* Determines if the given block type is allowed to be inserted into the block list. |
|
* This function is not exported and not memoized because using a memoized selector |
|
* inside another memoized selector is just a waste of time. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} blockName The name of the block type, e.g.' core/paragraph'. |
|
* @param {?string} rootClientId Optional root client ID of block list. |
|
* |
|
* @return {boolean} Whether the given block type is allowed to be inserted. |
|
*/ |
|
|
|
var selectors_canInsertBlockTypeUnmemoized = function canInsertBlockTypeUnmemoized(state, blockName) { |
|
var rootClientId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; |
|
|
|
var checkAllowList = function checkAllowList(list, item) { |
|
var defaultResult = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; |
|
|
|
if (Object(external_lodash_["isBoolean"])(list)) { |
|
return list; |
|
} |
|
|
|
if (Object(external_lodash_["isArray"])(list)) { |
|
return Object(external_lodash_["includes"])(list, item); |
|
} |
|
|
|
return defaultResult; |
|
}; |
|
|
|
var blockType = Object(external_this_wp_blocks_["getBlockType"])(blockName); |
|
|
|
if (!blockType) { |
|
return false; |
|
} |
|
|
|
var _getEditorSettings = selectors_getEditorSettings(state), |
|
allowedBlockTypes = _getEditorSettings.allowedBlockTypes; |
|
|
|
var isBlockAllowedInEditor = checkAllowList(allowedBlockTypes, blockName, true); |
|
|
|
if (!isBlockAllowedInEditor) { |
|
return false; |
|
} |
|
|
|
var isLocked = !!selectors_getTemplateLock(state, rootClientId); |
|
|
|
if (isLocked) { |
|
return false; |
|
} |
|
|
|
var parentBlockListSettings = getBlockListSettings(state, rootClientId); |
|
var parentAllowedBlocks = Object(external_lodash_["get"])(parentBlockListSettings, ['allowedBlocks']); |
|
var hasParentAllowedBlock = checkAllowList(parentAllowedBlocks, blockName); |
|
var blockAllowedParentBlocks = blockType.parent; |
|
var parentName = selectors_getBlockName(state, rootClientId); |
|
var hasBlockAllowedParent = checkAllowList(blockAllowedParentBlocks, parentName); |
|
|
|
if (hasParentAllowedBlock !== null && hasBlockAllowedParent !== null) { |
|
return hasParentAllowedBlock || hasBlockAllowedParent; |
|
} else if (hasParentAllowedBlock !== null) { |
|
return hasParentAllowedBlock; |
|
} else if (hasBlockAllowedParent !== null) { |
|
return hasBlockAllowedParent; |
|
} |
|
|
|
return true; |
|
}; |
|
/** |
|
* Determines if the given block type is allowed to be inserted into the block list. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {string} blockName The name of the block type, e.g.' core/paragraph'. |
|
* @param {?string} rootClientId Optional root client ID of block list. |
|
* |
|
* @return {boolean} Whether the given block type is allowed to be inserted. |
|
*/ |
|
|
|
|
|
var selectors_canInsertBlockType = Object(rememo["a" /* default */])(selectors_canInsertBlockTypeUnmemoized, function (state, blockName, rootClientId) { |
|
return [state.blockListSettings[rootClientId], state.editor.present.blocks.byClientId[rootClientId], state.settings.allowedBlockTypes, state.settings.templateLock]; |
|
}); |
|
/** |
|
* Returns information about how recently and frequently a block has been inserted. |
|
* |
|
* @param {Object} state Global application state. |
|
* @param {string} id A string which identifies the insert, e.g. 'core/block/12' |
|
* |
|
* @return {?{ time: number, count: number }} An object containing `time` which is when the last |
|
* insert occured as a UNIX epoch, and `count` which is |
|
* the number of inserts that have occurred. |
|
*/ |
|
|
|
function getInsertUsage(state, id) { |
|
return state.preferences.insertUsage[id] || null; |
|
} |
|
/** |
|
* Returns whether we can show a block type in the inserter |
|
* |
|
* @param {Object} state Global State |
|
* @param {Object} blockType BlockType |
|
* @param {?string} rootClientId Optional root client ID of block list. |
|
* |
|
* @return {boolean} Whether the given block type is allowed to be shown in the inserter. |
|
*/ |
|
|
|
|
|
var selectors_canIncludeBlockTypeInInserter = function canIncludeBlockTypeInInserter(state, blockType, rootClientId) { |
|
if (!Object(external_this_wp_blocks_["hasBlockSupport"])(blockType, 'inserter', true)) { |
|
return false; |
|
} |
|
|
|
return selectors_canInsertBlockTypeUnmemoized(state, blockType.name, rootClientId); |
|
}; |
|
/** |
|
* Returns whether we can show a reusable block in the inserter |
|
* |
|
* @param {Object} state Global State |
|
* @param {Object} reusableBlock Reusable block object |
|
* @param {?string} rootClientId Optional root client ID of block list. |
|
* |
|
* @return {boolean} Whether the given block type is allowed to be shown in the inserter. |
|
*/ |
|
|
|
|
|
var selectors_canIncludeReusableBlockInInserter = function canIncludeReusableBlockInInserter(state, reusableBlock, rootClientId) { |
|
if (!selectors_canInsertBlockTypeUnmemoized(state, 'core/block', rootClientId)) { |
|
return false; |
|
} |
|
|
|
var referencedBlockName = selectors_getBlockName(state, reusableBlock.clientId); |
|
|
|
if (!referencedBlockName) { |
|
return false; |
|
} |
|
|
|
var referencedBlockType = Object(external_this_wp_blocks_["getBlockType"])(referencedBlockName); |
|
|
|
if (!referencedBlockType) { |
|
return false; |
|
} |
|
|
|
if (!selectors_canInsertBlockTypeUnmemoized(state, referencedBlockName, rootClientId)) { |
|
return false; |
|
} |
|
|
|
if (isAncestorOf(state, reusableBlock.clientId, rootClientId)) { |
|
return false; |
|
} |
|
|
|
return true; |
|
}; |
|
/** |
|
* Determines the items that appear in the inserter. Includes both static |
|
* items (e.g. a regular block type) and dynamic items (e.g. a reusable block). |
|
* |
|
* Each item object contains what's necessary to display a button in the |
|
* inserter and handle its selection. |
|
* |
|
* The 'utility' property indicates how useful we think an item will be to the |
|
* user. There are 4 levels of utility: |
|
* |
|
* 1. Blocks that are contextually useful (utility = 3) |
|
* 2. Blocks that have been previously inserted (utility = 2) |
|
* 3. Blocks that are in the common category (utility = 1) |
|
* 4. All other blocks (utility = 0) |
|
* |
|
* The 'frecency' property is a heuristic (https://en.wikipedia.org/wiki/Frecency) |
|
* that combines block usage frequenty and recency. |
|
* |
|
* Items are returned ordered descendingly by their 'utility' and 'frecency'. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {?string} rootClientId Optional root client ID of block list. |
|
* |
|
* @return {Editor.InserterItem[]} Items that appear in inserter. |
|
* |
|
* @typedef {Object} Editor.InserterItem |
|
* @property {string} id Unique identifier for the item. |
|
* @property {string} name The type of block to create. |
|
* @property {Object} initialAttributes Attributes to pass to the newly created block. |
|
* @property {string} title Title of the item, as it appears in the inserter. |
|
* @property {string} icon Dashicon for the item, as it appears in the inserter. |
|
* @property {string} category Block category that the item is associated with. |
|
* @property {string[]} keywords Keywords that can be searched to find this item. |
|
* @property {boolean} isDisabled Whether or not the user should be prevented from inserting |
|
* this item. |
|
* @property {number} utility How useful we think this item is, between 0 and 3. |
|
* @property {number} frecency Hueristic that combines frequency and recency. |
|
*/ |
|
|
|
|
|
var selectors_getInserterItems = Object(rememo["a" /* default */])(function (state) { |
|
var rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; |
|
|
|
var calculateUtility = function calculateUtility(category, count, isContextual) { |
|
if (isContextual) { |
|
return INSERTER_UTILITY_HIGH; |
|
} else if (count > 0) { |
|
return INSERTER_UTILITY_MEDIUM; |
|
} else if (category === 'common') { |
|
return INSERTER_UTILITY_LOW; |
|
} |
|
|
|
return INSERTER_UTILITY_NONE; |
|
}; |
|
|
|
var calculateFrecency = function calculateFrecency(time, count) { |
|
if (!time) { |
|
return count; |
|
} // The selector is cached, which means Date.now() is the last time that the |
|
// relevant state changed. This suits our needs. |
|
|
|
|
|
var duration = Date.now() - time; |
|
|
|
switch (true) { |
|
case duration < MILLISECONDS_PER_HOUR: |
|
return count * 4; |
|
|
|
case duration < MILLISECONDS_PER_DAY: |
|
return count * 2; |
|
|
|
case duration < MILLISECONDS_PER_WEEK: |
|
return count / 2; |
|
|
|
default: |
|
return count / 4; |
|
} |
|
}; |
|
|
|
var buildBlockTypeInserterItem = function buildBlockTypeInserterItem(blockType) { |
|
var id = blockType.name; |
|
var isDisabled = false; |
|
|
|
if (!Object(external_this_wp_blocks_["hasBlockSupport"])(blockType.name, 'multiple', true)) { |
|
isDisabled = Object(external_lodash_["some"])(selectors_getBlocksByClientId(state, getClientIdsWithDescendants(state)), { |
|
name: blockType.name |
|
}); |
|
} |
|
|
|
var isContextual = Object(external_lodash_["isArray"])(blockType.parent); |
|
|
|
var _ref = getInsertUsage(state, id) || {}, |
|
time = _ref.time, |
|
_ref$count = _ref.count, |
|
count = _ref$count === void 0 ? 0 : _ref$count; |
|
|
|
return { |
|
id: id, |
|
name: blockType.name, |
|
initialAttributes: {}, |
|
title: blockType.title, |
|
icon: blockType.icon, |
|
category: blockType.category, |
|
keywords: blockType.keywords, |
|
isDisabled: isDisabled, |
|
utility: calculateUtility(blockType.category, count, isContextual), |
|
frecency: calculateFrecency(time, count), |
|
hasChildBlocksWithInserterSupport: Object(external_this_wp_blocks_["hasChildBlocksWithInserterSupport"])(blockType.name) |
|
}; |
|
}; |
|
|
|
var buildReusableBlockInserterItem = function buildReusableBlockInserterItem(reusableBlock) { |
|
var id = "core/block/".concat(reusableBlock.id); |
|
var referencedBlockName = selectors_getBlockName(state, reusableBlock.clientId); |
|
var referencedBlockType = Object(external_this_wp_blocks_["getBlockType"])(referencedBlockName); |
|
|
|
var _ref2 = getInsertUsage(state, id) || {}, |
|
time = _ref2.time, |
|
_ref2$count = _ref2.count, |
|
count = _ref2$count === void 0 ? 0 : _ref2$count; |
|
|
|
var utility = calculateUtility('reusable', count, false); |
|
var frecency = calculateFrecency(time, count); |
|
return { |
|
id: id, |
|
name: 'core/block', |
|
initialAttributes: { |
|
ref: reusableBlock.id |
|
}, |
|
title: reusableBlock.title, |
|
icon: referencedBlockType.icon, |
|
category: 'reusable', |
|
keywords: [], |
|
isDisabled: false, |
|
utility: utility, |
|
frecency: frecency |
|
}; |
|
}; |
|
|
|
var blockTypeInserterItems = Object(external_this_wp_blocks_["getBlockTypes"])().filter(function (blockType) { |
|
return selectors_canIncludeBlockTypeInInserter(state, blockType, rootClientId); |
|
}).map(buildBlockTypeInserterItem); |
|
|
|
var reusableBlockInserterItems = __experimentalGetReusableBlocks(state).filter(function (block) { |
|
return selectors_canIncludeReusableBlockInInserter(state, block, rootClientId); |
|
}).map(buildReusableBlockInserterItem); |
|
|
|
return Object(external_lodash_["orderBy"])(Object(toConsumableArray["a" /* default */])(blockTypeInserterItems).concat(Object(toConsumableArray["a" /* default */])(reusableBlockInserterItems)), ['utility', 'frecency'], ['desc', 'desc']); |
|
}, function (state, rootClientId) { |
|
return [state.blockListSettings[rootClientId], state.editor.present.blocks, state.preferences.insertUsage, state.settings.allowedBlockTypes, state.settings.templateLock, state.reusableBlocks.data, Object(external_this_wp_blocks_["getBlockTypes"])()]; |
|
}); |
|
/** |
|
* Determines whether there are items to show in the inserter. |
|
* @param {Object} state Editor state. |
|
* @param {?string} rootClientId Optional root client ID of block list. |
|
* |
|
* @return {boolean} Items that appear in inserter. |
|
*/ |
|
|
|
var hasInserterItems = Object(rememo["a" /* default */])(function (state) { |
|
var rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; |
|
var hasBlockType = Object(external_lodash_["some"])(Object(external_this_wp_blocks_["getBlockTypes"])(), function (blockType) { |
|
return selectors_canIncludeBlockTypeInInserter(state, blockType, rootClientId); |
|
}); |
|
|
|
if (hasBlockType) { |
|
return true; |
|
} |
|
|
|
var hasReusableBlock = Object(external_lodash_["some"])(__experimentalGetReusableBlocks(state), function (block) { |
|
return selectors_canIncludeReusableBlockInInserter(state, block, rootClientId); |
|
}); |
|
return hasReusableBlock; |
|
}, function (state, rootClientId) { |
|
return [state.blockListSettings[rootClientId], state.editor.present.blocks, state.settings.allowedBlockTypes, state.settings.templateLock, state.reusableBlocks.data, Object(external_this_wp_blocks_["getBlockTypes"])()]; |
|
}); |
|
/** |
|
* Returns the reusable block with the given ID. |
|
* |
|
* @param {Object} state Global application state. |
|
* @param {number|string} ref The reusable block's ID. |
|
* |
|
* @return {Object} The reusable block, or null if none exists. |
|
*/ |
|
|
|
var __experimentalGetReusableBlock = Object(rememo["a" /* default */])(function (state, ref) { |
|
var block = state.reusableBlocks.data[ref]; |
|
|
|
if (!block) { |
|
return null; |
|
} |
|
|
|
var isTemporary = isNaN(parseInt(ref)); |
|
return Object(objectSpread["a" /* default */])({}, block, { |
|
id: isTemporary ? ref : +ref, |
|
isTemporary: isTemporary |
|
}); |
|
}, function (state, ref) { |
|
return [state.reusableBlocks.data[ref]]; |
|
}); |
|
/** |
|
* Returns whether or not the reusable block with the given ID is being saved. |
|
* |
|
* @param {Object} state Global application state. |
|
* @param {string} ref The reusable block's ID. |
|
* |
|
* @return {boolean} Whether or not the reusable block is being saved. |
|
*/ |
|
|
|
function __experimentalIsSavingReusableBlock(state, ref) { |
|
return state.reusableBlocks.isSaving[ref] || false; |
|
} |
|
/** |
|
* Returns true if the reusable block with the given ID is being fetched, or |
|
* false otherwise. |
|
* |
|
* @param {Object} state Global application state. |
|
* @param {string} ref The reusable block's ID. |
|
* |
|
* @return {boolean} Whether the reusable block is being fetched. |
|
*/ |
|
|
|
function __experimentalIsFetchingReusableBlock(state, ref) { |
|
return !!state.reusableBlocks.isFetching[ref]; |
|
} |
|
/** |
|
* Returns an array of all reusable blocks. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {Array} An array of all reusable blocks. |
|
*/ |
|
|
|
function __experimentalGetReusableBlocks(state) { |
|
return Object(external_lodash_["map"])(state.reusableBlocks.data, function (value, ref) { |
|
return __experimentalGetReusableBlock(state, ref); |
|
}); |
|
} |
|
/** |
|
* Returns state object prior to a specified optimist transaction ID, or `null` |
|
* if the transaction corresponding to the given ID cannot be found. |
|
* |
|
* @param {Object} state Current global application state. |
|
* @param {Object} transactionId Optimist transaction ID. |
|
* |
|
* @return {Object} Global application state prior to transaction. |
|
*/ |
|
|
|
function getStateBeforeOptimisticTransaction(state, transactionId) { |
|
var transaction = Object(external_lodash_["find"])(state.optimist, function (entry) { |
|
return entry.beforeState && Object(external_lodash_["get"])(entry.action, ['optimist', 'id']) === transactionId; |
|
}); |
|
return transaction ? transaction.beforeState : null; |
|
} |
|
/** |
|
* Returns true if the post is being published, or false otherwise. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether post is being published. |
|
*/ |
|
|
|
function selectors_isPublishingPost(state) { |
|
if (!selectors_isSavingPost(state)) { |
|
return false; |
|
} // Saving is optimistic, so assume that current post would be marked as |
|
// published if publishing |
|
|
|
|
|
if (!selectors_isCurrentPostPublished(state)) { |
|
return false; |
|
} // Use post update transaction ID to retrieve the state prior to the |
|
// optimistic transaction |
|
|
|
|
|
var stateBeforeRequest = getStateBeforeOptimisticTransaction(state, POST_UPDATE_TRANSACTION_ID); // Consider as publishing when current post prior to request was not |
|
// considered published |
|
|
|
return !!stateBeforeRequest && !selectors_isCurrentPostPublished(stateBeforeRequest); |
|
} |
|
/** |
|
* Returns whether the permalink is editable or not. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {boolean} Whether or not the permalink is editable. |
|
*/ |
|
|
|
function isPermalinkEditable(state) { |
|
var permalinkTemplate = selectors_getEditedPostAttribute(state, 'permalink_template'); |
|
return PERMALINK_POSTNAME_REGEX.test(permalinkTemplate); |
|
} |
|
/** |
|
* Returns the permalink for the post. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {?string} The permalink, or null if the post is not viewable. |
|
*/ |
|
|
|
function getPermalink(state) { |
|
var permalinkParts = getPermalinkParts(state); |
|
|
|
if (!permalinkParts) { |
|
return null; |
|
} |
|
|
|
var prefix = permalinkParts.prefix, |
|
postName = permalinkParts.postName, |
|
suffix = permalinkParts.suffix; |
|
|
|
if (isPermalinkEditable(state)) { |
|
return prefix + postName + suffix; |
|
} |
|
|
|
return prefix; |
|
} |
|
/** |
|
* Returns the permalink for a post, split into it's three parts: the prefix, |
|
* the postName, and the suffix. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {Object} An object containing the prefix, postName, and suffix for |
|
* the permalink, or null if the post is not viewable. |
|
*/ |
|
|
|
function getPermalinkParts(state) { |
|
var permalinkTemplate = selectors_getEditedPostAttribute(state, 'permalink_template'); |
|
|
|
if (!permalinkTemplate) { |
|
return null; |
|
} |
|
|
|
var postName = selectors_getEditedPostAttribute(state, 'slug') || selectors_getEditedPostAttribute(state, 'generated_slug'); |
|
|
|
var _permalinkTemplate$sp = permalinkTemplate.split(PERMALINK_POSTNAME_REGEX), |
|
_permalinkTemplate$sp2 = Object(slicedToArray["a" /* default */])(_permalinkTemplate$sp, 2), |
|
prefix = _permalinkTemplate$sp2[0], |
|
suffix = _permalinkTemplate$sp2[1]; |
|
|
|
return { |
|
prefix: prefix, |
|
postName: postName, |
|
suffix: suffix |
|
}; |
|
} |
|
/** |
|
* Returns true if an optimistic transaction is pending commit, for which the |
|
* before state satisfies the given predicate function. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {Function} predicate Function given state, returning true if match. |
|
* |
|
* @return {boolean} Whether predicate matches for some history. |
|
*/ |
|
|
|
function inSomeHistory(state, predicate) { |
|
var optimist = state.optimist; // In recursion, optimist state won't exist. Assume exhausted options. |
|
|
|
if (!optimist) { |
|
return false; |
|
} |
|
|
|
return optimist.some(function (_ref3) { |
|
var beforeState = _ref3.beforeState; |
|
return beforeState && predicate(beforeState); |
|
}); |
|
} |
|
/** |
|
* Returns the Block List settings of a block, if any exist. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {?string} clientId Block client ID. |
|
* |
|
* @return {?Object} Block settings of the block if set. |
|
*/ |
|
|
|
function getBlockListSettings(state, clientId) { |
|
return state.blockListSettings[clientId]; |
|
} |
|
/** |
|
* Returns the editor settings. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {Object} The editor settings object. |
|
*/ |
|
|
|
function selectors_getEditorSettings(state) { |
|
return state.settings; |
|
} |
|
/** |
|
* Returns the token settings. |
|
* |
|
* @param {Object} state Editor state. |
|
* @param {?string} name Token name. |
|
* |
|
* @return {Object} Token settings object, or the named token settings object if set. |
|
*/ |
|
|
|
function getTokenSettings(state, name) { |
|
if (!name) { |
|
return state.tokens; |
|
} |
|
|
|
return state.tokens[name]; |
|
} |
|
/** |
|
* Returns whether the post is locked. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Is locked. |
|
*/ |
|
|
|
function isPostLocked(state) { |
|
return state.postLock.isLocked; |
|
} |
|
/** |
|
* Returns whether post saving is locked. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Is locked. |
|
*/ |
|
|
|
function selectors_isPostSavingLocked(state) { |
|
return Object.keys(state.postSavingLock).length > 0; |
|
} |
|
/** |
|
* Returns whether the edition of the post has been taken over. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Is post lock takeover. |
|
*/ |
|
|
|
function isPostLockTakeover(state) { |
|
return state.postLock.isTakeover; |
|
} |
|
/** |
|
* Returns details about the post lock user. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {Object} A user object. |
|
*/ |
|
|
|
function getPostLockUser(state) { |
|
return state.postLock.user; |
|
} |
|
/** |
|
* Returns the active post lock. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {Object} The lock object. |
|
*/ |
|
|
|
function getActivePostLock(state) { |
|
return state.postLock.activePostLock; |
|
} |
|
/** |
|
* Returns whether or not the user has the unfiltered_html capability. |
|
* |
|
* @param {Object} state Editor state. |
|
* |
|
* @return {boolean} Whether the user can or can't post unfiltered HTML. |
|
*/ |
|
|
|
function canUserUseUnfilteredHTML(state) { |
|
return Object(external_lodash_["has"])(selectors_getCurrentPost(state), ['_links', 'wp:action-unfiltered-html']); |
|
} |
|
/** |
|
* Returns whether the pre-publish panel should be shown |
|
* or skipped when the user clicks the "publish" button. |
|
* |
|
* @param {Object} state Global application state. |
|
* |
|
* @return {boolean} Whether the pre-publish panel should be shown or not. |
|
*/ |
|
|
|
function selectors_isPublishSidebarEnabled(state) { |
|
if (state.preferences.hasOwnProperty('isPublishSidebarEnabled')) { |
|
return state.preferences.isPublishSidebarEnabled; |
|
} |
|
|
|
return PREFERENCES_DEFAULTS.isPublishSidebarEnabled; |
|
} |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js |
|
var asyncToGenerator = __webpack_require__(38); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","apiFetch"]} |
|
var external_this_wp_apiFetch_ = __webpack_require__(30); |
|
var external_this_wp_apiFetch_default = /*#__PURE__*/__webpack_require__.n(external_this_wp_apiFetch_); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/effects/reusable-blocks.js |
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
// TODO: Ideally this would be the only dispatch in scope. This requires either |
|
// refactoring editor actions to yielded controls, or replacing direct dispatch |
|
// on the editor store with action creators (e.g. `REMOVE_REUSABLE_BLOCK`). |
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Module Constants |
|
*/ |
|
|
|
var REUSABLE_BLOCK_NOTICE_ID = 'REUSABLE_BLOCK_NOTICE_ID'; |
|
/** |
|
* Fetch Reusable Blocks Effect Handler. |
|
* |
|
* @param {Object} action action object. |
|
* @param {Object} store Redux Store. |
|
*/ |
|
|
|
var reusable_blocks_fetchReusableBlocks = |
|
/*#__PURE__*/ |
|
function () { |
|
var _ref = Object(asyncToGenerator["a" /* default */])( |
|
/*#__PURE__*/ |
|
regeneratorRuntime.mark(function _callee(action, store) { |
|
var id, dispatch, postType, posts, results; |
|
return regeneratorRuntime.wrap(function _callee$(_context) { |
|
while (1) { |
|
switch (_context.prev = _context.next) { |
|
case 0: |
|
id = action.id; |
|
dispatch = store.dispatch; // TODO: these are potentially undefined, this fix is in place |
|
// until there is a filter to not use reusable blocks if undefined |
|
|
|
_context.next = 4; |
|
return external_this_wp_apiFetch_default()({ |
|
path: '/wp/v2/types/wp_block' |
|
}); |
|
|
|
case 4: |
|
postType = _context.sent; |
|
|
|
if (postType) { |
|
_context.next = 7; |
|
break; |
|
} |
|
|
|
return _context.abrupt("return"); |
|
|
|
case 7: |
|
_context.prev = 7; |
|
|
|
if (!id) { |
|
_context.next = 15; |
|
break; |
|
} |
|
|
|
_context.next = 11; |
|
return external_this_wp_apiFetch_default()({ |
|
path: "/wp/v2/".concat(postType.rest_base, "/").concat(id) |
|
}); |
|
|
|
case 11: |
|
_context.t0 = _context.sent; |
|
posts = [_context.t0]; |
|
_context.next = 18; |
|
break; |
|
|
|
case 15: |
|
_context.next = 17; |
|
return external_this_wp_apiFetch_default()({ |
|
path: "/wp/v2/".concat(postType.rest_base, "?per_page=-1") |
|
}); |
|
|
|
case 17: |
|
posts = _context.sent; |
|
|
|
case 18: |
|
results = Object(external_lodash_["compact"])(Object(external_lodash_["map"])(posts, function (post) { |
|
if (post.status !== 'publish' || post.content.protected) { |
|
return null; |
|
} |
|
|
|
var parsedBlocks = Object(external_this_wp_blocks_["parse"])(post.content.raw); |
|
return { |
|
reusableBlock: { |
|
id: post.id, |
|
title: getPostRawValue(post.title) |
|
}, |
|
parsedBlock: parsedBlocks.length === 1 ? parsedBlocks[0] : Object(external_this_wp_blocks_["createBlock"])('core/template', {}, parsedBlocks) |
|
}; |
|
})); |
|
|
|
if (results.length) { |
|
dispatch(__experimentalReceiveReusableBlocks(results)); |
|
} |
|
|
|
dispatch({ |
|
type: 'FETCH_REUSABLE_BLOCKS_SUCCESS', |
|
id: id |
|
}); |
|
_context.next = 26; |
|
break; |
|
|
|
case 23: |
|
_context.prev = 23; |
|
_context.t1 = _context["catch"](7); |
|
dispatch({ |
|
type: 'FETCH_REUSABLE_BLOCKS_FAILURE', |
|
id: id, |
|
error: _context.t1 |
|
}); |
|
|
|
case 26: |
|
case "end": |
|
return _context.stop(); |
|
} |
|
} |
|
}, _callee, this, [[7, 23]]); |
|
})); |
|
|
|
return function fetchReusableBlocks(_x, _x2) { |
|
return _ref.apply(this, arguments); |
|
}; |
|
}(); |
|
/** |
|
* Save Reusable Blocks Effect Handler. |
|
* |
|
* @param {Object} action action object. |
|
* @param {Object} store Redux Store. |
|
*/ |
|
|
|
var saveReusableBlocks = |
|
/*#__PURE__*/ |
|
function () { |
|
var _ref2 = Object(asyncToGenerator["a" /* default */])( |
|
/*#__PURE__*/ |
|
regeneratorRuntime.mark(function _callee2(action, store) { |
|
var postType, id, dispatch, state, _getReusableBlock, clientId, title, isTemporary, reusableBlock, content, data, path, method, updatedReusableBlock, message; |
|
|
|
return regeneratorRuntime.wrap(function _callee2$(_context2) { |
|
while (1) { |
|
switch (_context2.prev = _context2.next) { |
|
case 0: |
|
_context2.next = 2; |
|
return external_this_wp_apiFetch_default()({ |
|
path: '/wp/v2/types/wp_block' |
|
}); |
|
|
|
case 2: |
|
postType = _context2.sent; |
|
|
|
if (postType) { |
|
_context2.next = 5; |
|
break; |
|
} |
|
|
|
return _context2.abrupt("return"); |
|
|
|
case 5: |
|
id = action.id; |
|
dispatch = store.dispatch; |
|
state = store.getState(); |
|
_getReusableBlock = __experimentalGetReusableBlock(state, id), clientId = _getReusableBlock.clientId, title = _getReusableBlock.title, isTemporary = _getReusableBlock.isTemporary; |
|
reusableBlock = selectors_getBlock(state, clientId); |
|
content = Object(external_this_wp_blocks_["serialize"])(reusableBlock.name === 'core/template' ? reusableBlock.innerBlocks : reusableBlock); |
|
data = isTemporary ? { |
|
title: title, |
|
content: content, |
|
status: 'publish' |
|
} : { |
|
id: id, |
|
title: title, |
|
content: content, |
|
status: 'publish' |
|
}; |
|
path = isTemporary ? "/wp/v2/".concat(postType.rest_base) : "/wp/v2/".concat(postType.rest_base, "/").concat(id); |
|
method = isTemporary ? 'POST' : 'PUT'; |
|
_context2.prev = 14; |
|
_context2.next = 17; |
|
return external_this_wp_apiFetch_default()({ |
|
path: path, |
|
data: data, |
|
method: method |
|
}); |
|
|
|
case 17: |
|
updatedReusableBlock = _context2.sent; |
|
dispatch({ |
|
type: 'SAVE_REUSABLE_BLOCK_SUCCESS', |
|
updatedId: updatedReusableBlock.id, |
|
id: id |
|
}); |
|
message = isTemporary ? Object(external_this_wp_i18n_["__"])('Block created.') : Object(external_this_wp_i18n_["__"])('Block updated.'); |
|
Object(external_this_wp_data_["dispatch"])('core/notices').createSuccessNotice(message, { |
|
id: REUSABLE_BLOCK_NOTICE_ID |
|
}); |
|
_context2.next = 27; |
|
break; |
|
|
|
case 23: |
|
_context2.prev = 23; |
|
_context2.t0 = _context2["catch"](14); |
|
dispatch({ |
|
type: 'SAVE_REUSABLE_BLOCK_FAILURE', |
|
id: id |
|
}); |
|
Object(external_this_wp_data_["dispatch"])('core/notices').createErrorNotice(_context2.t0.message, { |
|
id: REUSABLE_BLOCK_NOTICE_ID |
|
}); |
|
|
|
case 27: |
|
case "end": |
|
return _context2.stop(); |
|
} |
|
} |
|
}, _callee2, this, [[14, 23]]); |
|
})); |
|
|
|
return function saveReusableBlocks(_x3, _x4) { |
|
return _ref2.apply(this, arguments); |
|
}; |
|
}(); |
|
/** |
|
* Delete Reusable Blocks Effect Handler. |
|
* |
|
* @param {Object} action action object. |
|
* @param {Object} store Redux Store. |
|
*/ |
|
|
|
var deleteReusableBlocks = |
|
/*#__PURE__*/ |
|
function () { |
|
var _ref3 = Object(asyncToGenerator["a" /* default */])( |
|
/*#__PURE__*/ |
|
regeneratorRuntime.mark(function _callee3(action, store) { |
|
var postType, id, getState, dispatch, reusableBlock, allBlocks, associatedBlocks, associatedBlockClientIds, transactionId, message; |
|
return regeneratorRuntime.wrap(function _callee3$(_context3) { |
|
while (1) { |
|
switch (_context3.prev = _context3.next) { |
|
case 0: |
|
_context3.next = 2; |
|
return external_this_wp_apiFetch_default()({ |
|
path: '/wp/v2/types/wp_block' |
|
}); |
|
|
|
case 2: |
|
postType = _context3.sent; |
|
|
|
if (postType) { |
|
_context3.next = 5; |
|
break; |
|
} |
|
|
|
return _context3.abrupt("return"); |
|
|
|
case 5: |
|
id = action.id; |
|
getState = store.getState, dispatch = store.dispatch; // Don't allow a reusable block with a temporary ID to be deleted |
|
|
|
reusableBlock = __experimentalGetReusableBlock(getState(), id); |
|
|
|
if (!(!reusableBlock || reusableBlock.isTemporary)) { |
|
_context3.next = 10; |
|
break; |
|
} |
|
|
|
return _context3.abrupt("return"); |
|
|
|
case 10: |
|
// Remove any other blocks that reference this reusable block |
|
allBlocks = selectors_getBlocks(getState()); |
|
associatedBlocks = allBlocks.filter(function (block) { |
|
return Object(external_this_wp_blocks_["isReusableBlock"])(block) && block.attributes.ref === id; |
|
}); |
|
associatedBlockClientIds = associatedBlocks.map(function (block) { |
|
return block.clientId; |
|
}); |
|
transactionId = Object(external_lodash_["uniqueId"])(); |
|
dispatch({ |
|
type: 'REMOVE_REUSABLE_BLOCK', |
|
id: id, |
|
optimist: { |
|
type: redux_optimist["BEGIN"], |
|
id: transactionId |
|
} |
|
}); // Remove the parsed block. |
|
|
|
dispatch(actions_removeBlocks(Object(toConsumableArray["a" /* default */])(associatedBlockClientIds).concat([reusableBlock.clientId]))); |
|
_context3.prev = 16; |
|
_context3.next = 19; |
|
return external_this_wp_apiFetch_default()({ |
|
path: "/wp/v2/".concat(postType.rest_base, "/").concat(id), |
|
method: 'DELETE' |
|
}); |
|
|
|
case 19: |
|
dispatch({ |
|
type: 'DELETE_REUSABLE_BLOCK_SUCCESS', |
|
id: id, |
|
optimist: { |
|
type: redux_optimist["COMMIT"], |
|
id: transactionId |
|
} |
|
}); |
|
message = Object(external_this_wp_i18n_["__"])('Block deleted.'); |
|
Object(external_this_wp_data_["dispatch"])('core/notices').createSuccessNotice(message, { |
|
id: REUSABLE_BLOCK_NOTICE_ID |
|
}); |
|
_context3.next = 28; |
|
break; |
|
|
|
case 24: |
|
_context3.prev = 24; |
|
_context3.t0 = _context3["catch"](16); |
|
dispatch({ |
|
type: 'DELETE_REUSABLE_BLOCK_FAILURE', |
|
id: id, |
|
optimist: { |
|
type: redux_optimist["REVERT"], |
|
id: transactionId |
|
} |
|
}); |
|
Object(external_this_wp_data_["dispatch"])('core/notices').createErrorNotice(_context3.t0.message, { |
|
id: REUSABLE_BLOCK_NOTICE_ID |
|
}); |
|
|
|
case 28: |
|
case "end": |
|
return _context3.stop(); |
|
} |
|
} |
|
}, _callee3, this, [[16, 24]]); |
|
})); |
|
|
|
return function deleteReusableBlocks(_x5, _x6) { |
|
return _ref3.apply(this, arguments); |
|
}; |
|
}(); |
|
/** |
|
* Receive Reusable Blocks Effect Handler. |
|
* |
|
* @param {Object} action action object. |
|
* @return {Object} receive blocks action |
|
*/ |
|
|
|
var reusable_blocks_receiveReusableBlocks = function receiveReusableBlocks(action) { |
|
return receiveBlocks(Object(external_lodash_["map"])(action.results, 'parsedBlock')); |
|
}; |
|
/** |
|
* Convert a reusable block to a static block effect handler |
|
* |
|
* @param {Object} action action object. |
|
* @param {Object} store Redux Store. |
|
*/ |
|
|
|
var reusable_blocks_convertBlockToStatic = function convertBlockToStatic(action, store) { |
|
var state = store.getState(); |
|
var oldBlock = selectors_getBlock(state, action.clientId); |
|
var reusableBlock = __experimentalGetReusableBlock(state, oldBlock.attributes.ref); |
|
var referencedBlock = selectors_getBlock(state, reusableBlock.clientId); |
|
var newBlocks; |
|
|
|
if (referencedBlock.name === 'core/template') { |
|
newBlocks = referencedBlock.innerBlocks.map(function (innerBlock) { |
|
return Object(external_this_wp_blocks_["cloneBlock"])(innerBlock); |
|
}); |
|
} else { |
|
newBlocks = [Object(external_this_wp_blocks_["cloneBlock"])(referencedBlock)]; |
|
} |
|
|
|
store.dispatch(actions_replaceBlocks(oldBlock.clientId, newBlocks)); |
|
}; |
|
/** |
|
* Convert a static block to a reusable block effect handler |
|
* |
|
* @param {Object} action action object. |
|
* @param {Object} store Redux Store. |
|
*/ |
|
|
|
var reusable_blocks_convertBlockToReusable = function convertBlockToReusable(action, store) { |
|
var getState = store.getState, |
|
dispatch = store.dispatch; |
|
var parsedBlock; |
|
|
|
if (action.clientIds.length === 1) { |
|
parsedBlock = selectors_getBlock(getState(), action.clientIds[0]); |
|
} else { |
|
parsedBlock = Object(external_this_wp_blocks_["createBlock"])('core/template', {}, selectors_getBlocksByClientId(getState(), action.clientIds)); // This shouldn't be necessary but at the moment |
|
// we expect the content of the shared blocks to live in the blocks state. |
|
|
|
dispatch(receiveBlocks([parsedBlock])); |
|
} |
|
|
|
var reusableBlock = { |
|
id: Object(external_lodash_["uniqueId"])('reusable'), |
|
clientId: parsedBlock.clientId, |
|
title: Object(external_this_wp_i18n_["__"])('Untitled Reusable Block') |
|
}; |
|
dispatch(__experimentalReceiveReusableBlocks([{ |
|
reusableBlock: reusableBlock, |
|
parsedBlock: parsedBlock |
|
}])); |
|
dispatch(__experimentalSaveReusableBlock(reusableBlock.id)); |
|
dispatch(actions_replaceBlocks(action.clientIds, Object(external_this_wp_blocks_["createBlock"])('core/block', { |
|
ref: reusableBlock.id |
|
}))); // Re-add the original block to the store, since replaceBlock() will have removed it |
|
|
|
dispatch(receiveBlocks([parsedBlock])); |
|
}; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/effects/utils.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Waits for the resolution of a selector before returning the selector's value. |
|
* |
|
* @param {string} namespace Store namespace. |
|
* @param {string} selectorName Selector name. |
|
* @param {Array} args Selector args. |
|
* |
|
* @return {Promise} Selector result. |
|
*/ |
|
|
|
function resolveSelector(namespace, selectorName) { |
|
for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { |
|
args[_key - 2] = arguments[_key]; |
|
} |
|
|
|
return new Promise(function (resolve) { |
|
var hasFinished = function hasFinished() { |
|
return Object(external_this_wp_data_["select"])('core/data').hasFinishedResolution(namespace, selectorName, args); |
|
}; |
|
|
|
var getResult = function getResult() { |
|
return Object(external_this_wp_data_["select"])(namespace)[selectorName].apply(null, args); |
|
}; // We need to trigger the selector (to trigger the resolver) |
|
|
|
|
|
var result = getResult(); |
|
|
|
if (hasFinished()) { |
|
return resolve(result); |
|
} |
|
|
|
var unsubscribe = Object(external_this_wp_data_["subscribe"])(function () { |
|
if (hasFinished()) { |
|
unsubscribe(); |
|
resolve(getResult()); |
|
} |
|
}); |
|
}); |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/effects/posts.js |
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
// TODO: Ideally this would be the only dispatch in scope. This requires either |
|
// refactoring editor actions to yielded controls, or replacing direct dispatch |
|
// on the editor store with action creators (e.g. `REQUEST_POST_UPDATE_START`). |
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Module Constants |
|
*/ |
|
|
|
var SAVE_POST_NOTICE_ID = 'SAVE_POST_NOTICE_ID'; |
|
var TRASH_POST_NOTICE_ID = 'TRASH_POST_NOTICE_ID'; |
|
/** |
|
* Request Post Update Effect handler |
|
* |
|
* @param {Object} action the fetchReusableBlocks action object. |
|
* @param {Object} store Redux Store. |
|
*/ |
|
|
|
var requestPostUpdate = |
|
/*#__PURE__*/ |
|
function () { |
|
var _ref = Object(asyncToGenerator["a" /* default */])( |
|
/*#__PURE__*/ |
|
regeneratorRuntime.mark(function _callee(action, store) { |
|
var dispatch, getState, state, post, isAutosave, edits, toSend, postType, request, newPost, reset, isRevision; |
|
return regeneratorRuntime.wrap(function _callee$(_context) { |
|
while (1) { |
|
switch (_context.prev = _context.next) { |
|
case 0: |
|
dispatch = store.dispatch, getState = store.getState; |
|
state = getState(); |
|
post = selectors_getCurrentPost(state); |
|
isAutosave = !!action.options.isAutosave; // Prevent save if not saveable. |
|
// We don't check for dirtiness here as this can be overriden in the UI. |
|
|
|
if (selectors_isEditedPostSaveable(state)) { |
|
_context.next = 6; |
|
break; |
|
} |
|
|
|
return _context.abrupt("return"); |
|
|
|
case 6: |
|
edits = getPostEdits(state); |
|
|
|
if (isAutosave) { |
|
edits = Object(external_lodash_["pick"])(edits, ['title', 'content', 'excerpt']); |
|
} // New posts (with auto-draft status) must be explicitly assigned draft |
|
// status if there is not already a status assigned in edits (publish). |
|
// Otherwise, they are wrongly left as auto-draft. Status is not always |
|
// respected for autosaves, so it cannot simply be included in the pick |
|
// above. This behavior relies on an assumption that an auto-draft post |
|
// would never be saved by anyone other than the owner of the post, per |
|
// logic within autosaves REST controller to save status field only for |
|
// draft/auto-draft by current user. |
|
// |
|
// See: https://core.trac.wordpress.org/ticket/43316#comment:88 |
|
// See: https://core.trac.wordpress.org/ticket/43316#comment:89 |
|
|
|
|
|
if (isEditedPostNew(state)) { |
|
edits = Object(objectSpread["a" /* default */])({ |
|
status: 'draft' |
|
}, edits); |
|
} |
|
|
|
toSend = Object(objectSpread["a" /* default */])({}, edits, { |
|
content: getEditedPostContent(state), |
|
id: post.id |
|
}); |
|
_context.next = 12; |
|
return resolveSelector('core', 'getPostType', selectors_getCurrentPostType(state)); |
|
|
|
case 12: |
|
postType = _context.sent; |
|
dispatch({ |
|
type: 'REQUEST_POST_UPDATE_START', |
|
optimist: { |
|
type: redux_optimist["BEGIN"], |
|
id: POST_UPDATE_TRANSACTION_ID |
|
}, |
|
options: action.options |
|
}); // Optimistically apply updates under the assumption that the post |
|
// will be updated. See below logic in success resolution for revert |
|
// if the autosave is applied as a revision. |
|
|
|
dispatch(Object(objectSpread["a" /* default */])({}, updatePost(toSend), { |
|
optimist: { |
|
id: POST_UPDATE_TRANSACTION_ID |
|
} |
|
})); |
|
|
|
if (isAutosave) { |
|
// Ensure autosaves contain all expected fields, using autosave or |
|
// post values as fallback if not otherwise included in edits. |
|
toSend = Object(objectSpread["a" /* default */])({}, Object(external_lodash_["pick"])(post, ['title', 'content', 'excerpt']), getAutosave(state), toSend); |
|
request = external_this_wp_apiFetch_default()({ |
|
path: "/wp/v2/".concat(postType.rest_base, "/").concat(post.id, "/autosaves"), |
|
method: 'POST', |
|
data: toSend |
|
}); |
|
} else { |
|
Object(external_this_wp_data_["dispatch"])('core/notices').removeNotice(SAVE_POST_NOTICE_ID); |
|
Object(external_this_wp_data_["dispatch"])('core/notices').removeNotice('autosave-exists'); |
|
request = external_this_wp_apiFetch_default()({ |
|
path: "/wp/v2/".concat(postType.rest_base, "/").concat(post.id), |
|
method: 'PUT', |
|
data: toSend |
|
}); |
|
} |
|
|
|
_context.prev = 16; |
|
_context.next = 19; |
|
return request; |
|
|
|
case 19: |
|
newPost = _context.sent; |
|
reset = isAutosave ? resetAutosave : resetPost; |
|
dispatch(reset(newPost)); // An autosave may be processed by the server as a regular save |
|
// when its update is requested by the author and the post was |
|
// draft or auto-draft. |
|
|
|
isRevision = newPost.id !== post.id; |
|
dispatch({ |
|
type: 'REQUEST_POST_UPDATE_SUCCESS', |
|
previousPost: post, |
|
post: newPost, |
|
optimist: { |
|
// Note: REVERT is not a failure case here. Rather, it |
|
// is simply reversing the assumption that the updates |
|
// were applied to the post proper, such that the post |
|
// treated as having unsaved changes. |
|
type: isRevision ? redux_optimist["REVERT"] : redux_optimist["COMMIT"], |
|
id: POST_UPDATE_TRANSACTION_ID |
|
}, |
|
options: action.options, |
|
postType: postType |
|
}); |
|
_context.next = 29; |
|
break; |
|
|
|
case 26: |
|
_context.prev = 26; |
|
_context.t0 = _context["catch"](16); |
|
dispatch({ |
|
type: 'REQUEST_POST_UPDATE_FAILURE', |
|
optimist: { |
|
type: redux_optimist["REVERT"], |
|
id: POST_UPDATE_TRANSACTION_ID |
|
}, |
|
post: post, |
|
edits: edits, |
|
error: _context.t0, |
|
options: action.options |
|
}); |
|
|
|
case 29: |
|
case "end": |
|
return _context.stop(); |
|
} |
|
} |
|
}, _callee, this, [[16, 26]]); |
|
})); |
|
|
|
return function requestPostUpdate(_x, _x2) { |
|
return _ref.apply(this, arguments); |
|
}; |
|
}(); |
|
/** |
|
* Request Post Update Success Effect handler |
|
* |
|
* @param {Object} action action object. |
|
* @param {Object} store Redux Store. |
|
*/ |
|
|
|
var posts_requestPostUpdateSuccess = function requestPostUpdateSuccess(action) { |
|
var previousPost = action.previousPost, |
|
post = action.post, |
|
postType = action.postType; // Autosaves are neither shown a notice nor redirected. |
|
|
|
if (Object(external_lodash_["get"])(action.options, ['isAutosave'])) { |
|
return; |
|
} |
|
|
|
var publishStatus = ['publish', 'private', 'future']; |
|
var isPublished = Object(external_lodash_["includes"])(publishStatus, previousPost.status); |
|
var willPublish = Object(external_lodash_["includes"])(publishStatus, post.status); |
|
var noticeMessage; |
|
var shouldShowLink = Object(external_lodash_["get"])(postType, ['viewable'], false); |
|
|
|
if (!isPublished && !willPublish) { |
|
// If saving a non-published post, don't show notice. |
|
noticeMessage = null; |
|
} else if (isPublished && !willPublish) { |
|
// If undoing publish status, show specific notice |
|
noticeMessage = postType.labels.item_reverted_to_draft; |
|
shouldShowLink = false; |
|
} else if (!isPublished && willPublish) { |
|
// If publishing or scheduling a post, show the corresponding |
|
// publish message |
|
noticeMessage = { |
|
publish: postType.labels.item_published, |
|
private: postType.labels.item_published_privately, |
|
future: postType.labels.item_scheduled |
|
}[post.status]; |
|
} else { |
|
// Generic fallback notice |
|
noticeMessage = postType.labels.item_updated; |
|
} |
|
|
|
if (noticeMessage) { |
|
var actions = []; |
|
|
|
if (shouldShowLink) { |
|
actions.push({ |
|
label: postType.labels.view_item, |
|
url: post.link |
|
}); |
|
} |
|
|
|
Object(external_this_wp_data_["dispatch"])('core/notices').createSuccessNotice(noticeMessage, { |
|
id: SAVE_POST_NOTICE_ID, |
|
actions: actions |
|
}); |
|
} |
|
}; |
|
/** |
|
* Request Post Update Failure Effect handler |
|
* |
|
* @param {Object} action action object. |
|
*/ |
|
|
|
var posts_requestPostUpdateFailure = function requestPostUpdateFailure(action) { |
|
var post = action.post, |
|
edits = action.edits, |
|
error = action.error; |
|
|
|
if (error && 'rest_autosave_no_changes' === error.code) { |
|
// Autosave requested a new autosave, but there were no changes. This shouldn't |
|
// result in an error notice for the user. |
|
return; |
|
} |
|
|
|
var publishStatus = ['publish', 'private', 'future']; |
|
var isPublished = publishStatus.indexOf(post.status) !== -1; // If the post was being published, we show the corresponding publish error message |
|
// Unless we publish an "updating failed" message |
|
|
|
var messages = { |
|
publish: Object(external_this_wp_i18n_["__"])('Publishing failed'), |
|
private: Object(external_this_wp_i18n_["__"])('Publishing failed'), |
|
future: Object(external_this_wp_i18n_["__"])('Scheduling failed') |
|
}; |
|
var noticeMessage = !isPublished && publishStatus.indexOf(edits.status) !== -1 ? messages[edits.status] : Object(external_this_wp_i18n_["__"])('Updating failed'); |
|
Object(external_this_wp_data_["dispatch"])('core/notices').createErrorNotice(noticeMessage, { |
|
id: SAVE_POST_NOTICE_ID |
|
}); |
|
}; |
|
/** |
|
* Trash Post Effect handler |
|
* |
|
* @param {Object} action action object. |
|
* @param {Object} store Redux Store. |
|
*/ |
|
|
|
var posts_trashPost = |
|
/*#__PURE__*/ |
|
function () { |
|
var _ref2 = Object(asyncToGenerator["a" /* default */])( |
|
/*#__PURE__*/ |
|
regeneratorRuntime.mark(function _callee2(action, store) { |
|
var dispatch, getState, postId, postTypeSlug, postType, post; |
|
return regeneratorRuntime.wrap(function _callee2$(_context2) { |
|
while (1) { |
|
switch (_context2.prev = _context2.next) { |
|
case 0: |
|
dispatch = store.dispatch, getState = store.getState; |
|
postId = action.postId; |
|
postTypeSlug = selectors_getCurrentPostType(getState()); |
|
_context2.next = 5; |
|
return resolveSelector('core', 'getPostType', postTypeSlug); |
|
|
|
case 5: |
|
postType = _context2.sent; |
|
Object(external_this_wp_data_["dispatch"])('core/notices').removeNotice(TRASH_POST_NOTICE_ID); |
|
_context2.prev = 7; |
|
_context2.next = 10; |
|
return external_this_wp_apiFetch_default()({ |
|
path: "/wp/v2/".concat(postType.rest_base, "/").concat(postId), |
|
method: 'DELETE' |
|
}); |
|
|
|
case 10: |
|
post = selectors_getCurrentPost(getState()); // TODO: This should be an updatePost action (updating subsets of post properties), |
|
// But right now editPost is tied with change detection. |
|
|
|
dispatch(resetPost(Object(objectSpread["a" /* default */])({}, post, { |
|
status: 'trash' |
|
}))); |
|
_context2.next = 17; |
|
break; |
|
|
|
case 14: |
|
_context2.prev = 14; |
|
_context2.t0 = _context2["catch"](7); |
|
dispatch(Object(objectSpread["a" /* default */])({}, action, { |
|
type: 'TRASH_POST_FAILURE', |
|
error: _context2.t0 |
|
})); |
|
|
|
case 17: |
|
case "end": |
|
return _context2.stop(); |
|
} |
|
} |
|
}, _callee2, this, [[7, 14]]); |
|
})); |
|
|
|
return function trashPost(_x3, _x4) { |
|
return _ref2.apply(this, arguments); |
|
}; |
|
}(); |
|
/** |
|
* Trash Post Failure Effect handler |
|
* |
|
* @param {Object} action action object. |
|
* @param {Object} store Redux Store. |
|
*/ |
|
|
|
var posts_trashPostFailure = function trashPostFailure(action) { |
|
var message = action.error.message && action.error.code !== 'unknown_error' ? action.error.message : Object(external_this_wp_i18n_["__"])('Trashing failed'); |
|
Object(external_this_wp_data_["dispatch"])('core/notices').createErrorNotice(message, { |
|
id: TRASH_POST_NOTICE_ID |
|
}); |
|
}; |
|
/** |
|
* Refresh Post Effect handler |
|
* |
|
* @param {Object} action action object. |
|
* @param {Object} store Redux Store. |
|
*/ |
|
|
|
var posts_refreshPost = |
|
/*#__PURE__*/ |
|
function () { |
|
var _ref3 = Object(asyncToGenerator["a" /* default */])( |
|
/*#__PURE__*/ |
|
regeneratorRuntime.mark(function _callee3(action, store) { |
|
var dispatch, getState, state, post, postTypeSlug, postType, newPost; |
|
return regeneratorRuntime.wrap(function _callee3$(_context3) { |
|
while (1) { |
|
switch (_context3.prev = _context3.next) { |
|
case 0: |
|
dispatch = store.dispatch, getState = store.getState; |
|
state = getState(); |
|
post = selectors_getCurrentPost(state); |
|
postTypeSlug = selectors_getCurrentPostType(getState()); |
|
_context3.next = 6; |
|
return resolveSelector('core', 'getPostType', postTypeSlug); |
|
|
|
case 6: |
|
postType = _context3.sent; |
|
_context3.next = 9; |
|
return external_this_wp_apiFetch_default()({ |
|
// Timestamp arg allows caller to bypass browser caching, which is expected for this specific function. |
|
path: "/wp/v2/".concat(postType.rest_base, "/").concat(post.id, "?context=edit&_timestamp=").concat(Date.now()) |
|
}); |
|
|
|
case 9: |
|
newPost = _context3.sent; |
|
dispatch(resetPost(newPost)); |
|
|
|
case 11: |
|
case "end": |
|
return _context3.stop(); |
|
} |
|
} |
|
}, _callee3, this); |
|
})); |
|
|
|
return function refreshPost(_x5, _x6) { |
|
return _ref3.apply(this, arguments); |
|
}; |
|
}(); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/effects.js |
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Block validity is a function of blocks state (at the point of a |
|
* reset) and the template setting. As a compromise to its placement |
|
* across distinct parts of state, it is implemented here as a side- |
|
* effect of the block reset action. |
|
* |
|
* @param {Object} action RESET_BLOCKS action. |
|
* @param {Object} store Store instance. |
|
* |
|
* @return {?Object} New validity set action if validity has changed. |
|
*/ |
|
|
|
function validateBlocksToTemplate(action, store) { |
|
var state = store.getState(); |
|
var template = getTemplate(state); |
|
var templateLock = selectors_getTemplateLock(state); // Unlocked templates are considered always valid because they act |
|
// as default values only. |
|
|
|
var isBlocksValidToTemplate = !template || templateLock !== 'all' || Object(external_this_wp_blocks_["doBlocksMatchTemplate"])(action.blocks, template); // Update if validity has changed. |
|
|
|
if (isBlocksValidToTemplate !== isValidTemplate(state)) { |
|
return setTemplateValidity(isBlocksValidToTemplate); |
|
} |
|
} |
|
/** |
|
* Effect handler which will return a block select action to select the block |
|
* occurring before the selected block in the previous state, unless it is the |
|
* same block or the action includes a falsey `selectPrevious` option flag. |
|
* |
|
* @param {Object} action Action which had initiated the effect handler. |
|
* @param {Object} store Store instance. |
|
* |
|
* @return {?Object} Block select action to select previous, if applicable. |
|
*/ |
|
|
|
function selectPreviousBlock(action, store) { |
|
// if the action says previous block should not be selected don't do anything. |
|
if (!action.selectPrevious) { |
|
return; |
|
} |
|
|
|
var firstRemovedBlockClientId = action.clientIds[0]; |
|
var state = store.getState(); |
|
var selectedBlockClientId = selectors_getSelectedBlockClientId(state); // recreate the state before the block was removed. |
|
|
|
var previousState = Object(objectSpread["a" /* default */])({}, state, { |
|
editor: { |
|
present: Object(external_lodash_["last"])(state.editor.past) |
|
} |
|
}); // rootClientId of the removed block. |
|
|
|
|
|
var rootClientId = selectors_getBlockRootClientId(previousState, firstRemovedBlockClientId); // Client ID of the block that was before the removed block or the |
|
// rootClientId if the removed block was first amongst its siblings. |
|
|
|
var blockClientIdToSelect = selectors_getPreviousBlockClientId(previousState, firstRemovedBlockClientId) || rootClientId; // Dispatch select block action if the currently selected block |
|
// is not already the block we want to be selected. |
|
|
|
if (blockClientIdToSelect !== selectedBlockClientId) { |
|
return actions_selectBlock(blockClientIdToSelect, -1); |
|
} |
|
} |
|
/** |
|
* Effect handler which will return a default block insertion action if there |
|
* are no other blocks at the root of the editor. This is expected to be used |
|
* in actions which may result in no blocks remaining in the editor (removal, |
|
* replacement, etc). |
|
* |
|
* @param {Object} action Action which had initiated the effect handler. |
|
* @param {Object} store Store instance. |
|
* |
|
* @return {?Object} Default block insert action, if no other blocks exist. |
|
*/ |
|
|
|
function ensureDefaultBlock(action, store) { |
|
if (!selectors_getBlockCount(store.getState())) { |
|
return actions_insertDefaultBlock(); |
|
} |
|
} |
|
/* harmony default export */ var effects = ({ |
|
REQUEST_POST_UPDATE: function REQUEST_POST_UPDATE(action, store) { |
|
requestPostUpdate(action, store); |
|
}, |
|
REQUEST_POST_UPDATE_SUCCESS: posts_requestPostUpdateSuccess, |
|
REQUEST_POST_UPDATE_FAILURE: posts_requestPostUpdateFailure, |
|
TRASH_POST: function TRASH_POST(action, store) { |
|
posts_trashPost(action, store); |
|
}, |
|
TRASH_POST_FAILURE: posts_trashPostFailure, |
|
REFRESH_POST: function REFRESH_POST(action, store) { |
|
posts_refreshPost(action, store); |
|
}, |
|
MERGE_BLOCKS: function MERGE_BLOCKS(action, store) { |
|
var dispatch = store.dispatch; |
|
var state = store.getState(); |
|
|
|
var _action$blocks = Object(slicedToArray["a" /* default */])(action.blocks, 2), |
|
firstBlockClientId = _action$blocks[0], |
|
secondBlockClientId = _action$blocks[1]; |
|
|
|
var blockA = selectors_getBlock(state, firstBlockClientId); |
|
var blockB = selectors_getBlock(state, secondBlockClientId); |
|
var blockType = Object(external_this_wp_blocks_["getBlockType"])(blockA.name); // Only focus the previous block if it's not mergeable |
|
|
|
if (!blockType.merge) { |
|
dispatch(actions_selectBlock(blockA.clientId)); |
|
return; |
|
} // We can only merge blocks with similar types |
|
// thus, we transform the block to merge first |
|
|
|
|
|
var blocksWithTheSameType = blockA.name === blockB.name ? [blockB] : Object(external_this_wp_blocks_["switchToBlockType"])(blockB, blockA.name); // If the block types can not match, do nothing |
|
|
|
if (!blocksWithTheSameType || !blocksWithTheSameType.length) { |
|
return; |
|
} // Calling the merge to update the attributes and remove the block to be merged |
|
|
|
|
|
var updatedAttributes = blockType.merge(blockA.attributes, blocksWithTheSameType[0].attributes); |
|
dispatch(actions_selectBlock(blockA.clientId, -1)); |
|
dispatch(actions_replaceBlocks([blockA.clientId, blockB.clientId], [Object(objectSpread["a" /* default */])({}, blockA, { |
|
attributes: Object(objectSpread["a" /* default */])({}, blockA.attributes, updatedAttributes) |
|
})].concat(Object(toConsumableArray["a" /* default */])(blocksWithTheSameType.slice(1))))); |
|
}, |
|
SETUP_EDITOR: function SETUP_EDITOR(action, store) { |
|
var post = action.post, |
|
edits = action.edits; |
|
var state = store.getState(); // In order to ensure maximum of a single parse during setup, edits are |
|
// included as part of editor setup action. Assume edited content as |
|
// canonical if provided, falling back to post. |
|
|
|
var content; |
|
|
|
if (Object(external_lodash_["has"])(edits, ['content'])) { |
|
content = edits.content; |
|
} else { |
|
content = post.content.raw; |
|
} |
|
|
|
var blocks = Object(external_this_wp_blocks_["parse"])(content); // Apply a template for new posts only, if exists. |
|
|
|
var isNewPost = post.status === 'auto-draft'; |
|
var template = getTemplate(state); |
|
|
|
if (isNewPost && template) { |
|
blocks = Object(external_this_wp_blocks_["synchronizeBlocksWithTemplate"])(blocks, template); |
|
} |
|
|
|
var setupAction = setupEditorState(post, blocks); |
|
return Object(external_lodash_["compact"])([setupAction, // TODO: This is temporary, necessary only so long as editor setup |
|
// is a separate action from block resetting. |
|
// |
|
// See: https://github.com/WordPress/gutenberg/pull/9403 |
|
validateBlocksToTemplate(setupAction, store)]); |
|
}, |
|
RESET_BLOCKS: [validateBlocksToTemplate], |
|
SYNCHRONIZE_TEMPLATE: function SYNCHRONIZE_TEMPLATE(action, _ref) { |
|
var getState = _ref.getState; |
|
var state = getState(); |
|
var blocks = selectors_getBlocks(state); |
|
var template = getTemplate(state); |
|
var updatedBlockList = Object(external_this_wp_blocks_["synchronizeBlocksWithTemplate"])(blocks, template); |
|
return actions_resetBlocks(updatedBlockList); |
|
}, |
|
FETCH_REUSABLE_BLOCKS: function FETCH_REUSABLE_BLOCKS(action, store) { |
|
reusable_blocks_fetchReusableBlocks(action, store); |
|
}, |
|
SAVE_REUSABLE_BLOCK: function SAVE_REUSABLE_BLOCK(action, store) { |
|
saveReusableBlocks(action, store); |
|
}, |
|
DELETE_REUSABLE_BLOCK: function DELETE_REUSABLE_BLOCK(action, store) { |
|
deleteReusableBlocks(action, store); |
|
}, |
|
RECEIVE_REUSABLE_BLOCKS: reusable_blocks_receiveReusableBlocks, |
|
CONVERT_BLOCK_TO_STATIC: reusable_blocks_convertBlockToStatic, |
|
CONVERT_BLOCK_TO_REUSABLE: reusable_blocks_convertBlockToReusable, |
|
REMOVE_BLOCKS: [selectPreviousBlock, ensureDefaultBlock], |
|
REPLACE_BLOCKS: [ensureDefaultBlock], |
|
MULTI_SELECT: function MULTI_SELECT(action, _ref2) { |
|
var getState = _ref2.getState; |
|
var blockCount = selectors_getSelectedBlockCount(getState()); |
|
/* translators: %s: number of selected blocks */ |
|
|
|
Object(external_this_wp_a11y_["speak"])(Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_n"])('%s block selected.', '%s blocks selected.', blockCount), blockCount), 'assertive'); |
|
} |
|
}); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/middlewares.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Applies the custom middlewares used specifically in the editor module. |
|
* |
|
* @param {Object} store Store Object. |
|
* |
|
* @return {Object} Update Store Object. |
|
*/ |
|
|
|
function applyMiddlewares(store) { |
|
var middlewares = [refx_default()(effects), lib_default.a]; |
|
|
|
var enhancedDispatch = function enhancedDispatch() { |
|
throw new Error('Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.'); |
|
}; |
|
|
|
var chain = []; |
|
var middlewareAPI = { |
|
getState: store.getState, |
|
dispatch: function dispatch() { |
|
return enhancedDispatch.apply(void 0, arguments); |
|
} |
|
}; |
|
chain = middlewares.map(function (middleware) { |
|
return middleware(middlewareAPI); |
|
}); |
|
enhancedDispatch = external_lodash_["flowRight"].apply(void 0, Object(toConsumableArray["a" /* default */])(chain))(store.dispatch); |
|
store.dispatch = enhancedDispatch; |
|
return store; |
|
} |
|
|
|
/* harmony default export */ var store_middlewares = (applyMiddlewares); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/store/index.js |
|
/** |
|
* WordPress Dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Module Constants |
|
*/ |
|
|
|
var MODULE_KEY = 'core/editor'; |
|
var store_store = Object(external_this_wp_data_["registerStore"])(MODULE_KEY, { |
|
reducer: store_reducer, |
|
selectors: selectors_namespaceObject, |
|
actions: actions_namespaceObject, |
|
persist: ['preferences'] |
|
}); |
|
store_middlewares(store_store); |
|
/* harmony default export */ var build_module_store = (store_store); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js |
|
var esm_extends = __webpack_require__(18); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","element"]} |
|
var external_this_wp_element_ = __webpack_require__(0); |
|
|
|
// EXTERNAL MODULE: ./node_modules/classnames/index.js |
|
var classnames = __webpack_require__(16); |
|
var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","compose"]} |
|
var external_this_wp_compose_ = __webpack_require__(7); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","hooks"]} |
|
var external_this_wp_hooks_ = __webpack_require__(23); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/classCallCheck.js |
|
var classCallCheck = __webpack_require__(10); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/createClass.js |
|
var createClass = __webpack_require__(9); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js |
|
var possibleConstructorReturn = __webpack_require__(12); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js |
|
var getPrototypeOf = __webpack_require__(13); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/inherits.js + 1 modules |
|
var inherits = __webpack_require__(14); |
|
|
|
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js |
|
var assertThisInitialized = __webpack_require__(3); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","components"]} |
|
var external_this_wp_components_ = __webpack_require__(4); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-edit/context.js |
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
var _createContext = Object(external_this_wp_element_["createContext"])({ |
|
name: '', |
|
isSelected: false, |
|
focusedElement: null, |
|
setFocusedElement: external_lodash_["noop"], |
|
clientId: null |
|
}), |
|
Consumer = _createContext.Consumer, |
|
context_Provider = _createContext.Provider; |
|
|
|
|
|
/** |
|
* A Higher Order Component used to inject BlockEdit context to the |
|
* wrapped component. |
|
* |
|
* @param {Function} mapContextToProps Function called on every context change, |
|
* expected to return object of props to |
|
* merge with the component's own props. |
|
* |
|
* @return {Component} Enhanced component with injected context as props. |
|
*/ |
|
|
|
var context_withBlockEditContext = function withBlockEditContext(mapContextToProps) { |
|
return Object(external_this_wp_compose_["createHigherOrderComponent"])(function (OriginalComponent) { |
|
return function (props) { |
|
return Object(external_this_wp_element_["createElement"])(Consumer, null, function (context) { |
|
return Object(external_this_wp_element_["createElement"])(OriginalComponent, Object(esm_extends["a" /* default */])({}, props, mapContextToProps(context, props))); |
|
}); |
|
}; |
|
}, 'withBlockEditContext'); |
|
}; |
|
/** |
|
* A Higher Order Component used to render conditionally the wrapped |
|
* component only when the BlockEdit has selected state set. |
|
* |
|
* @param {Component} OriginalComponent Component to wrap. |
|
* |
|
* @return {Component} Component which renders only when the BlockEdit is selected. |
|
*/ |
|
|
|
var ifBlockEditSelected = Object(external_this_wp_compose_["createHigherOrderComponent"])(function (OriginalComponent) { |
|
return function (props) { |
|
return Object(external_this_wp_element_["createElement"])(Consumer, null, function (_ref) { |
|
var isSelected = _ref.isSelected; |
|
return isSelected && Object(external_this_wp_element_["createElement"])(OriginalComponent, props); |
|
}); |
|
}; |
|
}, 'ifBlockEditSelected'); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/autocomplete/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/* |
|
* Use one array instance for fallback rather than inline array literals |
|
* because the latter may cause rerender due to failed prop equality checks. |
|
*/ |
|
|
|
var completersFallback = []; |
|
/** |
|
* Wrap the default Autocomplete component with one that |
|
* supports a filter hook for customizing its list of autocompleters. |
|
* |
|
* Since there may be many Autocomplete instances at one time, this component |
|
* applies the filter on demand, when the component is first focused after |
|
* receiving a new list of completers. |
|
* |
|
* This function is exported for unit test. |
|
* |
|
* @param {Function} Autocomplete Original component. |
|
* @return {Function} Wrapped component |
|
*/ |
|
|
|
function withFilteredAutocompleters(Autocomplete) { |
|
return ( |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(FilteredAutocomplete, _Component); |
|
|
|
function FilteredAutocomplete() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, FilteredAutocomplete); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(FilteredAutocomplete).call(this)); |
|
_this.state = { |
|
completers: completersFallback |
|
}; |
|
_this.saveParentRef = _this.saveParentRef.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onFocus = _this.onFocus.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(FilteredAutocomplete, [{ |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate() { |
|
var hasFocus = this.parentNode.contains(document.activeElement); |
|
/* |
|
* It's possible for props to be updated when the component has focus, |
|
* so here, we ensure new completers are immediately applied while we |
|
* have the focus. |
|
* |
|
* NOTE: This may trigger another render but only when the component has focus. |
|
*/ |
|
|
|
if (hasFocus && this.hasStaleCompleters()) { |
|
this.updateCompletersState(); |
|
} |
|
} |
|
}, { |
|
key: "onFocus", |
|
value: function onFocus() { |
|
if (this.hasStaleCompleters()) { |
|
this.updateCompletersState(); |
|
} |
|
} |
|
}, { |
|
key: "hasStaleCompleters", |
|
value: function hasStaleCompleters() { |
|
return !('lastFilteredCompletersProp' in this.state) || this.state.lastFilteredCompletersProp !== this.props.completers; |
|
} |
|
}, { |
|
key: "updateCompletersState", |
|
value: function updateCompletersState() { |
|
var _this$props = this.props, |
|
blockName = _this$props.blockName, |
|
completers = _this$props.completers; |
|
var nextCompleters = completers; |
|
var lastFilteredCompletersProp = nextCompleters; |
|
|
|
if (Object(external_this_wp_hooks_["hasFilter"])('editor.Autocomplete.completers')) { |
|
nextCompleters = Object(external_this_wp_hooks_["applyFilters"])('editor.Autocomplete.completers', // Provide copies so filters may directly modify them. |
|
nextCompleters && nextCompleters.map(external_lodash_["clone"]), blockName); |
|
} |
|
|
|
this.setState({ |
|
lastFilteredCompletersProp: lastFilteredCompletersProp, |
|
completers: nextCompleters || completersFallback |
|
}); |
|
} |
|
}, { |
|
key: "saveParentRef", |
|
value: function saveParentRef(parentNode) { |
|
this.parentNode = parentNode; |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var completers = this.state.completers; |
|
|
|
var autocompleteProps = Object(objectSpread["a" /* default */])({}, this.props, { |
|
completers: completers |
|
}); |
|
|
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
onFocus: this.onFocus, |
|
ref: this.saveParentRef |
|
}, Object(external_this_wp_element_["createElement"])(Autocomplete, Object(esm_extends["a" /* default */])({ |
|
onFocus: this.onFocus |
|
}, autocompleteProps))); |
|
} |
|
}]); |
|
|
|
return FilteredAutocomplete; |
|
}(external_this_wp_element_["Component"]) |
|
); |
|
} |
|
/* harmony default export */ var autocomplete = (Object(external_this_wp_compose_["compose"])([context_withBlockEditContext(function (_ref) { |
|
var name = _ref.name; |
|
return { |
|
blockName: name |
|
}; |
|
}), withFilteredAutocompleters])(external_this_wp_components_["Autocomplete"])); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-icon/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
function BlockIcon(_ref) { |
|
var icon = _ref.icon, |
|
_ref$showColors = _ref.showColors, |
|
showColors = _ref$showColors === void 0 ? false : _ref$showColors, |
|
className = _ref.className; |
|
|
|
if (Object(external_lodash_["get"])(icon, ['src']) === 'block-default') { |
|
icon = { |
|
src: Object(external_this_wp_element_["createElement"])(external_this_wp_components_["SVG"], { |
|
xmlns: "http://www.w3.org/2000/svg", |
|
viewBox: "0 0 24 24" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Path"], { |
|
d: "M19 7h-1V5h-4v2h-4V5H6v2H5c-1.1 0-2 .9-2 2v10h18V9c0-1.1-.9-2-2-2zm0 10H5V9h14v8z" |
|
})) |
|
}; |
|
} |
|
|
|
var renderedIcon = Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Icon"], { |
|
icon: icon && icon.src ? icon.src : icon |
|
}); |
|
var style = showColors ? { |
|
backgroundColor: icon && icon.background, |
|
color: icon && icon.foreground |
|
} : {}; |
|
return Object(external_this_wp_element_["createElement"])("span", { |
|
style: style, |
|
className: classnames_default()('editor-block-icon', className, { |
|
'has-colors': showColors |
|
}) |
|
}, renderedIcon); |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/autocompleters/block.js |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Returns the client ID of the parent where a newly inserted block would be |
|
* placed. |
|
* |
|
* @return {string} Client ID of the parent where a newly inserted block would |
|
* be placed. |
|
*/ |
|
|
|
function defaultGetBlockInsertionParentClientId() { |
|
return Object(external_this_wp_data_["select"])('core/editor').getBlockInsertionPoint().rootClientId; |
|
} |
|
/** |
|
* Returns the inserter items for the specified parent block. |
|
* |
|
* @param {string} rootClientId Client ID of the block for which to retrieve |
|
* inserter items. |
|
* |
|
* @return {Array<Editor.InserterItem>} The inserter items for the specified |
|
* parent. |
|
*/ |
|
|
|
|
|
function defaultGetInserterItems(rootClientId) { |
|
return Object(external_this_wp_data_["select"])('core/editor').getInserterItems(rootClientId); |
|
} |
|
/** |
|
* Returns the name of the currently selected block. |
|
* |
|
* @return {string?} The name of the currently selected block or `null` if no |
|
* block is selected. |
|
*/ |
|
|
|
|
|
function defaultGetSelectedBlockName() { |
|
var _select = Object(external_this_wp_data_["select"])('core/editor'), |
|
getSelectedBlockClientId = _select.getSelectedBlockClientId, |
|
getBlockName = _select.getBlockName; |
|
|
|
var selectedBlockClientId = getSelectedBlockClientId(); |
|
return selectedBlockClientId ? getBlockName(selectedBlockClientId) : null; |
|
} |
|
/** |
|
* Creates a blocks repeater for replacing the current block with a selected block type. |
|
* |
|
* @return {Completer} A blocks completer. |
|
*/ |
|
|
|
|
|
function createBlockCompleter() { |
|
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, |
|
_ref$getBlockInsertio = _ref.getBlockInsertionParentClientId, |
|
getBlockInsertionParentClientId = _ref$getBlockInsertio === void 0 ? defaultGetBlockInsertionParentClientId : _ref$getBlockInsertio, |
|
_ref$getInserterItems = _ref.getInserterItems, |
|
getInserterItems = _ref$getInserterItems === void 0 ? defaultGetInserterItems : _ref$getInserterItems, |
|
_ref$getSelectedBlock = _ref.getSelectedBlockName, |
|
getSelectedBlockName = _ref$getSelectedBlock === void 0 ? defaultGetSelectedBlockName : _ref$getSelectedBlock; |
|
|
|
return { |
|
name: 'blocks', |
|
className: 'editor-autocompleters__block', |
|
triggerPrefix: '/', |
|
options: function options() { |
|
var selectedBlockName = getSelectedBlockName(); |
|
return getInserterItems(getBlockInsertionParentClientId()).filter( // Avoid offering to replace the current block with a block of the same type. |
|
function (inserterItem) { |
|
return selectedBlockName !== inserterItem.name; |
|
}); |
|
}, |
|
getOptionKeywords: function getOptionKeywords(inserterItem) { |
|
var title = inserterItem.title, |
|
_inserterItem$keyword = inserterItem.keywords, |
|
keywords = _inserterItem$keyword === void 0 ? [] : _inserterItem$keyword, |
|
category = inserterItem.category; |
|
return [category].concat(Object(toConsumableArray["a" /* default */])(keywords), [title]); |
|
}, |
|
getOptionLabel: function getOptionLabel(inserterItem) { |
|
var icon = inserterItem.icon, |
|
title = inserterItem.title; |
|
return [Object(external_this_wp_element_["createElement"])(BlockIcon, { |
|
key: "icon", |
|
icon: icon, |
|
showColors: true |
|
}), title]; |
|
}, |
|
allowContext: function allowContext(before, after) { |
|
return !(/\S/.test(before) || /\S/.test(after)); |
|
}, |
|
getOptionCompletion: function getOptionCompletion(inserterItem) { |
|
var name = inserterItem.name, |
|
initialAttributes = inserterItem.initialAttributes; |
|
return { |
|
action: 'replace', |
|
value: Object(external_this_wp_blocks_["createBlock"])(name, initialAttributes) |
|
}; |
|
}, |
|
isOptionDisabled: function isOptionDisabled(inserterItem) { |
|
return inserterItem.isDisabled; |
|
} |
|
}; |
|
} |
|
/** |
|
* Creates a blocks repeater for replacing the current block with a selected block type. |
|
* |
|
* @return {Completer} A blocks completer. |
|
*/ |
|
|
|
/* harmony default export */ var autocompleters_block = (createBlockCompleter()); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/autocompleters/user.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* A user mentions completer. |
|
* |
|
* @type {Completer} |
|
*/ |
|
|
|
/* harmony default export */ var autocompleters_user = ({ |
|
name: 'users', |
|
className: 'editor-autocompleters__user', |
|
triggerPrefix: '@', |
|
options: function options(search) { |
|
var payload = ''; |
|
|
|
if (search) { |
|
payload = '?search=' + encodeURIComponent(search); |
|
} |
|
|
|
return external_this_wp_apiFetch_default()({ |
|
path: '/wp/v2/users' + payload |
|
}); |
|
}, |
|
isDebounced: true, |
|
getOptionKeywords: function getOptionKeywords(user) { |
|
return [user.slug, user.name]; |
|
}, |
|
getOptionLabel: function getOptionLabel(user) { |
|
return [Object(external_this_wp_element_["createElement"])("img", { |
|
key: "avatar", |
|
className: "editor-autocompleters__user-avatar", |
|
alt: "", |
|
src: user.avatar_urls[24] |
|
}), Object(external_this_wp_element_["createElement"])("span", { |
|
key: "name", |
|
className: "editor-autocompleters__user-name" |
|
}, user.name), Object(external_this_wp_element_["createElement"])("span", { |
|
key: "slug", |
|
className: "editor-autocompleters__user-slug" |
|
}, user.slug)]; |
|
}, |
|
getOptionCompletion: function getOptionCompletion(user) { |
|
return "@".concat(user.slug); |
|
} |
|
}); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/autocompleters/index.js |
|
|
|
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/alignment-toolbar/index.js |
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
var DEFAULT_ALIGNMENT_CONTROLS = [{ |
|
icon: 'editor-alignleft', |
|
title: Object(external_this_wp_i18n_["__"])('Align text left'), |
|
align: 'left' |
|
}, { |
|
icon: 'editor-aligncenter', |
|
title: Object(external_this_wp_i18n_["__"])('Align text center'), |
|
align: 'center' |
|
}, { |
|
icon: 'editor-alignright', |
|
title: Object(external_this_wp_i18n_["__"])('Align text right'), |
|
align: 'right' |
|
}]; |
|
function AlignmentToolbar(_ref) { |
|
var isCollapsed = _ref.isCollapsed, |
|
value = _ref.value, |
|
onChange = _ref.onChange, |
|
_ref$alignmentControl = _ref.alignmentControls, |
|
alignmentControls = _ref$alignmentControl === void 0 ? DEFAULT_ALIGNMENT_CONTROLS : _ref$alignmentControl; |
|
|
|
function applyOrUnset(align) { |
|
return function () { |
|
return onChange(value === align ? undefined : align); |
|
}; |
|
} |
|
|
|
var activeAlignment = Object(external_lodash_["find"])(alignmentControls, function (control) { |
|
return control.align === value; |
|
}); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Toolbar"], { |
|
isCollapsed: isCollapsed, |
|
icon: activeAlignment ? activeAlignment.icon : 'editor-alignleft', |
|
label: Object(external_this_wp_i18n_["__"])('Change Text Alignment'), |
|
controls: alignmentControls.map(function (control) { |
|
var align = control.align; |
|
var isActive = value === align; |
|
return Object(objectSpread["a" /* default */])({}, control, { |
|
isActive: isActive, |
|
onClick: applyOrUnset(align) |
|
}); |
|
}) |
|
}); |
|
} |
|
/* harmony default export */ var alignment_toolbar = (Object(external_this_wp_compose_["compose"])(context_withBlockEditContext(function (_ref2) { |
|
var clientId = _ref2.clientId; |
|
return { |
|
clientId: clientId |
|
}; |
|
}), Object(external_this_wp_viewport_["withViewportMatch"])({ |
|
isLargeViewport: 'medium' |
|
}), Object(external_this_wp_data_["withSelect"])(function (select, _ref3) { |
|
var clientId = _ref3.clientId, |
|
isLargeViewport = _ref3.isLargeViewport, |
|
isCollapsed = _ref3.isCollapsed; |
|
|
|
var _select = select('core/editor'), |
|
getBlockRootClientId = _select.getBlockRootClientId, |
|
getEditorSettings = _select.getEditorSettings; |
|
|
|
return { |
|
isCollapsed: isCollapsed || !isLargeViewport || !getEditorSettings().hasFixedToolbar && getBlockRootClientId(clientId) |
|
}; |
|
}))(AlignmentToolbar)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-alignment-toolbar/index.js |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
var BLOCK_ALIGNMENTS_CONTROLS = { |
|
left: { |
|
icon: 'align-left', |
|
title: Object(external_this_wp_i18n_["__"])('Align left') |
|
}, |
|
center: { |
|
icon: 'align-center', |
|
title: Object(external_this_wp_i18n_["__"])('Align center') |
|
}, |
|
right: { |
|
icon: 'align-right', |
|
title: Object(external_this_wp_i18n_["__"])('Align right') |
|
}, |
|
wide: { |
|
icon: 'align-wide', |
|
title: Object(external_this_wp_i18n_["__"])('Wide width') |
|
}, |
|
full: { |
|
icon: 'align-full-width', |
|
title: Object(external_this_wp_i18n_["__"])('Full width') |
|
} |
|
}; |
|
var DEFAULT_CONTROLS = ['left', 'center', 'right', 'wide', 'full']; |
|
var WIDE_CONTROLS = ['wide', 'full']; |
|
function BlockAlignmentToolbar(_ref) { |
|
var isCollapsed = _ref.isCollapsed, |
|
value = _ref.value, |
|
onChange = _ref.onChange, |
|
_ref$controls = _ref.controls, |
|
controls = _ref$controls === void 0 ? DEFAULT_CONTROLS : _ref$controls, |
|
_ref$wideControlsEnab = _ref.wideControlsEnabled, |
|
wideControlsEnabled = _ref$wideControlsEnab === void 0 ? false : _ref$wideControlsEnab; |
|
|
|
function applyOrUnset(align) { |
|
return function () { |
|
return onChange(value === align ? undefined : align); |
|
}; |
|
} |
|
|
|
var enabledControls = wideControlsEnabled ? controls : controls.filter(function (control) { |
|
return WIDE_CONTROLS.indexOf(control) === -1; |
|
}); |
|
var activeAlignment = BLOCK_ALIGNMENTS_CONTROLS[value]; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Toolbar"], { |
|
isCollapsed: isCollapsed, |
|
icon: activeAlignment ? activeAlignment.icon : 'align-left', |
|
label: Object(external_this_wp_i18n_["__"])('Change Alignment'), |
|
controls: enabledControls.map(function (control) { |
|
return Object(objectSpread["a" /* default */])({}, BLOCK_ALIGNMENTS_CONTROLS[control], { |
|
isActive: value === control, |
|
onClick: applyOrUnset(control) |
|
}); |
|
}) |
|
}); |
|
} |
|
/* harmony default export */ var block_alignment_toolbar = (Object(external_this_wp_compose_["compose"])(context_withBlockEditContext(function (_ref2) { |
|
var clientId = _ref2.clientId; |
|
return { |
|
clientId: clientId |
|
}; |
|
}), Object(external_this_wp_viewport_["withViewportMatch"])({ |
|
isLargeViewport: 'medium' |
|
}), Object(external_this_wp_data_["withSelect"])(function (select, _ref3) { |
|
var clientId = _ref3.clientId, |
|
isLargeViewport = _ref3.isLargeViewport, |
|
isCollapsed = _ref3.isCollapsed; |
|
|
|
var _select = select('core/editor'), |
|
getBlockRootClientId = _select.getBlockRootClientId, |
|
getEditorSettings = _select.getEditorSettings; |
|
|
|
return { |
|
wideControlsEnabled: select('core/editor').getEditorSettings().alignWide, |
|
isCollapsed: isCollapsed || !isLargeViewport || !getEditorSettings().hasFixedToolbar && getBlockRootClientId(clientId) |
|
}; |
|
}))(BlockAlignmentToolbar)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-controls/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var _createSlotFill = Object(external_this_wp_components_["createSlotFill"])('BlockControls'), |
|
Fill = _createSlotFill.Fill, |
|
Slot = _createSlotFill.Slot; |
|
|
|
var block_controls_BlockControlsFill = function BlockControlsFill(_ref) { |
|
var controls = _ref.controls, |
|
children = _ref.children; |
|
return Object(external_this_wp_element_["createElement"])(Fill, null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Toolbar"], { |
|
controls: controls |
|
}), children); |
|
}; |
|
|
|
var BlockControls = ifBlockEditSelected(block_controls_BlockControlsFill); |
|
BlockControls.Slot = Slot; |
|
/* harmony default export */ var block_controls = (BlockControls); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-edit/edit.js |
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
var edit_Edit = function Edit(props) { |
|
var _props$attributes = props.attributes, |
|
attributes = _props$attributes === void 0 ? {} : _props$attributes, |
|
name = props.name; |
|
var blockType = Object(external_this_wp_blocks_["getBlockType"])(name); |
|
|
|
if (!blockType) { |
|
return null; |
|
} // Generate a class name for the block's editable form |
|
|
|
|
|
var generatedClassName = Object(external_this_wp_blocks_["hasBlockSupport"])(blockType, 'className', true) ? Object(external_this_wp_blocks_["getBlockDefaultClassName"])(name) : null; |
|
var className = classnames_default()(generatedClassName, attributes.className); // `edit` and `save` are functions or components describing the markup |
|
// with which a block is displayed. If `blockType` is valid, assign |
|
// them preferentially as the render value for the block. |
|
|
|
var Component = blockType.edit || blockType.save; |
|
return Object(external_this_wp_element_["createElement"])(Component, Object(esm_extends["a" /* default */])({}, props, { |
|
className: className |
|
})); |
|
}; |
|
/* harmony default export */ var edit = (Object(external_this_wp_components_["withFilters"])('editor.BlockEdit')(edit_Edit)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-edit/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
var block_edit_BlockEdit = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockEdit, _Component); |
|
|
|
function BlockEdit(props) { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, BlockEdit); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockEdit).call(this, props)); |
|
_this.setFocusedElement = _this.setFocusedElement.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.state = { |
|
focusedElement: null, |
|
setFocusedElement: _this.setFocusedElement |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockEdit, [{ |
|
key: "setFocusedElement", |
|
value: function setFocusedElement(focusedElement) { |
|
this.setState(function (prevState) { |
|
if (prevState.focusedElement === focusedElement) { |
|
return null; |
|
} |
|
|
|
return { |
|
focusedElement: focusedElement |
|
}; |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
return Object(external_this_wp_element_["createElement"])(context_Provider, { |
|
value: this.state |
|
}, Object(external_this_wp_element_["createElement"])(edit, this.props)); |
|
} |
|
}], [{ |
|
key: "getDerivedStateFromProps", |
|
value: function getDerivedStateFromProps(props) { |
|
var clientId = props.clientId, |
|
name = props.name, |
|
isSelected = props.isSelected; |
|
return { |
|
name: name, |
|
isSelected: isSelected, |
|
clientId: clientId |
|
}; |
|
} |
|
}]); |
|
|
|
return BlockEdit; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var block_edit = (block_edit_BlockEdit); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-format-controls/index.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var block_format_controls_createSlotFill = Object(external_this_wp_components_["createSlotFill"])('BlockFormatControls'), |
|
block_format_controls_Fill = block_format_controls_createSlotFill.Fill, |
|
block_format_controls_Slot = block_format_controls_createSlotFill.Slot; |
|
|
|
var BlockFormatControls = ifBlockEditSelected(block_format_controls_Fill); |
|
BlockFormatControls.Slot = block_format_controls_Slot; |
|
/* harmony default export */ var block_format_controls = (BlockFormatControls); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","keycodes"]} |
|
var external_this_wp_keycodes_ = __webpack_require__(17); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-navigation/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
function BlockNavigationList(_ref) { |
|
var blocks = _ref.blocks, |
|
selectedBlockClientId = _ref.selectedBlockClientId, |
|
selectBlock = _ref.selectBlock, |
|
showNestedBlocks = _ref.showNestedBlocks; |
|
return ( |
|
/* |
|
* Disable reason: The `list` ARIA role is redundant but |
|
* Safari+VoiceOver won't announce the list otherwise. |
|
*/ |
|
|
|
/* eslint-disable jsx-a11y/no-redundant-roles */ |
|
Object(external_this_wp_element_["createElement"])("ul", { |
|
className: "editor-block-navigation__list", |
|
role: "list" |
|
}, Object(external_lodash_["map"])(blocks, function (block) { |
|
var blockType = Object(external_this_wp_blocks_["getBlockType"])(block.name); |
|
var isSelected = block.clientId === selectedBlockClientId; |
|
return Object(external_this_wp_element_["createElement"])("li", { |
|
key: block.clientId |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-navigation__item" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
className: classnames_default()('editor-block-navigation__item-button', { |
|
'is-selected': block.clientId === selectedBlockClientId |
|
}), |
|
onClick: function onClick() { |
|
return selectBlock(block.clientId); |
|
}, |
|
isSelected: isSelected |
|
}, Object(external_this_wp_element_["createElement"])(BlockIcon, { |
|
icon: blockType.icon, |
|
showColors: true |
|
}), blockType.title, isSelected && Object(external_this_wp_element_["createElement"])("span", { |
|
className: "screen-reader-text" |
|
}, Object(external_this_wp_i18n_["__"])('(selected block)')))), showNestedBlocks && !!block.innerBlocks && !!block.innerBlocks.length && Object(external_this_wp_element_["createElement"])(BlockNavigationList, { |
|
blocks: block.innerBlocks, |
|
selectedBlockClientId: selectedBlockClientId, |
|
selectBlock: selectBlock, |
|
showNestedBlocks: true |
|
})); |
|
})) |
|
/* eslint-enable jsx-a11y/no-redundant-roles */ |
|
|
|
); |
|
} |
|
|
|
function BlockNavigation(_ref2) { |
|
var rootBlock = _ref2.rootBlock, |
|
rootBlocks = _ref2.rootBlocks, |
|
selectedBlockClientId = _ref2.selectedBlockClientId, |
|
selectBlock = _ref2.selectBlock; |
|
|
|
if (!rootBlocks || rootBlocks.length === 0) { |
|
return null; |
|
} |
|
|
|
var hasHierarchy = rootBlock && (rootBlock.clientId !== selectedBlockClientId || rootBlock.innerBlocks && rootBlock.innerBlocks.length !== 0); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["NavigableMenu"], { |
|
role: "presentation", |
|
className: "editor-block-navigation__container" |
|
}, Object(external_this_wp_element_["createElement"])("p", { |
|
className: "editor-block-navigation__label" |
|
}, Object(external_this_wp_i18n_["__"])('Block Navigation')), hasHierarchy && Object(external_this_wp_element_["createElement"])(BlockNavigationList, { |
|
blocks: [rootBlock], |
|
selectedBlockClientId: selectedBlockClientId, |
|
selectBlock: selectBlock, |
|
showNestedBlocks: true |
|
}), !hasHierarchy && Object(external_this_wp_element_["createElement"])(BlockNavigationList, { |
|
blocks: rootBlocks, |
|
selectedBlockClientId: selectedBlockClientId, |
|
selectBlock: selectBlock |
|
})); |
|
} |
|
|
|
/* harmony default export */ var block_navigation = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getSelectedBlockClientId = _select.getSelectedBlockClientId, |
|
getBlockHierarchyRootClientId = _select.getBlockHierarchyRootClientId, |
|
getBlock = _select.getBlock, |
|
getBlocks = _select.getBlocks; |
|
|
|
var selectedBlockClientId = getSelectedBlockClientId(); |
|
return { |
|
rootBlocks: getBlocks(), |
|
rootBlock: selectedBlockClientId ? getBlock(getBlockHierarchyRootClientId(selectedBlockClientId)) : null, |
|
selectedBlockClientId: selectedBlockClientId |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, _ref3) { |
|
var _ref3$onSelect = _ref3.onSelect, |
|
onSelect = _ref3$onSelect === void 0 ? external_lodash_["noop"] : _ref3$onSelect; |
|
return { |
|
selectBlock: function selectBlock(clientId) { |
|
dispatch('core/editor').selectBlock(clientId); |
|
onSelect(clientId); |
|
} |
|
}; |
|
}))(BlockNavigation)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-navigation/dropdown.js |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
var MenuIcon = Object(external_this_wp_element_["createElement"])(external_this_wp_components_["SVG"], { |
|
xmlns: "http://www.w3.org/2000/svg", |
|
viewBox: "0 0 24 24", |
|
width: "20", |
|
height: "20" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Path"], { |
|
d: "M5 5H3v2h2V5zm3 8h11v-2H8v2zm9-8H6v2h11V5zM7 11H5v2h2v-2zm0 8h2v-2H7v2zm3-2v2h11v-2H10z" |
|
})); |
|
|
|
function BlockNavigationDropdown(_ref) { |
|
var hasBlocks = _ref.hasBlocks; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Dropdown"], { |
|
renderToggle: function renderToggle(_ref2) { |
|
var isOpen = _ref2.isOpen, |
|
onToggle = _ref2.onToggle; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["KeyboardShortcuts"], { |
|
bindGlobal: true, |
|
shortcuts: Object(defineProperty["a" /* default */])({}, external_this_wp_keycodes_["rawShortcut"].access('o'), onToggle) |
|
}), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
icon: MenuIcon, |
|
"aria-expanded": isOpen, |
|
onClick: hasBlocks ? onToggle : undefined, |
|
label: Object(external_this_wp_i18n_["__"])('Block Navigation'), |
|
className: "editor-block-navigation", |
|
shortcut: external_this_wp_keycodes_["displayShortcut"].access('o'), |
|
"aria-disabled": !hasBlocks |
|
})); |
|
}, |
|
renderContent: function renderContent(_ref4) { |
|
var onClose = _ref4.onClose; |
|
return Object(external_this_wp_element_["createElement"])(block_navigation, { |
|
onSelect: onClose |
|
}); |
|
} |
|
}); |
|
} |
|
|
|
/* harmony default export */ var dropdown = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
hasBlocks: !!select('core/editor').getBlockCount() |
|
}; |
|
})(BlockNavigationDropdown)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/color-palette/with-color-context.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/* harmony default export */ var with_color_context = (Object(external_this_wp_compose_["createHigherOrderComponent"])(Object(external_this_wp_data_["withSelect"])(function (select, ownProps) { |
|
var settings = select('core/editor').getEditorSettings(); |
|
var colors = ownProps.colors === undefined ? settings.colors : ownProps.colors; |
|
var disableCustomColors = ownProps.disableCustomColors === undefined ? settings.disableCustomColors : ownProps.disableCustomColors; |
|
return { |
|
colors: colors, |
|
disableCustomColors: disableCustomColors, |
|
hasColorsToChoose: !Object(external_lodash_["isEmpty"])(colors) || !disableCustomColors |
|
}; |
|
}), 'withColorContext')); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/color-palette/index.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/* harmony default export */ var color_palette = (with_color_context(external_this_wp_components_["ColorPalette"])); |
|
|
|
// EXTERNAL MODULE: ./node_modules/tinycolor2/tinycolor.js |
|
var tinycolor = __webpack_require__(45); |
|
var tinycolor_default = /*#__PURE__*/__webpack_require__.n(tinycolor); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/colors/utils.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Provided an array of color objects as set by the theme or by the editor defaults, |
|
* and the values of the defined color or custom color returns a color object describing the color. |
|
* |
|
* @param {Array} colors Array of color objects as set by the theme or by the editor defaults. |
|
* @param {?string} definedColor A string containing the color slug. |
|
* @param {?string} customColor A string containing the customColor value. |
|
* |
|
* @return {?string} If definedColor is passed and the name is found in colors, |
|
* the color object exactly as set by the theme or editor defaults is returned. |
|
* Otherwise, an object that just sets the color is defined. |
|
*/ |
|
|
|
var utils_getColorObjectByAttributeValues = function getColorObjectByAttributeValues(colors, definedColor, customColor) { |
|
if (definedColor) { |
|
var colorObj = Object(external_lodash_["find"])(colors, { |
|
slug: definedColor |
|
}); |
|
|
|
if (colorObj) { |
|
return colorObj; |
|
} |
|
} |
|
|
|
return { |
|
color: customColor |
|
}; |
|
}; |
|
/** |
|
* Provided an array of color objects as set by the theme or by the editor defaults, and a color value returns the color object matching that value or undefined. |
|
* |
|
* @param {Array} colors Array of color objects as set by the theme or by the editor defaults. |
|
* @param {?string} colorValue A string containing the color value. |
|
* |
|
* @return {?string} Returns the color object included in the colors array whose color property equals colorValue. |
|
* Returns undefined if no color object matches this requirement. |
|
*/ |
|
|
|
var utils_getColorObjectByColorValue = function getColorObjectByColorValue(colors, colorValue) { |
|
return Object(external_lodash_["find"])(colors, { |
|
color: colorValue |
|
}); |
|
}; |
|
/** |
|
* Returns a class based on the context a color is being used and its slug. |
|
* |
|
* @param {string} colorContextName Context/place where color is being used e.g: background, text etc... |
|
* @param {string} colorSlug Slug of the color. |
|
* |
|
* @return {string} String with the class corresponding to the color in the provided context. |
|
*/ |
|
|
|
function getColorClassName(colorContextName, colorSlug) { |
|
if (!colorContextName || !colorSlug) { |
|
return; |
|
} |
|
|
|
return "has-".concat(Object(external_lodash_["kebabCase"])(colorSlug), "-").concat(colorContextName); |
|
} |
|
/** |
|
* Given an array of color objects and a color value returns the color value of the most readable color in the array. |
|
* |
|
* @param {Array} colors Array of color objects as set by the theme or by the editor defaults. |
|
* @param {?string} colorValue A string containing the color value. |
|
* |
|
* @return {string} String with the color value of the most readable color. |
|
*/ |
|
|
|
function utils_getMostReadableColor(colors, colorValue) { |
|
return tinycolor_default.a.mostReadable(colorValue, Object(external_lodash_["map"])(colors, 'color')).toHexString(); |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/colors/with-colors.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
var DEFAULT_COLORS = []; |
|
/** |
|
* Higher-order component, which handles color logic for class generation |
|
* color value, retrieval and color attribute setting. |
|
* |
|
* @param {...(object|string)} args The arguments can be strings or objects. If the argument is an object, |
|
* it should contain the color attribute name as key and the color context as value. |
|
* If the argument is a string the value should be the color attribute name, |
|
* the color context is computed by applying a kebab case transform to the value. |
|
* Color context represents the context/place where the color is going to be used. |
|
* The class name of the color is generated using 'has' followed by the color name |
|
* and ending with the color context all in kebab case e.g: has-green-background-color. |
|
* |
|
* |
|
* @return {Function} Higher-order component. |
|
*/ |
|
|
|
/* harmony default export */ var with_colors = (function () { |
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { |
|
args[_key] = arguments[_key]; |
|
} |
|
|
|
var colorMap = Object(external_lodash_["reduce"])(args, function (colorObject, arg) { |
|
return Object(objectSpread["a" /* default */])({}, colorObject, Object(external_lodash_["isString"])(arg) ? Object(defineProperty["a" /* default */])({}, arg, Object(external_lodash_["kebabCase"])(arg)) : arg); |
|
}, {}); |
|
return Object(external_this_wp_compose_["createHigherOrderComponent"])(Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var settings = select('core/editor').getEditorSettings(); |
|
return { |
|
colors: Object(external_lodash_["get"])(settings, ['colors'], DEFAULT_COLORS) |
|
}; |
|
}), function (WrappedComponent) { |
|
return ( |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(_class, _Component); |
|
|
|
function _class(props) { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, _class); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(_class).call(this, props)); |
|
_this.setters = _this.createSetters(); |
|
_this.colorUtils = { |
|
getMostReadableColor: _this.getMostReadableColor.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))) |
|
}; |
|
_this.state = {}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(_class, [{ |
|
key: "getMostReadableColor", |
|
value: function getMostReadableColor(colorValue) { |
|
var colors = this.props.colors; |
|
return utils_getMostReadableColor(colors, colorValue); |
|
} |
|
}, { |
|
key: "createSetters", |
|
value: function createSetters() { |
|
var _this2 = this; |
|
|
|
return Object(external_lodash_["reduce"])(colorMap, function (settersAccumulator, colorContext, colorAttributeName) { |
|
var upperFirstColorAttributeName = Object(external_lodash_["upperFirst"])(colorAttributeName); |
|
var customColorAttributeName = "custom".concat(upperFirstColorAttributeName); |
|
settersAccumulator["set".concat(upperFirstColorAttributeName)] = _this2.createSetColor(colorAttributeName, customColorAttributeName); |
|
return settersAccumulator; |
|
}, {}); |
|
} |
|
}, { |
|
key: "createSetColor", |
|
value: function createSetColor(colorAttributeName, customColorAttributeName) { |
|
var _this3 = this; |
|
|
|
return function (colorValue) { |
|
var _this3$props$setAttri; |
|
|
|
var colorObject = utils_getColorObjectByColorValue(_this3.props.colors, colorValue); |
|
|
|
_this3.props.setAttributes((_this3$props$setAttri = {}, Object(defineProperty["a" /* default */])(_this3$props$setAttri, colorAttributeName, colorObject && colorObject.slug ? colorObject.slug : undefined), Object(defineProperty["a" /* default */])(_this3$props$setAttri, customColorAttributeName, colorObject && colorObject.slug ? undefined : colorValue), _this3$props$setAttri)); |
|
}; |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
return Object(external_this_wp_element_["createElement"])(WrappedComponent, Object(objectSpread["a" /* default */])({}, this.props, { |
|
colors: undefined |
|
}, this.state, this.setters, { |
|
colorUtils: this.colorUtils |
|
})); |
|
} |
|
}], [{ |
|
key: "getDerivedStateFromProps", |
|
value: function getDerivedStateFromProps(_ref2, previousState) { |
|
var attributes = _ref2.attributes, |
|
colors = _ref2.colors; |
|
return Object(external_lodash_["reduce"])(colorMap, function (newState, colorContext, colorAttributeName) { |
|
var colorObject = utils_getColorObjectByAttributeValues(colors, attributes[colorAttributeName], attributes["custom".concat(Object(external_lodash_["upperFirst"])(colorAttributeName))]); |
|
var previousColorObject = previousState[colorAttributeName]; |
|
var previousColor = Object(external_lodash_["get"])(previousColorObject, ['color']); |
|
/** |
|
* The "and previousColorObject" condition checks that a previous color object was already computed. |
|
* At the start previousColorObject and colorValue are both equal to undefined |
|
* bus as previousColorObject does not exist we should compute the object. |
|
*/ |
|
|
|
if (previousColor === colorObject.color && previousColorObject) { |
|
newState[colorAttributeName] = previousColorObject; |
|
} else { |
|
newState[colorAttributeName] = Object(objectSpread["a" /* default */])({}, colorObject, { |
|
class: getColorClassName(colorContext, colorObject.slug) |
|
}); |
|
} |
|
|
|
return newState; |
|
}, {}); |
|
} |
|
}]); |
|
|
|
return _class; |
|
}(external_this_wp_element_["Component"]) |
|
); |
|
}]), 'withColors'); |
|
}); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/colors/index.js |
|
|
|
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/contrast-checker/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
function ContrastChecker(_ref) { |
|
var backgroundColor = _ref.backgroundColor, |
|
fallbackBackgroundColor = _ref.fallbackBackgroundColor, |
|
fallbackTextColor = _ref.fallbackTextColor, |
|
fontSize = _ref.fontSize, |
|
isLargeText = _ref.isLargeText, |
|
textColor = _ref.textColor; |
|
|
|
if (!(backgroundColor || fallbackBackgroundColor) || !(textColor || fallbackTextColor)) { |
|
return null; |
|
} |
|
|
|
var tinyBackgroundColor = tinycolor_default()(backgroundColor || fallbackBackgroundColor); |
|
var tinyTextColor = tinycolor_default()(textColor || fallbackTextColor); |
|
var hasTransparency = tinyBackgroundColor.getAlpha() !== 1 || tinyTextColor.getAlpha() !== 1; |
|
|
|
if (hasTransparency || tinycolor_default.a.isReadable(tinyBackgroundColor, tinyTextColor, { |
|
level: 'AA', |
|
size: isLargeText || isLargeText !== false && fontSize >= 24 ? 'large' : 'small' |
|
})) { |
|
return null; |
|
} |
|
|
|
var msg = tinyBackgroundColor.getBrightness() < tinyTextColor.getBrightness() ? Object(external_this_wp_i18n_["__"])('This color combination may be hard for people to read. Try using a darker background color and/or a brighter text color.') : Object(external_this_wp_i18n_["__"])('This color combination may be hard for people to read. Try using a brighter background color and/or a darker text color.'); |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-contrast-checker" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Notice"], { |
|
status: "warning", |
|
isDismissible: false |
|
}, msg)); |
|
} |
|
|
|
/* harmony default export */ var contrast_checker = (ContrastChecker); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/font-sizes/utils.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* Returns the font size object based on an array of named font sizes and the namedFontSize and customFontSize values. |
|
* If namedFontSize is undefined or not found in fontSizes an object with just the size value based on customFontSize is returned. |
|
* |
|
* @param {Array} fontSizes Array of font size objects containing at least the "name" and "size" values as properties. |
|
* @param {?string} fontSizeAttribute Content of the font size attribute (slug). |
|
* @param {?number} customFontSizeAttribute Contents of the custom font size attribute (value). |
|
* |
|
* @return {?string} If fontSizeAttribute is set and an equal slug is found in fontSizes it returns the font size object for that slug. |
|
* Otherwise, an object with just the size value based on customFontSize is returned. |
|
*/ |
|
|
|
var utils_getFontSize = function getFontSize(fontSizes, fontSizeAttribute, customFontSizeAttribute) { |
|
if (fontSizeAttribute) { |
|
var fontSizeObject = Object(external_lodash_["find"])(fontSizes, { |
|
slug: fontSizeAttribute |
|
}); |
|
|
|
if (fontSizeObject) { |
|
return fontSizeObject; |
|
} |
|
} |
|
|
|
return { |
|
size: customFontSizeAttribute |
|
}; |
|
}; |
|
/** |
|
* Returns a class based on fontSizeName. |
|
* |
|
* @param {string} fontSizeSlug Slug of the fontSize. |
|
* |
|
* @return {string} String with the class corresponding to the fontSize passed. |
|
* The class is generated by appending 'has-' followed by fontSizeSlug in kebabCase and ending with '-font-size'. |
|
*/ |
|
|
|
function getFontSizeClass(fontSizeSlug) { |
|
if (!fontSizeSlug) { |
|
return; |
|
} |
|
|
|
return "has-".concat(Object(external_lodash_["kebabCase"])(fontSizeSlug), "-font-size"); |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/font-sizes/font-size-picker.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
/* harmony default export */ var font_size_picker = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select$getEditorSett = select('core/editor').getEditorSettings(), |
|
disableCustomFontSizes = _select$getEditorSett.disableCustomFontSizes, |
|
fontSizes = _select$getEditorSett.fontSizes; |
|
|
|
return { |
|
disableCustomFontSizes: disableCustomFontSizes, |
|
fontSizes: fontSizes |
|
}; |
|
})(external_this_wp_components_["FontSizePicker"])); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/font-sizes/with-font-sizes.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Higher-order component, which handles font size logic for class generation, |
|
* font size value retrieval, and font size change handling. |
|
* |
|
* @param {...(object|string)} args The arguments should all be strings |
|
* Each string contains the font size attribute name e.g: 'fontSize'. |
|
* |
|
* @return {Function} Higher-order component. |
|
*/ |
|
|
|
/* harmony default export */ var with_font_sizes = (function () { |
|
for (var _len = arguments.length, fontSizeNames = new Array(_len), _key = 0; _key < _len; _key++) { |
|
fontSizeNames[_key] = arguments[_key]; |
|
} |
|
|
|
/* |
|
* Computes an object whose key is the font size attribute name as passed in the array, |
|
* and the value is the custom font size attribute name. |
|
* Custom font size is automatically compted by appending custom followed by the font size attribute name in with the first letter capitalized. |
|
*/ |
|
var fontSizeAttributeNames = Object(external_lodash_["reduce"])(fontSizeNames, function (fontSizeAttributeNamesAccumulator, fontSizeAttributeName) { |
|
fontSizeAttributeNamesAccumulator[fontSizeAttributeName] = "custom".concat(Object(external_lodash_["upperFirst"])(fontSizeAttributeName)); |
|
return fontSizeAttributeNamesAccumulator; |
|
}, {}); |
|
return Object(external_this_wp_compose_["createHigherOrderComponent"])(Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select$getEditorSett = select('core/editor').getEditorSettings(), |
|
fontSizes = _select$getEditorSett.fontSizes; |
|
|
|
return { |
|
fontSizes: fontSizes |
|
}; |
|
}), function (WrappedComponent) { |
|
return ( |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(_class, _Component); |
|
|
|
function _class(props) { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, _class); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(_class).call(this, props)); |
|
_this.setters = _this.createSetters(); |
|
_this.state = {}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(_class, [{ |
|
key: "createSetters", |
|
value: function createSetters() { |
|
var _this2 = this; |
|
|
|
return Object(external_lodash_["reduce"])(fontSizeAttributeNames, function (settersAccumulator, customFontSizeAttributeName, fontSizeAttributeName) { |
|
var upperFirstFontSizeAttributeName = Object(external_lodash_["upperFirst"])(fontSizeAttributeName); |
|
settersAccumulator["set".concat(upperFirstFontSizeAttributeName)] = _this2.createSetFontSize(fontSizeAttributeName, customFontSizeAttributeName); |
|
return settersAccumulator; |
|
}, {}); |
|
} |
|
}, { |
|
key: "createSetFontSize", |
|
value: function createSetFontSize(fontSizeAttributeName, customFontSizeAttributeName) { |
|
var _this3 = this; |
|
|
|
return function (fontSizeValue) { |
|
var _this3$props$setAttri; |
|
|
|
var fontSizeObject = Object(external_lodash_["find"])(_this3.props.fontSizes, { |
|
size: fontSizeValue |
|
}); |
|
|
|
_this3.props.setAttributes((_this3$props$setAttri = {}, Object(defineProperty["a" /* default */])(_this3$props$setAttri, fontSizeAttributeName, fontSizeObject && fontSizeObject.slug ? fontSizeObject.slug : undefined), Object(defineProperty["a" /* default */])(_this3$props$setAttri, customFontSizeAttributeName, fontSizeObject && fontSizeObject.slug ? undefined : fontSizeValue), _this3$props$setAttri)); |
|
}; |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
return Object(external_this_wp_element_["createElement"])(WrappedComponent, Object(objectSpread["a" /* default */])({}, this.props, { |
|
fontSizes: undefined |
|
}, this.state, this.setters)); |
|
} |
|
}], [{ |
|
key: "getDerivedStateFromProps", |
|
value: function getDerivedStateFromProps(_ref, previousState) { |
|
var attributes = _ref.attributes, |
|
fontSizes = _ref.fontSizes; |
|
|
|
var didAttributesChange = function didAttributesChange(customFontSizeAttributeName, fontSizeAttributeName) { |
|
if (previousState[fontSizeAttributeName]) { |
|
// if new font size is name compare with the previous slug |
|
if (attributes[fontSizeAttributeName]) { |
|
return attributes[fontSizeAttributeName] !== previousState[fontSizeAttributeName].slug; |
|
} // if font size is not named, update when the font size value changes. |
|
|
|
|
|
return previousState[fontSizeAttributeName].size !== attributes[customFontSizeAttributeName]; |
|
} // in this case we need to build the font size object |
|
|
|
|
|
return true; |
|
}; |
|
|
|
if (!Object(external_lodash_["some"])(fontSizeAttributeNames, didAttributesChange)) { |
|
return null; |
|
} |
|
|
|
var newState = Object(external_lodash_["reduce"])(Object(external_lodash_["pickBy"])(fontSizeAttributeNames, didAttributesChange), function (newStateAccumulator, customFontSizeAttributeName, fontSizeAttributeName) { |
|
var fontSizeAttributeValue = attributes[fontSizeAttributeName]; |
|
var fontSizeObject = utils_getFontSize(fontSizes, fontSizeAttributeValue, attributes[customFontSizeAttributeName]); |
|
newStateAccumulator[fontSizeAttributeName] = Object(objectSpread["a" /* default */])({}, fontSizeObject, { |
|
class: getFontSizeClass(fontSizeAttributeValue) |
|
}); |
|
return newStateAccumulator; |
|
}, {}); |
|
return Object(objectSpread["a" /* default */])({}, previousState, newState); |
|
} |
|
}]); |
|
|
|
return _class; |
|
}(external_this_wp_element_["Component"]) |
|
); |
|
}]), 'withFontSizes'); |
|
}); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/font-sizes/index.js |
|
|
|
|
|
|
|
|
|
// EXTERNAL MODULE: external {"this":["wp","isShallowEqual"]} |
|
var external_this_wp_isShallowEqual_ = __webpack_require__(40); |
|
var external_this_wp_isShallowEqual_default = /*#__PURE__*/__webpack_require__.n(external_this_wp_isShallowEqual_); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","dom"]} |
|
var external_this_wp_dom_ = __webpack_require__(22); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-mover/mover-description.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Return a label for the block movement controls depending on block position. |
|
* |
|
* @param {number} selectedCount Number of blocks selected. |
|
* @param {string} type Block type - in the case of a single block, should |
|
* define its 'type'. I.e. 'Text', 'Heading', 'Image' etc. |
|
* @param {number} firstIndex The index (position - 1) of the first block selected. |
|
* @param {boolean} isFirst This is the first block. |
|
* @param {boolean} isLast This is the last block. |
|
* @param {number} dir Direction of movement (> 0 is considered to be going |
|
* down, < 0 is up). |
|
* |
|
* @return {string} Label for the block movement controls. |
|
*/ |
|
|
|
function getBlockMoverDescription(selectedCount, type, firstIndex, isFirst, isLast, dir) { |
|
var position = firstIndex + 1; |
|
|
|
if (selectedCount > 1) { |
|
return getMultiBlockMoverDescription(selectedCount, firstIndex, isFirst, isLast, dir); |
|
} |
|
|
|
if (isFirst && isLast) { |
|
// translators: %s: Type of block (i.e. Text, Image etc) |
|
return Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["__"])('Block %s is the only block, and cannot be moved'), type); |
|
} |
|
|
|
if (dir > 0 && !isLast) { |
|
// moving down |
|
return Object(external_this_wp_i18n_["sprintf"])( // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position |
|
Object(external_this_wp_i18n_["__"])('Move %1$s block from position %2$d down to position %3$d'), type, position, position + 1); |
|
} |
|
|
|
if (dir > 0 && isLast) { |
|
// moving down, and is the last item |
|
// translators: %s: Type of block (i.e. Text, Image etc) |
|
return Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["__"])('Block %s is at the end of the content and can’t be moved down'), type); |
|
} |
|
|
|
if (dir < 0 && !isFirst) { |
|
// moving up |
|
return Object(external_this_wp_i18n_["sprintf"])( // translators: 1: Type of block (i.e. Text, Image etc), 2: Position of selected block, 3: New position |
|
Object(external_this_wp_i18n_["__"])('Move %1$s block from position %2$d up to position %3$d'), type, position, position - 1); |
|
} |
|
|
|
if (dir < 0 && isFirst) { |
|
// moving up, and is the first item |
|
// translators: %s: Type of block (i.e. Text, Image etc) |
|
return Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["__"])('Block %s is at the beginning of the content and can’t be moved up'), type); |
|
} |
|
} |
|
/** |
|
* Return a label for the block movement controls depending on block position. |
|
* |
|
* @param {number} selectedCount Number of blocks selected. |
|
* @param {number} firstIndex The index (position - 1) of the first block selected. |
|
* @param {boolean} isFirst This is the first block. |
|
* @param {boolean} isLast This is the last block. |
|
* @param {number} dir Direction of movement (> 0 is considered to be going |
|
* down, < 0 is up). |
|
* |
|
* @return {string} Label for the block movement controls. |
|
*/ |
|
|
|
function getMultiBlockMoverDescription(selectedCount, firstIndex, isFirst, isLast, dir) { |
|
var position = firstIndex + 1; |
|
|
|
if (dir < 0 && isFirst) { |
|
return Object(external_this_wp_i18n_["__"])('Blocks cannot be moved up as they are already at the top'); |
|
} |
|
|
|
if (dir > 0 && isLast) { |
|
return Object(external_this_wp_i18n_["__"])('Blocks cannot be moved down as they are already at the bottom'); |
|
} |
|
|
|
if (dir < 0 && !isFirst) { |
|
return Object(external_this_wp_i18n_["sprintf"])( // translators: 1: Number of selected blocks, 2: Position of selected blocks |
|
Object(external_this_wp_i18n_["_n"])('Move %1$d block from position %2$d up by one place', 'Move %1$d blocks from position %2$d up by one place', selectedCount), selectedCount, position); |
|
} |
|
|
|
if (dir > 0 && !isLast) { |
|
return Object(external_this_wp_i18n_["sprintf"])( // translators: 1: Number of selected blocks, 2: Position of selected blocks |
|
Object(external_this_wp_i18n_["_n"])('Move %1$d block from position %2$d down by one place', 'Move %1$d blocks from position %2$d down by one place', selectedCount), selectedCount, position); |
|
} |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-mover/icons.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
var upArrow = Object(external_this_wp_element_["createElement"])(external_this_wp_components_["SVG"], { |
|
width: "18", |
|
height: "18", |
|
xmlns: "http://www.w3.org/2000/svg", |
|
viewBox: "0 0 18 18" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Polygon"], { |
|
points: "9,4.5 3.3,10.1 4.8,11.5 9,7.3 13.2,11.5 14.7,10.1 " |
|
})); |
|
var downArrow = Object(external_this_wp_element_["createElement"])(external_this_wp_components_["SVG"], { |
|
width: "18", |
|
height: "18", |
|
xmlns: "http://www.w3.org/2000/svg", |
|
viewBox: "0 0 18 18" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Polygon"], { |
|
points: "9,13.5 14.7,7.9 13.2,6.5 9,10.7 4.8,6.5 3.3,7.9 " |
|
})); |
|
var dragHandle = Object(external_this_wp_element_["createElement"])(external_this_wp_components_["SVG"], { |
|
width: "18", |
|
height: "18", |
|
xmlns: "http://www.w3.org/2000/svg", |
|
viewBox: "0 0 18 18" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Path"], { |
|
d: "M13,8c0.6,0,1-0.4,1-1s-0.4-1-1-1s-1,0.4-1,1S12.4,8,13,8z M5,6C4.4,6,4,6.4,4,7s0.4,1,1,1s1-0.4,1-1S5.6,6,5,6z M5,10 c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1S5.6,10,5,10z M13,10c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1S13.6,10,13,10z M9,6 C8.4,6,8,6.4,8,7s0.4,1,1,1s1-0.4,1-1S9.6,6,9,6z M9,10c-0.6,0-1,0.4-1,1s0.4,1,1,1s1-0.4,1-1S9.6,10,9,10z" |
|
})); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-draggable/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
var block_draggable_BlockDraggable = function BlockDraggable(_ref) { |
|
var children = _ref.children, |
|
clientId = _ref.clientId, |
|
rootClientId = _ref.rootClientId, |
|
blockElementId = _ref.blockElementId, |
|
index = _ref.index, |
|
onDragStart = _ref.onDragStart, |
|
onDragEnd = _ref.onDragEnd; |
|
var transferData = { |
|
type: 'block', |
|
srcIndex: index, |
|
srcRootClientId: rootClientId, |
|
srcClientId: clientId |
|
}; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Draggable"], { |
|
elementId: blockElementId, |
|
transferData: transferData, |
|
onDragStart: onDragStart, |
|
onDragEnd: onDragEnd |
|
}, function (_ref2) { |
|
var onDraggableStart = _ref2.onDraggableStart, |
|
onDraggableEnd = _ref2.onDraggableEnd; |
|
return children({ |
|
onDraggableStart: onDraggableStart, |
|
onDraggableEnd: onDraggableEnd |
|
}); |
|
}); |
|
}; |
|
|
|
/* harmony default export */ var block_draggable = (Object(external_this_wp_data_["withSelect"])(function (select, _ref3) { |
|
var clientId = _ref3.clientId; |
|
|
|
var _select = select('core/editor'), |
|
getBlockIndex = _select.getBlockIndex, |
|
getBlockRootClientId = _select.getBlockRootClientId; |
|
|
|
return { |
|
index: getBlockIndex(clientId), |
|
rootClientId: getBlockRootClientId(clientId) |
|
}; |
|
})(block_draggable_BlockDraggable)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-mover/drag-handle.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
var drag_handle_IconDragHandle = function IconDragHandle(_ref) { |
|
var isVisible = _ref.isVisible, |
|
className = _ref.className, |
|
icon = _ref.icon, |
|
onDragStart = _ref.onDragStart, |
|
onDragEnd = _ref.onDragEnd, |
|
blockElementId = _ref.blockElementId, |
|
clientId = _ref.clientId; |
|
|
|
if (!isVisible) { |
|
return null; |
|
} |
|
|
|
var dragHandleClassNames = classnames_default()('editor-block-mover__control-drag-handle', className); |
|
return Object(external_this_wp_element_["createElement"])(block_draggable, { |
|
clientId: clientId, |
|
blockElementId: blockElementId, |
|
onDragStart: onDragStart, |
|
onDragEnd: onDragEnd |
|
}, function (_ref2) { |
|
var onDraggableStart = _ref2.onDraggableStart, |
|
onDraggableEnd = _ref2.onDraggableEnd; |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: dragHandleClassNames, |
|
"aria-hidden": "true", |
|
onDragStart: onDraggableStart, |
|
onDragEnd: onDraggableEnd, |
|
draggable: true |
|
}, icon); |
|
}); |
|
}; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-mover/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
var block_mover_BlockMover = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockMover, _Component); |
|
|
|
function BlockMover() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, BlockMover); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockMover).apply(this, arguments)); |
|
_this.state = { |
|
isFocused: false |
|
}; |
|
_this.onFocus = _this.onFocus.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onBlur = _this.onBlur.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockMover, [{ |
|
key: "onFocus", |
|
value: function onFocus() { |
|
this.setState({ |
|
isFocused: true |
|
}); |
|
} |
|
}, { |
|
key: "onBlur", |
|
value: function onBlur() { |
|
this.setState({ |
|
isFocused: false |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
onMoveUp = _this$props.onMoveUp, |
|
onMoveDown = _this$props.onMoveDown, |
|
isFirst = _this$props.isFirst, |
|
isLast = _this$props.isLast, |
|
isDraggable = _this$props.isDraggable, |
|
onDragStart = _this$props.onDragStart, |
|
onDragEnd = _this$props.onDragEnd, |
|
clientIds = _this$props.clientIds, |
|
blockElementId = _this$props.blockElementId, |
|
blockType = _this$props.blockType, |
|
firstIndex = _this$props.firstIndex, |
|
isLocked = _this$props.isLocked, |
|
instanceId = _this$props.instanceId, |
|
isHidden = _this$props.isHidden; |
|
var isFocused = this.state.isFocused; |
|
var blocksCount = Object(external_lodash_["castArray"])(clientIds).length; |
|
|
|
if (isLocked || isFirst && isLast) { |
|
return null; |
|
} // We emulate a disabled state because forcefully applying the `disabled` |
|
// attribute on the button while it has focus causes the screen to change |
|
// to an unfocused state (body as active element) without firing blur on, |
|
// the rendering parent, leaving it unable to react to focus out. |
|
|
|
|
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: classnames_default()('editor-block-mover', { |
|
'is-visible': isFocused || !isHidden |
|
}) |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
className: "editor-block-mover__control", |
|
onClick: isFirst ? null : onMoveUp, |
|
icon: upArrow, |
|
label: Object(external_this_wp_i18n_["__"])('Move up'), |
|
"aria-describedby": "editor-block-mover__up-description-".concat(instanceId), |
|
"aria-disabled": isFirst, |
|
onFocus: this.onFocus, |
|
onBlur: this.onBlur |
|
}), Object(external_this_wp_element_["createElement"])(drag_handle_IconDragHandle, { |
|
className: "editor-block-mover__control", |
|
icon: dragHandle, |
|
clientId: clientIds, |
|
blockElementId: blockElementId, |
|
isVisible: isDraggable, |
|
onDragStart: onDragStart, |
|
onDragEnd: onDragEnd |
|
}), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
className: "editor-block-mover__control", |
|
onClick: isLast ? null : onMoveDown, |
|
icon: downArrow, |
|
label: Object(external_this_wp_i18n_["__"])('Move down'), |
|
"aria-describedby": "editor-block-mover__down-description-".concat(instanceId), |
|
"aria-disabled": isLast, |
|
onFocus: this.onFocus, |
|
onBlur: this.onBlur |
|
}), Object(external_this_wp_element_["createElement"])("span", { |
|
id: "editor-block-mover__up-description-".concat(instanceId), |
|
className: "editor-block-mover__description" |
|
}, getBlockMoverDescription(blocksCount, blockType && blockType.title, firstIndex, isFirst, isLast, -1)), Object(external_this_wp_element_["createElement"])("span", { |
|
id: "editor-block-mover__down-description-".concat(instanceId), |
|
className: "editor-block-mover__description" |
|
}, getBlockMoverDescription(blocksCount, blockType && blockType.title, firstIndex, isFirst, isLast, 1))); |
|
} |
|
}]); |
|
|
|
return BlockMover; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var block_mover = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select, _ref) { |
|
var clientIds = _ref.clientIds; |
|
|
|
var _select = select('core/editor'), |
|
getBlock = _select.getBlock, |
|
getBlockIndex = _select.getBlockIndex, |
|
getTemplateLock = _select.getTemplateLock, |
|
getBlockRootClientId = _select.getBlockRootClientId; |
|
|
|
var firstClientId = Object(external_lodash_["first"])(Object(external_lodash_["castArray"])(clientIds)); |
|
var block = getBlock(firstClientId); |
|
var rootClientId = getBlockRootClientId(Object(external_lodash_["first"])(Object(external_lodash_["castArray"])(clientIds))); |
|
return { |
|
firstIndex: getBlockIndex(firstClientId, rootClientId), |
|
blockType: block ? Object(external_this_wp_blocks_["getBlockType"])(block.name) : null, |
|
isLocked: getTemplateLock(rootClientId) === 'all', |
|
rootClientId: rootClientId |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, _ref2) { |
|
var clientIds = _ref2.clientIds, |
|
rootClientId = _ref2.rootClientId; |
|
|
|
var _dispatch = dispatch('core/editor'), |
|
moveBlocksDown = _dispatch.moveBlocksDown, |
|
moveBlocksUp = _dispatch.moveBlocksUp; |
|
|
|
return { |
|
onMoveDown: Object(external_lodash_["partial"])(moveBlocksDown, clientIds, rootClientId), |
|
onMoveUp: Object(external_lodash_["partial"])(moveBlocksUp, clientIds, rootClientId) |
|
}; |
|
}), external_this_wp_compose_["withInstanceId"])(block_mover_BlockMover)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/media-upload/check.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
function MediaUploadCheck(_ref) { |
|
var hasUploadPermissions = _ref.hasUploadPermissions, |
|
_ref$fallback = _ref.fallback, |
|
fallback = _ref$fallback === void 0 ? null : _ref$fallback, |
|
children = _ref.children; |
|
return hasUploadPermissions ? children : fallback; |
|
} |
|
/* harmony default export */ var check = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core'), |
|
hasUploadPermissions = _select.hasUploadPermissions; |
|
|
|
return { |
|
hasUploadPermissions: hasUploadPermissions() |
|
}; |
|
})(MediaUploadCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-drop-zone/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External Dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var parseDropEvent = function parseDropEvent(event) { |
|
var result = { |
|
srcRootClientId: null, |
|
srcClientId: null, |
|
srcIndex: null, |
|
type: null |
|
}; |
|
|
|
if (!event.dataTransfer) { |
|
return result; |
|
} |
|
|
|
try { |
|
result = Object.assign(result, JSON.parse(event.dataTransfer.getData('text'))); |
|
} catch (err) { |
|
return result; |
|
} |
|
|
|
return result; |
|
}; |
|
|
|
var block_drop_zone_BlockDropZone = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockDropZone, _Component); |
|
|
|
function BlockDropZone() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, BlockDropZone); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockDropZone).apply(this, arguments)); |
|
_this.onFilesDrop = _this.onFilesDrop.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onHTMLDrop = _this.onHTMLDrop.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onDrop = _this.onDrop.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockDropZone, [{ |
|
key: "getInsertIndex", |
|
value: function getInsertIndex(position) { |
|
var index = this.props.index; |
|
|
|
if (index !== undefined) { |
|
return position.y === 'top' ? index : index + 1; |
|
} |
|
} |
|
}, { |
|
key: "onFilesDrop", |
|
value: function onFilesDrop(files, position) { |
|
var transformation = Object(external_this_wp_blocks_["findTransform"])(Object(external_this_wp_blocks_["getBlockTransforms"])('from'), function (transform) { |
|
return transform.type === 'files' && transform.isMatch(files); |
|
}); |
|
|
|
if (transformation) { |
|
var insertIndex = this.getInsertIndex(position); |
|
var blocks = transformation.transform(files, this.props.updateBlockAttributes); |
|
this.props.insertBlocks(blocks, insertIndex); |
|
} |
|
} |
|
}, { |
|
key: "onHTMLDrop", |
|
value: function onHTMLDrop(HTML, position) { |
|
var blocks = Object(external_this_wp_blocks_["pasteHandler"])({ |
|
HTML: HTML, |
|
mode: 'BLOCKS' |
|
}); |
|
|
|
if (blocks.length) { |
|
this.props.insertBlocks(blocks, this.getInsertIndex(position)); |
|
} |
|
} |
|
}, { |
|
key: "onDrop", |
|
value: function onDrop(event, position) { |
|
var _this$props = this.props, |
|
dstRootClientId = _this$props.rootClientId, |
|
dstClientId = _this$props.clientId, |
|
dstIndex = _this$props.index, |
|
getClientIdsOfDescendants = _this$props.getClientIdsOfDescendants; |
|
|
|
var _parseDropEvent = parseDropEvent(event), |
|
srcRootClientId = _parseDropEvent.srcRootClientId, |
|
srcClientId = _parseDropEvent.srcClientId, |
|
srcIndex = _parseDropEvent.srcIndex, |
|
type = _parseDropEvent.type; |
|
|
|
var isBlockDropType = function isBlockDropType(dropType) { |
|
return dropType === 'block'; |
|
}; |
|
|
|
var isSameLevel = function isSameLevel(srcRoot, dstRoot) { |
|
// Note that rootClientId of top-level blocks will be undefined OR a void string, |
|
// so we also need to account for that case separately. |
|
return srcRoot === dstRoot || !srcRoot === true && !dstRoot === true; |
|
}; |
|
|
|
var isSameBlock = function isSameBlock(src, dst) { |
|
return src === dst; |
|
}; |
|
|
|
var isSrcBlockAnAncestorOfDstBlock = function isSrcBlockAnAncestorOfDstBlock(src, dst) { |
|
return getClientIdsOfDescendants([src]).some(function (id) { |
|
return id === dst; |
|
}); |
|
}; |
|
|
|
if (!isBlockDropType(type) || isSameBlock(srcClientId, dstClientId) || isSrcBlockAnAncestorOfDstBlock(srcClientId, dstClientId)) { |
|
return; |
|
} |
|
|
|
var positionIndex = this.getInsertIndex(position); // If the block is kept at the same level and moved downwards, |
|
// subtract to account for blocks shifting upward to occupy its old position. |
|
|
|
var insertIndex = dstIndex && srcIndex < dstIndex && isSameLevel(srcRootClientId, dstRootClientId) ? positionIndex - 1 : positionIndex; |
|
this.props.moveBlockToPosition(srcClientId, srcRootClientId, insertIndex); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props2 = this.props, |
|
isLocked = _this$props2.isLocked, |
|
index = _this$props2.index; |
|
|
|
if (isLocked) { |
|
return null; |
|
} |
|
|
|
var isAppender = index === undefined; |
|
return Object(external_this_wp_element_["createElement"])(check, null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["DropZone"], { |
|
className: classnames_default()('editor-block-drop-zone', { |
|
'is-appender': isAppender |
|
}), |
|
onFilesDrop: this.onFilesDrop, |
|
onHTMLDrop: this.onHTMLDrop, |
|
onDrop: this.onDrop |
|
})); |
|
} |
|
}]); |
|
|
|
return BlockDropZone; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var block_drop_zone = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withDispatch"])(function (dispatch, ownProps) { |
|
var _dispatch = dispatch('core/editor'), |
|
_insertBlocks = _dispatch.insertBlocks, |
|
_updateBlockAttributes = _dispatch.updateBlockAttributes, |
|
_moveBlockToPosition = _dispatch.moveBlockToPosition; |
|
|
|
return { |
|
insertBlocks: function insertBlocks(blocks, index) { |
|
var rootClientId = ownProps.rootClientId; |
|
|
|
_insertBlocks(blocks, index, rootClientId); |
|
}, |
|
updateBlockAttributes: function updateBlockAttributes() { |
|
_updateBlockAttributes.apply(void 0, arguments); |
|
}, |
|
moveBlockToPosition: function moveBlockToPosition(srcClientId, srcRootClientId, dstIndex) { |
|
var dstRootClientId = ownProps.rootClientId; |
|
|
|
_moveBlockToPosition(srcClientId, srcRootClientId, dstRootClientId, dstIndex); |
|
} |
|
}; |
|
}), Object(external_this_wp_data_["withSelect"])(function (select, _ref) { |
|
var rootClientId = _ref.rootClientId; |
|
|
|
var _select = select('core/editor'), |
|
getClientIdsOfDescendants = _select.getClientIdsOfDescendants, |
|
getTemplateLock = _select.getTemplateLock; |
|
|
|
return { |
|
isLocked: !!getTemplateLock(rootClientId), |
|
getClientIdsOfDescendants: getClientIdsOfDescendants |
|
}; |
|
}), Object(external_this_wp_components_["withFilters"])('editor.BlockDropZone'))(block_drop_zone_BlockDropZone)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/warning/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
function Warning(_ref) { |
|
var className = _ref.className, |
|
actions = _ref.actions, |
|
children = _ref.children, |
|
secondaryActions = _ref.secondaryActions; |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: classnames_default()(className, 'editor-warning') |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-warning__contents" |
|
}, Object(external_this_wp_element_["createElement"])("p", { |
|
className: "editor-warning__message" |
|
}, children), external_this_wp_element_["Children"].count(actions) > 0 && Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-warning__actions" |
|
}, external_this_wp_element_["Children"].map(actions, function (action, i) { |
|
return Object(external_this_wp_element_["createElement"])("span", { |
|
key: i, |
|
className: "editor-warning__action" |
|
}, action); |
|
}))), secondaryActions && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Dropdown"], { |
|
className: "editor-warning__secondary", |
|
position: "bottom left", |
|
renderToggle: function renderToggle(_ref2) { |
|
var isOpen = _ref2.isOpen, |
|
onToggle = _ref2.onToggle; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
icon: "ellipsis", |
|
label: Object(external_this_wp_i18n_["__"])('More options'), |
|
onClick: onToggle, |
|
"aria-expanded": isOpen |
|
}); |
|
}, |
|
renderContent: function renderContent() { |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["MenuGroup"], { |
|
label: Object(external_this_wp_i18n_["__"])('More options') |
|
}, secondaryActions.map(function (item, pos) { |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["MenuItem"], { |
|
onClick: item.onClick, |
|
key: pos |
|
}, item.title); |
|
})); |
|
} |
|
})); |
|
} |
|
|
|
/* harmony default export */ var warning = (Warning); |
|
|
|
// EXTERNAL MODULE: ./node_modules/diff/dist/diff.js |
|
var diff = __webpack_require__(191); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-compare/block-view.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
var block_view_BlockView = function BlockView(_ref) { |
|
var title = _ref.title, |
|
rawContent = _ref.rawContent, |
|
renderedContent = _ref.renderedContent, |
|
action = _ref.action, |
|
actionText = _ref.actionText, |
|
className = _ref.className; |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: className |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-compare__content" |
|
}, Object(external_this_wp_element_["createElement"])("h1", { |
|
className: "editor-block-compare__heading" |
|
}, title), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-compare__html" |
|
}, rawContent), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-compare__preview edit-post-visual-editor" |
|
}, renderedContent)), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-compare__action" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
isLarge: true, |
|
tabIndex: "0", |
|
onClick: action |
|
}, actionText))); |
|
}; |
|
|
|
/* harmony default export */ var block_view = (block_view_BlockView); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-compare/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var block_compare_BlockCompare = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockCompare, _Component); |
|
|
|
function BlockCompare() { |
|
Object(classCallCheck["a" /* default */])(this, BlockCompare); |
|
|
|
return Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockCompare).apply(this, arguments)); |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockCompare, [{ |
|
key: "getDifference", |
|
value: function getDifference(originalContent, newContent) { |
|
var difference = Object(diff["diffChars"])(originalContent, newContent); |
|
return difference.map(function (item, pos) { |
|
var classes = classnames_default()({ |
|
'editor-block-compare__added': item.added, |
|
'editor-block-compare__removed': item.removed |
|
}); |
|
return Object(external_this_wp_element_["createElement"])("span", { |
|
key: pos, |
|
className: classes |
|
}, item.value); |
|
}); |
|
} |
|
}, { |
|
key: "getOriginalContent", |
|
value: function getOriginalContent(block) { |
|
return { |
|
rawContent: block.originalContent, |
|
renderedContent: Object(external_this_wp_blocks_["getSaveElement"])(block.name, block.attributes) |
|
}; |
|
} |
|
}, { |
|
key: "getConvertedContent", |
|
value: function getConvertedContent(block) { |
|
// The convertor may return an array of items or a single item |
|
var newBlocks = Object(external_lodash_["castArray"])(block); // Get converted block details |
|
|
|
var newContent = newBlocks.map(function (item) { |
|
return Object(external_this_wp_blocks_["getSaveContent"])(item.name, item.attributes, item.innerBlocks); |
|
}); |
|
var renderedContent = newBlocks.map(function (item) { |
|
return Object(external_this_wp_blocks_["getSaveElement"])(item.name, item.attributes, item.innerBlocks); |
|
}); |
|
return { |
|
rawContent: newContent.join(''), |
|
renderedContent: renderedContent |
|
}; |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
block = _this$props.block, |
|
onKeep = _this$props.onKeep, |
|
onConvert = _this$props.onConvert, |
|
convertor = _this$props.convertor, |
|
convertButtonText = _this$props.convertButtonText; |
|
var original = this.getOriginalContent(block); |
|
var converted = this.getConvertedContent(convertor(block)); |
|
var difference = this.getDifference(original.rawContent, converted.rawContent); |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-compare__wrapper" |
|
}, Object(external_this_wp_element_["createElement"])(block_view, { |
|
title: Object(external_this_wp_i18n_["__"])('Current'), |
|
className: "editor-block-compare__current", |
|
action: onKeep, |
|
actionText: Object(external_this_wp_i18n_["__"])('Convert to HTML'), |
|
rawContent: original.rawContent, |
|
renderedContent: original.renderedContent |
|
}), Object(external_this_wp_element_["createElement"])(block_view, { |
|
title: Object(external_this_wp_i18n_["__"])('After Conversion'), |
|
className: "editor-block-compare__converted", |
|
action: onConvert, |
|
actionText: convertButtonText, |
|
rawContent: difference, |
|
renderedContent: converted.renderedContent |
|
})); |
|
} |
|
}]); |
|
|
|
return BlockCompare; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var block_compare = (block_compare_BlockCompare); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list/block-invalid-warning.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var block_invalid_warning_BlockInvalidWarning = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockInvalidWarning, _Component); |
|
|
|
function BlockInvalidWarning(props) { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, BlockInvalidWarning); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockInvalidWarning).call(this, props)); |
|
_this.state = { |
|
compare: false |
|
}; |
|
_this.onCompare = _this.onCompare.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onCompareClose = _this.onCompareClose.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockInvalidWarning, [{ |
|
key: "onCompare", |
|
value: function onCompare() { |
|
this.setState({ |
|
compare: true |
|
}); |
|
} |
|
}, { |
|
key: "onCompareClose", |
|
value: function onCompareClose() { |
|
this.setState({ |
|
compare: false |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
convertToHTML = _this$props.convertToHTML, |
|
convertToBlocks = _this$props.convertToBlocks, |
|
convertToClassic = _this$props.convertToClassic, |
|
block = _this$props.block; |
|
var hasHTMLBlock = !!Object(external_this_wp_blocks_["getBlockType"])('core/html'); |
|
var compare = this.state.compare; |
|
var hiddenActions = [{ |
|
title: Object(external_this_wp_i18n_["__"])('Convert to Classic Block'), |
|
onClick: convertToClassic |
|
}]; |
|
|
|
if (compare) { |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Modal"], { |
|
title: // translators: Dialog title to fix block content |
|
Object(external_this_wp_i18n_["__"])('Resolve Block'), |
|
onRequestClose: this.onCompareClose, |
|
className: "editor-block-compare" |
|
}, Object(external_this_wp_element_["createElement"])(block_compare, { |
|
block: block, |
|
onKeep: convertToHTML, |
|
onConvert: convertToBlocks, |
|
convertor: block_invalid_warning_blockToBlocks, |
|
convertButtonText: Object(external_this_wp_i18n_["__"])('Convert to Blocks') |
|
})); |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(warning, { |
|
actions: [Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
key: "convert", |
|
onClick: this.onCompare, |
|
isLarge: true, |
|
isPrimary: !hasHTMLBlock |
|
}, // translators: Button to fix block content |
|
Object(external_this_wp_i18n_["_x"])('Resolve', 'imperative verb')), hasHTMLBlock && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
key: "edit", |
|
onClick: convertToHTML, |
|
isLarge: true, |
|
isPrimary: true |
|
}, Object(external_this_wp_i18n_["__"])('Convert to HTML'))], |
|
secondaryActions: hiddenActions |
|
}, Object(external_this_wp_i18n_["__"])('This block contains unexpected or invalid content.')); |
|
} |
|
}]); |
|
|
|
return BlockInvalidWarning; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
var block_invalid_warning_blockToClassic = function blockToClassic(block) { |
|
return Object(external_this_wp_blocks_["createBlock"])('core/freeform', { |
|
content: block.originalContent |
|
}); |
|
}; |
|
|
|
var block_invalid_warning_blockToHTML = function blockToHTML(block) { |
|
return Object(external_this_wp_blocks_["createBlock"])('core/html', { |
|
content: block.originalContent |
|
}); |
|
}; |
|
|
|
var block_invalid_warning_blockToBlocks = function blockToBlocks(block) { |
|
return Object(external_this_wp_blocks_["rawHandler"])({ |
|
HTML: block.originalContent |
|
}); |
|
}; |
|
|
|
/* harmony default export */ var block_invalid_warning = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, _ref) { |
|
var clientId = _ref.clientId; |
|
return { |
|
block: select('core/editor').getBlock(clientId) |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, _ref2) { |
|
var block = _ref2.block; |
|
|
|
var _dispatch = dispatch('core/editor'), |
|
replaceBlock = _dispatch.replaceBlock; |
|
|
|
return { |
|
convertToClassic: function convertToClassic() { |
|
replaceBlock(block.clientId, block_invalid_warning_blockToClassic(block)); |
|
}, |
|
convertToHTML: function convertToHTML() { |
|
replaceBlock(block.clientId, block_invalid_warning_blockToHTML(block)); |
|
}, |
|
convertToBlocks: function convertToBlocks() { |
|
replaceBlock(block.clientId, block_invalid_warning_blockToBlocks(block)); |
|
} |
|
}; |
|
})])(block_invalid_warning_BlockInvalidWarning)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list/block-crash-warning.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
var block_crash_warning_warning = Object(external_this_wp_element_["createElement"])(warning, null, Object(external_this_wp_i18n_["__"])('This block has encountered an error and cannot be previewed.')); |
|
/* harmony default export */ var block_crash_warning = (function () { |
|
return block_crash_warning_warning; |
|
}); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list/block-crash-boundary.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
var block_crash_boundary_BlockCrashBoundary = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockCrashBoundary, _Component); |
|
|
|
function BlockCrashBoundary() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, BlockCrashBoundary); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockCrashBoundary).apply(this, arguments)); |
|
_this.state = { |
|
hasError: false |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockCrashBoundary, [{ |
|
key: "componentDidCatch", |
|
value: function componentDidCatch(error) { |
|
this.props.onError(error); |
|
this.setState({ |
|
hasError: true |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
if (this.state.hasError) { |
|
return null; |
|
} |
|
|
|
return this.props.children; |
|
} |
|
}]); |
|
|
|
return BlockCrashBoundary; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var block_crash_boundary = (block_crash_boundary_BlockCrashBoundary); |
|
|
|
// EXTERNAL MODULE: ./node_modules/react-autosize-textarea/lib/index.js |
|
var react_autosize_textarea_lib = __webpack_require__(55); |
|
var react_autosize_textarea_lib_default = /*#__PURE__*/__webpack_require__.n(react_autosize_textarea_lib); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list/block-html.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External Dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress Dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
var block_html_BlockHTML = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockHTML, _Component); |
|
|
|
function BlockHTML(props) { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, BlockHTML); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockHTML).apply(this, arguments)); |
|
_this.onChange = _this.onChange.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onBlur = _this.onBlur.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.state = { |
|
html: props.block.isValid ? Object(external_this_wp_blocks_["getBlockContent"])(props.block) : props.block.originalContent |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockHTML, [{ |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
if (!Object(external_lodash_["isEqual"])(this.props.block.attributes, prevProps.block.attributes)) { |
|
this.setState({ |
|
html: Object(external_this_wp_blocks_["getBlockContent"])(this.props.block) |
|
}); |
|
} |
|
} |
|
}, { |
|
key: "onBlur", |
|
value: function onBlur() { |
|
var html = this.state.html; |
|
var blockType = Object(external_this_wp_blocks_["getBlockType"])(this.props.block.name); |
|
var attributes = Object(external_this_wp_blocks_["getBlockAttributes"])(blockType, html, this.props.block.attributes); // If html is empty we reset the block to the default HTML and mark it as valid to avoid triggering an error |
|
|
|
var content = html ? html : Object(external_this_wp_blocks_["getSaveContent"])(blockType, attributes); |
|
var isValid = html ? Object(external_this_wp_blocks_["isValidBlockContent"])(blockType, attributes, content) : true; |
|
this.props.onChange(this.props.clientId, attributes, content, isValid); // Ensure the state is updated if we reset so it displays the default content |
|
|
|
if (!html) { |
|
this.setState({ |
|
html: content |
|
}); |
|
} |
|
} |
|
}, { |
|
key: "onChange", |
|
value: function onChange(event) { |
|
this.setState({ |
|
html: event.target.value |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var html = this.state.html; |
|
return Object(external_this_wp_element_["createElement"])(react_autosize_textarea_lib_default.a, { |
|
className: "editor-block-list__block-html-textarea", |
|
value: html, |
|
onBlur: this.onBlur, |
|
onChange: this.onChange |
|
}); |
|
} |
|
}]); |
|
|
|
return BlockHTML; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var block_html = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, ownProps) { |
|
return { |
|
block: select('core/editor').getBlock(ownProps.clientId) |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onChange: function onChange(clientId, attributes, originalContent, isValid) { |
|
dispatch('core/editor').updateBlock(clientId, { |
|
attributes: attributes, |
|
originalContent: originalContent, |
|
isValid: isValid |
|
}); |
|
} |
|
}; |
|
})])(block_html_BlockHTML)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-title/index.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Renders the block's configured title as a string, or empty if the title |
|
* cannot be determined. |
|
* |
|
* @example |
|
* |
|
* ```jsx |
|
* <BlockTitle clientId="afd1cb17-2c08-4e7a-91be-007ba7ddc3a1" /> |
|
* ``` |
|
* |
|
* @param {?string} props.name Block name. |
|
* |
|
* @return {?string} Block title. |
|
*/ |
|
|
|
function BlockTitle(_ref) { |
|
var name = _ref.name; |
|
|
|
if (!name) { |
|
return null; |
|
} |
|
|
|
var blockType = Object(external_this_wp_blocks_["getBlockType"])(name); |
|
|
|
if (!blockType) { |
|
return null; |
|
} |
|
|
|
return blockType.title; |
|
} |
|
/* harmony default export */ var block_title = (Object(external_this_wp_data_["withSelect"])(function (select, ownProps) { |
|
var _select = select('core/editor'), |
|
getBlockName = _select.getBlockName; |
|
|
|
var clientId = ownProps.clientId; |
|
return { |
|
name: getBlockName(clientId) |
|
}; |
|
})(BlockTitle)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list/breadcrumb.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Block breadcrumb component, displaying the label of the block. If the block |
|
* descends from a root block, a button is displayed enabling the user to select |
|
* the root block. |
|
* |
|
* @param {string} props.clientId Client ID of block. |
|
* @param {string} props.rootClientId Client ID of block's root. |
|
* @param {Function} props.selectRootBlock Callback to select root block. |
|
*/ |
|
|
|
var breadcrumb_BlockBreadcrumb = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockBreadcrumb, _Component); |
|
|
|
function BlockBreadcrumb() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, BlockBreadcrumb); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockBreadcrumb).apply(this, arguments)); |
|
_this.state = { |
|
isFocused: false |
|
}; |
|
_this.onFocus = _this.onFocus.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onBlur = _this.onBlur.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockBreadcrumb, [{ |
|
key: "onFocus", |
|
value: function onFocus(event) { |
|
this.setState({ |
|
isFocused: true |
|
}); // This is used for improved interoperability |
|
// with the block's `onFocus` handler which selects the block, thus conflicting |
|
// with the intention to select the root block. |
|
|
|
event.stopPropagation(); |
|
} |
|
}, { |
|
key: "onBlur", |
|
value: function onBlur() { |
|
this.setState({ |
|
isFocused: false |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
clientId = _this$props.clientId, |
|
rootClientId = _this$props.rootClientId; |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: 'editor-block-list__breadcrumb' |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Toolbar"], null, rootClientId && Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])(block_title, { |
|
clientId: rootClientId |
|
}), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-block-list__descendant-arrow" |
|
})), Object(external_this_wp_element_["createElement"])(block_title, { |
|
clientId: clientId |
|
}))); |
|
} |
|
}]); |
|
|
|
return BlockBreadcrumb; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var breadcrumb = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, ownProps) { |
|
var _select = select('core/editor'), |
|
getBlockRootClientId = _select.getBlockRootClientId; |
|
|
|
var clientId = ownProps.clientId; |
|
return { |
|
rootClientId: getBlockRootClientId(clientId) |
|
}; |
|
})])(breadcrumb_BlockBreadcrumb)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/navigable-toolbar/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Browser dependencies |
|
*/ |
|
|
|
var _window = window, |
|
Node = _window.Node, |
|
getSelection = _window.getSelection; |
|
|
|
var navigable_toolbar_NavigableToolbar = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(NavigableToolbar, _Component); |
|
|
|
function NavigableToolbar() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, NavigableToolbar); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(NavigableToolbar).apply(this, arguments)); |
|
_this.focusToolbar = _this.focusToolbar.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.focusSelection = _this.focusSelection.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.switchOnKeyDown = Object(external_lodash_["cond"])([[Object(external_lodash_["matchesProperty"])(['keyCode'], external_this_wp_keycodes_["ESCAPE"]), _this.focusSelection]]); |
|
_this.toolbar = Object(external_this_wp_element_["createRef"])(); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(NavigableToolbar, [{ |
|
key: "focusToolbar", |
|
value: function focusToolbar() { |
|
var tabbables = external_this_wp_dom_["focus"].tabbable.find(this.toolbar.current); |
|
|
|
if (tabbables.length) { |
|
tabbables[0].focus(); |
|
} |
|
} |
|
/** |
|
* Programmatically shifts focus to the element where the current selection |
|
* exists, if there is a selection. |
|
*/ |
|
|
|
}, { |
|
key: "focusSelection", |
|
value: function focusSelection() { |
|
// Ensure that a selection exists. |
|
var selection = getSelection(); |
|
|
|
if (!selection) { |
|
return; |
|
} // Focus node may be a text node, which cannot be focused directly. |
|
// Find its parent element instead. |
|
|
|
|
|
var focusNode = selection.focusNode; |
|
var focusElement = focusNode; |
|
|
|
if (focusElement.nodeType !== Node.ELEMENT_NODE) { |
|
focusElement = focusElement.parentElement; |
|
} |
|
|
|
if (focusElement) { |
|
focusElement.focus(); |
|
} |
|
} |
|
}, { |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
if (this.props.focusOnMount) { |
|
this.focusToolbar(); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
children = _this$props.children, |
|
props = Object(objectWithoutProperties["a" /* default */])(_this$props, ["children"]); |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["NavigableMenu"], Object(esm_extends["a" /* default */])({ |
|
orientation: "horizontal", |
|
role: "toolbar", |
|
ref: this.toolbar, |
|
onKeyDown: this.switchOnKeyDown |
|
}, Object(external_lodash_["omit"])(props, ['focusOnMount'])), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["KeyboardShortcuts"], { |
|
bindGlobal: true // Use the same event that TinyMCE uses in the Classic block for its own `alt+f10` shortcut. |
|
, |
|
eventName: "keydown", |
|
shortcuts: { |
|
'alt+f10': this.focusToolbar |
|
} |
|
}), children); |
|
} |
|
}]); |
|
|
|
return NavigableToolbar; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var navigable_toolbar = (navigable_toolbar_NavigableToolbar); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list/block-contextual-toolbar.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
function BlockContextualToolbar(_ref) { |
|
var focusOnMount = _ref.focusOnMount; |
|
return Object(external_this_wp_element_["createElement"])(navigable_toolbar, { |
|
focusOnMount: focusOnMount, |
|
className: "editor-block-contextual-toolbar" |
|
/* translators: accessibility text for the block toolbar */ |
|
, |
|
"aria-label": Object(external_this_wp_i18n_["__"])('Block tools') |
|
}, Object(external_this_wp_element_["createElement"])(block_toolbar, null)); |
|
} |
|
|
|
/* harmony default export */ var block_contextual_toolbar = (BlockContextualToolbar); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list/multi-controls.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
function BlockListMultiControls(_ref) { |
|
var multiSelectedBlockClientIds = _ref.multiSelectedBlockClientIds, |
|
clientId = _ref.clientId, |
|
isSelecting = _ref.isSelecting, |
|
isFirst = _ref.isFirst, |
|
isLast = _ref.isLast; |
|
|
|
if (isSelecting) { |
|
return null; |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(block_mover, { |
|
key: "mover", |
|
clientId: clientId, |
|
clientIds: multiSelectedBlockClientIds, |
|
isFirst: isFirst, |
|
isLast: isLast |
|
}); |
|
} |
|
|
|
/* harmony default export */ var multi_controls = (Object(external_this_wp_data_["withSelect"])(function (select, _ref2) { |
|
var clientId = _ref2.clientId; |
|
|
|
var _select = select('core/editor'), |
|
getMultiSelectedBlockClientIds = _select.getMultiSelectedBlockClientIds, |
|
isMultiSelecting = _select.isMultiSelecting, |
|
getBlockIndex = _select.getBlockIndex, |
|
getBlockCount = _select.getBlockCount; |
|
|
|
var clientIds = getMultiSelectedBlockClientIds(); |
|
var firstIndex = getBlockIndex(Object(external_lodash_["first"])(clientIds), clientId); |
|
var lastIndex = getBlockIndex(Object(external_lodash_["last"])(clientIds), clientId); |
|
return { |
|
multiSelectedBlockClientIds: clientIds, |
|
isSelecting: isMultiSelecting(), |
|
isFirst: firstIndex === 0, |
|
isLast: lastIndex + 1 === getBlockCount() |
|
}; |
|
})(BlockListMultiControls)); |
|
|
|
// EXTERNAL MODULE: ./node_modules/dom-scroll-into-view/lib/index.js |
|
var dom_scroll_into_view_lib = __webpack_require__(59); |
|
var dom_scroll_into_view_lib_default = /*#__PURE__*/__webpack_require__.n(dom_scroll_into_view_lib); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-preview/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Block Preview Component: It renders a preview given a block name and attributes. |
|
* |
|
* @param {Object} props Component props. |
|
* |
|
* @return {WPElement} Rendered element. |
|
*/ |
|
|
|
function BlockPreview(props) { |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-preview" |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-preview__title" |
|
}, Object(external_this_wp_i18n_["__"])('Preview')), Object(external_this_wp_element_["createElement"])(BlockPreviewContent, props)); |
|
} |
|
|
|
function BlockPreviewContent(_ref) { |
|
var name = _ref.name, |
|
attributes = _ref.attributes; |
|
var block = Object(external_this_wp_blocks_["createBlock"])(name, attributes); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Disabled"], { |
|
className: "editor-block-preview__content editor-styles-wrapper", |
|
"aria-hidden": true |
|
}, Object(external_this_wp_element_["createElement"])(block_edit, { |
|
name: name, |
|
focus: false, |
|
attributes: block.attributes, |
|
setAttributes: external_lodash_["noop"] |
|
})); |
|
} |
|
/* harmony default export */ var block_preview = (BlockPreview); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/inserter-list-item/index.js |
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
function InserterListItem(_ref) { |
|
var icon = _ref.icon, |
|
hasChildBlocksWithInserterSupport = _ref.hasChildBlocksWithInserterSupport, |
|
_onClick = _ref.onClick, |
|
isDisabled = _ref.isDisabled, |
|
title = _ref.title, |
|
className = _ref.className, |
|
props = Object(objectWithoutProperties["a" /* default */])(_ref, ["icon", "hasChildBlocksWithInserterSupport", "onClick", "isDisabled", "title", "className"]); |
|
|
|
var itemIconStyle = icon ? { |
|
backgroundColor: icon.background, |
|
color: icon.foreground |
|
} : {}; |
|
var itemIconStackStyle = icon && icon.shadowColor ? { |
|
backgroundColor: icon.shadowColor |
|
} : {}; |
|
return Object(external_this_wp_element_["createElement"])("li", { |
|
className: "editor-block-types-list__list-item" |
|
}, Object(external_this_wp_element_["createElement"])("button", Object(esm_extends["a" /* default */])({ |
|
className: classnames_default()('editor-block-types-list__item', className, { |
|
'editor-block-types-list__item-has-children': hasChildBlocksWithInserterSupport |
|
}), |
|
onClick: function onClick(event) { |
|
event.preventDefault(); |
|
|
|
_onClick(); |
|
}, |
|
disabled: isDisabled, |
|
"aria-label": title // Fix for IE11 and JAWS 2018. |
|
|
|
}, props), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-block-types-list__item-icon", |
|
style: itemIconStyle |
|
}, Object(external_this_wp_element_["createElement"])(BlockIcon, { |
|
icon: icon, |
|
showColors: true |
|
}), hasChildBlocksWithInserterSupport && Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-block-types-list__item-icon-stack", |
|
style: itemIconStackStyle |
|
})), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-block-types-list__item-title" |
|
}, title))); |
|
} |
|
|
|
/* harmony default export */ var inserter_list_item = (InserterListItem); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-types-list/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
function BlockTypesList(_ref) { |
|
var items = _ref.items, |
|
onSelect = _ref.onSelect, |
|
_ref$onHover = _ref.onHover, |
|
onHover = _ref$onHover === void 0 ? function () {} : _ref$onHover, |
|
children = _ref.children; |
|
return ( |
|
/* |
|
* Disable reason: The `list` ARIA role is redundant but |
|
* Safari+VoiceOver won't announce the list otherwise. |
|
*/ |
|
|
|
/* eslint-disable jsx-a11y/no-redundant-roles */ |
|
Object(external_this_wp_element_["createElement"])("ul", { |
|
role: "list", |
|
className: "editor-block-types-list" |
|
}, items && items.map(function (item) { |
|
return Object(external_this_wp_element_["createElement"])(inserter_list_item, { |
|
key: item.id, |
|
className: Object(external_this_wp_blocks_["getBlockMenuDefaultClassName"])(item.id), |
|
icon: item.icon, |
|
hasChildBlocksWithInserterSupport: item.hasChildBlocksWithInserterSupport, |
|
onClick: function onClick() { |
|
onSelect(item); |
|
onHover(null); |
|
}, |
|
onFocus: function onFocus() { |
|
return onHover(item); |
|
}, |
|
onMouseEnter: function onMouseEnter() { |
|
return onHover(item); |
|
}, |
|
onMouseLeave: function onMouseLeave() { |
|
return onHover(null); |
|
}, |
|
onBlur: function onBlur() { |
|
return onHover(null); |
|
}, |
|
isDisabled: item.isDisabled, |
|
title: item.title |
|
}); |
|
}), children) |
|
/* eslint-enable jsx-a11y/no-redundant-roles */ |
|
|
|
); |
|
} |
|
|
|
/* harmony default export */ var block_types_list = (BlockTypesList); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/inserter/child-blocks.js |
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
function ChildBlocks(_ref) { |
|
var rootBlockIcon = _ref.rootBlockIcon, |
|
rootBlockTitle = _ref.rootBlockTitle, |
|
items = _ref.items, |
|
props = Object(objectWithoutProperties["a" /* default */])(_ref, ["rootBlockIcon", "rootBlockTitle", "items"]); |
|
|
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-inserter__child-blocks" |
|
}, (rootBlockIcon || rootBlockTitle) && Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-inserter__parent-block-header" |
|
}, Object(external_this_wp_element_["createElement"])(BlockIcon, { |
|
icon: rootBlockIcon, |
|
showColors: true |
|
}), rootBlockTitle && Object(external_this_wp_element_["createElement"])("h2", null, rootBlockTitle)), Object(external_this_wp_element_["createElement"])(block_types_list, Object(esm_extends["a" /* default */])({ |
|
items: items |
|
}, props))); |
|
} |
|
|
|
/* harmony default export */ var child_blocks = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_compose_["ifCondition"])(function (_ref2) { |
|
var items = _ref2.items; |
|
return items && items.length > 0; |
|
}), Object(external_this_wp_data_["withSelect"])(function (select, _ref3) { |
|
var rootClientId = _ref3.rootClientId; |
|
|
|
var _select = select('core/blocks'), |
|
getBlockType = _select.getBlockType; |
|
|
|
var _select2 = select('core/editor'), |
|
getBlockName = _select2.getBlockName; |
|
|
|
var rootBlockName = getBlockName(rootClientId); |
|
var rootBlockType = getBlockType(rootBlockName); |
|
return { |
|
rootBlockTitle: rootBlockType && rootBlockType.title, |
|
rootBlockIcon: rootBlockType && rootBlockType.icon |
|
}; |
|
}))(ChildBlocks)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/inserter/inline-elements.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var inline_elements_InserterInlineElements = function InserterInlineElements(_ref) { |
|
var filterValue = _ref.filterValue; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Slot"], { |
|
name: "Inserter.InlineElements", |
|
fillProps: { |
|
filterValue: filterValue |
|
} |
|
}, function (fills) { |
|
return !Object(external_lodash_["isEmpty"])(fills) && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
title: Object(external_this_wp_i18n_["__"])('Inline Elements'), |
|
initialOpen: false, |
|
className: "editor-inserter__inline-elements" |
|
}, Object(external_this_wp_element_["createElement"])(block_types_list, null, fills)); |
|
}); |
|
}; |
|
|
|
/* harmony default export */ var inline_elements = (inline_elements_InserterInlineElements); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/inserter/menu.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
var MAX_SUGGESTED_ITEMS = 9; |
|
|
|
var stopKeyPropagation = function stopKeyPropagation(event) { |
|
return event.stopPropagation(); |
|
}; |
|
/** |
|
* Filters an item list given a search term. |
|
* |
|
* @param {Array} items Item list |
|
* @param {string} searchTerm Search term. |
|
* |
|
* @return {Array} Filtered item list. |
|
*/ |
|
|
|
|
|
var menu_searchItems = function searchItems(items, searchTerm) { |
|
var normalizedSearchTerm = menu_normalizeTerm(searchTerm); |
|
|
|
var matchSearch = function matchSearch(string) { |
|
return menu_normalizeTerm(string).indexOf(normalizedSearchTerm) !== -1; |
|
}; |
|
|
|
var categories = Object(external_this_wp_blocks_["getCategories"])(); |
|
return items.filter(function (item) { |
|
var itemCategory = Object(external_lodash_["find"])(categories, { |
|
slug: item.category |
|
}); |
|
return matchSearch(item.title) || Object(external_lodash_["some"])(item.keywords, matchSearch) || itemCategory && matchSearch(itemCategory.title); |
|
}); |
|
}; |
|
/** |
|
* Converts the search term into a normalized term. |
|
* |
|
* @param {string} term The search term to normalize. |
|
* |
|
* @return {string} The normalized search term. |
|
*/ |
|
|
|
var menu_normalizeTerm = function normalizeTerm(term) { |
|
// Disregard diacritics. |
|
// Input: "média" |
|
term = Object(external_lodash_["deburr"])(term); // Accommodate leading slash, matching autocomplete expectations. |
|
// Input: "/media" |
|
|
|
term = term.replace(/^\//, ''); // Lowercase. |
|
// Input: "MEDIA" |
|
|
|
term = term.toLowerCase(); // Strip leading and trailing whitespace. |
|
// Input: " media " |
|
|
|
term = term.trim(); |
|
return term; |
|
}; |
|
var menu_InserterMenu = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(InserterMenu, _Component); |
|
|
|
function InserterMenu() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, InserterMenu); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(InserterMenu).apply(this, arguments)); |
|
_this.state = { |
|
childItems: [], |
|
filterValue: '', |
|
hoveredItem: null, |
|
suggestedItems: [], |
|
reusableItems: [], |
|
itemsPerCategory: {}, |
|
openPanels: ['suggested'] |
|
}; |
|
_this.onChangeSearchInput = _this.onChangeSearchInput.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onHover = _this.onHover.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.panels = {}; |
|
_this.inserterResults = Object(external_this_wp_element_["createRef"])(); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(InserterMenu, [{ |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
// This could be replaced by a resolver. |
|
this.props.fetchReusableBlocks(); |
|
this.filter(); |
|
} |
|
}, { |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
if (prevProps.items !== this.props.items) { |
|
this.filter(this.state.filterValue); |
|
} |
|
} |
|
}, { |
|
key: "onChangeSearchInput", |
|
value: function onChangeSearchInput(event) { |
|
this.filter(event.target.value); |
|
} |
|
}, { |
|
key: "onHover", |
|
value: function onHover(item) { |
|
this.setState({ |
|
hoveredItem: item |
|
}); |
|
var _this$props = this.props, |
|
showInsertionPoint = _this$props.showInsertionPoint, |
|
hideInsertionPoint = _this$props.hideInsertionPoint; |
|
|
|
if (item) { |
|
var _this$props2 = this.props, |
|
rootClientId = _this$props2.rootClientId, |
|
index = _this$props2.index; |
|
showInsertionPoint(rootClientId, index); |
|
} else { |
|
hideInsertionPoint(); |
|
} |
|
} |
|
}, { |
|
key: "bindPanel", |
|
value: function bindPanel(name) { |
|
var _this2 = this; |
|
|
|
return function (ref) { |
|
_this2.panels[name] = ref; |
|
}; |
|
} |
|
}, { |
|
key: "onTogglePanel", |
|
value: function onTogglePanel(panel) { |
|
var _this3 = this; |
|
|
|
return function () { |
|
var isOpened = _this3.state.openPanels.indexOf(panel) !== -1; |
|
|
|
if (isOpened) { |
|
_this3.setState({ |
|
openPanels: Object(external_lodash_["without"])(_this3.state.openPanels, panel) |
|
}); |
|
} else { |
|
_this3.setState({ |
|
openPanels: Object(toConsumableArray["a" /* default */])(_this3.state.openPanels).concat([panel]) |
|
}); |
|
|
|
_this3.props.setTimeout(function () { |
|
// We need a generic way to access the panel's container |
|
// eslint-disable-next-line react/no-find-dom-node |
|
dom_scroll_into_view_lib_default()(_this3.panels[panel], _this3.inserterResults.current, { |
|
alignWithTop: true |
|
}); |
|
}); |
|
} |
|
}; |
|
} |
|
}, { |
|
key: "filter", |
|
value: function filter() { |
|
var filterValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; |
|
var _this$props3 = this.props, |
|
debouncedSpeak = _this$props3.debouncedSpeak, |
|
items = _this$props3.items, |
|
rootChildBlocks = _this$props3.rootChildBlocks; |
|
var filteredItems = menu_searchItems(items, filterValue); |
|
|
|
var childItems = Object(external_lodash_["filter"])(filteredItems, function (_ref) { |
|
var name = _ref.name; |
|
return Object(external_lodash_["includes"])(rootChildBlocks, name); |
|
}); |
|
|
|
var suggestedItems = []; |
|
|
|
if (!filterValue) { |
|
var maxSuggestedItems = this.props.maxSuggestedItems || MAX_SUGGESTED_ITEMS; |
|
suggestedItems = Object(external_lodash_["filter"])(items, function (item) { |
|
return item.utility > 0; |
|
}).slice(0, maxSuggestedItems); |
|
} |
|
|
|
var reusableItems = Object(external_lodash_["filter"])(filteredItems, { |
|
category: 'reusable' |
|
}); |
|
|
|
var getCategoryIndex = function getCategoryIndex(item) { |
|
return Object(external_lodash_["findIndex"])(Object(external_this_wp_blocks_["getCategories"])(), function (category) { |
|
return category.slug === item.category; |
|
}); |
|
}; |
|
|
|
var itemsPerCategory = Object(external_lodash_["flow"])(function (itemList) { |
|
return Object(external_lodash_["filter"])(itemList, function (item) { |
|
return item.category !== 'reusable'; |
|
}); |
|
}, function (itemList) { |
|
return Object(external_lodash_["sortBy"])(itemList, getCategoryIndex); |
|
}, function (itemList) { |
|
return Object(external_lodash_["groupBy"])(itemList, 'category'); |
|
})(filteredItems); |
|
var openPanels = this.state.openPanels; |
|
|
|
if (filterValue !== this.state.filterValue) { |
|
if (!filterValue) { |
|
openPanels = ['suggested']; |
|
} else if (reusableItems.length) { |
|
openPanels = ['reusable']; |
|
} else if (filteredItems.length) { |
|
var firstCategory = Object(external_lodash_["find"])(Object(external_this_wp_blocks_["getCategories"])(), function (_ref2) { |
|
var slug = _ref2.slug; |
|
return itemsPerCategory[slug] && itemsPerCategory[slug].length; |
|
}); |
|
openPanels = [firstCategory.slug]; |
|
} |
|
} |
|
|
|
this.setState({ |
|
hoveredItem: null, |
|
childItems: childItems, |
|
filterValue: filterValue, |
|
suggestedItems: suggestedItems, |
|
reusableItems: reusableItems, |
|
itemsPerCategory: itemsPerCategory, |
|
openPanels: openPanels |
|
}); |
|
var resultCount = Object.keys(itemsPerCategory).reduce(function (accumulator, currentCategorySlug) { |
|
return accumulator + itemsPerCategory[currentCategorySlug].length; |
|
}, 0); |
|
var resultsFoundMessage = Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_n"])('%d result found.', '%d results found.', resultCount), resultCount); |
|
debouncedSpeak(resultsFoundMessage, 'assertive'); |
|
} |
|
}, { |
|
key: "onKeyDown", |
|
value: function onKeyDown(event) { |
|
if (Object(external_lodash_["includes"])([external_this_wp_keycodes_["LEFT"], external_this_wp_keycodes_["DOWN"], external_this_wp_keycodes_["RIGHT"], external_this_wp_keycodes_["UP"], external_this_wp_keycodes_["BACKSPACE"], external_this_wp_keycodes_["ENTER"]], event.keyCode)) { |
|
// Stop the key event from propagating up to ObserveTyping.startTypingInTextField. |
|
event.stopPropagation(); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this4 = this; |
|
|
|
var _this$props4 = this.props, |
|
instanceId = _this$props4.instanceId, |
|
onSelect = _this$props4.onSelect, |
|
rootClientId = _this$props4.rootClientId; |
|
var _this$state = this.state, |
|
childItems = _this$state.childItems, |
|
filterValue = _this$state.filterValue, |
|
hoveredItem = _this$state.hoveredItem, |
|
suggestedItems = _this$state.suggestedItems, |
|
reusableItems = _this$state.reusableItems, |
|
itemsPerCategory = _this$state.itemsPerCategory, |
|
openPanels = _this$state.openPanels; |
|
|
|
var isPanelOpen = function isPanelOpen(panel) { |
|
return openPanels.indexOf(panel) !== -1; |
|
}; |
|
|
|
var isSearching = !!filterValue; // Disable reason (no-autofocus): The inserter menu is a modal display, not one which |
|
// is always visible, and one which already incurs this behavior of autoFocus via |
|
// Popover's focusOnMount. |
|
// Disable reason (no-static-element-interactions): Navigational key-presses within |
|
// the menu are prevented from triggering WritingFlow and ObserveTyping interactions. |
|
|
|
/* eslint-disable jsx-a11y/no-autofocus, jsx-a11y/no-static-element-interactions */ |
|
|
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-inserter__menu", |
|
onKeyPress: stopKeyPropagation, |
|
onKeyDown: this.onKeyDown |
|
}, Object(external_this_wp_element_["createElement"])("label", { |
|
htmlFor: "editor-inserter__search-".concat(instanceId), |
|
className: "screen-reader-text" |
|
}, Object(external_this_wp_i18n_["__"])('Search for a block')), Object(external_this_wp_element_["createElement"])("input", { |
|
id: "editor-inserter__search-".concat(instanceId), |
|
type: "search", |
|
placeholder: Object(external_this_wp_i18n_["__"])('Search for a block'), |
|
className: "editor-inserter__search", |
|
autoFocus: true, |
|
onChange: this.onChangeSearchInput |
|
}), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-inserter__results", |
|
ref: this.inserterResults, |
|
tabIndex: "0", |
|
role: "region", |
|
"aria-label": Object(external_this_wp_i18n_["__"])('Available block types') |
|
}, Object(external_this_wp_element_["createElement"])(child_blocks, { |
|
rootClientId: rootClientId, |
|
items: childItems, |
|
onSelect: onSelect, |
|
onHover: this.onHover |
|
}), !!suggestedItems.length && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
title: Object(external_this_wp_i18n_["_x"])('Most Used', 'blocks'), |
|
opened: isPanelOpen('suggested'), |
|
onToggle: this.onTogglePanel('suggested'), |
|
ref: this.bindPanel('suggested') |
|
}, Object(external_this_wp_element_["createElement"])(block_types_list, { |
|
items: suggestedItems, |
|
onSelect: onSelect, |
|
onHover: this.onHover |
|
})), Object(external_this_wp_element_["createElement"])(inline_elements, { |
|
filterValue: filterValue |
|
}), Object(external_lodash_["map"])(Object(external_this_wp_blocks_["getCategories"])(), function (category) { |
|
var categoryItems = itemsPerCategory[category.slug]; |
|
|
|
if (!categoryItems || !categoryItems.length) { |
|
return null; |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
key: category.slug, |
|
title: category.title, |
|
icon: category.icon, |
|
opened: isSearching || isPanelOpen(category.slug), |
|
onToggle: _this4.onTogglePanel(category.slug), |
|
ref: _this4.bindPanel(category.slug) |
|
}, Object(external_this_wp_element_["createElement"])(block_types_list, { |
|
items: categoryItems, |
|
onSelect: onSelect, |
|
onHover: _this4.onHover |
|
})); |
|
}), !!reusableItems.length && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
className: "editor-inserter__reusable-blocks-panel", |
|
title: Object(external_this_wp_i18n_["__"])('Reusable'), |
|
opened: isPanelOpen('reusable'), |
|
onToggle: this.onTogglePanel('reusable'), |
|
icon: "controls-repeat", |
|
ref: this.bindPanel('reusable') |
|
}, Object(external_this_wp_element_["createElement"])(block_types_list, { |
|
items: reusableItems, |
|
onSelect: onSelect, |
|
onHover: this.onHover |
|
}), Object(external_this_wp_element_["createElement"])("a", { |
|
className: "editor-inserter__manage-reusable-blocks", |
|
href: "edit.php?post_type=wp_block" |
|
}, Object(external_this_wp_i18n_["__"])('Manage All Reusable Blocks'))), Object(external_lodash_["isEmpty"])(suggestedItems) && Object(external_lodash_["isEmpty"])(reusableItems) && Object(external_lodash_["isEmpty"])(itemsPerCategory) && Object(external_this_wp_element_["createElement"])("p", { |
|
className: "editor-inserter__no-results" |
|
}, Object(external_this_wp_i18n_["__"])('No blocks found.'))), hoveredItem && Object(external_this_wp_blocks_["isReusableBlock"])(hoveredItem) && Object(external_this_wp_element_["createElement"])(block_preview, { |
|
name: hoveredItem.name, |
|
attributes: hoveredItem.initialAttributes |
|
})); |
|
/* eslint-enable jsx-a11y/no-autofocus, jsx-a11y/no-noninteractive-element-interactions */ |
|
} |
|
}]); |
|
|
|
return InserterMenu; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var menu = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select, _ref3) { |
|
var rootClientId = _ref3.rootClientId; |
|
|
|
var _select = select('core/editor'), |
|
getEditedPostAttribute = _select.getEditedPostAttribute, |
|
getSelectedBlock = _select.getSelectedBlock, |
|
getInserterItems = _select.getInserterItems, |
|
getBlockName = _select.getBlockName; |
|
|
|
var _select2 = select('core/blocks'), |
|
getChildBlockNames = _select2.getChildBlockNames; |
|
|
|
var rootBlockName = getBlockName(rootClientId); |
|
return { |
|
selectedBlock: getSelectedBlock(), |
|
rootChildBlocks: getChildBlockNames(rootBlockName), |
|
title: getEditedPostAttribute('title'), |
|
items: getInserterItems(rootClientId), |
|
rootClientId: rootClientId |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, ownProps) { |
|
var _dispatch = dispatch('core/editor'), |
|
fetchReusableBlocks = _dispatch.__experimentalFetchReusableBlocks, |
|
showInsertionPoint = _dispatch.showInsertionPoint, |
|
hideInsertionPoint = _dispatch.hideInsertionPoint; |
|
|
|
return { |
|
fetchReusableBlocks: fetchReusableBlocks, |
|
showInsertionPoint: showInsertionPoint, |
|
hideInsertionPoint: hideInsertionPoint, |
|
onSelect: function onSelect(item) { |
|
var _dispatch2 = dispatch('core/editor'), |
|
replaceBlocks = _dispatch2.replaceBlocks, |
|
insertBlock = _dispatch2.insertBlock; |
|
|
|
var selectedBlock = ownProps.selectedBlock, |
|
index = ownProps.index, |
|
rootClientId = ownProps.rootClientId; |
|
var name = item.name, |
|
initialAttributes = item.initialAttributes; |
|
var insertedBlock = Object(external_this_wp_blocks_["createBlock"])(name, initialAttributes); |
|
|
|
if (selectedBlock && Object(external_this_wp_blocks_["isUnmodifiedDefaultBlock"])(selectedBlock)) { |
|
replaceBlocks(selectedBlock.clientId, insertedBlock); |
|
} else { |
|
insertBlock(insertedBlock, index, rootClientId); |
|
} |
|
|
|
ownProps.onSelect(); |
|
} |
|
}; |
|
}), external_this_wp_components_["withSpokenMessages"], external_this_wp_compose_["withInstanceId"], external_this_wp_compose_["withSafeTimeout"])(menu_InserterMenu)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/inserter/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var inserter_defaultRenderToggle = function defaultRenderToggle(_ref) { |
|
var onToggle = _ref.onToggle, |
|
disabled = _ref.disabled, |
|
isOpen = _ref.isOpen; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
icon: "insert", |
|
label: Object(external_this_wp_i18n_["__"])('Add block'), |
|
labelPosition: "bottom", |
|
onClick: onToggle, |
|
className: "editor-inserter__toggle", |
|
"aria-haspopup": "true", |
|
"aria-expanded": isOpen, |
|
disabled: disabled |
|
}); |
|
}; |
|
|
|
var inserter_Inserter = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(Inserter, _Component); |
|
|
|
function Inserter() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, Inserter); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(Inserter).apply(this, arguments)); |
|
_this.onToggle = _this.onToggle.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.renderToggle = _this.renderToggle.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.renderContent = _this.renderContent.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(Inserter, [{ |
|
key: "onToggle", |
|
value: function onToggle(isOpen) { |
|
var onToggle = this.props.onToggle; // Surface toggle callback to parent component |
|
|
|
if (onToggle) { |
|
onToggle(isOpen); |
|
} |
|
} |
|
/** |
|
* Render callback to display Dropdown toggle element. |
|
* |
|
* @param {Function} options.onToggle Callback to invoke when toggle is |
|
* pressed. |
|
* @param {boolean} options.isOpen Whether dropdown is currently open. |
|
* |
|
* @return {WPElement} Dropdown toggle element. |
|
*/ |
|
|
|
}, { |
|
key: "renderToggle", |
|
value: function renderToggle(_ref2) { |
|
var onToggle = _ref2.onToggle, |
|
isOpen = _ref2.isOpen; |
|
var _this$props = this.props, |
|
disabled = _this$props.disabled, |
|
_this$props$renderTog = _this$props.renderToggle, |
|
renderToggle = _this$props$renderTog === void 0 ? inserter_defaultRenderToggle : _this$props$renderTog; |
|
return renderToggle({ |
|
onToggle: onToggle, |
|
isOpen: isOpen, |
|
disabled: disabled |
|
}); |
|
} |
|
/** |
|
* Render callback to display Dropdown content element. |
|
* |
|
* @param {Function} options.onClose Callback to invoke when dropdown is |
|
* closed. |
|
* |
|
* @return {WPElement} Dropdown content element. |
|
*/ |
|
|
|
}, { |
|
key: "renderContent", |
|
value: function renderContent(_ref3) { |
|
var onClose = _ref3.onClose; |
|
var _this$props2 = this.props, |
|
rootClientId = _this$props2.rootClientId, |
|
index = _this$props2.index; |
|
return Object(external_this_wp_element_["createElement"])(menu, { |
|
onSelect: onClose, |
|
rootClientId: rootClientId, |
|
index: index |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props3 = this.props, |
|
position = _this$props3.position, |
|
title = _this$props3.title; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Dropdown"], { |
|
className: "editor-inserter", |
|
contentClassName: "editor-inserter__popover", |
|
position: position, |
|
onToggle: this.onToggle, |
|
expandOnMobile: true, |
|
headerTitle: title, |
|
renderToggle: this.renderToggle, |
|
renderContent: this.renderContent |
|
}); |
|
} |
|
}]); |
|
|
|
return Inserter; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var inserter = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, _ref4) { |
|
var rootClientId = _ref4.rootClientId, |
|
index = _ref4.index; |
|
|
|
var _select = select('core/editor'), |
|
getEditedPostAttribute = _select.getEditedPostAttribute, |
|
getBlockInsertionPoint = _select.getBlockInsertionPoint, |
|
hasInserterItems = _select.hasInserterItems; |
|
|
|
if (rootClientId === undefined && index === undefined) { |
|
// Unless explicitly provided, the default insertion point provided |
|
// by the store occurs immediately following the selected block. |
|
// Otherwise, the default behavior for an undefined index is to |
|
// append block to the end of the rootClientId context. |
|
var insertionPoint = getBlockInsertionPoint(); |
|
rootClientId = insertionPoint.rootClientId; |
|
index = insertionPoint.index; |
|
} |
|
|
|
return { |
|
title: getEditedPostAttribute('title'), |
|
hasItems: hasInserterItems(rootClientId), |
|
rootClientId: rootClientId, |
|
index: index |
|
}; |
|
}), Object(external_this_wp_compose_["ifCondition"])(function (_ref5) { |
|
var hasItems = _ref5.hasItems; |
|
return hasItems; |
|
})])(inserter_Inserter)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list/block-mobile-toolbar.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
function BlockMobileToolbar(_ref) { |
|
var clientId = _ref.clientId; |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-list__block-mobile-toolbar" |
|
}, Object(external_this_wp_element_["createElement"])(inserter, null), Object(external_this_wp_element_["createElement"])(block_mover, { |
|
clientIds: [clientId] |
|
})); |
|
} |
|
|
|
/* harmony default export */ var block_mobile_toolbar = (Object(external_this_wp_viewport_["ifViewportMatches"])('< small')(BlockMobileToolbar)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list/insertion-point.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var insertion_point_BlockInsertionPoint = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockInsertionPoint, _Component); |
|
|
|
function BlockInsertionPoint() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, BlockInsertionPoint); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockInsertionPoint).apply(this, arguments)); |
|
_this.state = { |
|
isInserterFocused: false |
|
}; |
|
_this.onBlurInserter = _this.onBlurInserter.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onFocusInserter = _this.onFocusInserter.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockInsertionPoint, [{ |
|
key: "onFocusInserter", |
|
value: function onFocusInserter(event) { |
|
// Stop propagation of the focus event to avoid selecting the current |
|
// block while inserting a new block, as it is not relevant to sibling |
|
// insertion and conflicts with contextual toolbar placement. |
|
event.stopPropagation(); |
|
this.setState({ |
|
isInserterFocused: true |
|
}); |
|
} |
|
}, { |
|
key: "onBlurInserter", |
|
value: function onBlurInserter() { |
|
this.setState({ |
|
isInserterFocused: false |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var isInserterFocused = this.state.isInserterFocused; |
|
var _this$props = this.props, |
|
showInsertionPoint = _this$props.showInsertionPoint, |
|
rootClientId = _this$props.rootClientId, |
|
insertIndex = _this$props.insertIndex; |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-list__insertion-point" |
|
}, showInsertionPoint && Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-list__insertion-point-indicator" |
|
}), Object(external_this_wp_element_["createElement"])("div", { |
|
onFocus: this.onFocusInserter, |
|
onBlur: this.onBlurInserter // While ideally it would be enough to capture the |
|
// bubbling focus event from the Inserter, due to the |
|
// characteristics of click focusing of `button`s in |
|
// Firefox and Safari, it is not reliable. |
|
// |
|
// See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Clicking_and_focus |
|
, |
|
tabIndex: -1, |
|
className: classnames_default()('editor-block-list__insertion-point-inserter', { |
|
'is-visible': isInserterFocused |
|
}) |
|
}, Object(external_this_wp_element_["createElement"])(inserter, { |
|
rootClientId: rootClientId, |
|
index: insertIndex |
|
}))); |
|
} |
|
}]); |
|
|
|
return BlockInsertionPoint; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var insertion_point = (Object(external_this_wp_data_["withSelect"])(function (select, _ref) { |
|
var clientId = _ref.clientId, |
|
rootClientId = _ref.rootClientId; |
|
|
|
var _select = select('core/editor'), |
|
getBlockIndex = _select.getBlockIndex, |
|
getBlockInsertionPoint = _select.getBlockInsertionPoint, |
|
isBlockInsertionPointVisible = _select.isBlockInsertionPointVisible; |
|
|
|
var blockIndex = getBlockIndex(clientId, rootClientId); |
|
var insertIndex = blockIndex; |
|
var insertionPoint = getBlockInsertionPoint(); |
|
var showInsertionPoint = isBlockInsertionPointVisible() && insertionPoint.index === insertIndex && insertionPoint.rootClientId === rootClientId; |
|
return { |
|
showInsertionPoint: showInsertionPoint, |
|
insertIndex: insertIndex |
|
}; |
|
})(insertion_point_BlockInsertionPoint)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/ignore-nested-events/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Component which renders a div with passed props applied except the optional |
|
* `childHandledEvents` prop. Event prop handlers are replaced with a proxying |
|
* event handler to capture and prevent events from being handled by ancestor |
|
* `IgnoreNestedEvents` elements by testing the presence of a private property |
|
* assigned on the event object. |
|
* |
|
* Optionally accepts an `childHandledEvents` prop array, which can be used in |
|
* instances where an inner `IgnoreNestedEvents` element exists and the outer |
|
* element should stop propagation but not invoke a callback handler, since it |
|
* would be assumed these are invoked by the child element. |
|
* |
|
* @type {Component} |
|
*/ |
|
|
|
var ignore_nested_events_IgnoreNestedEvents = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(IgnoreNestedEvents, _Component); |
|
|
|
function IgnoreNestedEvents() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, IgnoreNestedEvents); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(IgnoreNestedEvents).apply(this, arguments)); |
|
_this.proxyEvent = _this.proxyEvent.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); // The event map is responsible for tracking an event type to a React |
|
// component prop name, since it is easy to determine event type from |
|
// a React prop name, but not the other way around. |
|
|
|
_this.eventMap = {}; |
|
return _this; |
|
} |
|
/** |
|
* General event handler which only calls to its original props callback if |
|
* it has not already been handled by a descendant IgnoreNestedEvents. |
|
* |
|
* @param {Event} event Event object. |
|
* |
|
* @return {void} |
|
*/ |
|
|
|
|
|
Object(createClass["a" /* default */])(IgnoreNestedEvents, [{ |
|
key: "proxyEvent", |
|
value: function proxyEvent(event) { |
|
var isHandled = !!event.nativeEvent._blockHandled; // Assign into the native event, since React will reuse their synthetic |
|
// event objects and this property assignment could otherwise leak. |
|
// |
|
// See: https://reactjs.org/docs/events.html#event-pooling |
|
|
|
event.nativeEvent._blockHandled = true; // Invoke original prop handler |
|
|
|
var propKey = this.eventMap[event.type]; // If already handled (i.e. assume nested block), only invoke a |
|
// corresponding "Handled"-suffixed prop callback. |
|
|
|
if (isHandled) { |
|
propKey += 'Handled'; |
|
} |
|
|
|
if (this.props[propKey]) { |
|
this.props[propKey](event); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this2 = this; |
|
|
|
var _this$props = this.props, |
|
_this$props$childHand = _this$props.childHandledEvents, |
|
childHandledEvents = _this$props$childHand === void 0 ? [] : _this$props$childHand, |
|
forwardedRef = _this$props.forwardedRef, |
|
props = Object(objectWithoutProperties["a" /* default */])(_this$props, ["childHandledEvents", "forwardedRef"]); |
|
|
|
var eventHandlers = Object(external_lodash_["reduce"])(Object(toConsumableArray["a" /* default */])(childHandledEvents).concat(Object(toConsumableArray["a" /* default */])(Object.keys(props))), function (result, key) { |
|
// Try to match prop key as event handler |
|
var match = key.match(/^on([A-Z][a-zA-Z]+?)(Handled)?$/); |
|
|
|
if (match) { |
|
var isHandledProp = !!match[2]; |
|
|
|
if (isHandledProp) { |
|
// Avoid assigning through the invalid prop key. This |
|
// assumes mutation of shallow clone by above spread. |
|
delete props[key]; |
|
} // Re-map the prop to the local proxy handler to check whether |
|
// the event has already been handled. |
|
|
|
|
|
var proxiedPropName = 'on' + match[1]; |
|
result[proxiedPropName] = _this2.proxyEvent; // Assign event -> propName into an instance variable, so as to |
|
// avoid re-renders which could be incurred either by setState |
|
// or in mapping values to a newly created function. |
|
|
|
_this2.eventMap[match[1].toLowerCase()] = proxiedPropName; |
|
} |
|
|
|
return result; |
|
}, {}); |
|
return Object(external_this_wp_element_["createElement"])("div", Object(esm_extends["a" /* default */])({ |
|
ref: forwardedRef |
|
}, props, eventHandlers)); |
|
} |
|
}]); |
|
|
|
return IgnoreNestedEvents; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
var ignore_nested_events_forwardedIgnoreNestedEvents = function forwardedIgnoreNestedEvents(props, ref) { |
|
return Object(external_this_wp_element_["createElement"])(ignore_nested_events_IgnoreNestedEvents, Object(esm_extends["a" /* default */])({}, props, { |
|
forwardedRef: ref |
|
})); |
|
}; |
|
|
|
ignore_nested_events_forwardedIgnoreNestedEvents.displayName = 'IgnoreNestedEvents'; |
|
/* harmony default export */ var ignore_nested_events = (Object(external_this_wp_element_["forwardRef"])(ignore_nested_events_forwardedIgnoreNestedEvents)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/inserter-with-shortcuts/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
function InserterWithShortcuts(_ref) { |
|
var items = _ref.items, |
|
isLocked = _ref.isLocked, |
|
onInsert = _ref.onInsert; |
|
|
|
if (isLocked) { |
|
return null; |
|
} |
|
|
|
var itemsWithoutDefaultBlock = Object(external_lodash_["filter"])(items, function (item) { |
|
return !item.isDisabled && (item.name !== Object(external_this_wp_blocks_["getDefaultBlockName"])() || !Object(external_lodash_["isEmpty"])(item.initialAttributes)); |
|
}).slice(0, 3); |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-inserter-with-shortcuts" |
|
}, itemsWithoutDefaultBlock.map(function (item) { |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
key: item.id, |
|
className: "editor-inserter-with-shortcuts__block", |
|
onClick: function onClick() { |
|
return onInsert(item); |
|
} // translators: %s: block title/name to be added |
|
, |
|
label: Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["__"])('Add %s'), item.title), |
|
icon: Object(external_this_wp_element_["createElement"])(BlockIcon, { |
|
icon: item.icon |
|
}) |
|
}); |
|
})); |
|
} |
|
|
|
/* harmony default export */ var inserter_with_shortcuts = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select, _ref2) { |
|
var rootClientId = _ref2.rootClientId; |
|
|
|
var _select = select('core/editor'), |
|
getInserterItems = _select.getInserterItems, |
|
getTemplateLock = _select.getTemplateLock; |
|
|
|
return { |
|
items: getInserterItems(rootClientId), |
|
isLocked: !!getTemplateLock(rootClientId) |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, ownProps) { |
|
var clientId = ownProps.clientId, |
|
rootClientId = ownProps.rootClientId; |
|
return { |
|
onInsert: function onInsert(_ref3) { |
|
var name = _ref3.name, |
|
initialAttributes = _ref3.initialAttributes; |
|
var block = Object(external_this_wp_blocks_["createBlock"])(name, initialAttributes); |
|
|
|
if (clientId) { |
|
dispatch('core/editor').replaceBlocks(clientId, block); |
|
} else { |
|
dispatch('core/editor').insertBlock(block, undefined, rootClientId); |
|
} |
|
} |
|
}; |
|
}))(InserterWithShortcuts)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list/hover-area.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
var hover_area_HoverArea = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(HoverArea, _Component); |
|
|
|
function HoverArea() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, HoverArea); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(HoverArea).apply(this, arguments)); |
|
_this.state = { |
|
hoverArea: null |
|
}; |
|
_this.onMouseLeave = _this.onMouseLeave.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onMouseMove = _this.onMouseMove.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(HoverArea, [{ |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
if (this.props.container) { |
|
this.toggleListeners(this.props.container, false); |
|
} |
|
} |
|
}, { |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
if (this.props.container) { |
|
this.toggleListeners(this.props.container); |
|
} |
|
} |
|
}, { |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
if (prevProps.container === this.props.container) { |
|
return; |
|
} |
|
|
|
if (prevProps.container) { |
|
this.toggleListeners(prevProps.container, false); |
|
} |
|
|
|
if (this.props.container) { |
|
this.toggleListeners(this.props.container, true); |
|
} |
|
} |
|
}, { |
|
key: "toggleListeners", |
|
value: function toggleListeners(container) { |
|
var shouldListnerToEvents = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; |
|
var method = shouldListnerToEvents ? 'addEventListener' : 'removeEventListener'; |
|
container[method]('mousemove', this.onMouseMove); |
|
container[method]('mouseleave', this.onMouseLeave); |
|
} |
|
}, { |
|
key: "onMouseLeave", |
|
value: function onMouseLeave() { |
|
if (this.state.hoverArea) { |
|
this.setState({ |
|
hoverArea: null |
|
}); |
|
} |
|
} |
|
}, { |
|
key: "onMouseMove", |
|
value: function onMouseMove(event) { |
|
var _this$props = this.props, |
|
isRTL = _this$props.isRTL, |
|
container = _this$props.container; |
|
|
|
var _container$getBoundin = container.getBoundingClientRect(), |
|
width = _container$getBoundin.width, |
|
left = _container$getBoundin.left, |
|
right = _container$getBoundin.right; |
|
|
|
var hoverArea = null; |
|
|
|
if (event.clientX - left < width / 3) { |
|
hoverArea = isRTL ? 'right' : 'left'; |
|
} else if (right - event.clientX < width / 3) { |
|
hoverArea = isRTL ? 'left' : 'right'; |
|
} |
|
|
|
if (hoverArea !== this.state.hoverArea) { |
|
this.setState({ |
|
hoverArea: hoverArea |
|
}); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var hoverArea = this.state.hoverArea; |
|
var children = this.props.children; |
|
return children({ |
|
hoverArea: hoverArea |
|
}); |
|
} |
|
}]); |
|
|
|
return HoverArea; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var hover_area = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
isRTL: select('core/editor').getEditorSettings().isRTL |
|
}; |
|
})(hover_area_HoverArea)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/dom.js |
|
/** |
|
* Given a block client ID, returns the corresponding DOM node for the block, |
|
* if exists. As much as possible, this helper should be avoided, and used only |
|
* in cases where isolated behaviors need remote access to a block node. |
|
* |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {Element} Block DOM node. |
|
*/ |
|
function getBlockDOMNode(clientId) { |
|
return document.querySelector('[data-block="' + clientId + '"]'); |
|
} |
|
/** |
|
* Given a block client ID, returns the corresponding DOM node for the block |
|
* focusable wrapper, if exists. As much as possible, this helper should be |
|
* avoided, and used only in cases where isolated behaviors need remote access |
|
* to a block node. |
|
* |
|
* @param {string} clientId Block client ID. |
|
* |
|
* @return {Element} Block DOM node. |
|
*/ |
|
|
|
function getBlockFocusableWrapper(clientId) { |
|
return getBlockDOMNode(clientId).closest('.editor-block-list__block'); |
|
} |
|
/** |
|
* Returns true if the given HTMLElement is a block focus stop. Blocks without |
|
* their own text fields rely on the focus stop to be keyboard navigable. |
|
* |
|
* @param {HTMLElement} element Element to test. |
|
* |
|
* @return {boolean} Whether element is a block focus stop. |
|
*/ |
|
|
|
function isBlockFocusStop(element) { |
|
return element.classList.contains('editor-block-list__block'); |
|
} |
|
/** |
|
* Returns true if two elements are contained within the same block. |
|
* |
|
* @param {HTMLElement} a First element. |
|
* @param {HTMLElement} b Second element. |
|
* |
|
* @return {boolean} Whether elements are in the same block. |
|
*/ |
|
|
|
function isInSameBlock(a, b) { |
|
return a.closest('[data-block]') === b.closest('[data-block]'); |
|
} |
|
/** |
|
* Returns true if an elements is considered part of the block and not its children. |
|
* |
|
* @param {HTMLElement} blockElement Block container element. |
|
* @param {HTMLElement} element Element. |
|
* |
|
* @return {boolean} Whether element is in the block Element but not its children. |
|
*/ |
|
|
|
function isInsideRootBlock(blockElement, element) { |
|
var innerBlocksContainer = blockElement.querySelector('.editor-block-list__layout'); |
|
return blockElement.contains(element) && (!innerBlocksContainer || !innerBlocksContainer.contains(element)); |
|
} |
|
/** |
|
* Returns true if the given HTMLElement contains inner blocks (an InnerBlocks |
|
* element). |
|
* |
|
* @param {HTMLElement} element Element to test. |
|
* |
|
* @return {boolean} Whether element contains inner blocks. |
|
*/ |
|
|
|
function hasInnerBlocksContext(element) { |
|
return !!element.querySelector('.editor-block-list__layout'); |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list/block.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var block_BlockListBlock = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockListBlock, _Component); |
|
|
|
function BlockListBlock() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, BlockListBlock); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockListBlock).apply(this, arguments)); |
|
_this.setBlockListRef = _this.setBlockListRef.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.bindBlockNode = _this.bindBlockNode.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.setAttributes = _this.setAttributes.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.maybeHover = _this.maybeHover.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.forceFocusedContextualToolbar = _this.forceFocusedContextualToolbar.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.hideHoverEffects = _this.hideHoverEffects.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.mergeBlocks = _this.mergeBlocks.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.insertBlocksAfter = _this.insertBlocksAfter.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onFocus = _this.onFocus.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.preventDrag = _this.preventDrag.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onPointerDown = _this.onPointerDown.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.deleteOrInsertAfterWrapper = _this.deleteOrInsertAfterWrapper.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onBlockError = _this.onBlockError.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onTouchStart = _this.onTouchStart.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onClick = _this.onClick.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onDragStart = _this.onDragStart.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onDragEnd = _this.onDragEnd.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.selectOnOpen = _this.selectOnOpen.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.hadTouchStart = false; |
|
_this.state = { |
|
error: null, |
|
dragging: false, |
|
isHovered: false |
|
}; |
|
_this.isForcingContextualToolbar = false; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockListBlock, [{ |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
if (this.props.isSelected) { |
|
this.focusTabbable(); |
|
} |
|
} |
|
}, { |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
if (this.isForcingContextualToolbar) { |
|
// The forcing of contextual toolbar should only be true during one update, |
|
// after the first update normal conditions should apply. |
|
this.isForcingContextualToolbar = false; |
|
} |
|
|
|
if (this.props.isTypingWithinBlock || this.props.isSelected) { |
|
this.hideHoverEffects(); |
|
} |
|
|
|
if (this.props.isSelected && !prevProps.isSelected) { |
|
this.focusTabbable(true); |
|
} // When triggering a multi-selection, |
|
// move the focus to the wrapper of the first selected block. |
|
|
|
|
|
if (this.props.isFirstMultiSelected && !prevProps.isFirstMultiSelected) { |
|
this.wrapperNode.focus(); |
|
} |
|
} |
|
}, { |
|
key: "setBlockListRef", |
|
value: function setBlockListRef(node) { |
|
this.wrapperNode = node; |
|
this.props.blockRef(node, this.props.clientId); // We need to rerender to trigger a rerendering of HoverArea |
|
// it depents on this.wrapperNode but we can't keep this.wrapperNode in state |
|
// Because we need it to be immediately availeble for `focusableTabbable` to work. |
|
|
|
this.forceUpdate(); |
|
} |
|
}, { |
|
key: "bindBlockNode", |
|
value: function bindBlockNode(node) { |
|
this.node = node; |
|
} |
|
/** |
|
* When a block becomes selected, transition focus to an inner tabbable. |
|
* |
|
* @param {boolean} ignoreInnerBlocks Should not focus inner blocks. |
|
*/ |
|
|
|
}, { |
|
key: "focusTabbable", |
|
value: function focusTabbable(ignoreInnerBlocks) { |
|
var _this2 = this; |
|
|
|
var initialPosition = this.props.initialPosition; // Focus is captured by the wrapper node, so while focus transition |
|
// should only consider tabbables within editable display, since it |
|
// may be the wrapper itself or a side control which triggered the |
|
// focus event, don't unnecessary transition to an inner tabbable. |
|
|
|
if (this.wrapperNode.contains(document.activeElement)) { |
|
return; |
|
} // Find all tabbables within node. |
|
|
|
|
|
var textInputs = external_this_wp_dom_["focus"].tabbable.find(this.node).filter(external_this_wp_dom_["isTextField"]) // Exclude inner blocks |
|
.filter(function (node) { |
|
return !ignoreInnerBlocks || isInsideRootBlock(_this2.node, node); |
|
}); // If reversed (e.g. merge via backspace), use the last in the set of |
|
// tabbables. |
|
|
|
var isReverse = -1 === initialPosition; |
|
var target = (isReverse ? external_lodash_["last"] : external_lodash_["first"])(textInputs); |
|
|
|
if (!target) { |
|
this.wrapperNode.focus(); |
|
return; |
|
} |
|
|
|
target.focus(); // In reverse case, need to explicitly place caret position. |
|
|
|
if (isReverse) { |
|
Object(external_this_wp_dom_["placeCaretAtHorizontalEdge"])(target, true); |
|
Object(external_this_wp_dom_["placeCaretAtVerticalEdge"])(target, true); |
|
} |
|
} |
|
}, { |
|
key: "setAttributes", |
|
value: function setAttributes(attributes) { |
|
var _this$props = this.props, |
|
clientId = _this$props.clientId, |
|
name = _this$props.name, |
|
onChange = _this$props.onChange; |
|
var type = Object(external_this_wp_blocks_["getBlockType"])(name); |
|
onChange(clientId, attributes); |
|
var metaAttributes = Object(external_lodash_["reduce"])(attributes, function (result, value, key) { |
|
if (Object(external_lodash_["get"])(type, ['attributes', key, 'source']) === 'meta') { |
|
result[type.attributes[key].meta] = value; |
|
} |
|
|
|
return result; |
|
}, {}); |
|
|
|
if (Object(external_lodash_["size"])(metaAttributes)) { |
|
this.props.onMetaChange(metaAttributes); |
|
} |
|
} |
|
}, { |
|
key: "onTouchStart", |
|
value: function onTouchStart() { |
|
// Detect touchstart to disable hover on iOS |
|
this.hadTouchStart = true; |
|
} |
|
}, { |
|
key: "onClick", |
|
value: function onClick() { |
|
// Clear touchstart detection |
|
// Browser will try to emulate mouse events also see https://www.html5rocks.com/en/mobile/touchandmouse/ |
|
this.hadTouchStart = false; |
|
} |
|
/** |
|
* A mouseover event handler to apply hover effect when a pointer device is |
|
* placed within the bounds of the block. The mouseover event is preferred |
|
* over mouseenter because it may be the case that a previous mouseenter |
|
* event was blocked from being handled by a IgnoreNestedEvents component, |
|
* therefore transitioning out of a nested block to the bounds of the block |
|
* would otherwise not trigger a hover effect. |
|
* |
|
* @see https://developer.mozilla.org/en-US/docs/Web/Events/mouseenter |
|
*/ |
|
|
|
}, { |
|
key: "maybeHover", |
|
value: function maybeHover() { |
|
var _this$props2 = this.props, |
|
isPartOfMultiSelection = _this$props2.isPartOfMultiSelection, |
|
isSelected = _this$props2.isSelected; |
|
var isHovered = this.state.isHovered; |
|
|
|
if (isHovered || isPartOfMultiSelection || isSelected || this.props.isMultiSelecting || this.hadTouchStart) { |
|
return; |
|
} |
|
|
|
this.setState({ |
|
isHovered: true |
|
}); |
|
} |
|
/** |
|
* Sets the block state as unhovered if currently hovering. There are cases |
|
* where mouseleave may occur but the block is not hovered (multi-select), |
|
* so to avoid unnecesary renders, the state is only set if hovered. |
|
*/ |
|
|
|
}, { |
|
key: "hideHoverEffects", |
|
value: function hideHoverEffects() { |
|
if (this.state.isHovered) { |
|
this.setState({ |
|
isHovered: false |
|
}); |
|
} |
|
} |
|
}, { |
|
key: "mergeBlocks", |
|
value: function mergeBlocks() { |
|
var forward = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; |
|
var _this$props3 = this.props, |
|
clientId = _this$props3.clientId, |
|
getPreviousBlockClientId = _this$props3.getPreviousBlockClientId, |
|
getNextBlockClientId = _this$props3.getNextBlockClientId, |
|
onMerge = _this$props3.onMerge; |
|
var previousBlockClientId = getPreviousBlockClientId(clientId); |
|
var nextBlockClientId = getNextBlockClientId(clientId); // Do nothing when it's the first block. |
|
|
|
if (!forward && !previousBlockClientId || forward && !nextBlockClientId) { |
|
return; |
|
} |
|
|
|
if (forward) { |
|
onMerge(clientId, nextBlockClientId); |
|
} else { |
|
onMerge(previousBlockClientId, clientId); |
|
} |
|
} |
|
}, { |
|
key: "insertBlocksAfter", |
|
value: function insertBlocksAfter(blocks) { |
|
this.props.onInsertBlocks(blocks, this.props.order + 1); |
|
} |
|
/** |
|
* Marks the block as selected when focused and not already selected. This |
|
* specifically handles the case where block does not set focus on its own |
|
* (via `setFocus`), typically if there is no focusable input in the block. |
|
* |
|
* @return {void} |
|
*/ |
|
|
|
}, { |
|
key: "onFocus", |
|
value: function onFocus() { |
|
if (!this.props.isSelected && !this.props.isPartOfMultiSelection) { |
|
this.props.onSelect(); |
|
} |
|
} |
|
/** |
|
* Prevents default dragging behavior within a block to allow for multi- |
|
* selection to take effect unhampered. |
|
* |
|
* @param {DragEvent} event Drag event. |
|
* |
|
* @return {void} |
|
*/ |
|
|
|
}, { |
|
key: "preventDrag", |
|
value: function preventDrag(event) { |
|
event.preventDefault(); |
|
} |
|
/** |
|
* Begins tracking cursor multi-selection when clicking down within block. |
|
* |
|
* @param {MouseEvent} event A mousedown event. |
|
* |
|
* @return {void} |
|
*/ |
|
|
|
}, { |
|
key: "onPointerDown", |
|
value: function onPointerDown(event) { |
|
// Not the main button. |
|
// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button |
|
if (event.button !== 0) { |
|
return; |
|
} |
|
|
|
if (event.shiftKey) { |
|
if (!this.props.isSelected) { |
|
this.props.onShiftSelection(); |
|
event.preventDefault(); |
|
} |
|
} else { |
|
this.props.onSelectionStart(this.props.clientId); // Allow user to escape out of a multi-selection to a singular |
|
// selection of a block via click. This is handled here since |
|
// onFocus excludes blocks involved in a multiselection, as |
|
// focus can be incurred by starting a multiselection (focus |
|
// moved to first block's multi-controls). |
|
|
|
if (this.props.isPartOfMultiSelection) { |
|
this.props.onSelect(); |
|
} |
|
} |
|
} |
|
/** |
|
* Interprets keydown event intent to remove or insert after block if key |
|
* event occurs on wrapper node. This can occur when the block has no text |
|
* fields of its own, particularly after initial insertion, to allow for |
|
* easy deletion and continuous writing flow to add additional content. |
|
* |
|
* @param {KeyboardEvent} event Keydown event. |
|
*/ |
|
|
|
}, { |
|
key: "deleteOrInsertAfterWrapper", |
|
value: function deleteOrInsertAfterWrapper(event) { |
|
var keyCode = event.keyCode, |
|
target = event.target; |
|
|
|
if (!this.props.isSelected || target !== this.wrapperNode || this.props.isLocked) { |
|
return; |
|
} |
|
|
|
switch (keyCode) { |
|
case external_this_wp_keycodes_["ENTER"]: |
|
// Insert default block after current block if enter and event |
|
// not already handled by descendant. |
|
this.props.onInsertDefaultBlockAfter(); |
|
event.preventDefault(); |
|
break; |
|
|
|
case external_this_wp_keycodes_["BACKSPACE"]: |
|
case external_this_wp_keycodes_["DELETE"]: |
|
// Remove block on backspace. |
|
var _this$props4 = this.props, |
|
clientId = _this$props4.clientId, |
|
onRemove = _this$props4.onRemove; |
|
onRemove(clientId); |
|
event.preventDefault(); |
|
break; |
|
} |
|
} |
|
}, { |
|
key: "onBlockError", |
|
value: function onBlockError(error) { |
|
this.setState({ |
|
error: error |
|
}); |
|
} |
|
}, { |
|
key: "onDragStart", |
|
value: function onDragStart() { |
|
this.setState({ |
|
dragging: true |
|
}); |
|
} |
|
}, { |
|
key: "onDragEnd", |
|
value: function onDragEnd() { |
|
this.setState({ |
|
dragging: false |
|
}); |
|
} |
|
}, { |
|
key: "selectOnOpen", |
|
value: function selectOnOpen(open) { |
|
if (open && !this.props.isSelected) { |
|
this.props.onSelect(); |
|
} |
|
} |
|
}, { |
|
key: "forceFocusedContextualToolbar", |
|
value: function forceFocusedContextualToolbar() { |
|
this.isForcingContextualToolbar = true; // trigger a re-render |
|
|
|
this.setState(function () { |
|
return {}; |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this3 = this; |
|
|
|
return Object(external_this_wp_element_["createElement"])(hover_area, { |
|
container: this.wrapperNode |
|
}, function (_ref) { |
|
var hoverArea = _ref.hoverArea; |
|
var _this3$props = _this3.props, |
|
order = _this3$props.order, |
|
mode = _this3$props.mode, |
|
isFocusMode = _this3$props.isFocusMode, |
|
hasFixedToolbar = _this3$props.hasFixedToolbar, |
|
isLocked = _this3$props.isLocked, |
|
isFirst = _this3$props.isFirst, |
|
isLast = _this3$props.isLast, |
|
clientId = _this3$props.clientId, |
|
rootClientId = _this3$props.rootClientId, |
|
isSelected = _this3$props.isSelected, |
|
isPartOfMultiSelection = _this3$props.isPartOfMultiSelection, |
|
isFirstMultiSelected = _this3$props.isFirstMultiSelected, |
|
isTypingWithinBlock = _this3$props.isTypingWithinBlock, |
|
isCaretWithinFormattedText = _this3$props.isCaretWithinFormattedText, |
|
isMultiSelecting = _this3$props.isMultiSelecting, |
|
isEmptyDefaultBlock = _this3$props.isEmptyDefaultBlock, |
|
isMovable = _this3$props.isMovable, |
|
isParentOfSelectedBlock = _this3$props.isParentOfSelectedBlock, |
|
isDraggable = _this3$props.isDraggable, |
|
className = _this3$props.className, |
|
name = _this3$props.name, |
|
isValid = _this3$props.isValid, |
|
attributes = _this3$props.attributes; |
|
var isHovered = _this3.state.isHovered && !isMultiSelecting; |
|
var blockType = Object(external_this_wp_blocks_["getBlockType"])(name); // translators: %s: Type of block (i.e. Text, Image etc) |
|
|
|
var blockLabel = Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["__"])('Block: %s'), blockType.title); // The block as rendered in the editor is composed of general block UI |
|
// (mover, toolbar, wrapper) and the display of the block content. |
|
|
|
var isUnregisteredBlock = name === Object(external_this_wp_blocks_["getUnregisteredTypeHandlerName"])(); // If the block is selected and we're typing the block should not appear. |
|
// Empty paragraph blocks should always show up as unselected. |
|
|
|
var showEmptyBlockSideInserter = (isSelected || isHovered) && isEmptyDefaultBlock && isValid; |
|
var showSideInserter = (isSelected || isHovered) && isEmptyDefaultBlock; |
|
var shouldAppearSelected = !isFocusMode && !showSideInserter && isSelected && !isTypingWithinBlock; |
|
var shouldAppearHovered = !isFocusMode && !hasFixedToolbar && isHovered && !isEmptyDefaultBlock; // We render block movers and block settings to keep them tabbale even if hidden |
|
|
|
var shouldRenderMovers = !isFocusMode && (isSelected || hoverArea === 'left') && !showEmptyBlockSideInserter && !isMultiSelecting && !isPartOfMultiSelection && !isTypingWithinBlock; |
|
var shouldShowBreadcrumb = !isFocusMode && isHovered && !isEmptyDefaultBlock; |
|
var shouldShowContextualToolbar = !hasFixedToolbar && !showSideInserter && (isSelected && (!isTypingWithinBlock || isCaretWithinFormattedText) || isFirstMultiSelected); |
|
var shouldShowMobileToolbar = shouldAppearSelected; |
|
var _this3$state = _this3.state, |
|
error = _this3$state.error, |
|
dragging = _this3$state.dragging; // Insertion point can only be made visible if the block is at the |
|
// the extent of a multi-selection, or not in a multi-selection. |
|
|
|
var shouldShowInsertionPoint = isPartOfMultiSelection && isFirstMultiSelected || !isPartOfMultiSelection; // The wp-block className is important for editor styles. |
|
// Generate the wrapper class names handling the different states of the block. |
|
|
|
var wrapperClassName = classnames_default()('wp-block editor-block-list__block', { |
|
'has-warning': !isValid || !!error || isUnregisteredBlock, |
|
'is-selected': shouldAppearSelected, |
|
'is-multi-selected': isPartOfMultiSelection, |
|
'is-hovered': shouldAppearHovered, |
|
'is-reusable': Object(external_this_wp_blocks_["isReusableBlock"])(blockType), |
|
'is-dragging': dragging, |
|
'is-typing': isTypingWithinBlock, |
|
'is-focused': isFocusMode && (isSelected || isParentOfSelectedBlock), |
|
'is-focus-mode': isFocusMode |
|
}, className); |
|
var onReplace = _this3.props.onReplace; // Determine whether the block has props to apply to the wrapper. |
|
|
|
var wrapperProps = _this3.props.wrapperProps; |
|
|
|
if (blockType.getEditWrapperProps) { |
|
wrapperProps = Object(objectSpread["a" /* default */])({}, wrapperProps, blockType.getEditWrapperProps(attributes)); |
|
} |
|
|
|
var blockElementId = "block-".concat(clientId); // We wrap the BlockEdit component in a div that hides it when editing in |
|
// HTML mode. This allows us to render all of the ancillary pieces |
|
// (InspectorControls, etc.) which are inside `BlockEdit` but not |
|
// `BlockHTML`, even in HTML mode. |
|
|
|
var blockEdit = Object(external_this_wp_element_["createElement"])(block_edit, { |
|
name: name, |
|
isSelected: isSelected, |
|
attributes: attributes, |
|
setAttributes: _this3.setAttributes, |
|
insertBlocksAfter: isLocked ? undefined : _this3.insertBlocksAfter, |
|
onReplace: isLocked ? undefined : onReplace, |
|
mergeBlocks: isLocked ? undefined : _this3.mergeBlocks, |
|
clientId: clientId, |
|
isSelectionEnabled: _this3.props.isSelectionEnabled, |
|
toggleSelection: _this3.props.toggleSelection |
|
}); |
|
|
|
if (mode !== 'visual') { |
|
blockEdit = Object(external_this_wp_element_["createElement"])("div", { |
|
style: { |
|
display: 'none' |
|
} |
|
}, blockEdit); |
|
} // Disable reasons: |
|
// |
|
// jsx-a11y/mouse-events-have-key-events: |
|
// - onMouseOver is explicitly handling hover effects |
|
// |
|
// jsx-a11y/no-static-element-interactions: |
|
// - Each block can be selected by clicking on it |
|
|
|
/* eslint-disable jsx-a11y/mouse-events-have-key-events, jsx-a11y/no-static-element-interactions, jsx-a11y/onclick-has-role, jsx-a11y/click-events-have-key-events */ |
|
|
|
|
|
return Object(external_this_wp_element_["createElement"])(ignore_nested_events, Object(esm_extends["a" /* default */])({ |
|
id: blockElementId, |
|
ref: _this3.setBlockListRef, |
|
onMouseOver: _this3.maybeHover, |
|
onMouseOverHandled: _this3.hideHoverEffects, |
|
onMouseLeave: _this3.hideHoverEffects, |
|
className: wrapperClassName, |
|
"data-type": name, |
|
onTouchStart: _this3.onTouchStart, |
|
onFocus: _this3.onFocus, |
|
onClick: _this3.onClick, |
|
onKeyDown: _this3.deleteOrInsertAfterWrapper, |
|
tabIndex: "0", |
|
"aria-label": blockLabel, |
|
childHandledEvents: ['onDragStart', 'onMouseDown'] |
|
}, wrapperProps), shouldShowInsertionPoint && Object(external_this_wp_element_["createElement"])(insertion_point, { |
|
clientId: clientId, |
|
rootClientId: rootClientId |
|
}), Object(external_this_wp_element_["createElement"])(block_drop_zone, { |
|
index: order, |
|
clientId: clientId, |
|
rootClientId: rootClientId |
|
}), shouldRenderMovers && Object(external_this_wp_element_["createElement"])(block_mover, { |
|
clientIds: clientId, |
|
blockElementId: blockElementId, |
|
isFirst: isFirst, |
|
isLast: isLast, |
|
isHidden: !(isHovered || isSelected) || hoverArea !== 'left', |
|
isDraggable: isDraggable !== false && !isPartOfMultiSelection && isMovable, |
|
onDragStart: _this3.onDragStart, |
|
onDragEnd: _this3.onDragEnd |
|
}), isFirstMultiSelected && Object(external_this_wp_element_["createElement"])(multi_controls, { |
|
rootClientId: rootClientId |
|
}), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-list__block-edit" |
|
}, shouldShowBreadcrumb && Object(external_this_wp_element_["createElement"])(breadcrumb, { |
|
clientId: clientId, |
|
isHidden: !(isHovered || isSelected) || hoverArea !== 'left' |
|
}), (shouldShowContextualToolbar || _this3.isForcingContextualToolbar) && Object(external_this_wp_element_["createElement"])(block_contextual_toolbar // If the toolbar is being shown because of being forced |
|
// it should focus the toolbar right after the mount. |
|
, { |
|
focusOnMount: _this3.isForcingContextualToolbar |
|
}), !shouldShowContextualToolbar && isSelected && !hasFixedToolbar && !isEmptyDefaultBlock && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["KeyboardShortcuts"], { |
|
bindGlobal: true, |
|
eventName: "keydown", |
|
shortcuts: { |
|
'alt+f10': _this3.forceFocusedContextualToolbar |
|
} |
|
}), Object(external_this_wp_element_["createElement"])(ignore_nested_events, { |
|
ref: _this3.bindBlockNode, |
|
onDragStart: _this3.preventDrag, |
|
onMouseDown: _this3.onPointerDown, |
|
"data-block": clientId |
|
}, Object(external_this_wp_element_["createElement"])(block_crash_boundary, { |
|
onError: _this3.onBlockError |
|
}, isValid && blockEdit, isValid && mode === 'html' && Object(external_this_wp_element_["createElement"])(block_html, { |
|
clientId: clientId |
|
}), !isValid && [Object(external_this_wp_element_["createElement"])(block_invalid_warning, { |
|
key: "invalid-warning", |
|
clientId: clientId |
|
}), Object(external_this_wp_element_["createElement"])("div", { |
|
key: "invalid-preview" |
|
}, Object(external_this_wp_blocks_["getSaveElement"])(blockType, attributes))]), shouldShowMobileToolbar && Object(external_this_wp_element_["createElement"])(block_mobile_toolbar, { |
|
clientId: clientId |
|
}), !!error && Object(external_this_wp_element_["createElement"])(block_crash_warning, null))), showEmptyBlockSideInserter && Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-list__side-inserter" |
|
}, Object(external_this_wp_element_["createElement"])(inserter_with_shortcuts, { |
|
clientId: clientId, |
|
rootClientId: rootClientId, |
|
onToggle: _this3.selectOnOpen |
|
})), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-list__empty-block-inserter" |
|
}, Object(external_this_wp_element_["createElement"])(inserter, { |
|
position: "top right", |
|
onToggle: _this3.selectOnOpen |
|
})))); |
|
/* eslint-enable jsx-a11y/no-static-element-interactions, jsx-a11y/onclick-has-role, jsx-a11y/click-events-have-key-events */ |
|
}); |
|
} |
|
}]); |
|
|
|
return BlockListBlock; |
|
}(external_this_wp_element_["Component"]); |
|
var applyWithSelect = Object(external_this_wp_data_["withSelect"])(function (select, _ref2) { |
|
var clientId = _ref2.clientId, |
|
rootClientId = _ref2.rootClientId, |
|
isLargeViewport = _ref2.isLargeViewport; |
|
|
|
var _select = select('core/editor'), |
|
isBlockSelected = _select.isBlockSelected, |
|
isAncestorMultiSelected = _select.isAncestorMultiSelected, |
|
isBlockMultiSelected = _select.isBlockMultiSelected, |
|
isFirstMultiSelectedBlock = _select.isFirstMultiSelectedBlock, |
|
isMultiSelecting = _select.isMultiSelecting, |
|
isTyping = _select.isTyping, |
|
isCaretWithinFormattedText = _select.isCaretWithinFormattedText, |
|
getBlockIndex = _select.getBlockIndex, |
|
getBlockMode = _select.getBlockMode, |
|
isSelectionEnabled = _select.isSelectionEnabled, |
|
getSelectedBlocksInitialCaretPosition = _select.getSelectedBlocksInitialCaretPosition, |
|
getEditorSettings = _select.getEditorSettings, |
|
hasSelectedInnerBlock = _select.hasSelectedInnerBlock, |
|
getTemplateLock = _select.getTemplateLock, |
|
getPreviousBlockClientId = _select.getPreviousBlockClientId, |
|
getNextBlockClientId = _select.getNextBlockClientId, |
|
__unstableGetBlockWithoutInnerBlocks = _select.__unstableGetBlockWithoutInnerBlocks; |
|
|
|
var block = __unstableGetBlockWithoutInnerBlocks(clientId); |
|
|
|
var isSelected = isBlockSelected(clientId); |
|
|
|
var _getEditorSettings = getEditorSettings(), |
|
hasFixedToolbar = _getEditorSettings.hasFixedToolbar, |
|
focusMode = _getEditorSettings.focusMode; |
|
|
|
var templateLock = getTemplateLock(rootClientId); |
|
var isParentOfSelectedBlock = hasSelectedInnerBlock(clientId, true); // The fallback to `{}` is a temporary fix. |
|
// This function should never be called when a block is not present in the state. |
|
// It happens now because the order in withSelect rendering is not correct. |
|
|
|
var _ref3 = block || {}, |
|
name = _ref3.name, |
|
attributes = _ref3.attributes, |
|
isValid = _ref3.isValid; |
|
|
|
return { |
|
isPartOfMultiSelection: isBlockMultiSelected(clientId) || isAncestorMultiSelected(clientId), |
|
isFirstMultiSelected: isFirstMultiSelectedBlock(clientId), |
|
isMultiSelecting: isMultiSelecting(), |
|
// We only care about this prop when the block is selected |
|
// Thus to avoid unnecessary rerenders we avoid updating the prop if the block is not selected. |
|
isTypingWithinBlock: (isSelected || isParentOfSelectedBlock) && isTyping(), |
|
isCaretWithinFormattedText: isCaretWithinFormattedText(), |
|
order: getBlockIndex(clientId, rootClientId), |
|
mode: getBlockMode(clientId), |
|
isSelectionEnabled: isSelectionEnabled(), |
|
initialPosition: getSelectedBlocksInitialCaretPosition(), |
|
isEmptyDefaultBlock: name && Object(external_this_wp_blocks_["isUnmodifiedDefaultBlock"])({ |
|
name: name, |
|
attributes: attributes |
|
}), |
|
isMovable: 'all' !== templateLock, |
|
isLocked: !!templateLock, |
|
isFocusMode: focusMode && isLargeViewport, |
|
hasFixedToolbar: hasFixedToolbar && isLargeViewport, |
|
// Users of the editor.BlockListBlock filter used to be able to access the block prop |
|
// Ideally these blocks would rely on the clientId prop only. |
|
// This is kept for backward compatibility reasons. |
|
block: block, |
|
name: name, |
|
attributes: attributes, |
|
isValid: isValid, |
|
isSelected: isSelected, |
|
isParentOfSelectedBlock: isParentOfSelectedBlock, |
|
// We only care about these selectors when events are triggered. |
|
// We call them dynamically in the event handlers to avoid unnecessary re-renders. |
|
getPreviousBlockClientId: getPreviousBlockClientId, |
|
getNextBlockClientId: getNextBlockClientId |
|
}; |
|
}); |
|
var applyWithDispatch = Object(external_this_wp_data_["withDispatch"])(function (dispatch, ownProps, _ref4) { |
|
var select = _ref4.select; |
|
|
|
var _select2 = select('core/editor'), |
|
getBlockSelectionStart = _select2.getBlockSelectionStart; |
|
|
|
var _dispatch = dispatch('core/editor'), |
|
updateBlockAttributes = _dispatch.updateBlockAttributes, |
|
selectBlock = _dispatch.selectBlock, |
|
multiSelect = _dispatch.multiSelect, |
|
insertBlocks = _dispatch.insertBlocks, |
|
insertDefaultBlock = _dispatch.insertDefaultBlock, |
|
removeBlock = _dispatch.removeBlock, |
|
mergeBlocks = _dispatch.mergeBlocks, |
|
replaceBlocks = _dispatch.replaceBlocks, |
|
editPost = _dispatch.editPost, |
|
_toggleSelection = _dispatch.toggleSelection; |
|
|
|
return { |
|
onChange: function onChange(clientId, attributes) { |
|
updateBlockAttributes(clientId, attributes); |
|
}, |
|
onSelect: function onSelect() { |
|
var clientId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ownProps.clientId; |
|
var initialPosition = arguments.length > 1 ? arguments[1] : undefined; |
|
selectBlock(clientId, initialPosition); |
|
}, |
|
onInsertBlocks: function onInsertBlocks(blocks, index) { |
|
var rootClientId = ownProps.rootClientId; |
|
insertBlocks(blocks, index, rootClientId); |
|
}, |
|
onInsertDefaultBlockAfter: function onInsertDefaultBlockAfter() { |
|
var order = ownProps.order, |
|
rootClientId = ownProps.rootClientId; |
|
insertDefaultBlock({}, rootClientId, order + 1); |
|
}, |
|
onRemove: function onRemove(clientId) { |
|
removeBlock(clientId); |
|
}, |
|
onMerge: function onMerge() { |
|
mergeBlocks.apply(void 0, arguments); |
|
}, |
|
onReplace: function onReplace(blocks) { |
|
replaceBlocks([ownProps.clientId], blocks); |
|
}, |
|
onMetaChange: function onMetaChange(meta) { |
|
editPost({ |
|
meta: meta |
|
}); |
|
}, |
|
onShiftSelection: function onShiftSelection() { |
|
if (!ownProps.isSelectionEnabled) { |
|
return; |
|
} |
|
|
|
if (getBlockSelectionStart()) { |
|
multiSelect(getBlockSelectionStart(), ownProps.clientId); |
|
} else { |
|
selectBlock(ownProps.clientId); |
|
} |
|
}, |
|
toggleSelection: function toggleSelection(selectionEnabled) { |
|
_toggleSelection(selectionEnabled); |
|
} |
|
}; |
|
}); |
|
/* harmony default export */ var block_list_block = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_viewport_["withViewportMatch"])({ |
|
isLargeViewport: 'medium' |
|
}), applyWithSelect, applyWithDispatch, Object(external_this_wp_components_["withFilters"])('editor.BlockListBlock'))(block_BlockListBlock)); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","htmlEntities"]} |
|
var external_this_wp_htmlEntities_ = __webpack_require__(49); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/default-block-appender/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
function DefaultBlockAppender(_ref) { |
|
var isLocked = _ref.isLocked, |
|
isVisible = _ref.isVisible, |
|
onAppend = _ref.onAppend, |
|
showPrompt = _ref.showPrompt, |
|
placeholder = _ref.placeholder, |
|
rootClientId = _ref.rootClientId, |
|
hovered = _ref.hovered, |
|
setState = _ref.setState; |
|
|
|
if (isLocked || !isVisible) { |
|
return null; |
|
} |
|
|
|
var value = Object(external_this_wp_htmlEntities_["decodeEntities"])(placeholder) || Object(external_this_wp_i18n_["__"])('Start writing or type / to choose a block'); // The appender "button" is in-fact a text field so as to support |
|
// transitions by WritingFlow occurring by arrow key press. WritingFlow |
|
// only supports tab transitions into text fields and to the block focus |
|
// boundary. |
|
// |
|
// See: https://github.com/WordPress/gutenberg/issues/4829#issuecomment-374213658 |
|
// |
|
// If it were ever to be made to be a proper `button` element, it is |
|
// important to note that `onFocus` alone would not be sufficient to |
|
// capture click events, notably in Firefox. |
|
// |
|
// See: https://gist.github.com/cvrebert/68659d0333a578d75372 |
|
// The wp-block className is important for editor styles. |
|
|
|
|
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
"data-root-client-id": rootClientId || '', |
|
className: "wp-block editor-default-block-appender", |
|
onMouseEnter: function onMouseEnter() { |
|
return setState({ |
|
hovered: true |
|
}); |
|
}, |
|
onMouseLeave: function onMouseLeave() { |
|
return setState({ |
|
hovered: false |
|
}); |
|
} |
|
}, Object(external_this_wp_element_["createElement"])(block_drop_zone, { |
|
rootClientId: rootClientId |
|
}), Object(external_this_wp_element_["createElement"])(react_autosize_textarea_lib_default.a, { |
|
role: "button", |
|
"aria-label": Object(external_this_wp_i18n_["__"])('Add block'), |
|
className: "editor-default-block-appender__content", |
|
readOnly: true, |
|
onFocus: onAppend, |
|
value: showPrompt ? value : '' |
|
}), hovered && Object(external_this_wp_element_["createElement"])(inserter_with_shortcuts, { |
|
rootClientId: rootClientId |
|
}), Object(external_this_wp_element_["createElement"])(inserter, { |
|
position: "top right" |
|
})); |
|
} |
|
/* harmony default export */ var default_block_appender = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_compose_["withState"])({ |
|
hovered: false |
|
}), Object(external_this_wp_data_["withSelect"])(function (select, ownProps) { |
|
var _select = select('core/editor'), |
|
getBlockCount = _select.getBlockCount, |
|
getBlockName = _select.getBlockName, |
|
isBlockValid = _select.isBlockValid, |
|
getEditorSettings = _select.getEditorSettings, |
|
getTemplateLock = _select.getTemplateLock; |
|
|
|
var isEmpty = !getBlockCount(ownProps.rootClientId); |
|
var isLastBlockDefault = getBlockName(ownProps.lastBlockClientId) === Object(external_this_wp_blocks_["getDefaultBlockName"])(); |
|
var isLastBlockValid = isBlockValid(ownProps.lastBlockClientId); |
|
|
|
var _getEditorSettings = getEditorSettings(), |
|
bodyPlaceholder = _getEditorSettings.bodyPlaceholder; |
|
|
|
return { |
|
isVisible: isEmpty || !isLastBlockDefault || !isLastBlockValid, |
|
showPrompt: isEmpty, |
|
isLocked: !!getTemplateLock(ownProps.rootClientId), |
|
placeholder: bodyPlaceholder |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, ownProps) { |
|
var _dispatch = dispatch('core/editor'), |
|
insertDefaultBlock = _dispatch.insertDefaultBlock, |
|
startTyping = _dispatch.startTyping; |
|
|
|
return { |
|
onAppend: function onAppend() { |
|
var rootClientId = ownProps.rootClientId; |
|
insertDefaultBlock(undefined, rootClientId); |
|
startTyping(); |
|
} |
|
}; |
|
}))(DefaultBlockAppender)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list-appender/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
function BlockListAppender(_ref) { |
|
var blockClientIds = _ref.blockClientIds, |
|
rootClientId = _ref.rootClientId, |
|
canInsertDefaultBlock = _ref.canInsertDefaultBlock, |
|
isLocked = _ref.isLocked; |
|
|
|
if (isLocked) { |
|
return null; |
|
} |
|
|
|
if (canInsertDefaultBlock) { |
|
return Object(external_this_wp_element_["createElement"])(ignore_nested_events, { |
|
childHandledEvents: ['onFocus', 'onClick', 'onKeyDown'] |
|
}, Object(external_this_wp_element_["createElement"])(default_block_appender, { |
|
rootClientId: rootClientId, |
|
lastBlockClientId: Object(external_lodash_["last"])(blockClientIds) |
|
})); |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "block-list-appender" |
|
}, Object(external_this_wp_element_["createElement"])(inserter, { |
|
rootClientId: rootClientId, |
|
renderToggle: function renderToggle(_ref2) { |
|
var onToggle = _ref2.onToggle, |
|
disabled = _ref2.disabled, |
|
isOpen = _ref2.isOpen; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
"aria-label": Object(external_this_wp_i18n_["__"])('Add block'), |
|
onClick: onToggle, |
|
className: "block-list-appender__toggle", |
|
"aria-haspopup": "true", |
|
"aria-expanded": isOpen, |
|
disabled: disabled |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Dashicon"], { |
|
icon: "insert" |
|
})); |
|
} |
|
})); |
|
} |
|
|
|
/* harmony default export */ var block_list_appender = (Object(external_this_wp_data_["withSelect"])(function (select, _ref3) { |
|
var rootClientId = _ref3.rootClientId; |
|
|
|
var _select = select('core/editor'), |
|
getBlockOrder = _select.getBlockOrder, |
|
canInsertBlockType = _select.canInsertBlockType, |
|
getTemplateLock = _select.getTemplateLock; |
|
|
|
return { |
|
isLocked: !!getTemplateLock(rootClientId), |
|
blockClientIds: getBlockOrder(rootClientId), |
|
canInsertDefaultBlock: canInsertBlockType(Object(external_this_wp_blocks_["getDefaultBlockName"])(), rootClientId) |
|
}; |
|
})(BlockListAppender)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-list/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
var block_list_BlockList = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockList, _Component); |
|
|
|
function BlockList(props) { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, BlockList); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockList).call(this, props)); |
|
_this.onSelectionStart = _this.onSelectionStart.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onSelectionEnd = _this.onSelectionEnd.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.setBlockRef = _this.setBlockRef.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.setLastClientY = _this.setLastClientY.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onPointerMove = Object(external_lodash_["throttle"])(_this.onPointerMove.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))), 100); // Browser does not fire `*move` event when the pointer position changes |
|
// relative to the document, so fire it with the last known position. |
|
|
|
_this.onScroll = function () { |
|
return _this.onPointerMove({ |
|
clientY: _this.lastClientY |
|
}); |
|
}; |
|
|
|
_this.lastClientY = 0; |
|
_this.nodes = {}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockList, [{ |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
window.addEventListener('mousemove', this.setLastClientY); |
|
} |
|
}, { |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
window.removeEventListener('mousemove', this.setLastClientY); |
|
} |
|
}, { |
|
key: "setLastClientY", |
|
value: function setLastClientY(_ref) { |
|
var clientY = _ref.clientY; |
|
this.lastClientY = clientY; |
|
} |
|
}, { |
|
key: "setBlockRef", |
|
value: function setBlockRef(node, clientId) { |
|
if (node === null) { |
|
delete this.nodes[clientId]; |
|
} else { |
|
this.nodes = Object(objectSpread["a" /* default */])({}, this.nodes, Object(defineProperty["a" /* default */])({}, clientId, node)); |
|
} |
|
} |
|
/** |
|
* Handles a pointer move event to update the extent of the current cursor |
|
* multi-selection. |
|
* |
|
* @param {MouseEvent} event A mousemove event object. |
|
* |
|
* @return {void} |
|
*/ |
|
|
|
}, { |
|
key: "onPointerMove", |
|
value: function onPointerMove(_ref2) { |
|
var clientY = _ref2.clientY; |
|
|
|
// We don't start multi-selection until the mouse starts moving, so as |
|
// to avoid dispatching multi-selection actions on an in-place click. |
|
if (!this.props.isMultiSelecting) { |
|
this.props.onStartMultiSelect(); |
|
} |
|
|
|
var blockContentBoundaries = getBlockDOMNode(this.selectionAtStart).getBoundingClientRect(); // prevent multi-selection from triggering when the selected block is a float |
|
// and the cursor is still between the top and the bottom of the block. |
|
|
|
if (clientY >= blockContentBoundaries.top && clientY <= blockContentBoundaries.bottom) { |
|
return; |
|
} |
|
|
|
var y = clientY - blockContentBoundaries.top; |
|
var key = Object(external_lodash_["findLast"])(this.coordMapKeys, function (coordY) { |
|
return coordY < y; |
|
}); |
|
this.onSelectionChange(this.coordMap[key]); |
|
} |
|
/** |
|
* Binds event handlers to the document for tracking a pending multi-select |
|
* in response to a mousedown event occurring in a rendered block. |
|
* |
|
* @param {string} clientId Client ID of block where mousedown occurred. |
|
* |
|
* @return {void} |
|
*/ |
|
|
|
}, { |
|
key: "onSelectionStart", |
|
value: function onSelectionStart(clientId) { |
|
if (!this.props.isSelectionEnabled) { |
|
return; |
|
} |
|
|
|
var boundaries = this.nodes[clientId].getBoundingClientRect(); // Create a clientId to Y coördinate map. |
|
|
|
var clientIdToCoordMap = Object(external_lodash_["mapValues"])(this.nodes, function (node) { |
|
return node.getBoundingClientRect().top - boundaries.top; |
|
}); // Cache a Y coördinate to clientId map for use in `onPointerMove`. |
|
|
|
this.coordMap = Object(external_lodash_["invert"])(clientIdToCoordMap); // Cache an array of the Y coördinates for use in `onPointerMove`. |
|
// Sort the coördinates, as `this.nodes` will not necessarily reflect |
|
// the current block sequence. |
|
|
|
this.coordMapKeys = Object(external_lodash_["sortBy"])(Object.values(clientIdToCoordMap)); |
|
this.selectionAtStart = clientId; |
|
window.addEventListener('mousemove', this.onPointerMove); // Capture scroll on all elements. |
|
|
|
window.addEventListener('scroll', this.onScroll, true); |
|
window.addEventListener('mouseup', this.onSelectionEnd); |
|
} |
|
/** |
|
* Handles multi-selection changes in response to pointer move. |
|
* |
|
* @param {string} clientId Client ID of block under cursor in multi-select |
|
* drag. |
|
*/ |
|
|
|
}, { |
|
key: "onSelectionChange", |
|
value: function onSelectionChange(clientId) { |
|
var _this$props = this.props, |
|
onMultiSelect = _this$props.onMultiSelect, |
|
selectionStart = _this$props.selectionStart, |
|
selectionEnd = _this$props.selectionEnd; |
|
var selectionAtStart = this.selectionAtStart; |
|
var isAtStart = selectionAtStart === clientId; |
|
|
|
if (!selectionAtStart || !this.props.isSelectionEnabled) { |
|
return; |
|
} // If multi-selecting and cursor extent returns to the start of |
|
// selection, cancel multi-select. |
|
|
|
|
|
if (isAtStart && selectionStart) { |
|
onMultiSelect(null, null); |
|
} // Expand multi-selection to block under cursor. |
|
|
|
|
|
if (!isAtStart && selectionEnd !== clientId) { |
|
onMultiSelect(selectionAtStart, clientId); |
|
} |
|
} |
|
/** |
|
* Handles a mouseup event to end the current cursor multi-selection. |
|
* |
|
* @return {void} |
|
*/ |
|
|
|
}, { |
|
key: "onSelectionEnd", |
|
value: function onSelectionEnd() { |
|
// Cancel throttled calls. |
|
this.onPointerMove.cancel(); |
|
delete this.coordMap; |
|
delete this.coordMapKeys; |
|
delete this.selectionAtStart; |
|
window.removeEventListener('mousemove', this.onPointerMove); |
|
window.removeEventListener('scroll', this.onScroll, true); |
|
window.removeEventListener('mouseup', this.onSelectionEnd); // We may or may not be in a multi-selection when mouseup occurs (e.g. |
|
// an in-place mouse click), so only trigger stop if multi-selecting. |
|
|
|
if (this.props.isMultiSelecting) { |
|
this.props.onStopMultiSelect(); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this2 = this; |
|
|
|
var _this$props2 = this.props, |
|
blockClientIds = _this$props2.blockClientIds, |
|
rootClientId = _this$props2.rootClientId, |
|
isDraggable = _this$props2.isDraggable; |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-list__layout" |
|
}, Object(external_lodash_["map"])(blockClientIds, function (clientId, blockIndex) { |
|
return Object(external_this_wp_element_["createElement"])(block_list_block, { |
|
key: 'block-' + clientId, |
|
index: blockIndex, |
|
clientId: clientId, |
|
blockRef: _this2.setBlockRef, |
|
onSelectionStart: _this2.onSelectionStart, |
|
rootClientId: rootClientId, |
|
isFirst: blockIndex === 0, |
|
isLast: blockIndex === blockClientIds.length - 1, |
|
isDraggable: isDraggable |
|
}); |
|
}), Object(external_this_wp_element_["createElement"])(block_list_appender, { |
|
rootClientId: rootClientId |
|
})); |
|
} |
|
}]); |
|
|
|
return BlockList; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var block_list = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, ownProps) { |
|
var _select = select('core/editor'), |
|
getBlockOrder = _select.getBlockOrder, |
|
isSelectionEnabled = _select.isSelectionEnabled, |
|
isMultiSelecting = _select.isMultiSelecting, |
|
getMultiSelectedBlocksStartClientId = _select.getMultiSelectedBlocksStartClientId, |
|
getMultiSelectedBlocksEndClientId = _select.getMultiSelectedBlocksEndClientId; |
|
|
|
var rootClientId = ownProps.rootClientId; |
|
return { |
|
blockClientIds: getBlockOrder(rootClientId), |
|
selectionStart: getMultiSelectedBlocksStartClientId(), |
|
selectionEnd: getMultiSelectedBlocksEndClientId(), |
|
isSelectionEnabled: isSelectionEnabled(), |
|
isMultiSelecting: isMultiSelecting() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
startMultiSelect = _dispatch.startMultiSelect, |
|
stopMultiSelect = _dispatch.stopMultiSelect, |
|
multiSelect = _dispatch.multiSelect; |
|
|
|
return { |
|
onStartMultiSelect: startMultiSelect, |
|
onStopMultiSelect: stopMultiSelect, |
|
onMultiSelect: multiSelect |
|
}; |
|
})])(block_list_BlockList)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/inner-blocks/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
var inner_blocks_InnerBlocks = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(InnerBlocks, _Component); |
|
|
|
function InnerBlocks() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, InnerBlocks); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(InnerBlocks).apply(this, arguments)); |
|
_this.state = { |
|
templateInProcess: !!_this.props.template |
|
}; |
|
|
|
_this.updateNestedSettings(); |
|
|
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(InnerBlocks, [{ |
|
key: "getTemplateLock", |
|
value: function getTemplateLock() { |
|
var _this$props = this.props, |
|
templateLock = _this$props.templateLock, |
|
parentLock = _this$props.parentLock; |
|
return templateLock === undefined ? parentLock : templateLock; |
|
} |
|
}, { |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
var innerBlocks = this.props.block.innerBlocks; // only synchronize innerBlocks with template if innerBlocks are empty or a locking all exists |
|
|
|
if (innerBlocks.length === 0 || this.getTemplateLock() === 'all') { |
|
this.synchronizeBlocksWithTemplate(); |
|
} |
|
|
|
if (this.state.templateInProcess) { |
|
this.setState({ |
|
templateInProcess: false |
|
}); |
|
} |
|
} |
|
}, { |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
var _this$props2 = this.props, |
|
template = _this$props2.template, |
|
block = _this$props2.block; |
|
var innerBlocks = block.innerBlocks; |
|
this.updateNestedSettings(); // only synchronize innerBlocks with template if innerBlocks are empty or a locking all exists |
|
|
|
if (innerBlocks.length === 0 || this.getTemplateLock() === 'all') { |
|
var hasTemplateChanged = !Object(external_lodash_["isEqual"])(template, prevProps.template); |
|
|
|
if (hasTemplateChanged) { |
|
this.synchronizeBlocksWithTemplate(); |
|
} |
|
} |
|
} |
|
/** |
|
* Called on mount or when a mismatch exists between the templates and |
|
* inner blocks, synchronizes inner blocks with the template, replacing |
|
* current blocks. |
|
*/ |
|
|
|
}, { |
|
key: "synchronizeBlocksWithTemplate", |
|
value: function synchronizeBlocksWithTemplate() { |
|
var _this$props3 = this.props, |
|
template = _this$props3.template, |
|
block = _this$props3.block, |
|
replaceInnerBlocks = _this$props3.replaceInnerBlocks; |
|
var innerBlocks = block.innerBlocks; // Synchronize with templates. If the next set differs, replace. |
|
|
|
var nextBlocks = Object(external_this_wp_blocks_["synchronizeBlocksWithTemplate"])(innerBlocks, template); |
|
|
|
if (!Object(external_lodash_["isEqual"])(nextBlocks, innerBlocks)) { |
|
replaceInnerBlocks(nextBlocks); |
|
} |
|
} |
|
}, { |
|
key: "updateNestedSettings", |
|
value: function updateNestedSettings() { |
|
var _this$props4 = this.props, |
|
blockListSettings = _this$props4.blockListSettings, |
|
allowedBlocks = _this$props4.allowedBlocks, |
|
updateNestedSettings = _this$props4.updateNestedSettings; |
|
var newSettings = { |
|
allowedBlocks: allowedBlocks, |
|
templateLock: this.getTemplateLock() |
|
}; |
|
|
|
if (!external_this_wp_isShallowEqual_default()(blockListSettings, newSettings)) { |
|
updateNestedSettings(newSettings); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props5 = this.props, |
|
clientId = _this$props5.clientId, |
|
isSmallScreen = _this$props5.isSmallScreen, |
|
isSelectedBlockInRoot = _this$props5.isSelectedBlockInRoot; |
|
var templateInProcess = this.state.templateInProcess; |
|
var classes = classnames_default()('editor-inner-blocks', { |
|
'has-overlay': isSmallScreen && !isSelectedBlockInRoot |
|
}); |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: classes |
|
}, !templateInProcess && Object(external_this_wp_element_["createElement"])(block_list, { |
|
rootClientId: clientId |
|
})); |
|
} |
|
}]); |
|
|
|
return InnerBlocks; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
inner_blocks_InnerBlocks = Object(external_this_wp_compose_["compose"])([context_withBlockEditContext(function (context) { |
|
return Object(external_lodash_["pick"])(context, ['clientId']); |
|
}), Object(external_this_wp_viewport_["withViewportMatch"])({ |
|
isSmallScreen: '< medium' |
|
}), Object(external_this_wp_data_["withSelect"])(function (select, ownProps) { |
|
var _select = select('core/editor'), |
|
isBlockSelected = _select.isBlockSelected, |
|
hasSelectedInnerBlock = _select.hasSelectedInnerBlock, |
|
getBlock = _select.getBlock, |
|
getBlockListSettings = _select.getBlockListSettings, |
|
getBlockRootClientId = _select.getBlockRootClientId, |
|
getTemplateLock = _select.getTemplateLock; |
|
|
|
var clientId = ownProps.clientId; |
|
var rootClientId = getBlockRootClientId(clientId); |
|
return { |
|
isSelectedBlockInRoot: isBlockSelected(clientId) || hasSelectedInnerBlock(clientId), |
|
block: getBlock(clientId), |
|
blockListSettings: getBlockListSettings(clientId), |
|
parentLock: getTemplateLock(rootClientId) |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, ownProps) { |
|
var _dispatch = dispatch('core/editor'), |
|
replaceBlocks = _dispatch.replaceBlocks, |
|
insertBlocks = _dispatch.insertBlocks, |
|
updateBlockListSettings = _dispatch.updateBlockListSettings; |
|
|
|
var block = ownProps.block, |
|
clientId = ownProps.clientId, |
|
_ownProps$templateIns = ownProps.templateInsertUpdatesSelection, |
|
templateInsertUpdatesSelection = _ownProps$templateIns === void 0 ? true : _ownProps$templateIns; |
|
return { |
|
replaceInnerBlocks: function replaceInnerBlocks(blocks) { |
|
var clientIds = Object(external_lodash_["map"])(block.innerBlocks, 'clientId'); |
|
|
|
if (clientIds.length) { |
|
replaceBlocks(clientIds, blocks); |
|
} else { |
|
insertBlocks(blocks, undefined, clientId, templateInsertUpdatesSelection); |
|
} |
|
}, |
|
updateNestedSettings: function updateNestedSettings(settings) { |
|
dispatch(updateBlockListSettings(clientId, settings)); |
|
} |
|
}; |
|
})])(inner_blocks_InnerBlocks); |
|
inner_blocks_InnerBlocks.Content = Object(external_this_wp_blocks_["withBlockContentContext"])(function (_ref) { |
|
var BlockContent = _ref.BlockContent; |
|
return Object(external_this_wp_element_["createElement"])(BlockContent, null); |
|
}); |
|
/* harmony default export */ var inner_blocks = (inner_blocks_InnerBlocks); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/inspector-advanced-controls/index.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var inspector_advanced_controls_createSlotFill = Object(external_this_wp_components_["createSlotFill"])('InspectorAdvancedControls'), |
|
inspector_advanced_controls_Fill = inspector_advanced_controls_createSlotFill.Fill, |
|
inspector_advanced_controls_Slot = inspector_advanced_controls_createSlotFill.Slot; |
|
|
|
var InspectorAdvancedControls = ifBlockEditSelected(inspector_advanced_controls_Fill); |
|
InspectorAdvancedControls.Slot = inspector_advanced_controls_Slot; |
|
/* harmony default export */ var inspector_advanced_controls = (InspectorAdvancedControls); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/inspector-controls/index.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var inspector_controls_createSlotFill = Object(external_this_wp_components_["createSlotFill"])('InspectorControls'), |
|
inspector_controls_Fill = inspector_controls_createSlotFill.Fill, |
|
inspector_controls_Slot = inspector_controls_createSlotFill.Slot; |
|
|
|
var InspectorControls = ifBlockEditSelected(inspector_controls_Fill); |
|
InspectorControls.Slot = inspector_controls_Slot; |
|
/* harmony default export */ var inspector_controls = (InspectorControls); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/color-palette/control.js |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
// translators: first %s: The type of color (e.g. background color), second %s: the color name or value (e.g. red or #ff0000) |
|
|
|
var colorIndicatorAriaLabel = Object(external_this_wp_i18n_["__"])('(current %s: %s)'); |
|
|
|
function ColorPaletteControl(_ref) { |
|
var colors = _ref.colors, |
|
disableCustomColors = _ref.disableCustomColors, |
|
label = _ref.label, |
|
onChange = _ref.onChange, |
|
value = _ref.value; |
|
var colorObject = utils_getColorObjectByColorValue(colors, value); |
|
var colorName = colorObject && colorObject.name; |
|
var ariaLabel = Object(external_this_wp_i18n_["sprintf"])(colorIndicatorAriaLabel, label.toLowerCase(), colorName || value); |
|
var labelElement = Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, label, value && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["ColorIndicator"], { |
|
colorValue: value, |
|
"aria-label": ariaLabel |
|
})); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["BaseControl"], { |
|
className: "editor-color-palette-control", |
|
label: labelElement |
|
}, Object(external_this_wp_element_["createElement"])(color_palette, Object(esm_extends["a" /* default */])({ |
|
className: "editor-color-palette-control__color-palette", |
|
value: value, |
|
onChange: onChange |
|
}, { |
|
colors: colors, |
|
disableCustomColors: disableCustomColors |
|
}))); |
|
} |
|
/* harmony default export */ var color_palette_control = (Object(external_this_wp_compose_["compose"])([with_color_context, Object(external_this_wp_compose_["ifCondition"])(function (_ref2) { |
|
var hasColorsToChoose = _ref2.hasColorsToChoose; |
|
return hasColorsToChoose; |
|
})])(ColorPaletteControl)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/panel-color-settings/index.js |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
var hasCustomColorsDisabledForSetting = function hasCustomColorsDisabledForSetting(disableCustomColors, colorSetting) { |
|
if (colorSetting.disableCustomColors !== undefined) { |
|
return colorSetting.disableCustomColors; |
|
} |
|
|
|
return disableCustomColors; |
|
}; |
|
|
|
var hasColorsToChooseInSetting = function hasColorsToChooseInSetting() { |
|
var colors = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; |
|
var disableCustomColors = arguments.length > 1 ? arguments[1] : undefined; |
|
var colorSetting = arguments.length > 2 ? arguments[2] : undefined; |
|
|
|
if (!hasCustomColorsDisabledForSetting(disableCustomColors, colorSetting)) { |
|
return true; |
|
} |
|
|
|
return (colorSetting.colors || colors).length > 0; |
|
}; |
|
|
|
var panel_color_settings_hasColorsToChoose = function hasColorsToChoose(_ref) { |
|
var colors = _ref.colors, |
|
disableCustomColors = _ref.disableCustomColors, |
|
colorSettings = _ref.colorSettings; |
|
return Object(external_lodash_["some"])(colorSettings, function (colorSetting) { |
|
return hasColorsToChooseInSetting(colors, disableCustomColors, colorSetting); |
|
}); |
|
}; // translators: first %s: The type of color (e.g. background color), second %s: the color name or value (e.g. red or #ff0000) |
|
|
|
|
|
var panel_color_settings_colorIndicatorAriaLabel = Object(external_this_wp_i18n_["__"])('(%s: %s)'); |
|
|
|
var panel_color_settings_renderColorIndicators = function renderColorIndicators(colorSettings, colors) { |
|
return colorSettings.map(function (_ref2, index) { |
|
var value = _ref2.value, |
|
label = _ref2.label, |
|
availableColors = _ref2.colors; |
|
|
|
if (!value) { |
|
return null; |
|
} |
|
|
|
var colorObject = utils_getColorObjectByColorValue(availableColors || colors, value); |
|
var colorName = colorObject && colorObject.name; |
|
var ariaLabel = Object(external_this_wp_i18n_["sprintf"])(panel_color_settings_colorIndicatorAriaLabel, label.toLowerCase(), colorName || value); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["ColorIndicator"], { |
|
key: index, |
|
colorValue: value, |
|
"aria-label": ariaLabel |
|
}); |
|
}); |
|
}; // colorSettings is passed as an array of props so that it can be used for |
|
// mapping both ColorIndicator and ColorPaletteControl components. Passing |
|
// an array of components/nodes here wouldn't be feasible. |
|
|
|
|
|
var PanelColorSettings = Object(external_this_wp_compose_["ifCondition"])(panel_color_settings_hasColorsToChoose)(function (_ref3) { |
|
var children = _ref3.children, |
|
colors = _ref3.colors, |
|
colorSettings = _ref3.colorSettings, |
|
disableCustomColors = _ref3.disableCustomColors, |
|
title = _ref3.title, |
|
props = Object(objectWithoutProperties["a" /* default */])(_ref3, ["children", "colors", "colorSettings", "disableCustomColors", "title"]); |
|
|
|
var className = 'editor-panel-color-settings'; |
|
var titleElement = Object(external_this_wp_element_["createElement"])("span", { |
|
className: "".concat(className, "__panel-title") |
|
}, title, panel_color_settings_renderColorIndicators(colorSettings, colors)); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], Object(esm_extends["a" /* default */])({ |
|
className: className, |
|
title: titleElement |
|
}, props), colorSettings.map(function (settings, index) { |
|
return Object(external_this_wp_element_["createElement"])(color_palette_control, Object(esm_extends["a" /* default */])({ |
|
key: index |
|
}, Object(objectSpread["a" /* default */])({ |
|
colors: colors, |
|
disableCustomColors: disableCustomColors |
|
}, settings))); |
|
}), children); |
|
}); |
|
/* harmony default export */ var panel_color_settings = (with_color_context(PanelColorSettings)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/plain-text/index.js |
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
|
|
function PlainText(_ref) { |
|
var _onChange = _ref.onChange, |
|
className = _ref.className, |
|
props = Object(objectWithoutProperties["a" /* default */])(_ref, ["onChange", "className"]); |
|
|
|
return Object(external_this_wp_element_["createElement"])(react_autosize_textarea_lib_default.a, Object(esm_extends["a" /* default */])({ |
|
className: classnames_default()('editor-plain-text', className), |
|
onChange: function onChange(event) { |
|
return _onChange(event.target.value); |
|
} |
|
}, props)); |
|
} |
|
|
|
/* harmony default export */ var plain_text = (PlainText); |
|
|
|
// EXTERNAL MODULE: ./node_modules/memize/index.js |
|
var memize = __webpack_require__(41); |
|
var memize_default = /*#__PURE__*/__webpack_require__.n(memize); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","blob"]} |
|
var external_this_wp_blob_ = __webpack_require__(32); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","deprecated"]} |
|
var external_this_wp_deprecated_ = __webpack_require__(65); |
|
var external_this_wp_deprecated_default = /*#__PURE__*/__webpack_require__.n(external_this_wp_deprecated_); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/rich-text/format-edit.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
var format_edit_FormatEdit = function FormatEdit(_ref) { |
|
var formatTypes = _ref.formatTypes, |
|
onChange = _ref.onChange, |
|
value = _ref.value; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, formatTypes.map(function (_ref2) { |
|
var name = _ref2.name, |
|
Edit = _ref2.edit; |
|
|
|
if (!Edit) { |
|
return null; |
|
} |
|
|
|
var activeFormat = Object(external_this_wp_richText_["getActiveFormat"])(value, name); |
|
var isActive = activeFormat !== undefined; |
|
var activeAttributes = isActive ? activeFormat.attributes || {} : {}; |
|
return Object(external_this_wp_element_["createElement"])(Edit, { |
|
key: name, |
|
isActive: isActive, |
|
activeAttributes: activeAttributes, |
|
value: value, |
|
onChange: onChange |
|
}); |
|
})); |
|
}; |
|
|
|
/* harmony default export */ var format_edit = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/rich-text'), |
|
getFormatTypes = _select.getFormatTypes; |
|
|
|
return { |
|
formatTypes: getFormatTypes() |
|
}; |
|
})(format_edit_FormatEdit)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/rich-text/format-toolbar/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
var format_toolbar_FormatToolbar = function FormatToolbar(_ref) { |
|
var controls = _ref.controls; |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-format-toolbar" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Toolbar"], null, controls.map(function (format) { |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Slot"], { |
|
name: "RichText.ToolbarControls.".concat(format), |
|
key: format |
|
}); |
|
}), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Slot"], { |
|
name: "RichText.ToolbarControls" |
|
}))); |
|
}; |
|
|
|
/* harmony default export */ var format_toolbar = (format_toolbar_FormatToolbar); |
|
|
|
// EXTERNAL MODULE: external "tinymce" |
|
var external_tinymce_ = __webpack_require__(192); |
|
var external_tinymce_default = /*#__PURE__*/__webpack_require__.n(external_tinymce_); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/rich-text/aria.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
var aria_isAriaPropName = function isAriaPropName(name) { |
|
return Object(external_lodash_["startsWith"])(name, 'aria-'); |
|
}; |
|
|
|
var aria_pickAriaProps = function pickAriaProps(props) { |
|
return Object(external_lodash_["pickBy"])(props, function (value, key) { |
|
return aria_isAriaPropName(key) && !Object(external_lodash_["isNil"])(value); |
|
}); |
|
}; |
|
var aria_diffAriaProps = function diffAriaProps(props, nextProps) { |
|
var prevAriaKeys = Object(external_lodash_["keys"])(aria_pickAriaProps(props)); |
|
var nextAriaKeys = Object(external_lodash_["keys"])(aria_pickAriaProps(nextProps)); |
|
var removedKeys = Object(external_lodash_["difference"])(prevAriaKeys, nextAriaKeys); |
|
var updatedKeys = nextAriaKeys.filter(function (key) { |
|
return !Object(external_lodash_["isEqual"])(props[key], nextProps[key]); |
|
}); |
|
return { |
|
removedKeys: removedKeys, |
|
updatedKeys: updatedKeys |
|
}; |
|
}; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/rich-text/tinymce.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Browser dependencies |
|
*/ |
|
|
|
var tinymce_window = window, |
|
tinymce_getSelection = tinymce_window.getSelection; |
|
var TEXT_NODE = window.Node.TEXT_NODE; |
|
var userAgent = window.navigator.userAgent; |
|
/** |
|
* Zero-width space character used by TinyMCE as a caret landing point for |
|
* inline boundary nodes. |
|
* |
|
* @see tinymce/src/core/main/ts/text/Zwsp.ts |
|
* |
|
* @type {string} |
|
*/ |
|
|
|
var TINYMCE_ZWSP = "\uFEFF"; |
|
/** |
|
* Applies a fix that provides `input` events for contenteditable in Internet Explorer. |
|
* |
|
* @param {Element} editorNode The root editor node. |
|
* |
|
* @return {Function} A function to remove the fix (for cleanup). |
|
*/ |
|
|
|
function applyInternetExplorerInputFix(editorNode) { |
|
/** |
|
* Dispatches `input` events in response to `textinput` events. |
|
* |
|
* IE provides a `textinput` event that is similar to an `input` event, |
|
* and we use it to manually dispatch an `input` event. |
|
* `textinput` is dispatched for text entry but for not deletions. |
|
* |
|
* @param {Event} textInputEvent An Internet Explorer `textinput` event. |
|
*/ |
|
function mapTextInputEvent(textInputEvent) { |
|
textInputEvent.stopImmediatePropagation(); |
|
var inputEvent = document.createEvent('Event'); |
|
inputEvent.initEvent('input', true, false); |
|
inputEvent.data = textInputEvent.data; |
|
textInputEvent.target.dispatchEvent(inputEvent); |
|
} |
|
/** |
|
* Dispatches `input` events in response to Delete and Backspace keyup. |
|
* |
|
* It would be better dispatch an `input` event after each deleting |
|
* `keydown` because the DOM is updated after each, but it is challenging |
|
* to determine the right time to dispatch `input` since propagation of |
|
* `keydown` can be stopped at any point. |
|
* |
|
* It's easier to listen for `keyup` in the capture phase and dispatch |
|
* `input` before `keyup` propagates further. It's not perfect, but should |
|
* be good enough. |
|
* |
|
* @param {KeyboardEvent} keyUp |
|
* @param {Node} keyUp.target The event target. |
|
* @param {number} keyUp.keyCode The key code. |
|
*/ |
|
|
|
|
|
function mapDeletionKeyUpEvents(_ref) { |
|
var target = _ref.target, |
|
keyCode = _ref.keyCode; |
|
var isDeletion = external_this_wp_keycodes_["BACKSPACE"] === keyCode || external_this_wp_keycodes_["DELETE"] === keyCode; |
|
|
|
if (isDeletion && editorNode.contains(target)) { |
|
var inputEvent = document.createEvent('Event'); |
|
inputEvent.initEvent('input', true, false); |
|
inputEvent.data = null; |
|
target.dispatchEvent(inputEvent); |
|
} |
|
} |
|
|
|
editorNode.addEventListener('textinput', mapTextInputEvent); |
|
document.addEventListener('keyup', mapDeletionKeyUpEvents, true); |
|
return function removeInternetExplorerInputFix() { |
|
editorNode.removeEventListener('textinput', mapTextInputEvent); |
|
document.removeEventListener('keyup', mapDeletionKeyUpEvents, true); |
|
}; |
|
} |
|
|
|
var IS_PLACEHOLDER_VISIBLE_ATTR_NAME = 'data-is-placeholder-visible'; |
|
/** |
|
* Whether or not the user agent is Internet Explorer. |
|
* |
|
* @type {boolean} |
|
*/ |
|
|
|
var IS_IE = userAgent.indexOf('Trident') >= 0; |
|
|
|
var tinymce_TinyMCE = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(TinyMCE, _Component); |
|
|
|
function TinyMCE() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, TinyMCE); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(TinyMCE).call(this)); |
|
_this.bindEditorNode = _this.bindEditorNode.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onFocus = _this.onFocus.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onKeyDown = _this.onKeyDown.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.initialize = _this.initialize.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(TinyMCE, [{ |
|
key: "onFocus", |
|
value: function onFocus() { |
|
if (this.props.onFocus) { |
|
this.props.onFocus(); |
|
} |
|
|
|
this.initialize(); |
|
} // We must prevent rerenders because RichText, the browser, and TinyMCE will |
|
// modify the DOM. React will rerender the DOM fine, but we're losing |
|
// selection and it would be more expensive to do so as it would just set |
|
// the inner HTML through `dangerouslySetInnerHTML`. Instead RichText does |
|
// it's own diffing and selection setting. |
|
// |
|
// Because we never update the component, we have to look through props and |
|
// update the attributes on the wrapper nodes here. `componentDidUpdate` |
|
// will never be called. |
|
|
|
}, { |
|
key: "shouldComponentUpdate", |
|
value: function shouldComponentUpdate(nextProps) { |
|
var _this2 = this; |
|
|
|
this.configureIsPlaceholderVisible(nextProps.isPlaceholderVisible); |
|
|
|
if (!Object(external_lodash_["isEqual"])(this.props.style, nextProps.style)) { |
|
this.editorNode.setAttribute('style', ''); |
|
Object.assign(this.editorNode.style, nextProps.style); |
|
} |
|
|
|
if (!Object(external_lodash_["isEqual"])(this.props.className, nextProps.className)) { |
|
this.editorNode.className = classnames_default()(nextProps.className, 'editor-rich-text__tinymce'); |
|
} |
|
|
|
var _diffAriaProps = aria_diffAriaProps(this.props, nextProps), |
|
removedKeys = _diffAriaProps.removedKeys, |
|
updatedKeys = _diffAriaProps.updatedKeys; |
|
|
|
removedKeys.forEach(function (key) { |
|
return _this2.editorNode.removeAttribute(key); |
|
}); |
|
updatedKeys.forEach(function (key) { |
|
return _this2.editorNode.setAttribute(key, nextProps[key]); |
|
}); |
|
return false; |
|
} |
|
}, { |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
if (!this.editor) { |
|
return; |
|
} |
|
|
|
this.editor.destroy(); |
|
delete this.editor; |
|
} |
|
}, { |
|
key: "configureIsPlaceholderVisible", |
|
value: function configureIsPlaceholderVisible(isPlaceholderVisible) { |
|
var isPlaceholderVisibleString = String(!!isPlaceholderVisible); |
|
|
|
if (this.editorNode.getAttribute(IS_PLACEHOLDER_VISIBLE_ATTR_NAME) !== isPlaceholderVisibleString) { |
|
this.editorNode.setAttribute(IS_PLACEHOLDER_VISIBLE_ATTR_NAME, isPlaceholderVisibleString); |
|
} |
|
} |
|
/** |
|
* Initializes TinyMCE. Can only be called once per instance. |
|
*/ |
|
|
|
}, { |
|
key: "initialize", |
|
value: function initialize() { |
|
var _this3 = this; |
|
|
|
if (this.initialize.called) { |
|
return; |
|
} |
|
|
|
this.initialize.called = true; |
|
var multilineTag = this.props.multilineTag; |
|
var settings = { |
|
theme: false, |
|
inline: true, |
|
toolbar: false, |
|
browser_spellcheck: true, |
|
entity_encoding: 'raw', |
|
convert_urls: false, |
|
// Disables TinyMCE's parsing to verify HTML. It makes |
|
// initialisation a bit faster. Since we're setting raw HTML |
|
// already with dangerouslySetInnerHTML, we don't need this to be |
|
// verified. |
|
verify_html: false, |
|
inline_boundaries_selector: 'a[href],code,b,i,strong,em,del,ins,sup,sub', |
|
plugins: [], |
|
forced_root_block: multilineTag || false, |
|
// Allow TinyMCE to keep one undo level for comparing changes. |
|
// Prevent it otherwise from accumulating any history. |
|
custom_undo_redo_levels: 1, |
|
lists_indent_on_tab: false |
|
}; |
|
|
|
if (multilineTag === 'li') { |
|
settings.plugins.push('lists'); |
|
} |
|
|
|
external_tinymce_default.a.init(Object(objectSpread["a" /* default */])({}, settings, { |
|
target: this.editorNode, |
|
setup: function setup(editor) { |
|
_this3.editor = editor; |
|
|
|
_this3.props.onSetup(editor); // TinyMCE resets the element content on initialization, even |
|
// when it's already identical to what exists currently. This |
|
// behavior clobbers a selection which exists at the time of |
|
// initialization, thus breaking writing flow navigation. The |
|
// hack here neutralizes setHTML during initialization. |
|
|
|
|
|
var setHTML; |
|
editor.on('preinit', function () { |
|
setHTML = editor.dom.setHTML; |
|
|
|
editor.dom.setHTML = function () {}; |
|
}); |
|
editor.on('init', function () { |
|
// History is handled internally by RichText. |
|
// |
|
// See: https://github.com/tinymce/tinymce/blob/master/src/core/main/ts/api/UndoManager.ts |
|
['z', 'y'].forEach(function (character) { |
|
editor.shortcuts.remove("meta+".concat(character)); |
|
}); |
|
editor.shortcuts.remove('meta+shift+z'); // Reset TinyMCE's default formatting shortcuts, since |
|
// RichText supports only registered formats. |
|
// |
|
// See: https://github.com/tinymce/tinymce/blob/master/src/core/main/ts/keyboard/FormatShortcuts.ts |
|
|
|
['b', 'i', 'u'].forEach(function (character) { |
|
editor.shortcuts.remove("meta+".concat(character)); |
|
}); |
|
[1, 2, 3, 4, 5, 6, 7, 8, 9].forEach(function (number) { |
|
editor.shortcuts.remove("access+".concat(number)); |
|
}); // Restore the original `setHTML` once initialized. |
|
|
|
editor.dom.setHTML = setHTML; // In IE11, focus is lost to parent after initialising |
|
// TinyMCE, so we have to set it back. |
|
|
|
if (IS_IE && document.activeElement !== _this3.editorNode && document.activeElement.contains(_this3.editorNode)) { |
|
_this3.editorNode.focus(); |
|
} |
|
}); |
|
editor.on('keydown', _this3.onKeyDown, true); |
|
} |
|
})); |
|
} |
|
}, { |
|
key: "bindEditorNode", |
|
value: function bindEditorNode(editorNode) { |
|
this.editorNode = editorNode; |
|
|
|
if (this.props.setRef) { |
|
this.props.setRef(editorNode); |
|
} |
|
|
|
if (IS_IE) { |
|
if (editorNode) { |
|
// Mounting: |
|
this.removeInternetExplorerInputFix = applyInternetExplorerInputFix(editorNode); |
|
} else { |
|
// Unmounting: |
|
this.removeInternetExplorerInputFix(); |
|
} |
|
} |
|
} |
|
}, { |
|
key: "onKeyDown", |
|
value: function onKeyDown(event) { |
|
var keyCode = event.keyCode; |
|
var isDelete = keyCode === external_this_wp_keycodes_["DELETE"] || keyCode === external_this_wp_keycodes_["BACKSPACE"]; // Disables TinyMCE behaviour. |
|
|
|
if (keyCode === external_this_wp_keycodes_["ENTER"] || isDelete && Object(external_this_wp_dom_["isEntirelySelected"])(this.editorNode)) { |
|
event.preventDefault(); // For some reason this is needed to also prevent the insertion of |
|
// line breaks. |
|
|
|
return false; |
|
} // Handles a horizontal navigation key down event to handle the case |
|
// where TinyMCE attempts to preventDefault when on the outside edge of |
|
// an inline boundary when arrowing _away_ from the boundary, not within |
|
// it. Replaces the TinyMCE event `preventDefault` behavior with a noop, |
|
// such that those relying on `defaultPrevented` are not misinformed |
|
// about the arrow event. |
|
// |
|
// If TinyMCE#4476 is resolved, this handling may be removed. |
|
// |
|
// @see https://github.com/tinymce/tinymce/issues/4476 |
|
|
|
|
|
if (keyCode !== external_this_wp_keycodes_["LEFT"] && keyCode !== external_this_wp_keycodes_["RIGHT"]) { |
|
return; |
|
} |
|
|
|
var _getSelection = tinymce_getSelection(), |
|
focusNode = _getSelection.focusNode; |
|
|
|
var nodeType = focusNode.nodeType, |
|
nodeValue = focusNode.nodeValue; |
|
|
|
if (nodeType !== TEXT_NODE) { |
|
return; |
|
} |
|
|
|
if (nodeValue.length !== 1 || nodeValue[0] !== TINYMCE_ZWSP) { |
|
return; |
|
} // Consider to be moving away from inline boundary based on: |
|
// |
|
// 1. Within a text fragment consisting only of ZWSP. |
|
// 2. If in reverse, there is no previous sibling. If forward, there is |
|
// no next sibling (i.e. end of node). |
|
|
|
|
|
var isReverse = event.keyCode === external_this_wp_keycodes_["LEFT"]; |
|
var edgeSibling = isReverse ? 'previousSibling' : 'nextSibling'; |
|
|
|
if (!focusNode[edgeSibling]) { |
|
// Note: This is not reassigning on the native event, rather the |
|
// "fixed" TinyMCE copy, which proxies its preventDefault to the |
|
// native event. By reassigning here, we're effectively preventing |
|
// the proxied call on the native event, but not otherwise mutating |
|
// the original event object. |
|
event.preventDefault = external_lodash_["noop"]; |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _objectSpread2; |
|
|
|
var ariaProps = aria_pickAriaProps(this.props); |
|
var _this$props = this.props, |
|
_this$props$tagName = _this$props.tagName, |
|
tagName = _this$props$tagName === void 0 ? 'div' : _this$props$tagName, |
|
style = _this$props.style, |
|
record = _this$props.record, |
|
valueToEditableHTML = _this$props.valueToEditableHTML, |
|
className = _this$props.className, |
|
isPlaceholderVisible = _this$props.isPlaceholderVisible, |
|
onPaste = _this$props.onPaste, |
|
onInput = _this$props.onInput, |
|
onKeyDown = _this$props.onKeyDown, |
|
onCompositionEnd = _this$props.onCompositionEnd, |
|
onBlur = _this$props.onBlur; |
|
/* |
|
* The role=textbox and aria-multiline=true must always be used together |
|
* as TinyMCE always behaves like a sort of textarea where text wraps in |
|
* multiple lines. Only the table block editable element is excluded. |
|
*/ |
|
|
|
if (tagName !== 'table') { |
|
ariaProps.role = 'textbox'; |
|
ariaProps['aria-multiline'] = true; |
|
} // If a default value is provided, render it into the DOM even before |
|
// TinyMCE finishes initializing. This avoids a short delay by allowing |
|
// us to show and focus the content before it's truly ready to edit. |
|
|
|
|
|
return Object(external_this_wp_element_["createElement"])(tagName, Object(objectSpread["a" /* default */])({}, ariaProps, (_objectSpread2 = { |
|
className: classnames_default()(className, 'editor-rich-text__tinymce'), |
|
contentEditable: true |
|
}, Object(defineProperty["a" /* default */])(_objectSpread2, IS_PLACEHOLDER_VISIBLE_ATTR_NAME, isPlaceholderVisible), Object(defineProperty["a" /* default */])(_objectSpread2, "ref", this.bindEditorNode), Object(defineProperty["a" /* default */])(_objectSpread2, "style", style), Object(defineProperty["a" /* default */])(_objectSpread2, "suppressContentEditableWarning", true), Object(defineProperty["a" /* default */])(_objectSpread2, "dangerouslySetInnerHTML", { |
|
__html: valueToEditableHTML(record) |
|
}), Object(defineProperty["a" /* default */])(_objectSpread2, "onPaste", onPaste), Object(defineProperty["a" /* default */])(_objectSpread2, "onInput", onInput), Object(defineProperty["a" /* default */])(_objectSpread2, "onFocus", this.onFocus), Object(defineProperty["a" /* default */])(_objectSpread2, "onBlur", onBlur), Object(defineProperty["a" /* default */])(_objectSpread2, "onKeyDown", onKeyDown), Object(defineProperty["a" /* default */])(_objectSpread2, "onCompositionEnd", onCompositionEnd), _objectSpread2))); |
|
} |
|
}]); |
|
|
|
return TinyMCE; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/rich-text/patterns.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
function getPatterns(_ref) { |
|
var onReplace = _ref.onReplace, |
|
valueToFormat = _ref.valueToFormat, |
|
onCreateUndoLevel = _ref.onCreateUndoLevel, |
|
onChange = _ref.onChange; |
|
var prefixTransforms = Object(external_this_wp_blocks_["getBlockTransforms"])('from').filter(function (_ref2) { |
|
var type = _ref2.type; |
|
return type === 'prefix'; |
|
}); |
|
return [function (record) { |
|
if (!onReplace) { |
|
return record; |
|
} |
|
|
|
var start = Object(external_this_wp_richText_["getSelectionStart"])(record); |
|
var text = Object(external_this_wp_richText_["getTextContent"])(record); |
|
var characterBefore = text.slice(start - 1, start); |
|
|
|
if (!/\s/.test(characterBefore)) { |
|
return record; |
|
} |
|
|
|
var trimmedTextBefore = text.slice(0, start).trim(); |
|
var transformation = Object(external_this_wp_blocks_["findTransform"])(prefixTransforms, function (_ref3) { |
|
var prefix = _ref3.prefix; |
|
return trimmedTextBefore === prefix; |
|
}); |
|
|
|
if (!transformation) { |
|
return record; |
|
} |
|
|
|
var content = valueToFormat(Object(external_this_wp_richText_["slice"])(record, start, text.length)); |
|
var block = transformation.transform(content); |
|
onCreateUndoLevel(); |
|
onReplace([block]); |
|
return record; |
|
}, function (record) { |
|
var BACKTICK = '`'; |
|
var start = Object(external_this_wp_richText_["getSelectionStart"])(record); |
|
var text = Object(external_this_wp_richText_["getTextContent"])(record); |
|
var characterBefore = text.slice(start - 1, start); // Quick check the text for the necessary character. |
|
|
|
if (characterBefore !== BACKTICK) { |
|
return record; |
|
} |
|
|
|
var textBefore = text.slice(0, start - 1); |
|
var indexBefore = textBefore.lastIndexOf(BACKTICK); |
|
|
|
if (indexBefore === -1) { |
|
return record; |
|
} |
|
|
|
var startIndex = indexBefore; |
|
var endIndex = start - 2; |
|
|
|
if (startIndex === endIndex) { |
|
return record; |
|
} |
|
|
|
onChange(record); |
|
record = Object(external_this_wp_richText_["remove"])(record, startIndex, startIndex + 1); |
|
record = Object(external_this_wp_richText_["remove"])(record, endIndex, endIndex + 1); |
|
record = Object(external_this_wp_richText_["applyFormat"])(record, { |
|
type: 'code' |
|
}, startIndex, endIndex); |
|
return record; |
|
}]; |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/rich-text/shortcut.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
var shortcut_RichTextShortcut = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(RichTextShortcut, _Component); |
|
|
|
function RichTextShortcut() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, RichTextShortcut); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(RichTextShortcut).apply(this, arguments)); |
|
_this.onUse = _this.onUse.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(RichTextShortcut, [{ |
|
key: "onUse", |
|
value: function onUse() { |
|
this.props.onUse(); |
|
return false; |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
character = _this$props.character, |
|
type = _this$props.type; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["KeyboardShortcuts"], { |
|
bindGlobal: true, |
|
shortcuts: Object(defineProperty["a" /* default */])({}, external_this_wp_keycodes_["rawShortcut"][type](character), this.onUse) |
|
}); |
|
} |
|
}]); |
|
|
|
return RichTextShortcut; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/rich-text/list-edit.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
function isListRootSelected(editor) { |
|
return !editor.selection || editor.selection.getNode().closest('ol,ul') === editor.getBody(); |
|
} |
|
|
|
function isActiveListType(editor, tagName, rootTagName) { |
|
if (document.activeElement !== editor.getBody()) { |
|
return tagName === rootTagName; |
|
} |
|
|
|
var listItem = editor.selection.getNode(); |
|
var list = listItem.closest('ol,ul'); |
|
|
|
if (!list) { |
|
return; |
|
} |
|
|
|
return list.nodeName.toLowerCase() === tagName; |
|
} |
|
|
|
var list_edit_ListEdit = function ListEdit(_ref) { |
|
var editor = _ref.editor, |
|
onTagNameChange = _ref.onTagNameChange, |
|
tagName = _ref.tagName, |
|
onSyncDOM = _ref.onSyncDOM; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])(shortcut_RichTextShortcut, { |
|
type: "primary", |
|
character: "[", |
|
onUse: function onUse() { |
|
editor.execCommand('Outdent'); |
|
onSyncDOM(); |
|
} |
|
}), Object(external_this_wp_element_["createElement"])(shortcut_RichTextShortcut, { |
|
type: "primary", |
|
character: "]", |
|
onUse: function onUse() { |
|
editor.execCommand('Indent'); |
|
onSyncDOM(); |
|
} |
|
}), Object(external_this_wp_element_["createElement"])(shortcut_RichTextShortcut, { |
|
type: "primary", |
|
character: "m", |
|
onUse: function onUse() { |
|
editor.execCommand('Indent'); |
|
onSyncDOM(); |
|
} |
|
}), Object(external_this_wp_element_["createElement"])(shortcut_RichTextShortcut, { |
|
type: "primaryShift", |
|
character: "m", |
|
onUse: function onUse() { |
|
editor.execCommand('Outdent'); |
|
onSyncDOM(); |
|
} |
|
}), Object(external_this_wp_element_["createElement"])(block_format_controls, null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Toolbar"], { |
|
controls: [{ |
|
icon: 'editor-ul', |
|
title: Object(external_this_wp_i18n_["__"])('Convert to unordered list'), |
|
isActive: isActiveListType(editor, 'ul', tagName), |
|
onClick: function onClick() { |
|
if (isListRootSelected(editor)) { |
|
onTagNameChange('ul'); |
|
} else { |
|
editor.execCommand('InsertUnorderedList'); |
|
onSyncDOM(); |
|
} |
|
} |
|
}, { |
|
icon: 'editor-ol', |
|
title: Object(external_this_wp_i18n_["__"])('Convert to ordered list'), |
|
isActive: isActiveListType(editor, 'ol', tagName), |
|
onClick: function onClick() { |
|
if (isListRootSelected(editor)) { |
|
onTagNameChange('ol'); |
|
} else { |
|
editor.execCommand('InsertOrderedList'); |
|
onSyncDOM(); |
|
} |
|
} |
|
}, { |
|
icon: 'editor-outdent', |
|
title: Object(external_this_wp_i18n_["__"])('Outdent list item'), |
|
onClick: function onClick() { |
|
editor.execCommand('Outdent'); |
|
onSyncDOM(); |
|
} |
|
}, { |
|
icon: 'editor-indent', |
|
title: Object(external_this_wp_i18n_["__"])('Indent list item'), |
|
onClick: function onClick() { |
|
editor.execCommand('Indent'); |
|
onSyncDOM(); |
|
} |
|
}] |
|
}))); |
|
}; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/rich-text/remove-browser-shortcuts.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Set of keyboard shortcuts handled internally by RichText. |
|
* |
|
* @type {Array} |
|
*/ |
|
|
|
var HANDLED_SHORTCUTS = [external_this_wp_keycodes_["rawShortcut"].primary('z'), external_this_wp_keycodes_["rawShortcut"].primaryShift('z'), external_this_wp_keycodes_["rawShortcut"].primary('y')]; |
|
/** |
|
* An instance of a KeyboardShortcuts element pre-bound for the handled |
|
* shortcuts. Since shortcuts never change, the element can be considered |
|
* static, and can be skipped in reconciliation. |
|
* |
|
* @type {WPElement} |
|
*/ |
|
|
|
var SHORTCUTS_ELEMENT = Object(external_this_wp_element_["createElement"])(external_this_wp_components_["KeyboardShortcuts"], { |
|
bindGlobal: true, |
|
shortcuts: Object(external_lodash_["fromPairs"])(HANDLED_SHORTCUTS.map(function (shortcut) { |
|
return [shortcut, function (event) { |
|
return event.preventDefault(); |
|
}]; |
|
})) |
|
}); |
|
/** |
|
* Component which registered keyboard event handlers to prevent default |
|
* behaviors for key combinations otherwise handled internally by RichText. |
|
* |
|
* @return {WPElement} WordPress element. |
|
*/ |
|
|
|
var RemoveBrowserShortcuts = function RemoveBrowserShortcuts() { |
|
return SHORTCUTS_ELEMENT; |
|
}; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/rich-text/toolbar-button.js |
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
function RichTextToolbarButton(_ref) { |
|
var name = _ref.name, |
|
shortcutType = _ref.shortcutType, |
|
shortcutCharacter = _ref.shortcutCharacter, |
|
props = Object(objectWithoutProperties["a" /* default */])(_ref, ["name", "shortcutType", "shortcutCharacter"]); |
|
|
|
var shortcut; |
|
var fillName = 'RichText.ToolbarControls'; |
|
|
|
if (name) { |
|
fillName += ".".concat(name); |
|
} |
|
|
|
if (shortcutType && shortcutCharacter) { |
|
shortcut = external_this_wp_keycodes_["displayShortcut"][shortcutType](shortcutCharacter); |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Fill"], { |
|
name: fillName |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["ToolbarButton"], Object(esm_extends["a" /* default */])({}, props, { |
|
shortcut: shortcut |
|
}))); |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/rich-text/inserter-list-item.js |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
function isResult(keywords, filterValue) { |
|
return keywords.some(function (string) { |
|
return menu_normalizeTerm(string).indexOf(menu_normalizeTerm(filterValue)) !== -1; |
|
}); |
|
} |
|
|
|
var RichTextInserterItem = Object(external_this_wp_data_["withSelect"])(function (select, _ref) { |
|
var name = _ref.name; |
|
return { |
|
formatType: select('core/rich-text').getFormatType(name) |
|
}; |
|
})(function (props) { |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Fill"], { |
|
name: "Inserter.InlineElements" |
|
}, function (_ref2) { |
|
var filterValue = _ref2.filterValue; |
|
var _props$formatType = props.formatType, |
|
_props$formatType$key = _props$formatType.keywords, |
|
keywords = _props$formatType$key === void 0 ? [] : _props$formatType$key, |
|
title = _props$formatType.title; |
|
keywords.push(title, props.title); |
|
|
|
if (filterValue && !isResult(keywords, filterValue)) { |
|
return null; |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(inserter_list_item, Object(esm_extends["a" /* default */])({}, props, { |
|
icon: Object(external_this_wp_blocks_["normalizeIconObject"])(props.icon) |
|
})); |
|
}); |
|
}); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/rich-text/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Browser dependencies |
|
*/ |
|
|
|
var rich_text_window = window, |
|
rich_text_getSelection = rich_text_window.getSelection; |
|
var rich_text_RichText = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(RichText, _Component); |
|
|
|
function RichText(_ref) { |
|
var _this; |
|
|
|
var value = _ref.value, |
|
onReplace = _ref.onReplace, |
|
multiline = _ref.multiline; |
|
|
|
Object(classCallCheck["a" /* default */])(this, RichText); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(RichText).apply(this, arguments)); |
|
|
|
if (multiline === true || multiline === 'p' || multiline === 'li') { |
|
_this.multilineTag = multiline === true ? 'p' : multiline; |
|
} |
|
|
|
if (_this.multilineTag === 'li') { |
|
_this.multilineWrapperTags = ['ul', 'ol']; |
|
} |
|
|
|
if (_this.props.onSplit) { |
|
_this.onSplit = _this.props.onSplit; |
|
external_this_wp_deprecated_default()('wp.editor.RichText onSplit prop', { |
|
plugin: 'Gutenberg', |
|
alternative: 'wp.editor.RichText unstableOnSplit prop' |
|
}); |
|
} else if (_this.props.unstableOnSplit) { |
|
_this.onSplit = _this.props.unstableOnSplit; |
|
} |
|
|
|
_this.onSetup = _this.onSetup.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onFocus = _this.onFocus.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onBlur = _this.onBlur.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onChange = _this.onChange.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onDeleteKeyDown = _this.onDeleteKeyDown.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onKeyDown = _this.onKeyDown.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onPaste = _this.onPaste.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onCreateUndoLevel = _this.onCreateUndoLevel.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.setFocusedElement = _this.setFocusedElement.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onInput = _this.onInput.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onCompositionEnd = _this.onCompositionEnd.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onSelectionChange = _this.onSelectionChange.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.getRecord = _this.getRecord.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.createRecord = _this.createRecord.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.applyRecord = _this.applyRecord.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.isEmpty = _this.isEmpty.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.valueToFormat = _this.valueToFormat.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.setRef = _this.setRef.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.valueToEditableHTML = _this.valueToEditableHTML.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.formatToValue = memize_default()(_this.formatToValue.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))), { |
|
size: 1 |
|
}); |
|
_this.savedContent = value; |
|
_this.patterns = getPatterns({ |
|
onReplace: onReplace, |
|
onCreateUndoLevel: _this.onCreateUndoLevel, |
|
valueToFormat: _this.valueToFormat, |
|
onChange: _this.onChange |
|
}); |
|
_this.enterPatterns = Object(external_this_wp_blocks_["getBlockTransforms"])('from').filter(function (_ref2) { |
|
var type = _ref2.type; |
|
return type === 'enter'; |
|
}); |
|
_this.state = {}; |
|
_this.usedDeprecatedChildrenSource = Array.isArray(value); |
|
_this.lastHistoryValue = value; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(RichText, [{ |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
document.removeEventListener('selectionchange', this.onSelectionChange); |
|
} |
|
}, { |
|
key: "setRef", |
|
value: function setRef(node) { |
|
this.editableRef = node; |
|
} |
|
/** |
|
* Sets a reference to the TinyMCE editor instance. |
|
* |
|
* @param {Editor} editor The editor instance as passed by TinyMCE. |
|
*/ |
|
|
|
}, { |
|
key: "onSetup", |
|
value: function onSetup(editor) { |
|
this.editor = editor; |
|
} |
|
}, { |
|
key: "setFocusedElement", |
|
value: function setFocusedElement() { |
|
if (this.props.setFocusedElement) { |
|
this.props.setFocusedElement(this.props.instanceId); |
|
} |
|
} |
|
/** |
|
* Get the current record (value and selection) from props and state. |
|
* |
|
* @return {Object} The current record (value and selection). |
|
*/ |
|
|
|
}, { |
|
key: "getRecord", |
|
value: function getRecord() { |
|
var _this$formatToValue = this.formatToValue(this.props.value), |
|
formats = _this$formatToValue.formats, |
|
text = _this$formatToValue.text; |
|
|
|
var _this$state = this.state, |
|
start = _this$state.start, |
|
end = _this$state.end; |
|
return { |
|
formats: formats, |
|
text: text, |
|
start: start, |
|
end: end |
|
}; |
|
} |
|
}, { |
|
key: "createRecord", |
|
value: function createRecord() { |
|
var range = rich_text_getSelection().getRangeAt(0); |
|
return Object(external_this_wp_richText_["create"])({ |
|
element: this.editableRef, |
|
range: range, |
|
multilineTag: this.multilineTag, |
|
multilineWrapperTags: this.multilineWrapperTags, |
|
removeNode: function removeNode(node) { |
|
return node.getAttribute('data-mce-bogus') === 'all'; |
|
}, |
|
unwrapNode: function unwrapNode(node) { |
|
return !!node.getAttribute('data-mce-bogus'); |
|
}, |
|
removeAttribute: function removeAttribute(attribute) { |
|
return attribute.indexOf('data-mce-') === 0; |
|
}, |
|
filterString: function filterString(string) { |
|
return string.replace(TINYMCE_ZWSP, ''); |
|
}, |
|
prepareEditableTree: this.props.prepareEditableTree |
|
}); |
|
} |
|
}, { |
|
key: "applyRecord", |
|
value: function applyRecord(record) { |
|
Object(external_this_wp_richText_["apply"])({ |
|
value: record, |
|
current: this.editableRef, |
|
multilineTag: this.multilineTag, |
|
multilineWrapperTags: this.multilineWrapperTags, |
|
createLinePadding: function createLinePadding(doc) { |
|
var element = doc.createElement('br'); |
|
element.setAttribute('data-mce-bogus', '1'); |
|
return element; |
|
}, |
|
prepareEditableTree: this.props.prepareEditableTree |
|
}); |
|
} |
|
}, { |
|
key: "isEmpty", |
|
value: function isEmpty() { |
|
return Object(external_this_wp_richText_["isEmpty"])(this.formatToValue(this.props.value)); |
|
} |
|
/** |
|
* Handles a paste event. |
|
* |
|
* Saves the pasted data as plain text in `pastedPlainText`. |
|
* |
|
* @param {PasteEvent} event The paste event. |
|
*/ |
|
|
|
}, { |
|
key: "onPaste", |
|
value: function onPaste(event) { |
|
var clipboardData = event.clipboardData; |
|
var items = clipboardData.items, |
|
files = clipboardData.files; // In Edge these properties can be null instead of undefined, so a more |
|
// rigorous test is required over using default values. |
|
|
|
items = Object(external_lodash_["isNil"])(items) ? [] : items; |
|
files = Object(external_lodash_["isNil"])(files) ? [] : files; |
|
var item = Object(external_lodash_["find"])(Object(toConsumableArray["a" /* default */])(items).concat(Object(toConsumableArray["a" /* default */])(files)), function (_ref3) { |
|
var type = _ref3.type; |
|
return /^image\/(?:jpe?g|png|gif)$/.test(type); |
|
}); |
|
var plainText = ''; |
|
var html = ''; // IE11 only supports `Text` as an argument for `getData` and will |
|
// otherwise throw an invalid argument error, so we try the standard |
|
// arguments first, then fallback to `Text` if they fail. |
|
|
|
try { |
|
plainText = clipboardData.getData('text/plain'); |
|
html = clipboardData.getData('text/html'); |
|
} catch (error1) { |
|
try { |
|
html = clipboardData.getData('Text'); |
|
} catch (error2) { |
|
// Some browsers like UC Browser paste plain text by default and |
|
// don't support clipboardData at all, so allow default |
|
// behaviour. |
|
return; |
|
} |
|
} |
|
|
|
event.preventDefault(); // Allows us to ask for this information when we get a report. |
|
|
|
window.console.log('Received HTML:\n\n', html); |
|
window.console.log('Received plain text:\n\n', plainText); // Only process file if no HTML is present. |
|
// Note: a pasted file may have the URL as plain text. |
|
|
|
if (item && !html) { |
|
var file = item.getAsFile ? item.getAsFile() : item; |
|
|
|
var _content = Object(external_this_wp_blocks_["pasteHandler"])({ |
|
HTML: "<img src=\"".concat(Object(external_this_wp_blob_["createBlobURL"])(file), "\">"), |
|
mode: 'BLOCKS', |
|
tagName: this.props.tagName |
|
}); |
|
|
|
var _shouldReplace = this.props.onReplace && this.isEmpty(); // Allows us to ask for this information when we get a report. |
|
|
|
|
|
window.console.log('Received item:\n\n', file); |
|
|
|
if (_shouldReplace) { |
|
this.props.onReplace(_content); |
|
} else if (this.onSplit) { |
|
this.splitContent(_content); |
|
} |
|
|
|
return; |
|
} |
|
|
|
var record = this.getRecord(); // There is a selection, check if a URL is pasted. |
|
|
|
if (!Object(external_this_wp_richText_["isCollapsed"])(record)) { |
|
var pastedText = (html || plainText).replace(/<[^>]+>/g, '').trim(); // A URL was pasted, turn the selection into a link |
|
|
|
if (Object(external_this_wp_url_["isURL"])(pastedText)) { |
|
this.onChange(Object(external_this_wp_richText_["applyFormat"])(record, { |
|
type: 'a', |
|
attributes: { |
|
href: Object(external_this_wp_htmlEntities_["decodeEntities"])(pastedText) |
|
} |
|
})); // Allows us to ask for this information when we get a report. |
|
|
|
window.console.log('Created link:\n\n', pastedText); |
|
return; |
|
} |
|
} |
|
|
|
var shouldReplace = this.props.onReplace && this.isEmpty(); |
|
var mode = 'INLINE'; |
|
|
|
if (shouldReplace) { |
|
mode = 'BLOCKS'; |
|
} else if (this.onSplit) { |
|
mode = 'AUTO'; |
|
} |
|
|
|
var content = Object(external_this_wp_blocks_["pasteHandler"])({ |
|
HTML: html, |
|
plainText: plainText, |
|
mode: mode, |
|
tagName: this.props.tagName, |
|
canUserUseUnfilteredHTML: this.props.canUserUseUnfilteredHTML |
|
}); |
|
|
|
if (typeof content === 'string') { |
|
var recordToInsert = Object(external_this_wp_richText_["create"])({ |
|
html: content |
|
}); |
|
this.onChange(Object(external_this_wp_richText_["insert"])(record, recordToInsert)); |
|
} else if (this.onSplit) { |
|
if (!content.length) { |
|
return; |
|
} |
|
|
|
if (shouldReplace) { |
|
this.props.onReplace(content); |
|
} else { |
|
this.splitContent(content, { |
|
paste: true |
|
}); |
|
} |
|
} |
|
} |
|
/** |
|
* Handles a focus event on the contenteditable field, calling the |
|
* `unstableOnFocus` prop callback if one is defined. The callback does not |
|
* receive any arguments. |
|
* |
|
* This is marked as a private API and the `unstableOnFocus` prop is not |
|
* documented, as the current requirements where it is used are subject to |
|
* future refactoring following `isSelected` handling. |
|
* |
|
* In contrast with `setFocusedElement`, this is only triggered in response |
|
* to focus within the contenteditable field, whereas `setFocusedElement` |
|
* is triggered on focus within any `RichText` descendent element. |
|
* |
|
* @see setFocusedElement |
|
* |
|
* @private |
|
*/ |
|
|
|
}, { |
|
key: "onFocus", |
|
value: function onFocus() { |
|
var unstableOnFocus = this.props.unstableOnFocus; |
|
|
|
if (unstableOnFocus) { |
|
unstableOnFocus(); |
|
} |
|
|
|
document.addEventListener('selectionchange', this.onSelectionChange); |
|
} |
|
}, { |
|
key: "onBlur", |
|
value: function onBlur() { |
|
document.removeEventListener('selectionchange', this.onSelectionChange); |
|
} |
|
/** |
|
* Handle input on the next selection change event. |
|
* |
|
* @param {SyntheticEvent} event Synthetic input event. |
|
*/ |
|
|
|
}, { |
|
key: "onInput", |
|
value: function onInput(event) { |
|
// For Input Method Editor (IME), used in Chinese, Japanese, and Korean |
|
// (CJK), do not trigger a change if characters are being composed. |
|
// Browsers setting `isComposing` to `true` will usually emit a final |
|
// `input` event when the characters are composed. |
|
if (event.nativeEvent.isComposing) { |
|
return; |
|
} |
|
|
|
var record = this.createRecord(); |
|
var transformed = this.patterns.reduce(function (accumlator, transform) { |
|
return transform(accumlator); |
|
}, record); |
|
this.onChange(transformed, { |
|
withoutHistory: true |
|
}); // Create an undo level when input stops for over a second. |
|
|
|
this.props.clearTimeout(this.onInput.timeout); |
|
this.onInput.timeout = this.props.setTimeout(this.onCreateUndoLevel, 1000); |
|
} |
|
}, { |
|
key: "onCompositionEnd", |
|
value: function onCompositionEnd() { |
|
// Ensure the value is up-to-date for browsers that don't emit a final |
|
// input event after composition. |
|
this.onChange(this.createRecord()); |
|
} |
|
/** |
|
* Handles the `selectionchange` event: sync the selection to local state. |
|
*/ |
|
|
|
}, { |
|
key: "onSelectionChange", |
|
value: function onSelectionChange() { |
|
var _this$createRecord = this.createRecord(), |
|
start = _this$createRecord.start, |
|
end = _this$createRecord.end, |
|
formats = _this$createRecord.formats; |
|
|
|
if (start !== this.state.start || end !== this.state.end) { |
|
var isCaretWithinFormattedText = this.props.isCaretWithinFormattedText; |
|
|
|
if (!isCaretWithinFormattedText && formats[start]) { |
|
this.props.onEnterFormattedText(); |
|
} else if (isCaretWithinFormattedText && !formats[start]) { |
|
this.props.onExitFormattedText(); |
|
} |
|
|
|
this.setState({ |
|
start: start, |
|
end: end |
|
}); |
|
} |
|
} |
|
/** |
|
* Calls all registered onChangeEditableValue handlers. |
|
* |
|
* @param {Array} formats The formats of the latest rich-text value. |
|
* @param {string} text The text of the latest rich-text value. |
|
*/ |
|
|
|
}, { |
|
key: "onChangeEditableValue", |
|
value: function onChangeEditableValue(_ref4) { |
|
var formats = _ref4.formats, |
|
text = _ref4.text; |
|
Object(external_lodash_["get"])(this.props, ['onChangeEditableValue'], []).forEach(function (eventHandler) { |
|
eventHandler(formats, text); |
|
}); |
|
} |
|
/** |
|
* Sync the value to global state. The node tree and selection will also be |
|
* updated if differences are found. |
|
* |
|
* @param {Object} record The record to sync and apply. |
|
* @param {Object} $2 Named options. |
|
* @param {boolean} $2.withoutHistory If true, no undo level will be |
|
* created. |
|
*/ |
|
|
|
}, { |
|
key: "onChange", |
|
value: function onChange(record) { |
|
var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, |
|
withoutHistory = _ref5.withoutHistory; |
|
|
|
this.applyRecord(record); |
|
var start = record.start, |
|
end = record.end; |
|
this.onChangeEditableValue(record); |
|
this.savedContent = this.valueToFormat(record); |
|
this.props.onChange(this.savedContent); |
|
this.setState({ |
|
start: start, |
|
end: end |
|
}); |
|
|
|
if (!withoutHistory) { |
|
this.onCreateUndoLevel(); |
|
} |
|
} |
|
}, { |
|
key: "onCreateUndoLevel", |
|
value: function onCreateUndoLevel() { |
|
// If the content is the same, no level needs to be created. |
|
if (this.lastHistoryValue === this.savedContent) { |
|
return; |
|
} |
|
|
|
this.props.onCreateUndoLevel(); |
|
this.lastHistoryValue = this.savedContent; |
|
} |
|
/** |
|
* Handles a delete keyDown event to handle merge or removal for collapsed |
|
* selection where caret is at directional edge: forward for a delete key, |
|
* reverse for a backspace key. |
|
* |
|
* @link https://en.wikipedia.org/wiki/Caret_navigation |
|
* |
|
* @param {KeyboardEvent} event Keydown event. |
|
*/ |
|
|
|
}, { |
|
key: "onDeleteKeyDown", |
|
value: function onDeleteKeyDown(event) { |
|
var _this$props = this.props, |
|
onMerge = _this$props.onMerge, |
|
onRemove = _this$props.onRemove; |
|
|
|
if (!onMerge && !onRemove) { |
|
return; |
|
} |
|
|
|
var keyCode = event.keyCode; |
|
var isReverse = keyCode === external_this_wp_keycodes_["BACKSPACE"]; // Only process delete if the key press occurs at uncollapsed edge. |
|
|
|
if (!Object(external_this_wp_richText_["isCollapsed"])(this.createRecord())) { |
|
return; |
|
} |
|
|
|
var empty = this.isEmpty(); // It is important to consider emptiness because an empty container |
|
// will include a bogus TinyMCE BR node _after_ the caret, so in a |
|
// forward deletion the isHorizontalEdge function will incorrectly |
|
// interpret the presence of the bogus node as not being at the edge. |
|
|
|
var isEdge = empty || Object(external_this_wp_dom_["isHorizontalEdge"])(this.editableRef, isReverse); |
|
|
|
if (!isEdge) { |
|
return; |
|
} |
|
|
|
if (onMerge) { |
|
onMerge(!isReverse); |
|
} // Only handle remove on Backspace. This serves dual-purpose of being |
|
// an intentional user interaction distinguishing between Backspace and |
|
// Delete to remove the empty field, but also to avoid merge & remove |
|
// causing destruction of two fields (merge, then removed merged). |
|
|
|
|
|
if (onRemove && empty && isReverse) { |
|
onRemove(!isReverse); |
|
} |
|
|
|
event.preventDefault(); |
|
} |
|
/** |
|
* Handles a keydown event. |
|
* |
|
* @param {KeyboardEvent} event The keydown event. |
|
*/ |
|
|
|
}, { |
|
key: "onKeyDown", |
|
value: function onKeyDown(event) { |
|
var keyCode = event.keyCode; |
|
|
|
if (keyCode === external_this_wp_keycodes_["DELETE"] || keyCode === external_this_wp_keycodes_["BACKSPACE"]) { |
|
var value = this.createRecord(); |
|
var start = Object(external_this_wp_richText_["getSelectionStart"])(value); |
|
var end = Object(external_this_wp_richText_["getSelectionEnd"])(value); // Always handle full content deletion ourselves. |
|
|
|
if (start === 0 && end !== 0 && end === value.text.length) { |
|
this.onChange(Object(external_this_wp_richText_["remove"])(value)); |
|
event.preventDefault(); |
|
return; |
|
} |
|
|
|
if (this.multilineTag) { |
|
var newValue; |
|
|
|
if (keyCode === external_this_wp_keycodes_["BACKSPACE"]) { |
|
if (Object(external_this_wp_richText_["charAt"])(value, start - 1) === external_this_wp_richText_["LINE_SEPARATOR"]) { |
|
newValue = Object(external_this_wp_richText_["remove"])(value, // Only remove the line if the selection is |
|
// collapsed. |
|
Object(external_this_wp_richText_["isCollapsed"])(value) ? start - 1 : start, end); |
|
} |
|
} else if (Object(external_this_wp_richText_["charAt"])(value, end) === external_this_wp_richText_["LINE_SEPARATOR"]) { |
|
newValue = Object(external_this_wp_richText_["remove"])(value, start, // Only remove the line if the selection is collapsed. |
|
Object(external_this_wp_richText_["isCollapsed"])(value) ? end + 1 : end); |
|
} |
|
|
|
if (newValue) { |
|
this.onChange(newValue); |
|
event.preventDefault(); |
|
} |
|
} |
|
|
|
this.onDeleteKeyDown(event); |
|
} else if (keyCode === external_this_wp_keycodes_["ENTER"]) { |
|
event.preventDefault(); |
|
var record = this.createRecord(); |
|
|
|
if (this.props.onReplace) { |
|
var text = Object(external_this_wp_richText_["getTextContent"])(record); |
|
var transformation = Object(external_this_wp_blocks_["findTransform"])(this.enterPatterns, function (item) { |
|
return item.regExp.test(text); |
|
}); |
|
|
|
if (transformation) { |
|
this.props.onReplace([transformation.transform({ |
|
content: text |
|
})]); |
|
return; |
|
} |
|
} |
|
|
|
if (this.multilineTag) { |
|
if (this.onSplit && Object(external_this_wp_richText_["isEmptyLine"])(record)) { |
|
this.onSplit.apply(this, Object(toConsumableArray["a" /* default */])(Object(external_this_wp_richText_["split"])(record).map(this.valueToFormat))); |
|
} else { |
|
this.onChange(Object(external_this_wp_richText_["insertLineSeparator"])(record)); |
|
} |
|
} else if (event.shiftKey || !this.onSplit) { |
|
var _text = Object(external_this_wp_richText_["getTextContent"])(record); |
|
|
|
var length = _text.length; |
|
var toInsert = '\n'; // If the caret is at the end of the text, and there is no |
|
// trailing line break or no text at all, we have to insert two |
|
// line breaks in order to create a new line visually and place |
|
// the caret there. |
|
|
|
if (record.end === length && (_text.charAt(length - 1) !== '\n' || length === 0)) { |
|
toInsert = '\n\n'; |
|
} |
|
|
|
this.onChange(Object(external_this_wp_richText_["insert"])(record, toInsert)); |
|
} else { |
|
this.splitContent(); |
|
} |
|
} |
|
} |
|
/** |
|
* Splits the content at the location of the selection. |
|
* |
|
* Replaces the content of the editor inside this element with the contents |
|
* before the selection. Sends the elements after the selection to the `onSplit` |
|
* handler. |
|
* |
|
* @param {Array} blocks The blocks to add after the split point. |
|
* @param {Object} context The context for splitting. |
|
*/ |
|
|
|
}, { |
|
key: "splitContent", |
|
value: function splitContent() { |
|
var blocks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; |
|
var context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; |
|
var record = this.createRecord(); |
|
|
|
if (!this.onSplit) { |
|
return; |
|
} |
|
|
|
var _split = Object(external_this_wp_richText_["split"])(record), |
|
_split2 = Object(slicedToArray["a" /* default */])(_split, 2), |
|
before = _split2[0], |
|
after = _split2[1]; // In case split occurs at the trailing or leading edge of the field, |
|
// assume that the before/after values respectively reflect the current |
|
// value. This also provides an opportunity for the parent component to |
|
// determine whether the before/after value has changed using a trivial |
|
// strict equality operation. |
|
|
|
|
|
if (Object(external_this_wp_richText_["isEmpty"])(after)) { |
|
before = record; |
|
} else if (Object(external_this_wp_richText_["isEmpty"])(before)) { |
|
after = record; |
|
} // If pasting and the split would result in no content other than the |
|
// pasted blocks, remove the before and after blocks. |
|
|
|
|
|
if (context.paste) { |
|
before = Object(external_this_wp_richText_["isEmpty"])(before) ? null : before; |
|
after = Object(external_this_wp_richText_["isEmpty"])(after) ? null : after; |
|
} |
|
|
|
if (before) { |
|
before = this.valueToFormat(before); |
|
} |
|
|
|
if (after) { |
|
after = this.valueToFormat(after); |
|
} |
|
|
|
this.onSplit.apply(this, [before, after].concat(Object(toConsumableArray["a" /* default */])(blocks))); |
|
} |
|
}, { |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
var _this2 = this; |
|
|
|
var _this$props2 = this.props, |
|
tagName = _this$props2.tagName, |
|
value = _this$props2.value, |
|
isSelected = _this$props2.isSelected; |
|
|
|
if (tagName === prevProps.tagName && value !== prevProps.value && value !== this.savedContent) { |
|
// Handle deprecated `children` and `node` sources. |
|
// The old way of passing a value with the `node` matcher required |
|
// the value to be mapped first, creating a new array each time, so |
|
// a shallow check wouldn't work. We need to check deep equality. |
|
// This is only executed for a deprecated API and will eventually be |
|
// removed. |
|
if (Array.isArray(value) && Object(external_lodash_["isEqual"])(value, this.savedContent)) { |
|
return; |
|
} |
|
|
|
var record = this.formatToValue(value); |
|
|
|
if (isSelected) { |
|
var prevRecord = this.formatToValue(prevProps.value); |
|
var length = Object(external_this_wp_richText_["getTextContent"])(prevRecord).length; |
|
record.start = length; |
|
record.end = length; |
|
} |
|
|
|
this.applyRecord(record); |
|
this.savedContent = value; |
|
} // If any format props update, reapply value. |
|
|
|
|
|
var shouldReapply = Object.keys(this.props).some(function (name) { |
|
if (name.indexOf('format_') !== 0) { |
|
return false; |
|
} // Allow primitives and arrays: |
|
|
|
|
|
if (!Object(external_lodash_["isPlainObject"])(_this2.props[name])) { |
|
return _this2.props[name] !== prevProps[name]; |
|
} |
|
|
|
return Object.keys(_this2.props[name]).some(function (subName) { |
|
return _this2.props[name][subName] !== prevProps[name][subName]; |
|
}); |
|
}); |
|
|
|
if (shouldReapply) { |
|
var _record = this.formatToValue(value); // Maintain the previous selection if the instance is currently |
|
// selected. |
|
|
|
|
|
if (isSelected) { |
|
_record.start = this.state.start; |
|
_record.end = this.state.end; |
|
} |
|
|
|
this.applyRecord(_record); |
|
} |
|
} |
|
/** |
|
* Get props that are provided by formats to modify RichText. |
|
* |
|
* @return {Object} Props that start with 'format_'. |
|
*/ |
|
|
|
}, { |
|
key: "getFormatProps", |
|
value: function getFormatProps() { |
|
return Object(external_lodash_["pickBy"])(this.props, function (propValue, name) { |
|
return name.startsWith('format_'); |
|
}); |
|
} |
|
/** |
|
* Converts the outside data structure to our internal representation. |
|
* |
|
* @param {*} value The outside value, data type depends on props. |
|
* @return {Object} An internal rich-text value. |
|
*/ |
|
|
|
}, { |
|
key: "formatToValue", |
|
value: function formatToValue(value) { |
|
// Handle deprecated `children` and `node` sources. |
|
if (Array.isArray(value)) { |
|
return Object(external_this_wp_richText_["create"])({ |
|
html: external_this_wp_blocks_["children"].toHTML(value), |
|
multilineTag: this.multilineTag, |
|
multilineWrapperTags: this.multilineWrapperTags |
|
}); |
|
} |
|
|
|
if (this.props.format === 'string') { |
|
return Object(external_this_wp_richText_["create"])({ |
|
html: value, |
|
multilineTag: this.multilineTag, |
|
multilineWrapperTags: this.multilineWrapperTags |
|
}); |
|
} // Guard for blocks passing `null` in onSplit callbacks. May be removed |
|
// if onSplit is revised to not pass a `null` value. |
|
|
|
|
|
if (value === null) { |
|
return Object(external_this_wp_richText_["create"])(); |
|
} |
|
|
|
return value; |
|
} |
|
}, { |
|
key: "valueToEditableHTML", |
|
value: function valueToEditableHTML(value) { |
|
return Object(external_this_wp_richText_["unstableToDom"])({ |
|
value: value, |
|
multilineTag: this.multilineTag, |
|
multilineWrapperTags: this.multilineWrapperTags, |
|
createLinePadding: function createLinePadding(doc) { |
|
var element = doc.createElement('br'); |
|
element.setAttribute('data-mce-bogus', '1'); |
|
return element; |
|
}, |
|
prepareEditableTree: this.props.prepareEditableTree |
|
}).body.innerHTML; |
|
} |
|
/** |
|
* Removes editor only formats from the value. |
|
* |
|
* Editor only formats are applied using `prepareEditableTree`, so we need to |
|
* remove them before converting the internal state |
|
* |
|
* @param {Object} value The internal rich-text value. |
|
* @return {Object} A new rich-text value. |
|
*/ |
|
|
|
}, { |
|
key: "removeEditorOnlyFormats", |
|
value: function removeEditorOnlyFormats(value) { |
|
this.props.formatTypes.forEach(function (formatType) { |
|
// Remove formats created by prepareEditableTree, because they are editor only. |
|
if (formatType.__experimentalCreatePrepareEditableTree) { |
|
value = Object(external_this_wp_richText_["removeFormat"])(value, formatType.name, 0, value.text.length); |
|
} |
|
}); |
|
return value; |
|
} |
|
/** |
|
* Converts the internal value to the external data format. |
|
* |
|
* @param {Object} value The internal rich-text value. |
|
* @return {*} The external data format, data type depends on props. |
|
*/ |
|
|
|
}, { |
|
key: "valueToFormat", |
|
value: function valueToFormat(value) { |
|
value = this.removeEditorOnlyFormats(value); // Handle deprecated `children` and `node` sources. |
|
|
|
if (this.usedDeprecatedChildrenSource) { |
|
return external_this_wp_blocks_["children"].fromDOM(Object(external_this_wp_richText_["unstableToDom"])({ |
|
value: value, |
|
multilineTag: this.multilineTag, |
|
multilineWrapperTags: this.multilineWrapperTags |
|
}).body.childNodes); |
|
} |
|
|
|
if (this.props.format === 'string') { |
|
return Object(external_this_wp_richText_["toHTMLString"])({ |
|
value: value, |
|
multilineTag: this.multilineTag, |
|
multilineWrapperTags: this.multilineWrapperTags |
|
}); |
|
} |
|
|
|
return value; |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this3 = this; |
|
|
|
var _this$props3 = this.props, |
|
_this$props3$tagName = _this$props3.tagName, |
|
Tagname = _this$props3$tagName === void 0 ? 'div' : _this$props3$tagName, |
|
style = _this$props3.style, |
|
wrapperClassName = _this$props3.wrapperClassName, |
|
className = _this$props3.className, |
|
_this$props3$inlineTo = _this$props3.inlineToolbar, |
|
inlineToolbar = _this$props3$inlineTo === void 0 ? false : _this$props3$inlineTo, |
|
formattingControls = _this$props3.formattingControls, |
|
placeholder = _this$props3.placeholder, |
|
_this$props3$keepPlac = _this$props3.keepPlaceholderOnFocus, |
|
keepPlaceholderOnFocus = _this$props3$keepPlac === void 0 ? false : _this$props3$keepPlac, |
|
isSelected = _this$props3.isSelected, |
|
autocompleters = _this$props3.autocompleters, |
|
onTagNameChange = _this$props3.onTagNameChange; |
|
var MultilineTag = this.multilineTag; |
|
var ariaProps = aria_pickAriaProps(this.props); // Generating a key that includes `tagName` ensures that if the tag |
|
// changes, we unmount and destroy the previous TinyMCE element, then |
|
// mount and initialize a new child element in its place. |
|
|
|
var key = ['editor', Tagname].join(); |
|
var isPlaceholderVisible = placeholder && (!isSelected || keepPlaceholderOnFocus) && this.isEmpty(); |
|
var classes = classnames_default()(wrapperClassName, 'editor-rich-text'); |
|
var record = this.getRecord(); |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: classes, |
|
onFocus: this.setFocusedElement |
|
}, isSelected && this.editor && this.multilineTag === 'li' && Object(external_this_wp_element_["createElement"])(list_edit_ListEdit, { |
|
editor: this.editor, |
|
onTagNameChange: onTagNameChange, |
|
tagName: Tagname, |
|
onSyncDOM: function onSyncDOM() { |
|
return _this3.onChange(_this3.createRecord()); |
|
} |
|
}), isSelected && !inlineToolbar && Object(external_this_wp_element_["createElement"])(block_format_controls, null, Object(external_this_wp_element_["createElement"])(format_toolbar, { |
|
controls: formattingControls |
|
})), isSelected && inlineToolbar && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IsolatedEventContainer"], { |
|
className: "editor-rich-text__inline-toolbar" |
|
}, Object(external_this_wp_element_["createElement"])(format_toolbar, { |
|
controls: formattingControls |
|
})), Object(external_this_wp_element_["createElement"])(autocomplete, { |
|
onReplace: this.props.onReplace, |
|
completers: autocompleters, |
|
record: record, |
|
onChange: this.onChange |
|
}, function (_ref6) { |
|
var listBoxId = _ref6.listBoxId, |
|
activeId = _ref6.activeId; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])(tinymce_TinyMCE, Object(esm_extends["a" /* default */])({ |
|
tagName: Tagname, |
|
onSetup: _this3.onSetup, |
|
style: style, |
|
record: record, |
|
valueToEditableHTML: _this3.valueToEditableHTML, |
|
isPlaceholderVisible: isPlaceholderVisible, |
|
"aria-label": placeholder, |
|
"aria-autocomplete": "list", |
|
"aria-owns": listBoxId, |
|
"aria-activedescendant": activeId |
|
}, ariaProps, { |
|
className: className, |
|
key: key, |
|
onPaste: _this3.onPaste, |
|
onInput: _this3.onInput, |
|
onCompositionEnd: _this3.onCompositionEnd, |
|
onKeyDown: _this3.onKeyDown, |
|
onFocus: _this3.onFocus, |
|
onBlur: _this3.onBlur, |
|
multilineTag: _this3.multilineTag, |
|
multilineWrapperTags: _this3.multilineWrapperTags, |
|
setRef: _this3.setRef |
|
})), isPlaceholderVisible && Object(external_this_wp_element_["createElement"])(Tagname, { |
|
className: classnames_default()('editor-rich-text__tinymce', className), |
|
style: style |
|
}, MultilineTag ? Object(external_this_wp_element_["createElement"])(MultilineTag, null, placeholder) : placeholder), isSelected && Object(external_this_wp_element_["createElement"])(format_edit, { |
|
value: record, |
|
onChange: _this3.onChange |
|
})); |
|
}), isSelected && Object(external_this_wp_element_["createElement"])(RemoveBrowserShortcuts, null)); |
|
} |
|
}]); |
|
|
|
return RichText; |
|
}(external_this_wp_element_["Component"]); |
|
rich_text_RichText.defaultProps = { |
|
formattingControls: ['bold', 'italic', 'link', 'strikethrough'], |
|
format: 'string', |
|
value: '' |
|
}; |
|
var RichTextContainer = Object(external_this_wp_compose_["compose"])([external_this_wp_compose_["withInstanceId"], context_withBlockEditContext(function (context, ownProps) { |
|
// When explicitly set as not selected, do nothing. |
|
if (ownProps.isSelected === false) { |
|
return { |
|
clientId: context.clientId |
|
}; |
|
} // When explicitly set as selected, use the value stored in the context instead. |
|
|
|
|
|
if (ownProps.isSelected === true) { |
|
return { |
|
isSelected: context.isSelected, |
|
clientId: context.clientId |
|
}; |
|
} // Ensures that only one RichText component can be focused. |
|
|
|
|
|
return { |
|
isSelected: context.isSelected && context.focusedElement === ownProps.instanceId, |
|
setFocusedElement: context.setFocusedElement, |
|
clientId: context.clientId |
|
}; |
|
}), Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
canUserUseUnfilteredHTML = _select.canUserUseUnfilteredHTML, |
|
isCaretWithinFormattedText = _select.isCaretWithinFormattedText; |
|
|
|
var _select2 = select('core/rich-text'), |
|
getFormatTypes = _select2.getFormatTypes; |
|
|
|
return { |
|
canUserUseUnfilteredHTML: canUserUseUnfilteredHTML(), |
|
isCaretWithinFormattedText: isCaretWithinFormattedText(), |
|
formatTypes: getFormatTypes() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
createUndoLevel = _dispatch.createUndoLevel, |
|
redo = _dispatch.redo, |
|
undo = _dispatch.undo, |
|
enterFormattedText = _dispatch.enterFormattedText, |
|
exitFormattedText = _dispatch.exitFormattedText; |
|
|
|
return { |
|
onCreateUndoLevel: createUndoLevel, |
|
onRedo: redo, |
|
onUndo: undo, |
|
onEnterFormattedText: enterFormattedText, |
|
onExitFormattedText: exitFormattedText |
|
}; |
|
}), external_this_wp_compose_["withSafeTimeout"], Object(external_this_wp_components_["withFilters"])('experimentalRichText')])(rich_text_RichText); |
|
|
|
RichTextContainer.Content = function (_ref7) { |
|
var value = _ref7.value, |
|
Tag = _ref7.tagName, |
|
multiline = _ref7.multiline, |
|
props = Object(objectWithoutProperties["a" /* default */])(_ref7, ["value", "tagName", "multiline"]); |
|
|
|
var html = value; |
|
var MultilineTag; |
|
|
|
if (multiline === true || multiline === 'p' || multiline === 'li') { |
|
MultilineTag = multiline === true ? 'p' : multiline; |
|
} // Handle deprecated `children` and `node` sources. |
|
|
|
|
|
if (Array.isArray(value)) { |
|
html = external_this_wp_blocks_["children"].toHTML(value); |
|
} |
|
|
|
if (!html && MultilineTag) { |
|
html = "<".concat(MultilineTag, "></").concat(MultilineTag, ">"); |
|
} |
|
|
|
var content = Object(external_this_wp_element_["createElement"])(external_this_wp_element_["RawHTML"], null, html); |
|
|
|
if (Tag) { |
|
return Object(external_this_wp_element_["createElement"])(Tag, Object(external_lodash_["omit"])(props, ['format']), content); |
|
} |
|
|
|
return content; |
|
}; |
|
|
|
RichTextContainer.isEmpty = function () { |
|
var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; |
|
|
|
// Handle deprecated `children` and `node` sources. |
|
if (Array.isArray(value)) { |
|
return !value || value.length === 0; |
|
} |
|
|
|
return value.length === 0; |
|
}; |
|
|
|
RichTextContainer.Content.defaultProps = { |
|
format: 'string', |
|
value: '' |
|
}; |
|
/* harmony default export */ var rich_text = (RichTextContainer); |
|
|
|
|
|
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/server-side-render/index.js |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies. |
|
*/ |
|
|
|
|
|
/* harmony default export */ var server_side_render = (function (_ref) { |
|
var _ref$urlQueryArgs = _ref.urlQueryArgs, |
|
urlQueryArgs = _ref$urlQueryArgs === void 0 ? {} : _ref$urlQueryArgs, |
|
props = Object(objectWithoutProperties["a" /* default */])(_ref, ["urlQueryArgs"]); |
|
|
|
var _select = Object(external_this_wp_data_["select"])('core/editor'), |
|
getCurrentPostId = _select.getCurrentPostId; |
|
|
|
urlQueryArgs = Object(objectSpread["a" /* default */])({ |
|
post_id: getCurrentPostId() |
|
}, urlQueryArgs); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["ServerSideRender"], Object(esm_extends["a" /* default */])({ |
|
urlQueryArgs: urlQueryArgs |
|
}, props)); |
|
}); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/media-upload/index.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* This is a placeholder for the media upload component necessary to make it possible to provide |
|
* an integration with the core blocks that handle media files. By default it renders nothing but |
|
* it provides a way to have it overridden with the `editor.MediaUpload` filter. |
|
* |
|
* @return {WPElement} Media upload element. |
|
*/ |
|
|
|
var MediaUpload = function MediaUpload() { |
|
return null; |
|
}; // Todo: rename the filter |
|
|
|
|
|
/* harmony default export */ var media_upload = (Object(external_this_wp_components_["withFilters"])('editor.MediaUpload')(MediaUpload)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/url-popover/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
var url_popover_URLPopover = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(URLPopover, _Component); |
|
|
|
function URLPopover() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, URLPopover); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(URLPopover).apply(this, arguments)); |
|
_this.toggleSettingsVisibility = _this.toggleSettingsVisibility.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.state = { |
|
isSettingsExpanded: false |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(URLPopover, [{ |
|
key: "toggleSettingsVisibility", |
|
value: function toggleSettingsVisibility() { |
|
this.setState({ |
|
isSettingsExpanded: !this.state.isSettingsExpanded |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
children = _this$props.children, |
|
renderSettings = _this$props.renderSettings, |
|
onClose = _this$props.onClose, |
|
onClickOutside = _this$props.onClickOutside, |
|
_this$props$position = _this$props.position, |
|
position = _this$props$position === void 0 ? 'bottom center' : _this$props$position, |
|
_this$props$focusOnMo = _this$props.focusOnMount, |
|
focusOnMount = _this$props$focusOnMo === void 0 ? 'firstElement' : _this$props$focusOnMo; |
|
var isSettingsExpanded = this.state.isSettingsExpanded; |
|
var showSettings = !!renderSettings && isSettingsExpanded; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Popover"], { |
|
className: "editor-url-popover", |
|
focusOnMount: focusOnMount, |
|
position: position, |
|
onClose: onClose, |
|
onClickOutside: onClickOutside |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-url-popover__row" |
|
}, children, !!renderSettings && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
className: "editor-url-popover__settings-toggle", |
|
icon: "ellipsis", |
|
label: Object(external_this_wp_i18n_["__"])('Link Settings'), |
|
onClick: this.toggleSettingsVisibility, |
|
"aria-expanded": isSettingsExpanded |
|
})), showSettings && Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-url-popover__row editor-url-popover__settings" |
|
}, renderSettings())); |
|
} |
|
}]); |
|
|
|
return URLPopover; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var url_popover = (url_popover_URLPopover); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/media-upload/media-upload.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External Dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Browsers may use unexpected mime types, and they differ from browser to browser. |
|
* This function computes a flexible array of mime types from the mime type structured provided by the server. |
|
* Converts { jpg|jpeg|jpe: "image/jpeg" } into [ "image/jpeg", "image/jpg", "image/jpeg", "image/jpe" ] |
|
* The computation of this array instead of directly using the object, |
|
* solves the problem in chrome where mp3 files have audio/mp3 as mime type instead of audio/mpeg. |
|
* https://bugs.chromium.org/p/chromium/issues/detail?id=227004 |
|
* |
|
* @param {?Object} wpMimeTypesObject Mime type object received from the server. |
|
* Extensions are keys separated by '|' and values are mime types associated with an extension. |
|
* |
|
* @return {?Array} An array of mime types or the parameter passed if it was "falsy". |
|
*/ |
|
|
|
function getMimeTypesArray(wpMimeTypesObject) { |
|
if (!wpMimeTypesObject) { |
|
return wpMimeTypesObject; |
|
} |
|
|
|
return Object(external_lodash_["flatMap"])(wpMimeTypesObject, function (mime, extensionsString) { |
|
var _mime$split = mime.split('/'), |
|
_mime$split2 = Object(slicedToArray["a" /* default */])(_mime$split, 1), |
|
type = _mime$split2[0]; |
|
|
|
var extensions = extensionsString.split('|'); |
|
return [mime].concat(Object(toConsumableArray["a" /* default */])(Object(external_lodash_["map"])(extensions, function (extension) { |
|
return "".concat(type, "/").concat(extension); |
|
}))); |
|
}); |
|
} |
|
/** |
|
* Media Upload is used by audio, image, gallery, video, and file blocks to |
|
* handle uploading a media file when a file upload button is activated. |
|
* |
|
* TODO: future enhancement to add an upload indicator. |
|
* |
|
* @param {Object} $0 Parameters object passed to the function. |
|
* @param {?Array} $0.allowedTypes Array with the types of media that can be uploaded, if unset all types are allowed. |
|
* @param {?Object} $0.additionalData Additional data to include in the request. |
|
* @param {Array} $0.filesList List of files. |
|
* @param {?number} $0.maxUploadFileSize Maximum upload size in bytes allowed for the site. |
|
* @param {Function} $0.onError Function called when an error happens. |
|
* @param {Function} $0.onFileChange Function called each time a file or a temporary representation of the file is available. |
|
* @param {?Object} $0.wpAllowedMimeTypes List of allowed mime types and file extensions. |
|
*/ |
|
|
|
function mediaUpload(_x) { |
|
return _mediaUpload.apply(this, arguments); |
|
} |
|
/** |
|
* @param {File} file Media File to Save. |
|
* @param {?Object} additionalData Additional data to include in the request. |
|
* |
|
* @return {Promise} Media Object Promise. |
|
*/ |
|
|
|
function _mediaUpload() { |
|
_mediaUpload = Object(asyncToGenerator["a" /* default */])( |
|
/*#__PURE__*/ |
|
regeneratorRuntime.mark(function _callee(_ref) { |
|
var allowedTypes, _ref$additionalData, additionalData, filesList, maxUploadFileSize, _ref$onError, onError, onFileChange, _ref$wpAllowedMimeTyp, wpAllowedMimeTypes, files, filesSet, setAndUpdateFiles, isAllowedType, allowedMimeTypesForUser, isAllowedMimeTypeForUser, triggerError, validFiles, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _mediaFile, idx, mediaFile, savedMedia, mediaObject, message; |
|
|
|
return regeneratorRuntime.wrap(function _callee$(_context) { |
|
while (1) { |
|
switch (_context.prev = _context.next) { |
|
case 0: |
|
allowedTypes = _ref.allowedTypes, _ref$additionalData = _ref.additionalData, additionalData = _ref$additionalData === void 0 ? {} : _ref$additionalData, filesList = _ref.filesList, maxUploadFileSize = _ref.maxUploadFileSize, _ref$onError = _ref.onError, onError = _ref$onError === void 0 ? external_lodash_["noop"] : _ref$onError, onFileChange = _ref.onFileChange, _ref$wpAllowedMimeTyp = _ref.wpAllowedMimeTypes, wpAllowedMimeTypes = _ref$wpAllowedMimeTyp === void 0 ? null : _ref$wpAllowedMimeTyp; |
|
// Cast filesList to array |
|
files = Object(toConsumableArray["a" /* default */])(filesList); |
|
filesSet = []; |
|
|
|
setAndUpdateFiles = function setAndUpdateFiles(idx, value) { |
|
Object(external_this_wp_blob_["revokeBlobURL"])(Object(external_lodash_["get"])(filesSet, [idx, 'url'])); |
|
filesSet[idx] = value; |
|
onFileChange(Object(external_lodash_["compact"])(filesSet)); |
|
}; // Allowed type specified by consumer |
|
|
|
|
|
isAllowedType = function isAllowedType(fileType) { |
|
if (!allowedTypes) { |
|
return true; |
|
} |
|
|
|
return Object(external_lodash_["some"])(allowedTypes, function (allowedType) { |
|
// If a complete mimetype is specified verify if it matches exactly the mime type of the file. |
|
if (Object(external_lodash_["includes"])(allowedType, '/')) { |
|
return allowedType === fileType; |
|
} // Otherwise a general mime type is used and we should verify if the file mimetype starts with it. |
|
|
|
|
|
return Object(external_lodash_["startsWith"])(fileType, "".concat(allowedType, "/")); |
|
}); |
|
}; // Allowed types for the current WP_User |
|
|
|
|
|
allowedMimeTypesForUser = getMimeTypesArray(wpAllowedMimeTypes); |
|
|
|
isAllowedMimeTypeForUser = function isAllowedMimeTypeForUser(fileType) { |
|
return Object(external_lodash_["includes"])(allowedMimeTypesForUser, fileType); |
|
}; // Build the error message including the filename |
|
|
|
|
|
triggerError = function triggerError(error) { |
|
error.message = [Object(external_this_wp_element_["createElement"])("strong", { |
|
key: "filename" |
|
}, error.file.name), ': ', error.message]; |
|
onError(error); |
|
}; |
|
|
|
validFiles = []; |
|
_iteratorNormalCompletion = true; |
|
_didIteratorError = false; |
|
_iteratorError = undefined; |
|
_context.prev = 12; |
|
_iterator = files[Symbol.iterator](); |
|
|
|
case 14: |
|
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) { |
|
_context.next = 34; |
|
break; |
|
} |
|
|
|
_mediaFile = _step.value; |
|
|
|
if (!(allowedMimeTypesForUser && !isAllowedMimeTypeForUser(_mediaFile.type))) { |
|
_context.next = 19; |
|
break; |
|
} |
|
|
|
triggerError({ |
|
code: 'MIME_TYPE_NOT_ALLOWED_FOR_USER', |
|
message: Object(external_this_wp_i18n_["__"])('Sorry, this file type is not permitted for security reasons.'), |
|
file: _mediaFile |
|
}); |
|
return _context.abrupt("continue", 31); |
|
|
|
case 19: |
|
if (isAllowedType(_mediaFile.type)) { |
|
_context.next = 22; |
|
break; |
|
} |
|
|
|
triggerError({ |
|
code: 'MIME_TYPE_NOT_SUPPORTED', |
|
message: Object(external_this_wp_i18n_["__"])('Sorry, this file type is not supported here.'), |
|
file: _mediaFile |
|
}); |
|
return _context.abrupt("continue", 31); |
|
|
|
case 22: |
|
if (!(maxUploadFileSize && _mediaFile.size > maxUploadFileSize)) { |
|
_context.next = 25; |
|
break; |
|
} |
|
|
|
triggerError({ |
|
code: 'SIZE_ABOVE_LIMIT', |
|
message: Object(external_this_wp_i18n_["__"])('This file exceeds the maximum upload size for this site.'), |
|
file: _mediaFile |
|
}); |
|
return _context.abrupt("continue", 31); |
|
|
|
case 25: |
|
if (!(_mediaFile.size <= 0)) { |
|
_context.next = 28; |
|
break; |
|
} |
|
|
|
triggerError({ |
|
code: 'EMPTY_FILE', |
|
message: Object(external_this_wp_i18n_["__"])('This file is empty.'), |
|
file: _mediaFile |
|
}); |
|
return _context.abrupt("continue", 31); |
|
|
|
case 28: |
|
validFiles.push(_mediaFile); // Set temporary URL to create placeholder media file, this is replaced |
|
// with final file from media gallery when upload is `done` below |
|
|
|
filesSet.push({ |
|
url: Object(external_this_wp_blob_["createBlobURL"])(_mediaFile) |
|
}); |
|
onFileChange(filesSet); |
|
|
|
case 31: |
|
_iteratorNormalCompletion = true; |
|
_context.next = 14; |
|
break; |
|
|
|
case 34: |
|
_context.next = 40; |
|
break; |
|
|
|
case 36: |
|
_context.prev = 36; |
|
_context.t0 = _context["catch"](12); |
|
_didIteratorError = true; |
|
_iteratorError = _context.t0; |
|
|
|
case 40: |
|
_context.prev = 40; |
|
_context.prev = 41; |
|
|
|
if (!_iteratorNormalCompletion && _iterator.return != null) { |
|
_iterator.return(); |
|
} |
|
|
|
case 43: |
|
_context.prev = 43; |
|
|
|
if (!_didIteratorError) { |
|
_context.next = 46; |
|
break; |
|
} |
|
|
|
throw _iteratorError; |
|
|
|
case 46: |
|
return _context.finish(43); |
|
|
|
case 47: |
|
return _context.finish(40); |
|
|
|
case 48: |
|
idx = 0; |
|
|
|
case 49: |
|
if (!(idx < validFiles.length)) { |
|
_context.next = 68; |
|
break; |
|
} |
|
|
|
mediaFile = validFiles[idx]; |
|
_context.prev = 51; |
|
_context.next = 54; |
|
return createMediaFromFile(mediaFile, additionalData); |
|
|
|
case 54: |
|
savedMedia = _context.sent; |
|
mediaObject = Object(objectSpread["a" /* default */])({}, Object(external_lodash_["omit"])(savedMedia, ['alt_text', 'source_url']), { |
|
alt: savedMedia.alt_text, |
|
caption: Object(external_lodash_["get"])(savedMedia, ['caption', 'raw'], ''), |
|
title: savedMedia.title.raw, |
|
url: savedMedia.source_url |
|
}); |
|
setAndUpdateFiles(idx, mediaObject); |
|
_context.next = 65; |
|
break; |
|
|
|
case 59: |
|
_context.prev = 59; |
|
_context.t1 = _context["catch"](51); |
|
// Reset to empty on failure. |
|
setAndUpdateFiles(idx, null); |
|
message = void 0; |
|
|
|
if (Object(external_lodash_["has"])(_context.t1, ['message'])) { |
|
message = Object(external_lodash_["get"])(_context.t1, ['message']); |
|
} else { |
|
message = Object(external_this_wp_i18n_["sprintf"])( // translators: %s: file name |
|
Object(external_this_wp_i18n_["__"])('Error while uploading file %s to the media library.'), mediaFile.name); |
|
} |
|
|
|
onError({ |
|
code: 'GENERAL', |
|
message: message, |
|
file: mediaFile |
|
}); |
|
|
|
case 65: |
|
++idx; |
|
_context.next = 49; |
|
break; |
|
|
|
case 68: |
|
case "end": |
|
return _context.stop(); |
|
} |
|
} |
|
}, _callee, this, [[12, 36, 40, 48], [41,, 43, 47], [51, 59]]); |
|
})); |
|
return _mediaUpload.apply(this, arguments); |
|
} |
|
|
|
function createMediaFromFile(file, additionalData) { |
|
// Create upload payload |
|
var data = new window.FormData(); |
|
data.append('file', file, file.name || file.type.replace('/', '.')); |
|
data.append('title', file.name ? file.name.replace(/\.[^.]+$/, '') : file.type.replace('/', '.')); |
|
Object(external_lodash_["forEach"])(additionalData, function (value, key) { |
|
return data.append(key, value); |
|
}); |
|
return external_this_wp_apiFetch_default()({ |
|
path: '/wp/v2/media', |
|
body: data, |
|
method: 'POST' |
|
}); |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/media-upload/index.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Upload a media file when the file upload button is activated. |
|
* Wrapper around mediaUpload() that injects the current post ID. |
|
* |
|
* @param {Object} $0 Parameters object passed to the function. |
|
* @param {string} $0.allowedTypes Array with the types of media that can be uploaded, if unset all types are allowed. |
|
* @param {Array} $0.filesList List of files. |
|
* @param {?number} $0.maxUploadFileSize Maximum upload size in bytes allowed for the site. |
|
* @param {Function} $0.onError Function called when an error happens. |
|
* @param {Function} $0.onFileChange Function called each time a file or a temporary representation of the file is available. |
|
*/ |
|
|
|
/* harmony default export */ var utils_media_upload = (function (_ref) { |
|
var allowedTypes = _ref.allowedTypes, |
|
filesList = _ref.filesList, |
|
maxUploadFileSize = _ref.maxUploadFileSize, |
|
_ref$onError = _ref.onError, |
|
_onError = _ref$onError === void 0 ? external_lodash_["noop"] : _ref$onError, |
|
onFileChange = _ref.onFileChange; |
|
|
|
var _select = Object(external_this_wp_data_["select"])('core/editor'), |
|
getCurrentPostId = _select.getCurrentPostId, |
|
getEditorSettings = _select.getEditorSettings; |
|
|
|
var wpAllowedMimeTypes = getEditorSettings().allowedMimeTypes; |
|
maxUploadFileSize = maxUploadFileSize || getEditorSettings().maxUploadFileSize; |
|
mediaUpload({ |
|
allowedTypes: allowedTypes, |
|
filesList: filesList, |
|
onFileChange: onFileChange, |
|
additionalData: { |
|
post: getCurrentPostId() |
|
}, |
|
maxUploadFileSize: maxUploadFileSize, |
|
onError: function onError(_ref2) { |
|
var message = _ref2.message; |
|
return _onError(message); |
|
}, |
|
wpAllowedMimeTypes: wpAllowedMimeTypes |
|
}); |
|
}); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/url.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Returns the URL of a WPAdmin Page. |
|
* |
|
* TODO: This should be moved to a module less specific to the editor. |
|
* |
|
* @param {string} page Page to navigate to. |
|
* @param {Object} query Query Args. |
|
* |
|
* @return {string} WPAdmin URL. |
|
*/ |
|
|
|
function getWPAdminURL(page, query) { |
|
return Object(external_this_wp_url_["addQueryArgs"])(page, query); |
|
} |
|
/** |
|
* Performs some basic cleanup of a string for use as a post slug |
|
* |
|
* This replicates some of what santize_title() does in WordPress core, but |
|
* is only designed to approximate what the slug will be. |
|
* |
|
* Converts whitespace, periods, forward slashes and underscores to hyphens. |
|
* Converts Latin-1 Supplement and Latin Extended-A letters to basic Latin |
|
* letters. Removes combining diacritical marks. Converts remaining string |
|
* to lowercase. It does not touch octets, HTML entities, or other encoded |
|
* characters. |
|
* |
|
* @param {string} string Title or slug to be processed |
|
* |
|
* @return {string} Processed string |
|
*/ |
|
|
|
function cleanForSlug(string) { |
|
return Object(external_lodash_["toLower"])(Object(external_lodash_["deburr"])(Object(external_lodash_["trim"])(string.replace(/[\s\./_]+/g, '-'), '-'))); |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/index.js |
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/media-placeholder/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
var media_placeholder_InsertFromURLPopover = function InsertFromURLPopover(_ref) { |
|
var src = _ref.src, |
|
onChange = _ref.onChange, |
|
onSubmit = _ref.onSubmit, |
|
onClose = _ref.onClose; |
|
return Object(external_this_wp_element_["createElement"])(url_popover, { |
|
onClose: onClose |
|
}, Object(external_this_wp_element_["createElement"])("form", { |
|
className: "editor-media-placeholder__url-input-form", |
|
onSubmit: onSubmit |
|
}, Object(external_this_wp_element_["createElement"])("input", { |
|
className: "editor-media-placeholder__url-input-field", |
|
type: "url", |
|
"aria-label": Object(external_this_wp_i18n_["__"])('URL'), |
|
placeholder: Object(external_this_wp_i18n_["__"])('Paste or type URL'), |
|
onChange: onChange, |
|
value: src |
|
}), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
className: "editor-media-placeholder__url-input-submit-button", |
|
icon: "editor-break", |
|
label: Object(external_this_wp_i18n_["__"])('Apply'), |
|
type: "submit" |
|
}))); |
|
}; |
|
|
|
var media_placeholder_MediaPlaceholder = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(MediaPlaceholder, _Component); |
|
|
|
function MediaPlaceholder() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, MediaPlaceholder); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(MediaPlaceholder).apply(this, arguments)); |
|
_this.state = { |
|
src: '', |
|
isURLInputVisible: false |
|
}; |
|
_this.onChangeSrc = _this.onChangeSrc.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onSubmitSrc = _this.onSubmitSrc.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onUpload = _this.onUpload.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onFilesUpload = _this.onFilesUpload.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.openURLInput = _this.openURLInput.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.closeURLInput = _this.closeURLInput.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(MediaPlaceholder, [{ |
|
key: "onlyAllowsImages", |
|
value: function onlyAllowsImages() { |
|
var allowedTypes = this.props.allowedTypes; |
|
|
|
if (!allowedTypes) { |
|
return false; |
|
} |
|
|
|
return Object(external_lodash_["every"])(allowedTypes, function (allowedType) { |
|
return allowedType === 'image' || Object(external_lodash_["startsWith"])(allowedType, 'image/'); |
|
}); |
|
} |
|
}, { |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
this.setState({ |
|
src: Object(external_lodash_["get"])(this.props.value, ['src'], '') |
|
}); |
|
} |
|
}, { |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
if (Object(external_lodash_["get"])(prevProps.value, ['src'], '') !== Object(external_lodash_["get"])(this.props.value, ['src'], '')) { |
|
this.setState({ |
|
src: Object(external_lodash_["get"])(this.props.value, ['src'], '') |
|
}); |
|
} |
|
} |
|
}, { |
|
key: "onChangeSrc", |
|
value: function onChangeSrc(event) { |
|
this.setState({ |
|
src: event.target.value |
|
}); |
|
} |
|
}, { |
|
key: "onSubmitSrc", |
|
value: function onSubmitSrc(event) { |
|
event.preventDefault(); |
|
|
|
if (this.state.src && this.props.onSelectURL) { |
|
this.props.onSelectURL(this.state.src); |
|
this.closeURLInput(); |
|
} |
|
} |
|
}, { |
|
key: "onUpload", |
|
value: function onUpload(event) { |
|
this.onFilesUpload(event.target.files); |
|
} |
|
}, { |
|
key: "onFilesUpload", |
|
value: function onFilesUpload(files) { |
|
var _this$props = this.props, |
|
onSelect = _this$props.onSelect, |
|
multiple = _this$props.multiple, |
|
onError = _this$props.onError, |
|
allowedTypes = _this$props.allowedTypes; |
|
var setMedia = multiple ? onSelect : function (_ref2) { |
|
var _ref3 = Object(slicedToArray["a" /* default */])(_ref2, 1), |
|
media = _ref3[0]; |
|
|
|
return onSelect(media); |
|
}; |
|
utils_media_upload({ |
|
allowedTypes: allowedTypes, |
|
filesList: files, |
|
onFileChange: setMedia, |
|
onError: onError |
|
}); |
|
} |
|
}, { |
|
key: "openURLInput", |
|
value: function openURLInput() { |
|
this.setState({ |
|
isURLInputVisible: true |
|
}); |
|
} |
|
}, { |
|
key: "closeURLInput", |
|
value: function closeURLInput() { |
|
this.setState({ |
|
isURLInputVisible: false |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props2 = this.props, |
|
accept = _this$props2.accept, |
|
icon = _this$props2.icon, |
|
className = _this$props2.className, |
|
_this$props2$labels = _this$props2.labels, |
|
labels = _this$props2$labels === void 0 ? {} : _this$props2$labels, |
|
onSelect = _this$props2.onSelect, |
|
_this$props2$value = _this$props2.value, |
|
value = _this$props2$value === void 0 ? {} : _this$props2$value, |
|
onSelectURL = _this$props2.onSelectURL, |
|
_this$props2$onHTMLDr = _this$props2.onHTMLDrop, |
|
onHTMLDrop = _this$props2$onHTMLDr === void 0 ? external_lodash_["noop"] : _this$props2$onHTMLDr, |
|
_this$props2$multiple = _this$props2.multiple, |
|
multiple = _this$props2$multiple === void 0 ? false : _this$props2$multiple, |
|
notices = _this$props2.notices, |
|
_this$props2$allowedT = _this$props2.allowedTypes, |
|
allowedTypes = _this$props2$allowedT === void 0 ? [] : _this$props2$allowedT, |
|
hasUploadPermissions = _this$props2.hasUploadPermissions; |
|
var _this$state = this.state, |
|
isURLInputVisible = _this$state.isURLInputVisible, |
|
src = _this$state.src; |
|
var instructions = labels.instructions || ''; |
|
var title = labels.title || ''; |
|
|
|
if (!hasUploadPermissions && !onSelectURL) { |
|
instructions = Object(external_this_wp_i18n_["__"])('To edit this block, you need permission to upload media.'); |
|
} |
|
|
|
if (!instructions || !title) { |
|
var isOneType = 1 === allowedTypes.length; |
|
var isAudio = isOneType && 'audio' === allowedTypes[0]; |
|
var isImage = isOneType && 'image' === allowedTypes[0]; |
|
var isVideo = isOneType && 'video' === allowedTypes[0]; |
|
|
|
if (!instructions) { |
|
if (hasUploadPermissions) { |
|
instructions = Object(external_this_wp_i18n_["__"])('Drag a media file, upload a new one or select a file from your library.'); |
|
|
|
if (isAudio) { |
|
instructions = Object(external_this_wp_i18n_["__"])('Drag an audio, upload a new one or select a file from your library.'); |
|
} else if (isImage) { |
|
instructions = Object(external_this_wp_i18n_["__"])('Drag an image, upload a new one or select a file from your library.'); |
|
} else if (isVideo) { |
|
instructions = Object(external_this_wp_i18n_["__"])('Drag a video, upload a new one or select a file from your library.'); |
|
} |
|
} else if (!hasUploadPermissions && onSelectURL) { |
|
instructions = Object(external_this_wp_i18n_["__"])('Given your current role, you can only link a media file, you cannot upload.'); |
|
|
|
if (isAudio) { |
|
instructions = Object(external_this_wp_i18n_["__"])('Given your current role, you can only link an audio, you cannot upload.'); |
|
} else if (isImage) { |
|
instructions = Object(external_this_wp_i18n_["__"])('Given your current role, you can only link an image, you cannot upload.'); |
|
} else if (isVideo) { |
|
instructions = Object(external_this_wp_i18n_["__"])('Given your current role, you can only link a video, you cannot upload.'); |
|
} |
|
} |
|
} |
|
|
|
if (!title) { |
|
title = Object(external_this_wp_i18n_["__"])('Media'); |
|
|
|
if (isAudio) { |
|
title = Object(external_this_wp_i18n_["__"])('Audio'); |
|
} else if (isImage) { |
|
title = Object(external_this_wp_i18n_["__"])('Image'); |
|
} else if (isVideo) { |
|
title = Object(external_this_wp_i18n_["__"])('Video'); |
|
} |
|
} |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Placeholder"], { |
|
icon: icon, |
|
label: title, |
|
instructions: instructions, |
|
className: classnames_default()('editor-media-placeholder', className), |
|
notices: notices |
|
}, Object(external_this_wp_element_["createElement"])(check, null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["DropZone"], { |
|
onFilesDrop: this.onFilesUpload, |
|
onHTMLDrop: onHTMLDrop |
|
}), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["FormFileUpload"], { |
|
isLarge: true, |
|
className: "editor-media-placeholder__button", |
|
onChange: this.onUpload, |
|
accept: accept, |
|
multiple: multiple |
|
}, Object(external_this_wp_i18n_["__"])('Upload')), Object(external_this_wp_element_["createElement"])(media_upload, { |
|
gallery: multiple && this.onlyAllowsImages(), |
|
multiple: multiple, |
|
onSelect: onSelect, |
|
allowedTypes: allowedTypes, |
|
value: value.id, |
|
render: function render(_ref4) { |
|
var open = _ref4.open; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
isLarge: true, |
|
className: "editor-media-placeholder__button", |
|
onClick: open |
|
}, Object(external_this_wp_i18n_["__"])('Media Library')); |
|
} |
|
})), onSelectURL && Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-media-placeholder__url-input-container" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
className: "editor-media-placeholder__button", |
|
onClick: this.openURLInput, |
|
isToggled: isURLInputVisible, |
|
isLarge: true |
|
}, Object(external_this_wp_i18n_["__"])('Insert from URL')), isURLInputVisible && Object(external_this_wp_element_["createElement"])(media_placeholder_InsertFromURLPopover, { |
|
src: src, |
|
onChange: this.onChangeSrc, |
|
onSubmit: this.onSubmitSrc, |
|
onClose: this.closeURLInput |
|
}))); |
|
} |
|
}]); |
|
|
|
return MediaPlaceholder; |
|
}(external_this_wp_element_["Component"]); |
|
var media_placeholder_applyWithSelect = Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core'), |
|
hasUploadPermissions = _select.hasUploadPermissions; |
|
|
|
return { |
|
hasUploadPermissions: hasUploadPermissions() |
|
}; |
|
}); |
|
/* harmony default export */ var media_placeholder = (Object(external_this_wp_compose_["compose"])(media_placeholder_applyWithSelect, Object(external_this_wp_components_["withFilters"])('editor.MediaPlaceholder'))(media_placeholder_MediaPlaceholder)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/url-input/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Since URLInput is rendered in the context of other inputs, but should be |
|
// considered a separate modal node, prevent keyboard events from propagating |
|
// as being considered from the input. |
|
|
|
var stopEventPropagation = function stopEventPropagation(event) { |
|
return event.stopPropagation(); |
|
}; |
|
|
|
var url_input_URLInput = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(URLInput, _Component); |
|
|
|
function URLInput(_ref) { |
|
var _this; |
|
|
|
var autocompleteRef = _ref.autocompleteRef; |
|
|
|
Object(classCallCheck["a" /* default */])(this, URLInput); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(URLInput).apply(this, arguments)); |
|
_this.onChange = _this.onChange.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onKeyDown = _this.onKeyDown.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.autocompleteRef = autocompleteRef || Object(external_this_wp_element_["createRef"])(); |
|
_this.inputRef = Object(external_this_wp_element_["createRef"])(); |
|
_this.updateSuggestions = Object(external_lodash_["throttle"])(_this.updateSuggestions.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))), 200); |
|
_this.suggestionNodes = []; |
|
_this.state = { |
|
posts: [], |
|
showSuggestions: false, |
|
selectedSuggestion: null |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(URLInput, [{ |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate() { |
|
var _this2 = this; |
|
|
|
var _this$state = this.state, |
|
showSuggestions = _this$state.showSuggestions, |
|
selectedSuggestion = _this$state.selectedSuggestion; // only have to worry about scrolling selected suggestion into view |
|
// when already expanded |
|
|
|
if (showSuggestions && selectedSuggestion !== null && !this.scrollingIntoView) { |
|
this.scrollingIntoView = true; |
|
dom_scroll_into_view_lib_default()(this.suggestionNodes[selectedSuggestion], this.autocompleteRef.current, { |
|
onlyScrollIfNeeded: true |
|
}); |
|
setTimeout(function () { |
|
_this2.scrollingIntoView = false; |
|
}, 100); |
|
} |
|
} |
|
}, { |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
delete this.suggestionsRequest; |
|
} |
|
}, { |
|
key: "bindSuggestionNode", |
|
value: function bindSuggestionNode(index) { |
|
var _this3 = this; |
|
|
|
return function (ref) { |
|
_this3.suggestionNodes[index] = ref; |
|
}; |
|
} |
|
}, { |
|
key: "updateSuggestions", |
|
value: function updateSuggestions(value) { |
|
var _this4 = this; |
|
|
|
// Show the suggestions after typing at least 2 characters |
|
// and also for URLs |
|
if (value.length < 2 || /^https?:/.test(value)) { |
|
this.setState({ |
|
showSuggestions: false, |
|
selectedSuggestion: null, |
|
loading: false |
|
}); |
|
return; |
|
} |
|
|
|
this.setState({ |
|
showSuggestions: true, |
|
selectedSuggestion: null, |
|
loading: true |
|
}); |
|
var request = external_this_wp_apiFetch_default()({ |
|
path: Object(external_this_wp_url_["addQueryArgs"])('/wp/v2/search', { |
|
search: value, |
|
per_page: 20, |
|
type: 'post' |
|
}) |
|
}); |
|
request.then(function (posts) { |
|
// A fetch Promise doesn't have an abort option. It's mimicked by |
|
// comparing the request reference in on the instance, which is |
|
// reset or deleted on subsequent requests or unmounting. |
|
if (_this4.suggestionsRequest !== request) { |
|
return; |
|
} |
|
|
|
_this4.setState({ |
|
posts: posts, |
|
loading: false |
|
}); |
|
|
|
if (!!posts.length) { |
|
_this4.props.debouncedSpeak(Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_n"])('%d result found, use up and down arrow keys to navigate.', '%d results found, use up and down arrow keys to navigate.', posts.length), posts.length), 'assertive'); |
|
} else { |
|
_this4.props.debouncedSpeak(Object(external_this_wp_i18n_["__"])('No results.'), 'assertive'); |
|
} |
|
}).catch(function () { |
|
if (_this4.suggestionsRequest === request) { |
|
_this4.setState({ |
|
loading: false |
|
}); |
|
} |
|
}); |
|
this.suggestionsRequest = request; |
|
} |
|
}, { |
|
key: "onChange", |
|
value: function onChange(event) { |
|
var inputValue = event.target.value; |
|
this.props.onChange(inputValue); |
|
this.updateSuggestions(inputValue); |
|
} |
|
}, { |
|
key: "onKeyDown", |
|
value: function onKeyDown(event) { |
|
var _this$state2 = this.state, |
|
showSuggestions = _this$state2.showSuggestions, |
|
selectedSuggestion = _this$state2.selectedSuggestion, |
|
posts = _this$state2.posts, |
|
loading = _this$state2.loading; // If the suggestions are not shown or loading, we shouldn't handle the arrow keys |
|
// We shouldn't preventDefault to allow block arrow keys navigation |
|
|
|
if (!showSuggestions || !posts.length || loading) { |
|
// In the Windows version of Firefox the up and down arrows don't move the caret |
|
// within an input field like they do for Mac Firefox/Chrome/Safari. This causes |
|
// a form of focus trapping that is disruptive to the user experience. This disruption |
|
// only happens if the caret is not in the first or last position in the text input. |
|
// See: https://github.com/WordPress/gutenberg/issues/5693#issuecomment-436684747 |
|
switch (event.keyCode) { |
|
// When UP is pressed, if the caret is at the start of the text, move it to the 0 |
|
// position. |
|
case external_this_wp_keycodes_["UP"]: |
|
{ |
|
if (0 !== event.target.selectionStart) { |
|
event.stopPropagation(); |
|
event.preventDefault(); // Set the input caret to position 0 |
|
|
|
event.target.setSelectionRange(0, 0); |
|
} |
|
|
|
break; |
|
} |
|
// When DOWN is pressed, if the caret is not at the end of the text, move it to the |
|
// last position. |
|
|
|
case external_this_wp_keycodes_["DOWN"]: |
|
{ |
|
if (this.props.value.length !== event.target.selectionStart) { |
|
event.stopPropagation(); |
|
event.preventDefault(); // Set the input caret to the last position |
|
|
|
event.target.setSelectionRange(this.props.value.length, this.props.value.length); |
|
} |
|
|
|
break; |
|
} |
|
} |
|
|
|
return; |
|
} |
|
|
|
var post = this.state.posts[this.state.selectedSuggestion]; |
|
|
|
switch (event.keyCode) { |
|
case external_this_wp_keycodes_["UP"]: |
|
{ |
|
event.stopPropagation(); |
|
event.preventDefault(); |
|
var previousIndex = !selectedSuggestion ? posts.length - 1 : selectedSuggestion - 1; |
|
this.setState({ |
|
selectedSuggestion: previousIndex |
|
}); |
|
break; |
|
} |
|
|
|
case external_this_wp_keycodes_["DOWN"]: |
|
{ |
|
event.stopPropagation(); |
|
event.preventDefault(); |
|
var nextIndex = selectedSuggestion === null || selectedSuggestion === posts.length - 1 ? 0 : selectedSuggestion + 1; |
|
this.setState({ |
|
selectedSuggestion: nextIndex |
|
}); |
|
break; |
|
} |
|
|
|
case external_this_wp_keycodes_["TAB"]: |
|
{ |
|
if (this.state.selectedSuggestion !== null) { |
|
this.selectLink(post); // Announce a link has been selected when tabbing away from the input field. |
|
|
|
this.props.speak(Object(external_this_wp_i18n_["__"])('Link selected')); |
|
} |
|
|
|
break; |
|
} |
|
|
|
case external_this_wp_keycodes_["ENTER"]: |
|
{ |
|
if (this.state.selectedSuggestion !== null) { |
|
event.stopPropagation(); |
|
this.selectLink(post); |
|
} |
|
|
|
break; |
|
} |
|
} |
|
} |
|
}, { |
|
key: "selectLink", |
|
value: function selectLink(post) { |
|
this.props.onChange(post.url, post); |
|
this.setState({ |
|
selectedSuggestion: null, |
|
showSuggestions: false |
|
}); |
|
} |
|
}, { |
|
key: "handleOnClick", |
|
value: function handleOnClick(post) { |
|
this.selectLink(post); // Move focus to the input field when a link suggestion is clicked. |
|
|
|
this.inputRef.current.focus(); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this5 = this; |
|
|
|
var _this$props = this.props, |
|
_this$props$value = _this$props.value, |
|
value = _this$props$value === void 0 ? '' : _this$props$value, |
|
_this$props$autoFocus = _this$props.autoFocus, |
|
autoFocus = _this$props$autoFocus === void 0 ? true : _this$props$autoFocus, |
|
instanceId = _this$props.instanceId; |
|
var _this$state3 = this.state, |
|
showSuggestions = _this$state3.showSuggestions, |
|
posts = _this$state3.posts, |
|
selectedSuggestion = _this$state3.selectedSuggestion, |
|
loading = _this$state3.loading; |
|
/* eslint-disable jsx-a11y/no-autofocus */ |
|
|
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-url-input" |
|
}, Object(external_this_wp_element_["createElement"])("input", { |
|
autoFocus: autoFocus, |
|
type: "text", |
|
"aria-label": Object(external_this_wp_i18n_["__"])('URL'), |
|
required: true, |
|
value: value, |
|
onChange: this.onChange, |
|
onInput: stopEventPropagation, |
|
placeholder: Object(external_this_wp_i18n_["__"])('Paste URL or type to search'), |
|
onKeyDown: this.onKeyDown, |
|
role: "combobox", |
|
"aria-expanded": showSuggestions, |
|
"aria-autocomplete": "list", |
|
"aria-owns": "editor-url-input-suggestions-".concat(instanceId), |
|
"aria-activedescendant": selectedSuggestion !== null ? "editor-url-input-suggestion-".concat(instanceId, "-").concat(selectedSuggestion) : undefined, |
|
ref: this.inputRef |
|
}), loading && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Spinner"], null), showSuggestions && !!posts.length && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Popover"], { |
|
position: "bottom", |
|
noArrow: true, |
|
focusOnMount: false |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-url-input__suggestions", |
|
id: "editor-url-input-suggestions-".concat(instanceId), |
|
ref: this.autocompleteRef, |
|
role: "listbox" |
|
}, posts.map(function (post, index) { |
|
return Object(external_this_wp_element_["createElement"])("button", { |
|
key: post.id, |
|
role: "option", |
|
tabIndex: "-1", |
|
id: "editor-url-input-suggestion-".concat(instanceId, "-").concat(index), |
|
ref: _this5.bindSuggestionNode(index), |
|
className: classnames_default()('editor-url-input__suggestion', { |
|
'is-selected': index === selectedSuggestion |
|
}), |
|
onClick: function onClick() { |
|
return _this5.handleOnClick(post); |
|
}, |
|
"aria-selected": index === selectedSuggestion |
|
}, Object(external_this_wp_htmlEntities_["decodeEntities"])(post.title) || Object(external_this_wp_i18n_["__"])('(no title)')); |
|
})))); |
|
/* eslint-enable jsx-a11y/no-autofocus */ |
|
} |
|
}]); |
|
|
|
return URLInput; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var url_input = (Object(external_this_wp_components_["withSpokenMessages"])(Object(external_this_wp_compose_["withInstanceId"])(url_input_URLInput))); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/url-input/button.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var button_URLInputButton = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(URLInputButton, _Component); |
|
|
|
function URLInputButton() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, URLInputButton); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(URLInputButton).apply(this, arguments)); |
|
_this.toggle = _this.toggle.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.submitLink = _this.submitLink.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.state = { |
|
expanded: false |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(URLInputButton, [{ |
|
key: "toggle", |
|
value: function toggle() { |
|
this.setState({ |
|
expanded: !this.state.expanded |
|
}); |
|
} |
|
}, { |
|
key: "submitLink", |
|
value: function submitLink(event) { |
|
event.preventDefault(); |
|
this.toggle(); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
url = _this$props.url, |
|
onChange = _this$props.onChange; |
|
var expanded = this.state.expanded; |
|
var buttonLabel = url ? Object(external_this_wp_i18n_["__"])('Edit Link') : Object(external_this_wp_i18n_["__"])('Insert Link'); |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-url-input__button" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
icon: "admin-links", |
|
label: buttonLabel, |
|
onClick: this.toggle, |
|
className: classnames_default()('components-toolbar__control', { |
|
'is-active': url |
|
}) |
|
}), expanded && Object(external_this_wp_element_["createElement"])("form", { |
|
className: "editor-url-input__button-modal", |
|
onSubmit: this.submitLink |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-url-input__button-modal-line" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
className: "editor-url-input__back", |
|
icon: "arrow-left-alt", |
|
label: Object(external_this_wp_i18n_["__"])('Close'), |
|
onClick: this.toggle |
|
}), Object(external_this_wp_element_["createElement"])(url_input, { |
|
value: url || '', |
|
onChange: onChange |
|
}), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
icon: "editor-break", |
|
label: Object(external_this_wp_i18n_["__"])('Submit'), |
|
type: "submit" |
|
})))); |
|
} |
|
}]); |
|
|
|
return URLInputButton; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var url_input_button = (button_URLInputButton); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/autosave-monitor/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
var autosave_monitor_AutosaveMonitor = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(AutosaveMonitor, _Component); |
|
|
|
function AutosaveMonitor() { |
|
Object(classCallCheck["a" /* default */])(this, AutosaveMonitor); |
|
|
|
return Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(AutosaveMonitor).apply(this, arguments)); |
|
} |
|
|
|
Object(createClass["a" /* default */])(AutosaveMonitor, [{ |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
var _this$props = this.props, |
|
isDirty = _this$props.isDirty, |
|
editsReference = _this$props.editsReference, |
|
isAutosaveable = _this$props.isAutosaveable; |
|
|
|
if (prevProps.isDirty !== isDirty || prevProps.isAutosaveable !== isAutosaveable || prevProps.editsReference !== editsReference) { |
|
this.toggleTimer(isDirty && isAutosaveable); |
|
} |
|
} |
|
}, { |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
this.toggleTimer(false); |
|
} |
|
}, { |
|
key: "toggleTimer", |
|
value: function toggleTimer(isPendingSave) { |
|
var _this = this; |
|
|
|
clearTimeout(this.pendingSave); |
|
var autosaveInterval = this.props.autosaveInterval; |
|
|
|
if (isPendingSave) { |
|
this.pendingSave = setTimeout(function () { |
|
return _this.props.autosave(); |
|
}, autosaveInterval * 1000); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
return null; |
|
} |
|
}]); |
|
|
|
return AutosaveMonitor; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var autosave_monitor = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
isEditedPostDirty = _select.isEditedPostDirty, |
|
isEditedPostAutosaveable = _select.isEditedPostAutosaveable, |
|
getEditorSettings = _select.getEditorSettings, |
|
getReferenceByDistinctEdits = _select.getReferenceByDistinctEdits; |
|
|
|
var _getEditorSettings = getEditorSettings(), |
|
autosaveInterval = _getEditorSettings.autosaveInterval; |
|
|
|
return { |
|
isDirty: isEditedPostDirty(), |
|
isAutosaveable: isEditedPostAutosaveable(), |
|
editsReference: getReferenceByDistinctEdits(), |
|
autosaveInterval: autosaveInterval |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
autosave: dispatch('core/editor').autosave |
|
}; |
|
})])(autosave_monitor_AutosaveMonitor)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/document-outline/item.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var item_TableOfContentsItem = function TableOfContentsItem(_ref) { |
|
var children = _ref.children, |
|
isValid = _ref.isValid, |
|
level = _ref.level, |
|
onClick = _ref.onClick, |
|
_ref$path = _ref.path, |
|
path = _ref$path === void 0 ? [] : _ref$path; |
|
return Object(external_this_wp_element_["createElement"])("li", { |
|
className: classnames_default()('document-outline__item', "is-".concat(level.toLowerCase()), { |
|
'is-invalid': !isValid |
|
}) |
|
}, Object(external_this_wp_element_["createElement"])("button", { |
|
className: "document-outline__button", |
|
onClick: onClick |
|
}, Object(external_this_wp_element_["createElement"])("span", { |
|
className: "document-outline__emdash", |
|
"aria-hidden": "true" |
|
}), // path is an array of nodes that are ancestors of the heading starting in the top level node. |
|
// This mapping renders each ancestor to make it easier for the user to know where the headings are nested. |
|
path.map(function (_ref2, index) { |
|
var clientId = _ref2.clientId; |
|
return Object(external_this_wp_element_["createElement"])("strong", { |
|
key: index, |
|
className: "document-outline__level" |
|
}, Object(external_this_wp_element_["createElement"])(block_title, { |
|
clientId: clientId |
|
})); |
|
}), Object(external_this_wp_element_["createElement"])("strong", { |
|
className: "document-outline__level" |
|
}, level), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "document-outline__item-content" |
|
}, children), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "screen-reader-text" |
|
}, Object(external_this_wp_i18n_["__"])('(Click to focus this heading)')))); |
|
}; |
|
|
|
/* harmony default export */ var document_outline_item = (item_TableOfContentsItem); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/document-outline/index.js |
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Module constants |
|
*/ |
|
|
|
var emptyHeadingContent = Object(external_this_wp_element_["createElement"])("em", null, Object(external_this_wp_i18n_["__"])('(Empty heading)')); |
|
var incorrectLevelContent = [Object(external_this_wp_element_["createElement"])("br", { |
|
key: "incorrect-break" |
|
}), Object(external_this_wp_element_["createElement"])("em", { |
|
key: "incorrect-message" |
|
}, Object(external_this_wp_i18n_["__"])('(Incorrect heading level)'))]; |
|
var singleH1Headings = [Object(external_this_wp_element_["createElement"])("br", { |
|
key: "incorrect-break-h1" |
|
}), Object(external_this_wp_element_["createElement"])("em", { |
|
key: "incorrect-message-h1" |
|
}, Object(external_this_wp_i18n_["__"])('(Your theme may already use a H1 for the post title)'))]; |
|
var multipleH1Headings = [Object(external_this_wp_element_["createElement"])("br", { |
|
key: "incorrect-break-multiple-h1" |
|
}), Object(external_this_wp_element_["createElement"])("em", { |
|
key: "incorrect-message-multiple-h1" |
|
}, Object(external_this_wp_i18n_["__"])('(Multiple H1 headings are not recommended)'))]; |
|
/** |
|
* Returns an array of heading blocks enhanced with the following properties: |
|
* path - An array of blocks that are ancestors of the heading starting from a top-level node. |
|
* Can be an empty array if the heading is a top-level node (is not nested inside another block). |
|
* level - An integer with the heading level. |
|
* isEmpty - Flag indicating if the heading has no content. |
|
* |
|
* @param {?Array} blocks An array of blocks. |
|
* @param {?Array} path An array of blocks that are ancestors of the blocks passed as blocks. |
|
* |
|
* @return {Array} An array of heading blocks enhanced with the properties described above. |
|
*/ |
|
|
|
var document_outline_computeOutlineHeadings = function computeOutlineHeadings() { |
|
var blocks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; |
|
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; |
|
return Object(external_lodash_["flatMap"])(blocks, function () { |
|
var block = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
|
|
if (block.name === 'core/heading') { |
|
return Object(objectSpread["a" /* default */])({}, block, { |
|
path: path, |
|
level: block.attributes.level, |
|
isEmpty: isEmptyHeading(block) |
|
}); |
|
} |
|
|
|
return computeOutlineHeadings(block.innerBlocks, Object(toConsumableArray["a" /* default */])(path).concat([block])); |
|
}); |
|
}; |
|
|
|
var isEmptyHeading = function isEmptyHeading(heading) { |
|
return !heading.attributes.content || heading.attributes.content.length === 0; |
|
}; |
|
|
|
var document_outline_DocumentOutline = function DocumentOutline(_ref) { |
|
var _ref$blocks = _ref.blocks, |
|
blocks = _ref$blocks === void 0 ? [] : _ref$blocks, |
|
title = _ref.title, |
|
onSelect = _ref.onSelect, |
|
isTitleSupported = _ref.isTitleSupported; |
|
var headings = document_outline_computeOutlineHeadings(blocks); |
|
|
|
if (headings.length < 1) { |
|
return null; |
|
} |
|
|
|
var prevHeadingLevel = 1; // Select the corresponding block in the main editor |
|
// when clicking on a heading item from the list. |
|
|
|
var onSelectHeading = function onSelectHeading(clientId) { |
|
return onSelect(clientId); |
|
}; |
|
|
|
var focusTitle = function focusTitle() { |
|
// Not great but it's the simplest way to focus the title right now. |
|
var titleNode = document.querySelector('.editor-post-title__input'); |
|
|
|
if (titleNode) { |
|
titleNode.focus(); |
|
} |
|
}; |
|
|
|
var hasTitle = isTitleSupported && title; |
|
var countByLevel = Object(external_lodash_["countBy"])(headings, 'level'); |
|
var hasMultipleH1 = countByLevel[1] > 1; |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "document-outline" |
|
}, Object(external_this_wp_element_["createElement"])("ul", null, hasTitle && Object(external_this_wp_element_["createElement"])(document_outline_item, { |
|
level: Object(external_this_wp_i18n_["__"])('Title'), |
|
isValid: true, |
|
onClick: focusTitle |
|
}, title), headings.map(function (item, index) { |
|
// Headings remain the same, go up by one, or down by any amount. |
|
// Otherwise there are missing levels. |
|
var isIncorrectLevel = item.level > prevHeadingLevel + 1; |
|
var isValid = !item.isEmpty && !isIncorrectLevel && !!item.level && (item.level !== 1 || !hasMultipleH1 && !hasTitle); |
|
prevHeadingLevel = item.level; |
|
return Object(external_this_wp_element_["createElement"])(document_outline_item, { |
|
key: index, |
|
level: "H".concat(item.level), |
|
isValid: isValid, |
|
onClick: function onClick() { |
|
return onSelectHeading(item.clientId); |
|
}, |
|
path: item.path |
|
}, item.isEmpty ? emptyHeadingContent : Object(external_this_wp_richText_["getTextContent"])(Object(external_this_wp_richText_["create"])({ |
|
html: item.attributes.content |
|
})), isIncorrectLevel && incorrectLevelContent, item.level === 1 && hasMultipleH1 && multipleH1Headings, hasTitle && item.level === 1 && !hasMultipleH1 && singleH1Headings); |
|
}))); |
|
}; |
|
/* harmony default export */ var document_outline = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getEditedPostAttribute = _select.getEditedPostAttribute, |
|
getBlocks = _select.getBlocks; |
|
|
|
var _select2 = select('core'), |
|
getPostType = _select2.getPostType; |
|
|
|
var postType = getPostType(getEditedPostAttribute('type')); |
|
return { |
|
title: getEditedPostAttribute('title'), |
|
blocks: getBlocks(), |
|
isTitleSupported: Object(external_lodash_["get"])(postType, ['supports', 'title'], false) |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
selectBlock = _dispatch.selectBlock; |
|
|
|
return { |
|
onSelect: selectBlock |
|
}; |
|
}))(document_outline_DocumentOutline)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/document-outline/check.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
function DocumentOutlineCheck(_ref) { |
|
var blocks = _ref.blocks, |
|
children = _ref.children; |
|
var headings = Object(external_lodash_["filter"])(blocks, function (block) { |
|
return block.name === 'core/heading'; |
|
}); |
|
|
|
if (headings.length < 1) { |
|
return null; |
|
} |
|
|
|
return children; |
|
} |
|
|
|
/* harmony default export */ var document_outline_check = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
blocks: select('core/editor').getBlocks() |
|
}; |
|
})(DocumentOutlineCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-actions/index.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
function BlockActions(_ref) { |
|
var onDuplicate = _ref.onDuplicate, |
|
onRemove = _ref.onRemove, |
|
onInsertBefore = _ref.onInsertBefore, |
|
onInsertAfter = _ref.onInsertAfter, |
|
isLocked = _ref.isLocked, |
|
canDuplicate = _ref.canDuplicate, |
|
children = _ref.children; |
|
return children({ |
|
onDuplicate: onDuplicate, |
|
onRemove: onRemove, |
|
onInsertAfter: onInsertAfter, |
|
onInsertBefore: onInsertBefore, |
|
isLocked: isLocked, |
|
canDuplicate: canDuplicate |
|
}); |
|
} |
|
|
|
/* harmony default export */ var block_actions = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, props) { |
|
var _select = select('core/editor'), |
|
getBlocksByClientId = _select.getBlocksByClientId, |
|
getBlockIndex = _select.getBlockIndex, |
|
getTemplateLock = _select.getTemplateLock, |
|
getBlockRootClientId = _select.getBlockRootClientId; |
|
|
|
var blocks = getBlocksByClientId(props.clientIds); |
|
var canDuplicate = Object(external_lodash_["every"])(blocks, function (block) { |
|
return !!block && Object(external_this_wp_blocks_["hasBlockSupport"])(block.name, 'multiple', true); |
|
}); |
|
var rootClientId = getBlockRootClientId(props.clientIds[0]); |
|
return { |
|
firstSelectedIndex: getBlockIndex(Object(external_lodash_["first"])(Object(external_lodash_["castArray"])(props.clientIds)), rootClientId), |
|
lastSelectedIndex: getBlockIndex(Object(external_lodash_["last"])(Object(external_lodash_["castArray"])(props.clientIds)), rootClientId), |
|
isLocked: !!getTemplateLock(rootClientId), |
|
blocks: blocks, |
|
canDuplicate: canDuplicate, |
|
rootClientId: rootClientId, |
|
extraProps: props |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, props) { |
|
var clientIds = props.clientIds, |
|
rootClientId = props.rootClientId, |
|
blocks = props.blocks, |
|
firstSelectedIndex = props.firstSelectedIndex, |
|
lastSelectedIndex = props.lastSelectedIndex, |
|
isLocked = props.isLocked, |
|
canDuplicate = props.canDuplicate; |
|
|
|
var _dispatch = dispatch('core/editor'), |
|
insertBlocks = _dispatch.insertBlocks, |
|
multiSelect = _dispatch.multiSelect, |
|
removeBlocks = _dispatch.removeBlocks, |
|
insertDefaultBlock = _dispatch.insertDefaultBlock; |
|
|
|
return { |
|
onDuplicate: function onDuplicate() { |
|
if (isLocked || !canDuplicate) { |
|
return; |
|
} |
|
|
|
var clonedBlocks = blocks.map(function (block) { |
|
return Object(external_this_wp_blocks_["cloneBlock"])(block); |
|
}); |
|
insertBlocks(clonedBlocks, lastSelectedIndex + 1, rootClientId); |
|
|
|
if (clonedBlocks.length > 1) { |
|
multiSelect(Object(external_lodash_["first"])(clonedBlocks).clientId, Object(external_lodash_["last"])(clonedBlocks).clientId); |
|
} |
|
}, |
|
onRemove: function onRemove() { |
|
if (!isLocked) { |
|
removeBlocks(clientIds); |
|
} |
|
}, |
|
onInsertBefore: function onInsertBefore() { |
|
if (!isLocked) { |
|
insertDefaultBlock({}, rootClientId, firstSelectedIndex); |
|
} |
|
}, |
|
onInsertAfter: function onInsertAfter() { |
|
if (!isLocked) { |
|
insertDefaultBlock({}, rootClientId, lastSelectedIndex + 1); |
|
} |
|
} |
|
}; |
|
})])(BlockActions)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/editor-global-keyboard-shortcuts/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var preventDefault = function preventDefault(event) { |
|
event.preventDefault(); |
|
return event; |
|
}; |
|
|
|
var shortcuts = { |
|
duplicate: { |
|
raw: external_this_wp_keycodes_["rawShortcut"].primaryShift('d'), |
|
display: external_this_wp_keycodes_["displayShortcut"].primaryShift('d') |
|
}, |
|
removeBlock: { |
|
raw: external_this_wp_keycodes_["rawShortcut"].access('z'), |
|
display: external_this_wp_keycodes_["displayShortcut"].access('z') |
|
}, |
|
insertBefore: { |
|
raw: external_this_wp_keycodes_["rawShortcut"].primaryAlt('t'), |
|
display: external_this_wp_keycodes_["displayShortcut"].primaryAlt('t') |
|
}, |
|
insertAfter: { |
|
raw: external_this_wp_keycodes_["rawShortcut"].primaryAlt('y'), |
|
display: external_this_wp_keycodes_["displayShortcut"].primaryAlt('y') |
|
} |
|
}; |
|
|
|
var editor_global_keyboard_shortcuts_EditorGlobalKeyboardShortcuts = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(EditorGlobalKeyboardShortcuts, _Component); |
|
|
|
function EditorGlobalKeyboardShortcuts() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, EditorGlobalKeyboardShortcuts); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(EditorGlobalKeyboardShortcuts).apply(this, arguments)); |
|
_this.selectAll = _this.selectAll.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.undoOrRedo = _this.undoOrRedo.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.save = _this.save.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.deleteSelectedBlocks = _this.deleteSelectedBlocks.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.clearMultiSelection = _this.clearMultiSelection.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(EditorGlobalKeyboardShortcuts, [{ |
|
key: "selectAll", |
|
value: function selectAll(event) { |
|
var _this$props = this.props, |
|
rootBlocksClientIds = _this$props.rootBlocksClientIds, |
|
onMultiSelect = _this$props.onMultiSelect; |
|
event.preventDefault(); |
|
onMultiSelect(Object(external_lodash_["first"])(rootBlocksClientIds), Object(external_lodash_["last"])(rootBlocksClientIds)); |
|
} |
|
}, { |
|
key: "undoOrRedo", |
|
value: function undoOrRedo(event) { |
|
var _this$props2 = this.props, |
|
onRedo = _this$props2.onRedo, |
|
onUndo = _this$props2.onUndo; |
|
|
|
if (event.shiftKey) { |
|
onRedo(); |
|
} else { |
|
onUndo(); |
|
} |
|
|
|
event.preventDefault(); |
|
} |
|
}, { |
|
key: "save", |
|
value: function save(event) { |
|
event.preventDefault(); |
|
this.props.onSave(); |
|
} |
|
}, { |
|
key: "deleteSelectedBlocks", |
|
value: function deleteSelectedBlocks(event) { |
|
var _this$props3 = this.props, |
|
selectedBlockClientIds = _this$props3.selectedBlockClientIds, |
|
hasMultiSelection = _this$props3.hasMultiSelection, |
|
onRemove = _this$props3.onRemove, |
|
isLocked = _this$props3.isLocked; |
|
|
|
if (hasMultiSelection) { |
|
event.preventDefault(); |
|
|
|
if (!isLocked) { |
|
onRemove(selectedBlockClientIds); |
|
} |
|
} |
|
} |
|
/** |
|
* Clears current multi-selection, if one exists. |
|
*/ |
|
|
|
}, { |
|
key: "clearMultiSelection", |
|
value: function clearMultiSelection() { |
|
var _this$props4 = this.props, |
|
hasMultiSelection = _this$props4.hasMultiSelection, |
|
clearSelectedBlock = _this$props4.clearSelectedBlock; |
|
|
|
if (hasMultiSelection) { |
|
clearSelectedBlock(); |
|
window.getSelection().removeAllRanges(); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _ref; |
|
|
|
var selectedBlockClientIds = this.props.selectedBlockClientIds; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["KeyboardShortcuts"], { |
|
shortcuts: (_ref = {}, Object(defineProperty["a" /* default */])(_ref, external_this_wp_keycodes_["rawShortcut"].primary('a'), this.selectAll), Object(defineProperty["a" /* default */])(_ref, external_this_wp_keycodes_["rawShortcut"].primary('z'), this.undoOrRedo), Object(defineProperty["a" /* default */])(_ref, external_this_wp_keycodes_["rawShortcut"].primaryShift('z'), this.undoOrRedo), Object(defineProperty["a" /* default */])(_ref, "backspace", this.deleteSelectedBlocks), Object(defineProperty["a" /* default */])(_ref, "del", this.deleteSelectedBlocks), Object(defineProperty["a" /* default */])(_ref, "escape", this.clearMultiSelection), _ref) |
|
}), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["KeyboardShortcuts"], { |
|
bindGlobal: true, |
|
shortcuts: Object(defineProperty["a" /* default */])({}, external_this_wp_keycodes_["rawShortcut"].primary('s'), this.save) |
|
}), selectedBlockClientIds.length > 0 && Object(external_this_wp_element_["createElement"])(block_actions, { |
|
clientIds: selectedBlockClientIds |
|
}, function (_ref3) { |
|
var _ref4; |
|
|
|
var onDuplicate = _ref3.onDuplicate, |
|
onRemove = _ref3.onRemove, |
|
onInsertAfter = _ref3.onInsertAfter, |
|
onInsertBefore = _ref3.onInsertBefore; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["KeyboardShortcuts"], { |
|
bindGlobal: true, |
|
shortcuts: (_ref4 = {}, Object(defineProperty["a" /* default */])(_ref4, shortcuts.duplicate.raw, Object(external_lodash_["flow"])(preventDefault, onDuplicate)), Object(defineProperty["a" /* default */])(_ref4, shortcuts.removeBlock.raw, Object(external_lodash_["flow"])(preventDefault, onRemove)), Object(defineProperty["a" /* default */])(_ref4, shortcuts.insertBefore.raw, Object(external_lodash_["flow"])(preventDefault, onInsertBefore)), Object(defineProperty["a" /* default */])(_ref4, shortcuts.insertAfter.raw, Object(external_lodash_["flow"])(preventDefault, onInsertAfter)), _ref4) |
|
}); |
|
})); |
|
} |
|
}]); |
|
|
|
return EditorGlobalKeyboardShortcuts; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var editor_global_keyboard_shortcuts = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getBlockOrder = _select.getBlockOrder, |
|
getMultiSelectedBlockClientIds = _select.getMultiSelectedBlockClientIds, |
|
hasMultiSelection = _select.hasMultiSelection, |
|
isEditedPostDirty = _select.isEditedPostDirty, |
|
getBlockRootClientId = _select.getBlockRootClientId, |
|
getTemplateLock = _select.getTemplateLock, |
|
getSelectedBlockClientId = _select.getSelectedBlockClientId; |
|
|
|
var selectedBlockClientId = getSelectedBlockClientId(); |
|
var selectedBlockClientIds = selectedBlockClientId ? [selectedBlockClientId] : getMultiSelectedBlockClientIds(); |
|
return { |
|
rootBlocksClientIds: getBlockOrder(), |
|
hasMultiSelection: hasMultiSelection(), |
|
isLocked: Object(external_lodash_["some"])(selectedBlockClientIds, function (clientId) { |
|
return !!getTemplateLock(getBlockRootClientId(clientId)); |
|
}), |
|
isDirty: isEditedPostDirty(), |
|
selectedBlockClientIds: selectedBlockClientIds |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, ownProps) { |
|
var _dispatch = dispatch('core/editor'), |
|
clearSelectedBlock = _dispatch.clearSelectedBlock, |
|
multiSelect = _dispatch.multiSelect, |
|
redo = _dispatch.redo, |
|
undo = _dispatch.undo, |
|
removeBlocks = _dispatch.removeBlocks, |
|
savePost = _dispatch.savePost; |
|
|
|
return { |
|
onSave: function onSave() { |
|
// TODO: This should be handled in the `savePost` effect in |
|
// considering `isSaveable`. See note on `isEditedPostSaveable` |
|
// selector about dirtiness and meta-boxes. When removing, also |
|
// remember to remove `isDirty` prop passing from `withSelect`. |
|
// |
|
// See: `isEditedPostSaveable` |
|
if (!ownProps.isDirty) { |
|
return; |
|
} |
|
|
|
savePost(); |
|
}, |
|
clearSelectedBlock: clearSelectedBlock, |
|
onMultiSelect: multiSelect, |
|
onRedo: redo, |
|
onUndo: undo, |
|
onRemove: removeBlocks |
|
}; |
|
})])(editor_global_keyboard_shortcuts_EditorGlobalKeyboardShortcuts)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/editor-history/redo.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
function EditorHistoryRedo(_ref) { |
|
var hasRedo = _ref.hasRedo, |
|
redo = _ref.redo; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
icon: "redo", |
|
label: Object(external_this_wp_i18n_["__"])('Redo'), |
|
shortcut: external_this_wp_keycodes_["displayShortcut"].primaryShift('z') // If there are no redo levels we don't want to actually disable this |
|
// button, because it will remove focus for keyboard users. |
|
// See: https://github.com/WordPress/gutenberg/issues/3486 |
|
, |
|
"aria-disabled": !hasRedo, |
|
onClick: hasRedo ? redo : undefined, |
|
className: "editor-history__redo" |
|
}); |
|
} |
|
|
|
/* harmony default export */ var editor_history_redo = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
hasRedo: select('core/editor').hasEditorRedo() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
redo: dispatch('core/editor').redo |
|
}; |
|
})])(EditorHistoryRedo)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/editor-history/undo.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
function EditorHistoryUndo(_ref) { |
|
var hasUndo = _ref.hasUndo, |
|
undo = _ref.undo; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
icon: "undo", |
|
label: Object(external_this_wp_i18n_["__"])('Undo'), |
|
shortcut: external_this_wp_keycodes_["displayShortcut"].primary('z') // If there are no undo levels we don't want to actually disable this |
|
// button, because it will remove focus for keyboard users. |
|
// See: https://github.com/WordPress/gutenberg/issues/3486 |
|
, |
|
"aria-disabled": !hasUndo, |
|
onClick: hasUndo ? undo : undefined, |
|
className: "editor-history__undo" |
|
}); |
|
} |
|
|
|
/* harmony default export */ var editor_history_undo = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
hasUndo: select('core/editor').hasEditorUndo() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
undo: dispatch('core/editor').undo |
|
}; |
|
})])(EditorHistoryUndo)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/template-validation-notice/index.js |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
function TemplateValidationNotice(_ref) { |
|
var isValid = _ref.isValid, |
|
props = Object(objectWithoutProperties["a" /* default */])(_ref, ["isValid"]); |
|
|
|
if (isValid) { |
|
return null; |
|
} |
|
|
|
var confirmSynchronization = function confirmSynchronization() { |
|
// eslint-disable-next-line no-alert |
|
if (window.confirm(Object(external_this_wp_i18n_["__"])('Resetting the template may result in loss of content, do you want to continue?'))) { |
|
props.synchronizeTemplate(); |
|
} |
|
}; |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Notice"], { |
|
className: "editor-template-validation-notice", |
|
isDismissible: false, |
|
status: "warning" |
|
}, Object(external_this_wp_element_["createElement"])("p", null, Object(external_this_wp_i18n_["__"])('The content of your post doesn’t match the template assigned to your post type.')), Object(external_this_wp_element_["createElement"])("div", null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
isDefault: true, |
|
onClick: props.resetTemplateValidity |
|
}, Object(external_this_wp_i18n_["__"])('Keep it as is')), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
onClick: confirmSynchronization, |
|
isPrimary: true |
|
}, Object(external_this_wp_i18n_["__"])('Reset the template')))); |
|
} |
|
|
|
/* harmony default export */ var template_validation_notice = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
isValid: select('core/editor').isValidTemplate() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
setTemplateValidity = _dispatch.setTemplateValidity, |
|
synchronizeTemplate = _dispatch.synchronizeTemplate; |
|
|
|
return { |
|
resetTemplateValidity: function resetTemplateValidity() { |
|
return setTemplateValidity(true); |
|
}, |
|
synchronizeTemplate: synchronizeTemplate |
|
}; |
|
})])(TemplateValidationNotice)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/editor-notices/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
function EditorNotices(props) { |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["NoticeList"], props, Object(external_this_wp_element_["createElement"])(template_validation_notice, null)); |
|
} |
|
|
|
/* harmony default export */ var editor_notices = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
notices: select('core/notices').getNotices() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onRemove: dispatch('core/notices').removeNotice |
|
}; |
|
})])(EditorNotices)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/page-attributes/check.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
function PageAttributesCheck(_ref) { |
|
var availableTemplates = _ref.availableTemplates, |
|
postType = _ref.postType, |
|
children = _ref.children; |
|
var supportsPageAttributes = Object(external_lodash_["get"])(postType, ['supports', 'page-attributes'], false); // Only render fields if post type supports page attributes or available templates exist. |
|
|
|
if (!supportsPageAttributes && Object(external_lodash_["isEmpty"])(availableTemplates)) { |
|
return null; |
|
} |
|
|
|
return children; |
|
} |
|
/* harmony default export */ var page_attributes_check = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getEditedPostAttribute = _select.getEditedPostAttribute, |
|
getEditorSettings = _select.getEditorSettings; |
|
|
|
var _select2 = select('core'), |
|
getPostType = _select2.getPostType; |
|
|
|
var _getEditorSettings = getEditorSettings(), |
|
availableTemplates = _getEditorSettings.availableTemplates; |
|
|
|
return { |
|
postType: getPostType(getEditedPostAttribute('type')), |
|
availableTemplates: availableTemplates |
|
}; |
|
})(PageAttributesCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-type-support-check/index.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* A component which renders its own children only if the current editor post |
|
* type supports one of the given `supportKeys` prop. |
|
* |
|
* @param {?Object} props.postType Current post type. |
|
* @param {WPElement} props.children Children to be rendered if post |
|
* type supports. |
|
* @param {(string|string[])} props.supportKeys String or string array of keys |
|
* to test. |
|
* |
|
* @return {WPElement} Rendered element. |
|
*/ |
|
|
|
function PostTypeSupportCheck(_ref) { |
|
var postType = _ref.postType, |
|
children = _ref.children, |
|
supportKeys = _ref.supportKeys; |
|
var isSupported = true; |
|
|
|
if (postType) { |
|
isSupported = Object(external_lodash_["some"])(Object(external_lodash_["castArray"])(supportKeys), function (key) { |
|
return !!postType.supports[key]; |
|
}); |
|
} |
|
|
|
if (!isSupported) { |
|
return null; |
|
} |
|
|
|
return children; |
|
} |
|
/* harmony default export */ var post_type_support_check = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getEditedPostAttribute = _select.getEditedPostAttribute; |
|
|
|
var _select2 = select('core'), |
|
getPostType = _select2.getPostType; |
|
|
|
return { |
|
postType: getPostType(getEditedPostAttribute('type')) |
|
}; |
|
})(PostTypeSupportCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/page-attributes/order.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
var PageAttributesOrder = Object(external_this_wp_compose_["withState"])({ |
|
orderInput: null |
|
})(function (_ref) { |
|
var onUpdateOrder = _ref.onUpdateOrder, |
|
_ref$order = _ref.order, |
|
order = _ref$order === void 0 ? 0 : _ref$order, |
|
orderInput = _ref.orderInput, |
|
setState = _ref.setState; |
|
|
|
var setUpdatedOrder = function setUpdatedOrder(value) { |
|
setState({ |
|
orderInput: value |
|
}); |
|
var newOrder = Number(value); |
|
|
|
if (Number.isInteger(newOrder) && Object(external_lodash_["invoke"])(value, ['trim']) !== '') { |
|
onUpdateOrder(Number(value)); |
|
} |
|
}; |
|
|
|
var value = orderInput === null ? order : orderInput; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["TextControl"], { |
|
className: "editor-page-attributes__order", |
|
type: "number", |
|
label: Object(external_this_wp_i18n_["__"])('Order'), |
|
value: value, |
|
onChange: setUpdatedOrder, |
|
size: 6, |
|
onBlur: function onBlur() { |
|
setState({ |
|
orderInput: null |
|
}); |
|
} |
|
}); |
|
}); |
|
|
|
function PageAttributesOrderWithChecks(props) { |
|
return Object(external_this_wp_element_["createElement"])(post_type_support_check, { |
|
supportKeys: "page-attributes" |
|
}, Object(external_this_wp_element_["createElement"])(PageAttributesOrder, props)); |
|
} |
|
|
|
/* harmony default export */ var page_attributes_order = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
order: select('core/editor').getEditedPostAttribute('menu_order') |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onUpdateOrder: function onUpdateOrder(order) { |
|
dispatch('core/editor').editPost({ |
|
menu_order: order |
|
}); |
|
} |
|
}; |
|
})])(PageAttributesOrderWithChecks)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/utils/terms.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* Returns terms in a tree form. |
|
* |
|
* @param {Array} flatTerms Array of terms in flat format. |
|
* |
|
* @return {Array} Array of terms in tree format. |
|
*/ |
|
|
|
function buildTermsTree(flatTerms) { |
|
var termsByParent = Object(external_lodash_["groupBy"])(flatTerms, 'parent'); |
|
|
|
var fillWithChildren = function fillWithChildren(terms) { |
|
return terms.map(function (term) { |
|
var children = termsByParent[term.id]; |
|
return Object(objectSpread["a" /* default */])({}, term, { |
|
children: children && children.length ? fillWithChildren(children) : [] |
|
}); |
|
}); |
|
}; |
|
|
|
return fillWithChildren(termsByParent['0'] || []); |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/page-attributes/parent.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
function PageAttributesParent(_ref) { |
|
var parent = _ref.parent, |
|
postType = _ref.postType, |
|
items = _ref.items, |
|
onUpdateParent = _ref.onUpdateParent; |
|
var isHierarchical = Object(external_lodash_["get"])(postType, ['hierarchical'], false); |
|
var parentPageLabel = Object(external_lodash_["get"])(postType, ['labels', 'parent_item_colon']); |
|
var pageItems = items || []; |
|
|
|
if (!isHierarchical || !parentPageLabel || !pageItems.length) { |
|
return null; |
|
} |
|
|
|
var pagesTree = buildTermsTree(pageItems.map(function (item) { |
|
return { |
|
id: item.id, |
|
parent: item.parent, |
|
name: item.title.raw ? item.title.raw : "#".concat(item.id, " (").concat(Object(external_this_wp_i18n_["__"])('no title'), ")") |
|
}; |
|
})); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["TreeSelect"], { |
|
label: parentPageLabel, |
|
noOptionLabel: "(".concat(Object(external_this_wp_i18n_["__"])('no parent'), ")"), |
|
tree: pagesTree, |
|
selectedId: parent, |
|
onChange: onUpdateParent |
|
}); |
|
} |
|
var parent_applyWithSelect = Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core'), |
|
getPostType = _select.getPostType, |
|
getEntityRecords = _select.getEntityRecords; |
|
|
|
var _select2 = select('core/editor'), |
|
getCurrentPostId = _select2.getCurrentPostId, |
|
getEditedPostAttribute = _select2.getEditedPostAttribute; |
|
|
|
var postTypeSlug = getEditedPostAttribute('type'); |
|
var postType = getPostType(postTypeSlug); |
|
var postId = getCurrentPostId(); |
|
var isHierarchical = Object(external_lodash_["get"])(postType, ['hierarchical'], false); |
|
var query = { |
|
per_page: -1, |
|
exclude: postId, |
|
parent_exclude: postId, |
|
orderby: 'menu_order', |
|
order: 'asc' |
|
}; |
|
return { |
|
parent: getEditedPostAttribute('parent'), |
|
items: isHierarchical ? getEntityRecords('postType', postTypeSlug, query) : [], |
|
postType: postType |
|
}; |
|
}); |
|
var parent_applyWithDispatch = Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
editPost = _dispatch.editPost; |
|
|
|
return { |
|
onUpdateParent: function onUpdateParent(parent) { |
|
editPost({ |
|
parent: parent || 0 |
|
}); |
|
} |
|
}; |
|
}); |
|
/* harmony default export */ var page_attributes_parent = (Object(external_this_wp_compose_["compose"])([parent_applyWithSelect, parent_applyWithDispatch])(PageAttributesParent)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/page-attributes/template.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
function PageTemplate(_ref) { |
|
var availableTemplates = _ref.availableTemplates, |
|
selectedTemplate = _ref.selectedTemplate, |
|
onUpdate = _ref.onUpdate; |
|
|
|
if (Object(external_lodash_["isEmpty"])(availableTemplates)) { |
|
return null; |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["SelectControl"], { |
|
label: Object(external_this_wp_i18n_["__"])('Template:'), |
|
value: selectedTemplate, |
|
onChange: onUpdate, |
|
className: "editor-page-attributes__template", |
|
options: Object(external_lodash_["map"])(availableTemplates, function (templateName, templateSlug) { |
|
return { |
|
value: templateSlug, |
|
label: templateName |
|
}; |
|
}) |
|
}); |
|
} |
|
/* harmony default export */ var page_attributes_template = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getEditedPostAttribute = _select.getEditedPostAttribute, |
|
getEditorSettings = _select.getEditorSettings; |
|
|
|
var _getEditorSettings = getEditorSettings(), |
|
availableTemplates = _getEditorSettings.availableTemplates; |
|
|
|
return { |
|
selectedTemplate: getEditedPostAttribute('template'), |
|
availableTemplates: availableTemplates |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onUpdate: function onUpdate(templateSlug) { |
|
dispatch('core/editor').editPost({ |
|
template: templateSlug || '' |
|
}); |
|
} |
|
}; |
|
}))(PageTemplate)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/check.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
function PostAuthorCheck(_ref) { |
|
var hasAssignAuthorAction = _ref.hasAssignAuthorAction, |
|
authors = _ref.authors, |
|
children = _ref.children; |
|
|
|
if (!hasAssignAuthorAction || authors.length < 2) { |
|
return null; |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(post_type_support_check, { |
|
supportKeys: "author" |
|
}, children); |
|
} |
|
/* harmony default export */ var post_author_check = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var post = select('core/editor').getCurrentPost(); |
|
return { |
|
hasAssignAuthorAction: Object(external_lodash_["get"])(post, ['_links', 'wp:action-assign-author'], false), |
|
postType: select('core/editor').getCurrentPostType(), |
|
authors: select('core').getAuthors() |
|
}; |
|
}), external_this_wp_compose_["withInstanceId"]])(PostAuthorCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-author/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
var post_author_PostAuthor = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PostAuthor, _Component); |
|
|
|
function PostAuthor() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, PostAuthor); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PostAuthor).apply(this, arguments)); |
|
_this.setAuthorId = _this.setAuthorId.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(PostAuthor, [{ |
|
key: "setAuthorId", |
|
value: function setAuthorId(event) { |
|
var onUpdateAuthor = this.props.onUpdateAuthor; |
|
var value = event.target.value; |
|
onUpdateAuthor(Number(value)); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
postAuthor = _this$props.postAuthor, |
|
instanceId = _this$props.instanceId, |
|
authors = _this$props.authors; |
|
var selectId = 'post-author-selector-' + instanceId; // Disable reason: A select with an onchange throws a warning |
|
|
|
/* eslint-disable jsx-a11y/no-onchange */ |
|
|
|
return Object(external_this_wp_element_["createElement"])(post_author_check, null, Object(external_this_wp_element_["createElement"])("label", { |
|
htmlFor: selectId |
|
}, Object(external_this_wp_i18n_["__"])('Author')), Object(external_this_wp_element_["createElement"])("select", { |
|
id: selectId, |
|
value: postAuthor, |
|
onChange: this.setAuthorId, |
|
className: "editor-post-author__select" |
|
}, authors.map(function (author) { |
|
return Object(external_this_wp_element_["createElement"])("option", { |
|
key: author.id, |
|
value: author.id |
|
}, author.name); |
|
}))); |
|
/* eslint-enable jsx-a11y/no-onchange */ |
|
} |
|
}]); |
|
|
|
return PostAuthor; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var post_author = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
postAuthor: select('core/editor').getEditedPostAttribute('author'), |
|
authors: select('core').getAuthors() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onUpdateAuthor: function onUpdateAuthor(author) { |
|
dispatch('core/editor').editPost({ |
|
author: author |
|
}); |
|
} |
|
}; |
|
}), external_this_wp_compose_["withInstanceId"]])(post_author_PostAuthor)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-comments/index.js |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
function PostComments(_ref) { |
|
var _ref$commentStatus = _ref.commentStatus, |
|
commentStatus = _ref$commentStatus === void 0 ? 'open' : _ref$commentStatus, |
|
props = Object(objectWithoutProperties["a" /* default */])(_ref, ["commentStatus"]); |
|
|
|
var onToggleComments = function onToggleComments() { |
|
return props.editPost({ |
|
comment_status: commentStatus === 'open' ? 'closed' : 'open' |
|
}); |
|
}; |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["CheckboxControl"], { |
|
label: Object(external_this_wp_i18n_["__"])('Allow Comments'), |
|
checked: commentStatus === 'open', |
|
onChange: onToggleComments |
|
}); |
|
} |
|
|
|
/* harmony default export */ var post_comments = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
commentStatus: select('core/editor').getEditedPostAttribute('comment_status') |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
editPost: dispatch('core/editor').editPost |
|
}; |
|
})])(PostComments)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-excerpt/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
function PostExcerpt(_ref) { |
|
var excerpt = _ref.excerpt, |
|
onUpdateExcerpt = _ref.onUpdateExcerpt; |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-excerpt" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["TextareaControl"], { |
|
label: Object(external_this_wp_i18n_["__"])('Write an excerpt (optional)'), |
|
className: "editor-post-excerpt__textarea", |
|
onChange: function onChange(value) { |
|
return onUpdateExcerpt(value); |
|
}, |
|
value: excerpt |
|
}), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["ExternalLink"], { |
|
href: "https://codex.wordpress.org/Excerpt" |
|
}, Object(external_this_wp_i18n_["__"])('Learn more about manual excerpts'))); |
|
} |
|
|
|
/* harmony default export */ var post_excerpt = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
excerpt: select('core/editor').getEditedPostAttribute('excerpt') |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onUpdateExcerpt: function onUpdateExcerpt(excerpt) { |
|
dispatch('core/editor').editPost({ |
|
excerpt: excerpt |
|
}); |
|
} |
|
}; |
|
})])(PostExcerpt)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-excerpt/check.js |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
function PostExcerptCheck(props) { |
|
return Object(external_this_wp_element_["createElement"])(post_type_support_check, Object(esm_extends["a" /* default */])({}, props, { |
|
supportKeys: "excerpt" |
|
})); |
|
} |
|
|
|
/* harmony default export */ var post_excerpt_check = (PostExcerptCheck); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/theme-support-check/index.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
function ThemeSupportCheck(_ref) { |
|
var themeSupports = _ref.themeSupports, |
|
children = _ref.children, |
|
postType = _ref.postType, |
|
supportKeys = _ref.supportKeys; |
|
var isSupported = Object(external_lodash_["some"])(Object(external_lodash_["castArray"])(supportKeys), function (key) { |
|
var supported = Object(external_lodash_["get"])(themeSupports, [key], false); // 'post-thumbnails' can be boolean or an array of post types. |
|
// In the latter case, we need to verify `postType` exists |
|
// within `supported`. If `postType` isn't passed, then the check |
|
// should fail. |
|
|
|
if ('post-thumbnails' === key && Object(external_lodash_["isArray"])(supported)) { |
|
return Object(external_lodash_["includes"])(supported, postType); |
|
} |
|
|
|
return supported; |
|
}); |
|
|
|
if (!isSupported) { |
|
return null; |
|
} |
|
|
|
return children; |
|
} |
|
/* harmony default export */ var theme_support_check = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core'), |
|
getThemeSupports = _select.getThemeSupports; |
|
|
|
var _select2 = select('core/editor'), |
|
getEditedPostAttribute = _select2.getEditedPostAttribute; |
|
|
|
return { |
|
postType: getEditedPostAttribute('type'), |
|
themeSupports: getThemeSupports() |
|
}; |
|
})(ThemeSupportCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-featured-image/check.js |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
function PostFeaturedImageCheck(props) { |
|
return Object(external_this_wp_element_["createElement"])(theme_support_check, { |
|
supportKeys: "post-thumbnails" |
|
}, Object(external_this_wp_element_["createElement"])(post_type_support_check, Object(esm_extends["a" /* default */])({}, props, { |
|
supportKeys: "thumbnail" |
|
}))); |
|
} |
|
|
|
/* harmony default export */ var post_featured_image_check = (PostFeaturedImageCheck); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-featured-image/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
var ALLOWED_MEDIA_TYPES = ['image']; // Used when labels from post type were not yet loaded or when they are not present. |
|
|
|
var DEFAULT_FEATURE_IMAGE_LABEL = Object(external_this_wp_i18n_["__"])('Featured Image'); |
|
|
|
var DEFAULT_SET_FEATURE_IMAGE_LABEL = Object(external_this_wp_i18n_["__"])('Set featured image'); |
|
|
|
var DEFAULT_REMOVE_FEATURE_IMAGE_LABEL = Object(external_this_wp_i18n_["__"])('Remove image'); |
|
|
|
function PostFeaturedImage(_ref) { |
|
var currentPostId = _ref.currentPostId, |
|
featuredImageId = _ref.featuredImageId, |
|
onUpdateImage = _ref.onUpdateImage, |
|
onRemoveImage = _ref.onRemoveImage, |
|
media = _ref.media, |
|
postType = _ref.postType; |
|
var postLabel = Object(external_lodash_["get"])(postType, ['labels'], {}); |
|
var instructions = Object(external_this_wp_element_["createElement"])("p", null, Object(external_this_wp_i18n_["__"])('To edit the featured image, you need permission to upload media.')); |
|
var mediaWidth, mediaHeight, mediaSourceUrl; |
|
|
|
if (media) { |
|
var mediaSize = Object(external_this_wp_hooks_["applyFilters"])('editor.PostFeaturedImage.imageSize', 'post-thumbnail', media.id, currentPostId); |
|
|
|
if (Object(external_lodash_["has"])(media, ['media_details', 'sizes', mediaSize])) { |
|
mediaWidth = media.media_details.sizes[mediaSize].width; |
|
mediaHeight = media.media_details.sizes[mediaSize].height; |
|
mediaSourceUrl = media.media_details.sizes[mediaSize].source_url; |
|
} else { |
|
mediaWidth = media.media_details.width; |
|
mediaHeight = media.media_details.height; |
|
mediaSourceUrl = media.source_url; |
|
} |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(post_featured_image_check, null, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-featured-image" |
|
}, !!featuredImageId && Object(external_this_wp_element_["createElement"])(check, { |
|
fallback: instructions |
|
}, Object(external_this_wp_element_["createElement"])(media_upload, { |
|
title: postLabel.featured_image || DEFAULT_FEATURE_IMAGE_LABEL, |
|
onSelect: onUpdateImage, |
|
allowedTypes: ALLOWED_MEDIA_TYPES, |
|
modalClass: "editor-post-featured-image__media-modal", |
|
render: function render(_ref2) { |
|
var open = _ref2.open; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
className: "editor-post-featured-image__preview", |
|
onClick: open, |
|
"aria-label": Object(external_this_wp_i18n_["__"])('Edit or update the image') |
|
}, media && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["ResponsiveWrapper"], { |
|
naturalWidth: mediaWidth, |
|
naturalHeight: mediaHeight |
|
}, Object(external_this_wp_element_["createElement"])("img", { |
|
src: mediaSourceUrl, |
|
alt: "" |
|
})), !media && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Spinner"], null)); |
|
}, |
|
value: featuredImageId |
|
})), !!featuredImageId && media && !media.isLoading && Object(external_this_wp_element_["createElement"])(check, null, Object(external_this_wp_element_["createElement"])(media_upload, { |
|
title: postLabel.featured_image || DEFAULT_FEATURE_IMAGE_LABEL, |
|
onSelect: onUpdateImage, |
|
allowedTypes: ALLOWED_MEDIA_TYPES, |
|
modalClass: "editor-post-featured-image__media-modal", |
|
render: function render(_ref3) { |
|
var open = _ref3.open; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
onClick: open, |
|
isDefault: true, |
|
isLarge: true |
|
}, Object(external_this_wp_i18n_["__"])('Replace image')); |
|
} |
|
})), !featuredImageId && Object(external_this_wp_element_["createElement"])("div", null, Object(external_this_wp_element_["createElement"])(check, { |
|
fallback: instructions |
|
}, Object(external_this_wp_element_["createElement"])(media_upload, { |
|
title: postLabel.featured_image || DEFAULT_FEATURE_IMAGE_LABEL, |
|
onSelect: onUpdateImage, |
|
allowedTypes: ALLOWED_MEDIA_TYPES, |
|
modalClass: "editor-post-featured-image__media-modal", |
|
render: function render(_ref4) { |
|
var open = _ref4.open; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
className: "editor-post-featured-image__toggle", |
|
onClick: open |
|
}, postLabel.set_featured_image || DEFAULT_SET_FEATURE_IMAGE_LABEL); |
|
} |
|
}))), !!featuredImageId && Object(external_this_wp_element_["createElement"])(check, null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
onClick: onRemoveImage, |
|
isLink: true, |
|
isDestructive: true |
|
}, postLabel.remove_featured_image || DEFAULT_REMOVE_FEATURE_IMAGE_LABEL)))); |
|
} |
|
|
|
var post_featured_image_applyWithSelect = Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core'), |
|
getMedia = _select.getMedia, |
|
getPostType = _select.getPostType; |
|
|
|
var _select2 = select('core/editor'), |
|
getCurrentPostId = _select2.getCurrentPostId, |
|
getEditedPostAttribute = _select2.getEditedPostAttribute; |
|
|
|
var featuredImageId = getEditedPostAttribute('featured_media'); |
|
return { |
|
media: featuredImageId ? getMedia(featuredImageId) : null, |
|
currentPostId: getCurrentPostId(), |
|
postType: getPostType(getEditedPostAttribute('type')), |
|
featuredImageId: featuredImageId |
|
}; |
|
}); |
|
var post_featured_image_applyWithDispatch = Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
editPost = _dispatch.editPost; |
|
|
|
return { |
|
onUpdateImage: function onUpdateImage(image) { |
|
editPost({ |
|
featured_media: image.id |
|
}); |
|
}, |
|
onRemoveImage: function onRemoveImage() { |
|
editPost({ |
|
featured_media: 0 |
|
}); |
|
} |
|
}; |
|
}); |
|
/* harmony default export */ var post_featured_image = (Object(external_this_wp_compose_["compose"])(post_featured_image_applyWithSelect, post_featured_image_applyWithDispatch, Object(external_this_wp_components_["withFilters"])('editor.PostFeaturedImage'))(PostFeaturedImage)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-format/check.js |
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
function PostFormatCheck(_ref) { |
|
var disablePostFormats = _ref.disablePostFormats, |
|
props = Object(objectWithoutProperties["a" /* default */])(_ref, ["disablePostFormats"]); |
|
|
|
return !disablePostFormats && Object(external_this_wp_element_["createElement"])(post_type_support_check, Object(esm_extends["a" /* default */])({}, props, { |
|
supportKeys: "post-formats" |
|
})); |
|
} |
|
|
|
/* harmony default export */ var post_format_check = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var editorSettings = select('core/editor').getEditorSettings(); |
|
return { |
|
disablePostFormats: editorSettings.disablePostFormats |
|
}; |
|
})(PostFormatCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-format/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
var POST_FORMATS = [{ |
|
id: 'aside', |
|
caption: Object(external_this_wp_i18n_["__"])('Aside') |
|
}, { |
|
id: 'gallery', |
|
caption: Object(external_this_wp_i18n_["__"])('Gallery') |
|
}, { |
|
id: 'link', |
|
caption: Object(external_this_wp_i18n_["__"])('Link') |
|
}, { |
|
id: 'image', |
|
caption: Object(external_this_wp_i18n_["__"])('Image') |
|
}, { |
|
id: 'quote', |
|
caption: Object(external_this_wp_i18n_["__"])('Quote') |
|
}, { |
|
id: 'standard', |
|
caption: Object(external_this_wp_i18n_["__"])('Standard') |
|
}, { |
|
id: 'status', |
|
caption: Object(external_this_wp_i18n_["__"])('Status') |
|
}, { |
|
id: 'video', |
|
caption: Object(external_this_wp_i18n_["__"])('Video') |
|
}, { |
|
id: 'audio', |
|
caption: Object(external_this_wp_i18n_["__"])('Audio') |
|
}, { |
|
id: 'chat', |
|
caption: Object(external_this_wp_i18n_["__"])('Chat') |
|
}]; |
|
|
|
function PostFormat(_ref) { |
|
var onUpdatePostFormat = _ref.onUpdatePostFormat, |
|
_ref$postFormat = _ref.postFormat, |
|
postFormat = _ref$postFormat === void 0 ? 'standard' : _ref$postFormat, |
|
supportedFormats = _ref.supportedFormats, |
|
suggestedFormat = _ref.suggestedFormat, |
|
instanceId = _ref.instanceId; |
|
var postFormatSelectorId = 'post-format-selector-' + instanceId; |
|
var formats = POST_FORMATS.filter(function (format) { |
|
return Object(external_lodash_["includes"])(supportedFormats, format.id); |
|
}); |
|
var suggestion = Object(external_lodash_["find"])(formats, function (format) { |
|
return format.id === suggestedFormat; |
|
}); // Disable reason: We need to change the value immiediately to show/hide the suggestion if needed |
|
|
|
/* eslint-disable jsx-a11y/no-onchange */ |
|
|
|
return Object(external_this_wp_element_["createElement"])(post_format_check, null, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-format" |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-format__content" |
|
}, Object(external_this_wp_element_["createElement"])("label", { |
|
htmlFor: postFormatSelectorId |
|
}, Object(external_this_wp_i18n_["__"])('Post Format')), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["SelectControl"], { |
|
value: postFormat, |
|
onChange: function onChange(format) { |
|
return onUpdatePostFormat(format); |
|
}, |
|
id: postFormatSelectorId, |
|
options: formats.map(function (format) { |
|
return { |
|
label: format.caption, |
|
value: format.id |
|
}; |
|
}) |
|
})), suggestion && suggestion.id !== postFormat && Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-format__suggestion" |
|
}, Object(external_this_wp_i18n_["__"])('Suggestion:'), ' ', Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
isLink: true, |
|
onClick: function onClick() { |
|
return onUpdatePostFormat(suggestion.id); |
|
} |
|
}, suggestion.caption)))); |
|
/* eslint-enable jsx-a11y/no-onchange */ |
|
} |
|
|
|
/* harmony default export */ var post_format = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getEditedPostAttribute = _select.getEditedPostAttribute, |
|
getSuggestedPostFormat = _select.getSuggestedPostFormat; |
|
|
|
var postFormat = getEditedPostAttribute('format'); |
|
var themeSupports = select('core').getThemeSupports(); // Ensure current format is always in the set. |
|
// The current format may not be a format supported by the theme. |
|
|
|
var supportedFormats = Object(external_lodash_["union"])([postFormat], Object(external_lodash_["get"])(themeSupports, ['formats'], [])); |
|
return { |
|
postFormat: postFormat, |
|
supportedFormats: supportedFormats, |
|
suggestedFormat: getSuggestedPostFormat() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onUpdatePostFormat: function onUpdatePostFormat(postFormat) { |
|
dispatch('core/editor').editPost({ |
|
format: postFormat |
|
}); |
|
} |
|
}; |
|
}), external_this_wp_compose_["withInstanceId"]])(PostFormat)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-last-revision/check.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
function PostLastRevisionCheck(_ref) { |
|
var lastRevisionId = _ref.lastRevisionId, |
|
revisionsCount = _ref.revisionsCount, |
|
children = _ref.children; |
|
|
|
if (!lastRevisionId || revisionsCount < 2) { |
|
return null; |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(post_type_support_check, { |
|
supportKeys: "revisions" |
|
}, children); |
|
} |
|
/* harmony default export */ var post_last_revision_check = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getCurrentPostLastRevisionId = _select.getCurrentPostLastRevisionId, |
|
getCurrentPostRevisionsCount = _select.getCurrentPostRevisionsCount; |
|
|
|
return { |
|
lastRevisionId: getCurrentPostLastRevisionId(), |
|
revisionsCount: getCurrentPostRevisionsCount() |
|
}; |
|
})(PostLastRevisionCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-last-revision/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
function LastRevision(_ref) { |
|
var lastRevisionId = _ref.lastRevisionId, |
|
revisionsCount = _ref.revisionsCount; |
|
return Object(external_this_wp_element_["createElement"])(post_last_revision_check, null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
href: getWPAdminURL('revision.php', { |
|
revision: lastRevisionId, |
|
gutenberg: true |
|
}), |
|
className: "editor-post-last-revision__title", |
|
icon: "backup" |
|
}, Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_n"])('%d Revision', '%d Revisions', revisionsCount), revisionsCount))); |
|
} |
|
|
|
/* harmony default export */ var post_last_revision = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getCurrentPostLastRevisionId = _select.getCurrentPostLastRevisionId, |
|
getCurrentPostRevisionsCount = _select.getCurrentPostRevisionsCount; |
|
|
|
return { |
|
lastRevisionId: getCurrentPostLastRevisionId(), |
|
revisionsCount: getCurrentPostRevisionsCount() |
|
}; |
|
})(LastRevision)); |
|
|
|
// EXTERNAL MODULE: external "jQuery" |
|
var external_jQuery_ = __webpack_require__(99); |
|
var external_jQuery_default = /*#__PURE__*/__webpack_require__.n(external_jQuery_); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-preview-button/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function writeInterstitialMessage(targetDocument) { |
|
var markup = Object(external_this_wp_element_["renderToString"])(Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-preview-button__interstitial-message" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["SVG"], { |
|
xmlns: "http://www.w3.org/2000/svg", |
|
viewBox: "0 0 96 96" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Path"], { |
|
className: "outer", |
|
d: "M48 12c19.9 0 36 16.1 36 36S67.9 84 48 84 12 67.9 12 48s16.1-36 36-36", |
|
fill: "none" |
|
}), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Path"], { |
|
className: "inner", |
|
d: "M69.5 46.4c0-3.9-1.4-6.7-2.6-8.8-1.6-2.6-3.1-4.9-3.1-7.5 0-2.9 2.2-5.7 5.4-5.7h.4C63.9 19.2 56.4 16 48 16c-11.2 0-21 5.7-26.7 14.4h2.1c3.3 0 8.5-.4 8.5-.4 1.7-.1 1.9 2.4.2 2.6 0 0-1.7.2-3.7.3L40 67.5l7-20.9L42 33c-1.7-.1-3.3-.3-3.3-.3-1.7-.1-1.5-2.7.2-2.6 0 0 5.3.4 8.4.4 3.3 0 8.5-.4 8.5-.4 1.7-.1 1.9 2.4.2 2.6 0 0-1.7.2-3.7.3l11.5 34.3 3.3-10.4c1.6-4.5 2.4-7.8 2.4-10.5zM16.1 48c0 12.6 7.3 23.5 18 28.7L18.8 35c-1.7 4-2.7 8.4-2.7 13zm32.5 2.8L39 78.6c2.9.8 5.9 1.3 9 1.3 3.7 0 7.3-.6 10.6-1.8-.1-.1-.2-.3-.2-.4l-9.8-26.9zM76.2 36c0 3.2-.6 6.9-2.4 11.4L64 75.6c9.5-5.5 15.9-15.8 15.9-27.6 0-5.5-1.4-10.8-3.9-15.3.1 1 .2 2.1.2 3.3z", |
|
fill: "none" |
|
})), Object(external_this_wp_element_["createElement"])("p", null, Object(external_this_wp_i18n_["__"])('Generating preview…')))); |
|
markup += "\n\t\t<style>\n\t\t\tbody {\n\t\t\t\tmargin: 0;\n\t\t\t}\n\t\t\t.editor-post-preview-button__interstitial-message {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\theight: 100vh;\n\t\t\t\twidth: 100vw;\n\t\t\t}\n\t\t\t@-webkit-keyframes paint {\n\t\t\t\t0% {\n\t\t\t\t\tstroke-dashoffset: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t@-moz-keyframes paint {\n\t\t\t\t0% {\n\t\t\t\t\tstroke-dashoffset: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t@-o-keyframes paint {\n\t\t\t\t0% {\n\t\t\t\t\tstroke-dashoffset: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t@keyframes paint {\n\t\t\t\t0% {\n\t\t\t\t\tstroke-dashoffset: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t.editor-post-preview-button__interstitial-message svg {\n\t\t\t\twidth: 192px;\n\t\t\t\theight: 192px;\n\t\t\t\tstroke: #555d66;\n\t\t\t\tstroke-width: 0.75;\n\t\t\t}\n\t\t\t.editor-post-preview-button__interstitial-message svg .outer,\n\t\t\t.editor-post-preview-button__interstitial-message svg .inner {\n\t\t\t\tstroke-dasharray: 280;\n\t\t\t\tstroke-dashoffset: 280;\n\t\t\t\t-webkit-animation: paint 1.5s ease infinite alternate;\n\t\t\t\t-moz-animation: paint 1.5s ease infinite alternate;\n\t\t\t\t-o-animation: paint 1.5s ease infinite alternate;\n\t\t\t\tanimation: paint 1.5s ease infinite alternate;\n\t\t\t}\n\t\t\tp {\n\t\t\t\ttext-align: center;\n\t\t\t\tfont-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;\n\t\t\t}\n\t\t</style>\n\t"; |
|
targetDocument.write(markup); |
|
targetDocument.title = Object(external_this_wp_i18n_["__"])('Generating preview…'); |
|
targetDocument.close(); |
|
} |
|
|
|
var post_preview_button_PostPreviewButton = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PostPreviewButton, _Component); |
|
|
|
function PostPreviewButton() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, PostPreviewButton); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PostPreviewButton).apply(this, arguments)); |
|
_this.openPreviewWindow = _this.openPreviewWindow.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(PostPreviewButton, [{ |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
var previewLink = this.props.previewLink; // This relies on the window being responsible to unset itself when |
|
// navigation occurs or a new preview window is opened, to avoid |
|
// unintentional forceful redirects. |
|
|
|
if (previewLink && !prevProps.previewLink) { |
|
this.setPreviewWindowLink(previewLink); |
|
} |
|
} |
|
/** |
|
* Sets the preview window's location to the given URL, if a preview window |
|
* exists and is not closed. |
|
* |
|
* @param {string} url URL to assign as preview window location. |
|
*/ |
|
|
|
}, { |
|
key: "setPreviewWindowLink", |
|
value: function setPreviewWindowLink(url) { |
|
var previewWindow = this.previewWindow; |
|
|
|
if (previewWindow && !previewWindow.closed) { |
|
previewWindow.location = url; |
|
} |
|
} |
|
}, { |
|
key: "getWindowTarget", |
|
value: function getWindowTarget() { |
|
var postId = this.props.postId; |
|
return "wp-preview-".concat(postId); |
|
} |
|
}, { |
|
key: "openPreviewWindow", |
|
value: function openPreviewWindow(event) { |
|
// Our Preview button has its 'href' and 'target' set correctly for a11y |
|
// purposes. Unfortunately, though, we can't rely on the default 'click' |
|
// handler since sometimes it incorrectly opens a new tab instead of reusing |
|
// the existing one. |
|
// https://github.com/WordPress/gutenberg/pull/8330 |
|
event.preventDefault(); // Open up a Preview tab if needed. This is where we'll show the preview. |
|
|
|
if (!this.previewWindow || this.previewWindow.closed) { |
|
this.previewWindow = window.open('', this.getWindowTarget()); |
|
} // Focus the Preview tab. This might not do anything, depending on the browser's |
|
// and user's preferences. |
|
// https://html.spec.whatwg.org/multipage/interaction.html#dom-window-focus |
|
|
|
|
|
this.previewWindow.focus(); // If we don't need to autosave the post before previewing, then we simply |
|
// load the Preview URL in the Preview tab. |
|
|
|
if (!this.props.isAutosaveable) { |
|
this.setPreviewWindowLink(event.target.href); |
|
return; |
|
} // Request an autosave. This happens asynchronously and causes the component |
|
// to update when finished. |
|
|
|
|
|
if (this.props.isDraft) { |
|
this.props.savePost({ |
|
isPreview: true |
|
}); |
|
} else { |
|
this.props.autosave({ |
|
isPreview: true |
|
}); |
|
} // Display a 'Generating preview' message in the Preview tab while we wait for the |
|
// autosave to finish. |
|
|
|
|
|
writeInterstitialMessage(this.previewWindow.document); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
previewLink = _this$props.previewLink, |
|
currentPostLink = _this$props.currentPostLink, |
|
isSaveable = _this$props.isSaveable; // Link to the `?preview=true` URL if we have it, since this lets us see |
|
// changes that were autosaved since the post was last published. Otherwise, |
|
// just link to the post's URL. |
|
|
|
var href = previewLink || currentPostLink; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
isLarge: true, |
|
className: "editor-post-preview", |
|
href: href, |
|
target: this.getWindowTarget(), |
|
disabled: !isSaveable, |
|
onClick: this.openPreviewWindow |
|
}, Object(external_this_wp_i18n_["_x"])('Preview', 'imperative verb'), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "screen-reader-text" |
|
}, |
|
/* translators: accessibility text */ |
|
Object(external_this_wp_i18n_["__"])('(opens in a new tab)')), Object(external_this_wp_element_["createElement"])(external_this_wp_nux_["DotTip"], { |
|
tipId: "core/editor.preview" |
|
}, Object(external_this_wp_i18n_["__"])('Click “Preview” to load a preview of this page, so you can make sure you’re happy with your blocks.'))); |
|
} |
|
}]); |
|
|
|
return PostPreviewButton; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var post_preview_button = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, _ref) { |
|
var forcePreviewLink = _ref.forcePreviewLink, |
|
forceIsAutosaveable = _ref.forceIsAutosaveable; |
|
|
|
var _select = select('core/editor'), |
|
getCurrentPostId = _select.getCurrentPostId, |
|
getCurrentPostAttribute = _select.getCurrentPostAttribute, |
|
getEditedPostAttribute = _select.getEditedPostAttribute, |
|
isEditedPostSaveable = _select.isEditedPostSaveable, |
|
isEditedPostAutosaveable = _select.isEditedPostAutosaveable, |
|
getEditedPostPreviewLink = _select.getEditedPostPreviewLink; |
|
|
|
var _select2 = select('core'), |
|
getPostType = _select2.getPostType; |
|
|
|
var previewLink = getEditedPostPreviewLink(); |
|
var postType = getPostType(getEditedPostAttribute('type')); |
|
return { |
|
postId: getCurrentPostId(), |
|
currentPostLink: getCurrentPostAttribute('link'), |
|
previewLink: forcePreviewLink !== undefined ? forcePreviewLink : previewLink, |
|
isSaveable: isEditedPostSaveable(), |
|
isAutosaveable: forceIsAutosaveable || isEditedPostAutosaveable(), |
|
isViewable: Object(external_lodash_["get"])(postType, ['viewable'], false), |
|
isDraft: ['draft', 'auto-draft'].indexOf(getEditedPostAttribute('status')) !== -1 |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
autosave: dispatch('core/editor').autosave, |
|
savePost: dispatch('core/editor').savePost |
|
}; |
|
}), Object(external_this_wp_compose_["ifCondition"])(function (_ref2) { |
|
var isViewable = _ref2.isViewable; |
|
return isViewable; |
|
})])(post_preview_button_PostPreviewButton)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-locked-modal/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
var post_locked_modal_PostLockedModal = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PostLockedModal, _Component); |
|
|
|
function PostLockedModal() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, PostLockedModal); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PostLockedModal).apply(this, arguments)); |
|
_this.sendPostLock = _this.sendPostLock.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.receivePostLock = _this.receivePostLock.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.releasePostLock = _this.releasePostLock.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(PostLockedModal, [{ |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
// Details on these events on the Heartbeat API docs |
|
// https://developer.wordpress.org/plugins/javascript/heartbeat-api/ |
|
external_jQuery_default()(document).on('heartbeat-send.refresh-lock', this.sendPostLock).on('heartbeat-tick.refresh-lock', this.receivePostLock); |
|
} |
|
}, { |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
external_jQuery_default()(document).off('heartbeat-send.refresh-lock', this.sendPostLock).off('heartbeat-tick.refresh-lock', this.receivePostLock); |
|
} |
|
/** |
|
* Keep the lock refreshed. |
|
* |
|
* When the user does not send a heartbeat in a heartbeat-tick |
|
* the user is no longer editing and another user can start editing. |
|
* |
|
* @param {Object} event Event. |
|
* @param {Object} data Data to send in the heartbeat request. |
|
*/ |
|
|
|
}, { |
|
key: "sendPostLock", |
|
value: function sendPostLock(event, data) { |
|
var _this$props = this.props, |
|
isLocked = _this$props.isLocked, |
|
activePostLock = _this$props.activePostLock, |
|
postId = _this$props.postId; |
|
|
|
if (isLocked) { |
|
return; |
|
} |
|
|
|
data['wp-refresh-post-lock'] = { |
|
lock: activePostLock, |
|
post_id: postId |
|
}; |
|
} |
|
/** |
|
* Refresh post locks: update the lock string or show the dialog if somebody has taken over editing. |
|
* |
|
* @param {Object} event Event. |
|
* @param {Object} data Data received in the heartbeat request |
|
*/ |
|
|
|
}, { |
|
key: "receivePostLock", |
|
value: function receivePostLock(event, data) { |
|
if (!data['wp-refresh-post-lock']) { |
|
return; |
|
} |
|
|
|
var _this$props2 = this.props, |
|
autosave = _this$props2.autosave, |
|
updatePostLock = _this$props2.updatePostLock; |
|
var received = data['wp-refresh-post-lock']; |
|
|
|
if (received.lock_error) { |
|
// Auto save and display the takeover modal. |
|
autosave(); |
|
updatePostLock({ |
|
isLocked: true, |
|
isTakeover: true, |
|
user: { |
|
avatar: received.lock_error.avatar_src |
|
} |
|
}); |
|
} else if (received.new_lock) { |
|
updatePostLock({ |
|
isLocked: false, |
|
activePostLock: received.new_lock |
|
}); |
|
} |
|
} |
|
/** |
|
* Unlock the post before the window is exited. |
|
*/ |
|
|
|
}, { |
|
key: "releasePostLock", |
|
value: function releasePostLock() { |
|
var _this$props3 = this.props, |
|
isLocked = _this$props3.isLocked, |
|
activePostLock = _this$props3.activePostLock, |
|
postLockUtils = _this$props3.postLockUtils, |
|
postId = _this$props3.postId; |
|
|
|
if (isLocked || !activePostLock) { |
|
return; |
|
} |
|
|
|
var data = { |
|
action: 'wp-remove-post-lock', |
|
_wpnonce: postLockUtils.unlockNonce, |
|
post_ID: postId, |
|
active_post_lock: activePostLock |
|
}; |
|
external_jQuery_default.a.post({ |
|
async: false, |
|
url: postLockUtils.ajaxUrl, |
|
data: data |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props4 = this.props, |
|
user = _this$props4.user, |
|
postId = _this$props4.postId, |
|
isLocked = _this$props4.isLocked, |
|
isTakeover = _this$props4.isTakeover, |
|
postLockUtils = _this$props4.postLockUtils, |
|
postType = _this$props4.postType; |
|
|
|
if (!isLocked) { |
|
return null; |
|
} |
|
|
|
var userDisplayName = user.name; |
|
var userAvatar = user.avatar; |
|
var unlockUrl = Object(external_this_wp_url_["addQueryArgs"])('post.php', { |
|
'get-post-lock': '1', |
|
lockKey: true, |
|
post: postId, |
|
action: 'edit', |
|
_wpnonce: postLockUtils.nonce |
|
}); |
|
var allPostsUrl = getWPAdminURL('edit.php', { |
|
post_type: Object(external_lodash_["get"])(postType, ['slug']) |
|
}); |
|
var allPostsLabel = Object(external_lodash_["get"])(postType, ['labels', 'all_items']); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Modal"], { |
|
title: isTakeover ? Object(external_this_wp_i18n_["__"])('Someone else has taken over this post.') : Object(external_this_wp_i18n_["__"])('This post is already being edited.'), |
|
focusOnMount: true, |
|
shouldCloseOnClickOutside: false, |
|
shouldCloseOnEsc: false, |
|
isDismissable: false, |
|
className: "editor-post-locked-modal" |
|
}, !!userAvatar && Object(external_this_wp_element_["createElement"])("img", { |
|
src: userAvatar, |
|
alt: Object(external_this_wp_i18n_["__"])('Avatar'), |
|
className: "editor-post-locked-modal__avatar" |
|
}), !!isTakeover && Object(external_this_wp_element_["createElement"])("div", null, Object(external_this_wp_element_["createElement"])("div", null, userDisplayName ? Object(external_this_wp_i18n_["sprintf"])( |
|
/* translators: %s: user's display name */ |
|
Object(external_this_wp_i18n_["__"])('%s now has editing control of this post. Don’t worry, your changes up to this moment have been saved.'), userDisplayName) : Object(external_this_wp_i18n_["__"])('Another user now has editing control of this post. Don’t worry, your changes up to this moment have been saved.')), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-locked-modal__buttons" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
isPrimary: true, |
|
isLarge: true, |
|
href: allPostsUrl |
|
}, allPostsLabel))), !isTakeover && Object(external_this_wp_element_["createElement"])("div", null, Object(external_this_wp_element_["createElement"])("div", null, userDisplayName ? Object(external_this_wp_i18n_["sprintf"])( |
|
/* translators: %s: user's display name */ |
|
Object(external_this_wp_i18n_["__"])('%s is currently working on this post, which means you cannot make changes, unless you take over.'), userDisplayName) : Object(external_this_wp_i18n_["__"])('Another user is currently working on this post, which means you cannot make changes, unless you take over.')), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-locked-modal__buttons" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
isDefault: true, |
|
isLarge: true, |
|
href: allPostsUrl |
|
}, allPostsLabel), Object(external_this_wp_element_["createElement"])(post_preview_button, null), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
isPrimary: true, |
|
isLarge: true, |
|
href: unlockUrl |
|
}, Object(external_this_wp_i18n_["__"])('Take Over'))))); |
|
} |
|
}]); |
|
|
|
return PostLockedModal; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var post_locked_modal = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getEditorSettings = _select.getEditorSettings, |
|
isPostLocked = _select.isPostLocked, |
|
isPostLockTakeover = _select.isPostLockTakeover, |
|
getPostLockUser = _select.getPostLockUser, |
|
getCurrentPostId = _select.getCurrentPostId, |
|
getActivePostLock = _select.getActivePostLock, |
|
getEditedPostAttribute = _select.getEditedPostAttribute; |
|
|
|
var _select2 = select('core'), |
|
getPostType = _select2.getPostType; |
|
|
|
return { |
|
isLocked: isPostLocked(), |
|
isTakeover: isPostLockTakeover(), |
|
user: getPostLockUser(), |
|
postId: getCurrentPostId(), |
|
postLockUtils: getEditorSettings().postLockUtils, |
|
activePostLock: getActivePostLock(), |
|
postType: getPostType(getEditedPostAttribute('type')) |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
autosave = _dispatch.autosave, |
|
updatePostLock = _dispatch.updatePostLock; |
|
|
|
return { |
|
autosave: autosave, |
|
updatePostLock: updatePostLock |
|
}; |
|
}), Object(external_this_wp_compose_["withGlobalEvents"])({ |
|
beforeunload: 'releasePostLock' |
|
}))(post_locked_modal_PostLockedModal)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-pending-status/check.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
function PostPendingStatusCheck(_ref) { |
|
var hasPublishAction = _ref.hasPublishAction, |
|
isPublished = _ref.isPublished, |
|
children = _ref.children; |
|
|
|
if (isPublished || !hasPublishAction) { |
|
return null; |
|
} |
|
|
|
return children; |
|
} |
|
/* harmony default export */ var post_pending_status_check = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
isCurrentPostPublished = _select.isCurrentPostPublished, |
|
getCurrentPostType = _select.getCurrentPostType, |
|
getCurrentPost = _select.getCurrentPost; |
|
|
|
return { |
|
hasPublishAction: Object(external_lodash_["get"])(getCurrentPost(), ['_links', 'wp:action-publish'], false), |
|
isPublished: isCurrentPostPublished(), |
|
postType: getCurrentPostType() |
|
}; |
|
}))(PostPendingStatusCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-pending-status/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
function PostPendingStatus(_ref) { |
|
var status = _ref.status, |
|
onUpdateStatus = _ref.onUpdateStatus; |
|
|
|
var togglePendingStatus = function togglePendingStatus() { |
|
var updatedStatus = status === 'pending' ? 'draft' : 'pending'; |
|
onUpdateStatus(updatedStatus); |
|
}; |
|
|
|
return Object(external_this_wp_element_["createElement"])(post_pending_status_check, null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["CheckboxControl"], { |
|
label: Object(external_this_wp_i18n_["__"])('Pending Review'), |
|
checked: status === 'pending', |
|
onChange: togglePendingStatus |
|
})); |
|
} |
|
/* harmony default export */ var post_pending_status = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
status: select('core/editor').getEditedPostAttribute('status') |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onUpdateStatus: function onUpdateStatus(status) { |
|
dispatch('core/editor').editPost({ |
|
status: status |
|
}); |
|
} |
|
}; |
|
}))(PostPendingStatus)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-pingbacks/index.js |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
function PostPingbacks(_ref) { |
|
var _ref$pingStatus = _ref.pingStatus, |
|
pingStatus = _ref$pingStatus === void 0 ? 'open' : _ref$pingStatus, |
|
props = Object(objectWithoutProperties["a" /* default */])(_ref, ["pingStatus"]); |
|
|
|
var onTogglePingback = function onTogglePingback() { |
|
return props.editPost({ |
|
ping_status: pingStatus === 'open' ? 'closed' : 'open' |
|
}); |
|
}; |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["CheckboxControl"], { |
|
label: Object(external_this_wp_i18n_["__"])('Allow Pingbacks & Trackbacks'), |
|
checked: pingStatus === 'open', |
|
onChange: onTogglePingback |
|
}); |
|
} |
|
|
|
/* harmony default export */ var post_pingbacks = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
pingStatus: select('core/editor').getEditedPostAttribute('ping_status') |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
editPost: dispatch('core/editor').editPost |
|
}; |
|
})])(PostPingbacks)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-button/label.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
function PublishButtonLabel(_ref) { |
|
var isPublished = _ref.isPublished, |
|
isBeingScheduled = _ref.isBeingScheduled, |
|
isSaving = _ref.isSaving, |
|
isPublishing = _ref.isPublishing, |
|
hasPublishAction = _ref.hasPublishAction, |
|
isAutosaving = _ref.isAutosaving; |
|
|
|
if (isPublishing) { |
|
return Object(external_this_wp_i18n_["__"])('Publishing…'); |
|
} else if (isPublished && isSaving && !isAutosaving) { |
|
return Object(external_this_wp_i18n_["__"])('Updating…'); |
|
} else if (isBeingScheduled && isSaving && !isAutosaving) { |
|
return Object(external_this_wp_i18n_["__"])('Scheduling…'); |
|
} |
|
|
|
if (!hasPublishAction) { |
|
return Object(external_this_wp_i18n_["__"])('Submit for Review'); |
|
} else if (isPublished) { |
|
return Object(external_this_wp_i18n_["__"])('Update'); |
|
} else if (isBeingScheduled) { |
|
return Object(external_this_wp_i18n_["__"])('Schedule'); |
|
} |
|
|
|
return Object(external_this_wp_i18n_["__"])('Publish'); |
|
} |
|
/* harmony default export */ var post_publish_button_label = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, _ref2) { |
|
var forceIsSaving = _ref2.forceIsSaving; |
|
|
|
var _select = select('core/editor'), |
|
isCurrentPostPublished = _select.isCurrentPostPublished, |
|
isEditedPostBeingScheduled = _select.isEditedPostBeingScheduled, |
|
isSavingPost = _select.isSavingPost, |
|
isPublishingPost = _select.isPublishingPost, |
|
getCurrentPost = _select.getCurrentPost, |
|
getCurrentPostType = _select.getCurrentPostType, |
|
isAutosavingPost = _select.isAutosavingPost; |
|
|
|
return { |
|
isPublished: isCurrentPostPublished(), |
|
isBeingScheduled: isEditedPostBeingScheduled(), |
|
isSaving: forceIsSaving || isSavingPost(), |
|
isPublishing: isPublishingPost(), |
|
hasPublishAction: Object(external_lodash_["get"])(getCurrentPost(), ['_links', 'wp:action-publish'], false), |
|
postType: getCurrentPostType(), |
|
isAutosaving: isAutosavingPost() |
|
}; |
|
})])(PublishButtonLabel)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-button/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
var post_publish_button_PostPublishButton = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PostPublishButton, _Component); |
|
|
|
function PostPublishButton(props) { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, PostPublishButton); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PostPublishButton).call(this, props)); |
|
_this.buttonNode = Object(external_this_wp_element_["createRef"])(); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(PostPublishButton, [{ |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
if (this.props.focusOnMount) { |
|
this.buttonNode.current.focus(); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
forceIsDirty = _this$props.forceIsDirty, |
|
forceIsSaving = _this$props.forceIsSaving, |
|
hasPublishAction = _this$props.hasPublishAction, |
|
isBeingScheduled = _this$props.isBeingScheduled, |
|
isOpen = _this$props.isOpen, |
|
isPostSavingLocked = _this$props.isPostSavingLocked, |
|
isPublishable = _this$props.isPublishable, |
|
isPublished = _this$props.isPublished, |
|
isSaveable = _this$props.isSaveable, |
|
isSaving = _this$props.isSaving, |
|
isToggle = _this$props.isToggle, |
|
onSave = _this$props.onSave, |
|
onStatusChange = _this$props.onStatusChange, |
|
_this$props$onSubmit = _this$props.onSubmit, |
|
onSubmit = _this$props$onSubmit === void 0 ? external_lodash_["noop"] : _this$props$onSubmit, |
|
onToggle = _this$props.onToggle, |
|
visibility = _this$props.visibility; |
|
var isButtonDisabled = isSaving || forceIsSaving || !isSaveable || isPostSavingLocked || !isPublishable && !forceIsDirty; |
|
var isToggleDisabled = isPublished || isSaving || forceIsSaving || !isSaveable || !isPublishable && !forceIsDirty; |
|
var publishStatus; |
|
|
|
if (!hasPublishAction) { |
|
publishStatus = 'pending'; |
|
} else if (isBeingScheduled) { |
|
publishStatus = 'future'; |
|
} else if (visibility === 'private') { |
|
publishStatus = 'private'; |
|
} else { |
|
publishStatus = 'publish'; |
|
} |
|
|
|
var onClick = function onClick() { |
|
onSubmit(); |
|
onStatusChange(publishStatus); |
|
onSave(); |
|
}; |
|
|
|
var buttonProps = { |
|
'aria-disabled': isButtonDisabled, |
|
className: 'editor-post-publish-button', |
|
isBusy: isSaving && isPublished, |
|
isLarge: true, |
|
isPrimary: true, |
|
onClick: onClick |
|
}; |
|
var toggleProps = { |
|
'aria-disabled': isToggleDisabled, |
|
'aria-expanded': isOpen, |
|
className: 'editor-post-publish-panel__toggle', |
|
isBusy: isSaving && isPublished, |
|
isPrimary: true, |
|
onClick: onToggle |
|
}; |
|
var toggleChildren = isBeingScheduled ? Object(external_this_wp_i18n_["__"])('Schedule…') : Object(external_this_wp_i18n_["__"])('Publish…'); |
|
var buttonChildren = Object(external_this_wp_element_["createElement"])(post_publish_button_label, { |
|
forceIsSaving: forceIsSaving |
|
}); |
|
var componentProps = isToggle ? toggleProps : buttonProps; |
|
var componentChildren = isToggle ? toggleChildren : buttonChildren; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], Object(esm_extends["a" /* default */])({ |
|
ref: this.buttonNode |
|
}, componentProps), componentChildren, Object(external_this_wp_element_["createElement"])(external_this_wp_nux_["DotTip"], { |
|
tipId: "core/editor.publish" |
|
}, Object(external_this_wp_i18n_["__"])('Finished writing? That’s great, let’s get this published right now. Just click “Publish” and you’re good to go.'))); |
|
} |
|
}]); |
|
|
|
return PostPublishButton; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var post_publish_button = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
isSavingPost = _select.isSavingPost, |
|
isEditedPostBeingScheduled = _select.isEditedPostBeingScheduled, |
|
getEditedPostVisibility = _select.getEditedPostVisibility, |
|
isCurrentPostPublished = _select.isCurrentPostPublished, |
|
isEditedPostSaveable = _select.isEditedPostSaveable, |
|
isEditedPostPublishable = _select.isEditedPostPublishable, |
|
isPostSavingLocked = _select.isPostSavingLocked, |
|
getCurrentPost = _select.getCurrentPost, |
|
getCurrentPostType = _select.getCurrentPostType; |
|
|
|
return { |
|
isSaving: isSavingPost(), |
|
isBeingScheduled: isEditedPostBeingScheduled(), |
|
visibility: getEditedPostVisibility(), |
|
isSaveable: isEditedPostSaveable(), |
|
isPostSavingLocked: isPostSavingLocked(), |
|
isPublishable: isEditedPostPublishable(), |
|
isPublished: isCurrentPostPublished(), |
|
hasPublishAction: Object(external_lodash_["get"])(getCurrentPost(), ['_links', 'wp:action-publish'], false), |
|
postType: getCurrentPostType() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
editPost = _dispatch.editPost, |
|
savePost = _dispatch.savePost; |
|
|
|
return { |
|
onStatusChange: function onStatusChange(status) { |
|
return editPost({ |
|
status: status |
|
}); |
|
}, |
|
onSave: savePost |
|
}; |
|
})])(post_publish_button_PostPublishButton)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-visibility/utils.js |
|
/** |
|
* WordPress Dependencies |
|
*/ |
|
|
|
var visibilityOptions = [{ |
|
value: 'public', |
|
label: Object(external_this_wp_i18n_["__"])('Public'), |
|
info: Object(external_this_wp_i18n_["__"])('Visible to everyone.') |
|
}, { |
|
value: 'private', |
|
label: Object(external_this_wp_i18n_["__"])('Private'), |
|
info: Object(external_this_wp_i18n_["__"])('Only visible to site admins and editors.') |
|
}, { |
|
value: 'password', |
|
label: Object(external_this_wp_i18n_["__"])('Password Protected'), |
|
info: Object(external_this_wp_i18n_["__"])('Protected with a password you choose. Only those with the password can view this post.') |
|
}]; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-visibility/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal Dependencies |
|
*/ |
|
|
|
|
|
var post_visibility_PostVisibility = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PostVisibility, _Component); |
|
|
|
function PostVisibility(props) { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, PostVisibility); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PostVisibility).apply(this, arguments)); |
|
_this.setPublic = _this.setPublic.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.setPrivate = _this.setPrivate.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.setPasswordProtected = _this.setPasswordProtected.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.updatePassword = _this.updatePassword.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.state = { |
|
hasPassword: !!props.password |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(PostVisibility, [{ |
|
key: "setPublic", |
|
value: function setPublic() { |
|
var _this$props = this.props, |
|
visibility = _this$props.visibility, |
|
onUpdateVisibility = _this$props.onUpdateVisibility, |
|
status = _this$props.status; |
|
onUpdateVisibility(visibility === 'private' ? 'draft' : status); |
|
this.setState({ |
|
hasPassword: false |
|
}); |
|
} |
|
}, { |
|
key: "setPrivate", |
|
value: function setPrivate() { |
|
if (!window.confirm(Object(external_this_wp_i18n_["__"])('Would you like to privately publish this post now?'))) { |
|
// eslint-disable-line no-alert |
|
return; |
|
} |
|
|
|
var _this$props2 = this.props, |
|
onUpdateVisibility = _this$props2.onUpdateVisibility, |
|
onSave = _this$props2.onSave; |
|
onUpdateVisibility('private'); |
|
this.setState({ |
|
hasPassword: false |
|
}); |
|
onSave(); |
|
} |
|
}, { |
|
key: "setPasswordProtected", |
|
value: function setPasswordProtected() { |
|
var _this$props3 = this.props, |
|
visibility = _this$props3.visibility, |
|
onUpdateVisibility = _this$props3.onUpdateVisibility, |
|
status = _this$props3.status, |
|
password = _this$props3.password; |
|
onUpdateVisibility(visibility === 'private' ? 'draft' : status, password || ''); |
|
this.setState({ |
|
hasPassword: true |
|
}); |
|
} |
|
}, { |
|
key: "updatePassword", |
|
value: function updatePassword(event) { |
|
var _this$props4 = this.props, |
|
status = _this$props4.status, |
|
onUpdateVisibility = _this$props4.onUpdateVisibility; |
|
onUpdateVisibility(status, event.target.value); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props5 = this.props, |
|
visibility = _this$props5.visibility, |
|
password = _this$props5.password, |
|
instanceId = _this$props5.instanceId; |
|
var visibilityHandlers = { |
|
public: { |
|
onSelect: this.setPublic, |
|
checked: visibility === 'public' && !this.state.hasPassword |
|
}, |
|
private: { |
|
onSelect: this.setPrivate, |
|
checked: visibility === 'private' |
|
}, |
|
password: { |
|
onSelect: this.setPasswordProtected, |
|
checked: this.state.hasPassword |
|
} |
|
}; |
|
return [Object(external_this_wp_element_["createElement"])("fieldset", { |
|
key: "visibility-selector", |
|
className: "editor-post-visibility__dialog-fieldset" |
|
}, Object(external_this_wp_element_["createElement"])("legend", { |
|
className: "editor-post-visibility__dialog-legend" |
|
}, Object(external_this_wp_i18n_["__"])('Post Visibility')), visibilityOptions.map(function (_ref) { |
|
var value = _ref.value, |
|
label = _ref.label, |
|
info = _ref.info; |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
key: value, |
|
className: "editor-post-visibility__choice" |
|
}, Object(external_this_wp_element_["createElement"])("input", { |
|
type: "radio", |
|
name: "editor-post-visibility__setting-".concat(instanceId), |
|
value: value, |
|
onChange: visibilityHandlers[value].onSelect, |
|
checked: visibilityHandlers[value].checked, |
|
id: "editor-post-".concat(value, "-").concat(instanceId), |
|
"aria-describedby": "editor-post-".concat(value, "-").concat(instanceId, "-description"), |
|
className: "editor-post-visibility__dialog-radio" |
|
}), Object(external_this_wp_element_["createElement"])("label", { |
|
htmlFor: "editor-post-".concat(value, "-").concat(instanceId), |
|
className: "editor-post-visibility__dialog-label" |
|
}, label), Object(external_this_wp_element_["createElement"])("p", { |
|
id: "editor-post-".concat(value, "-").concat(instanceId, "-description"), |
|
className: "editor-post-visibility__dialog-info" |
|
}, info)); |
|
})), this.state.hasPassword && Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-visibility__dialog-password", |
|
key: "password-selector" |
|
}, Object(external_this_wp_element_["createElement"])("label", { |
|
htmlFor: "editor-post-visibility__dialog-password-input-".concat(instanceId), |
|
className: "screen-reader-text" |
|
}, Object(external_this_wp_i18n_["__"])('Create password')), Object(external_this_wp_element_["createElement"])("input", { |
|
className: "editor-post-visibility__dialog-password-input", |
|
id: "editor-post-visibility__dialog-password-input-".concat(instanceId), |
|
type: "text", |
|
onChange: this.updatePassword, |
|
value: password, |
|
placeholder: Object(external_this_wp_i18n_["__"])('Use a secure password') |
|
}))]; |
|
} |
|
}]); |
|
|
|
return PostVisibility; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var post_visibility = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getEditedPostAttribute = _select.getEditedPostAttribute, |
|
getEditedPostVisibility = _select.getEditedPostVisibility; |
|
|
|
return { |
|
status: getEditedPostAttribute('status'), |
|
visibility: getEditedPostVisibility(), |
|
password: getEditedPostAttribute('password') |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
savePost = _dispatch.savePost, |
|
editPost = _dispatch.editPost; |
|
|
|
return { |
|
onSave: savePost, |
|
onUpdateVisibility: function onUpdateVisibility(status) { |
|
var password = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; |
|
editPost({ |
|
status: status, |
|
password: password |
|
}); |
|
} |
|
}; |
|
}), external_this_wp_compose_["withInstanceId"]])(post_visibility_PostVisibility)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-visibility/label.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Internal Dependencies |
|
*/ |
|
|
|
|
|
|
|
function PostVisibilityLabel(_ref) { |
|
var visibility = _ref.visibility; |
|
|
|
var getVisibilityLabel = function getVisibilityLabel() { |
|
return Object(external_lodash_["find"])(visibilityOptions, { |
|
value: visibility |
|
}).label; |
|
}; |
|
|
|
return getVisibilityLabel(visibility); |
|
} |
|
|
|
/* harmony default export */ var post_visibility_label = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
visibility: select('core/editor').getEditedPostVisibility() |
|
}; |
|
})(PostVisibilityLabel)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-schedule/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
function PostSchedule(_ref) { |
|
var date = _ref.date, |
|
onUpdateDate = _ref.onUpdateDate; |
|
|
|
var settings = Object(external_this_wp_date_["__experimentalGetSettings"])(); // To know if the current timezone is a 12 hour time with look for "a" in the time format |
|
// We also make sure this a is not escaped by a "/" |
|
|
|
|
|
var is12HourTime = /a(?!\\)/i.test(settings.formats.time.toLowerCase() // Test only the lower case a |
|
.replace(/\\\\/g, '') // Replace "//" with empty strings |
|
.split('').reverse().join('') // Reverse the string and test for "a" not followed by a slash |
|
); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["DateTimePicker"], { |
|
key: "date-time-picker", |
|
currentDate: date, |
|
onChange: onUpdateDate, |
|
is12Hour: is12HourTime |
|
}); |
|
} |
|
/* harmony default export */ var post_schedule = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
date: select('core/editor').getEditedPostAttribute('date') |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onUpdateDate: function onUpdateDate(date) { |
|
dispatch('core/editor').editPost({ |
|
date: date |
|
}); |
|
} |
|
}; |
|
})])(PostSchedule)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-schedule/label.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
function PostScheduleLabel(_ref) { |
|
var date = _ref.date, |
|
isFloating = _ref.isFloating; |
|
|
|
var settings = Object(external_this_wp_date_["__experimentalGetSettings"])(); |
|
|
|
return date && !isFloating ? Object(external_this_wp_date_["dateI18n"])(settings.formats.datetimeAbbreviated, date) : Object(external_this_wp_i18n_["__"])('Immediately'); |
|
} |
|
/* harmony default export */ var post_schedule_label = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
date: select('core/editor').getEditedPostAttribute('date'), |
|
isFloating: select('core/editor').isEditedPostDateFloating() |
|
}; |
|
})(PostScheduleLabel)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/flat-term-selector.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Module constants |
|
*/ |
|
|
|
var DEFAULT_QUERY = { |
|
per_page: -1, |
|
orderby: 'count', |
|
order: 'desc', |
|
_fields: 'id,name' |
|
}; |
|
var MAX_TERMS_SUGGESTIONS = 20; |
|
|
|
var isSameTermName = function isSameTermName(termA, termB) { |
|
return termA.toLowerCase() === termB.toLowerCase(); |
|
}; |
|
|
|
var flat_term_selector_FlatTermSelector = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(FlatTermSelector, _Component); |
|
|
|
function FlatTermSelector() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, FlatTermSelector); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(FlatTermSelector).apply(this, arguments)); |
|
_this.onChange = _this.onChange.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.searchTerms = Object(external_lodash_["throttle"])(_this.searchTerms.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))), 500); |
|
_this.findOrCreateTerm = _this.findOrCreateTerm.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.state = { |
|
loading: false, |
|
availableTerms: [], |
|
selectedTerms: [] |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(FlatTermSelector, [{ |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
var _this2 = this; |
|
|
|
if (!Object(external_lodash_["isEmpty"])(this.props.terms)) { |
|
this.setState({ |
|
loading: false |
|
}); |
|
this.initRequest = this.fetchTerms({ |
|
include: this.props.terms.join(','), |
|
per_page: -1 |
|
}); |
|
this.initRequest.then(function () { |
|
_this2.setState({ |
|
loading: false |
|
}); |
|
}, function (xhr) { |
|
if (xhr.statusText === 'abort') { |
|
return; |
|
} |
|
|
|
_this2.setState({ |
|
loading: false |
|
}); |
|
}); |
|
} |
|
} |
|
}, { |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
Object(external_lodash_["invoke"])(this.initRequest, ['abort']); |
|
Object(external_lodash_["invoke"])(this.searchRequest, ['abort']); |
|
} |
|
}, { |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
if (prevProps.terms !== this.props.terms) { |
|
this.updateSelectedTerms(this.props.terms); |
|
} |
|
} |
|
}, { |
|
key: "fetchTerms", |
|
value: function fetchTerms() { |
|
var _this3 = this; |
|
|
|
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; |
|
var taxonomy = this.props.taxonomy; |
|
|
|
var query = Object(objectSpread["a" /* default */])({}, DEFAULT_QUERY, params); |
|
|
|
var request = external_this_wp_apiFetch_default()({ |
|
path: Object(external_this_wp_url_["addQueryArgs"])("/wp/v2/".concat(taxonomy.rest_base), query) |
|
}); |
|
request.then(function (terms) { |
|
_this3.setState(function (state) { |
|
return { |
|
availableTerms: state.availableTerms.concat(terms.filter(function (term) { |
|
return !Object(external_lodash_["find"])(state.availableTerms, function (availableTerm) { |
|
return availableTerm.id === term.id; |
|
}); |
|
})) |
|
}; |
|
}); |
|
|
|
_this3.updateSelectedTerms(_this3.props.terms); |
|
}); |
|
return request; |
|
} |
|
}, { |
|
key: "updateSelectedTerms", |
|
value: function updateSelectedTerms() { |
|
var _this4 = this; |
|
|
|
var terms = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; |
|
var selectedTerms = terms.reduce(function (result, termId) { |
|
var termObject = Object(external_lodash_["find"])(_this4.state.availableTerms, function (term) { |
|
return term.id === termId; |
|
}); |
|
|
|
if (termObject) { |
|
result.push(termObject.name); |
|
} |
|
|
|
return result; |
|
}, []); |
|
this.setState({ |
|
selectedTerms: selectedTerms |
|
}); |
|
} |
|
}, { |
|
key: "findOrCreateTerm", |
|
value: function findOrCreateTerm(termName) { |
|
var _this5 = this; |
|
|
|
var taxonomy = this.props.taxonomy; // Tries to create a term or fetch it if it already exists. |
|
|
|
return external_this_wp_apiFetch_default()({ |
|
path: "/wp/v2/".concat(taxonomy.rest_base), |
|
method: 'POST', |
|
data: { |
|
name: termName |
|
} |
|
}).catch(function (error) { |
|
var errorCode = error.code; |
|
|
|
if (errorCode === 'term_exists') { |
|
// If the terms exist, fetch it instead of creating a new one. |
|
_this5.addRequest = external_this_wp_apiFetch_default()({ |
|
path: Object(external_this_wp_url_["addQueryArgs"])("/wp/v2/".concat(taxonomy.rest_base), Object(objectSpread["a" /* default */])({}, DEFAULT_QUERY, { |
|
search: termName |
|
})) |
|
}); |
|
return _this5.addRequest.then(function (searchResult) { |
|
return Object(external_lodash_["find"])(searchResult, function (result) { |
|
return isSameTermName(result.name, termName); |
|
}); |
|
}); |
|
} |
|
|
|
return Promise.reject(error); |
|
}); |
|
} |
|
}, { |
|
key: "onChange", |
|
value: function onChange(termNames) { |
|
var _this6 = this; |
|
|
|
var uniqueTerms = Object(external_lodash_["uniqBy"])(termNames, function (term) { |
|
return term.toLowerCase(); |
|
}); |
|
this.setState({ |
|
selectedTerms: uniqueTerms |
|
}); |
|
var newTermNames = uniqueTerms.filter(function (termName) { |
|
return !Object(external_lodash_["find"])(_this6.state.availableTerms, function (term) { |
|
return isSameTermName(term.name, termName); |
|
}); |
|
}); |
|
|
|
var termNamesToIds = function termNamesToIds(names, availableTerms) { |
|
return names.map(function (termName) { |
|
return Object(external_lodash_["find"])(availableTerms, function (term) { |
|
return isSameTermName(term.name, termName); |
|
}).id; |
|
}); |
|
}; |
|
|
|
if (newTermNames.length === 0) { |
|
return this.props.onUpdateTerms(termNamesToIds(uniqueTerms, this.state.availableTerms), this.props.taxonomy.rest_base); |
|
} |
|
|
|
Promise.all(newTermNames.map(this.findOrCreateTerm)).then(function (newTerms) { |
|
var newAvailableTerms = _this6.state.availableTerms.concat(newTerms); |
|
|
|
_this6.setState({ |
|
availableTerms: newAvailableTerms |
|
}); |
|
|
|
return _this6.props.onUpdateTerms(termNamesToIds(uniqueTerms, newAvailableTerms), _this6.props.taxonomy.rest_base); |
|
}); |
|
} |
|
}, { |
|
key: "searchTerms", |
|
value: function searchTerms() { |
|
var search = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; |
|
Object(external_lodash_["invoke"])(this.searchRequest, ['abort']); |
|
this.searchRequest = this.fetchTerms({ |
|
search: search |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
slug = _this$props.slug, |
|
taxonomy = _this$props.taxonomy, |
|
hasAssignAction = _this$props.hasAssignAction; |
|
|
|
if (!hasAssignAction) { |
|
return null; |
|
} |
|
|
|
var _this$state = this.state, |
|
loading = _this$state.loading, |
|
availableTerms = _this$state.availableTerms, |
|
selectedTerms = _this$state.selectedTerms; |
|
var termNames = availableTerms.map(function (term) { |
|
return term.name; |
|
}); |
|
var newTermLabel = Object(external_lodash_["get"])(taxonomy, ['labels', 'add_new_item'], slug === 'post_tag' ? Object(external_this_wp_i18n_["__"])('Add New Tag') : Object(external_this_wp_i18n_["__"])('Add New Term')); |
|
var singularName = Object(external_lodash_["get"])(taxonomy, ['labels', 'singular_name'], slug === 'post_tag' ? Object(external_this_wp_i18n_["__"])('Tag') : Object(external_this_wp_i18n_["__"])('Term')); |
|
var termAddedLabel = Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_x"])('%s added', 'term'), singularName); |
|
var termRemovedLabel = Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_x"])('%s removed', 'term'), singularName); |
|
var removeTermLabel = Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_x"])('Remove %s', 'term'), singularName); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["FormTokenField"], { |
|
value: selectedTerms, |
|
displayTransform: external_lodash_["unescape"], |
|
suggestions: termNames, |
|
onChange: this.onChange, |
|
onInputChange: this.searchTerms, |
|
maxSuggestions: MAX_TERMS_SUGGESTIONS, |
|
disabled: loading, |
|
label: newTermLabel, |
|
messages: { |
|
added: termAddedLabel, |
|
removed: termRemovedLabel, |
|
remove: removeTermLabel |
|
} |
|
}); |
|
} |
|
}]); |
|
|
|
return FlatTermSelector; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var flat_term_selector = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select, _ref) { |
|
var slug = _ref.slug; |
|
|
|
var _select = select('core/editor'), |
|
getCurrentPost = _select.getCurrentPost; |
|
|
|
var _select2 = select('core'), |
|
getTaxonomy = _select2.getTaxonomy; |
|
|
|
var taxonomy = getTaxonomy(slug); |
|
return { |
|
hasCreateAction: taxonomy ? Object(external_lodash_["get"])(getCurrentPost(), ['_links', 'wp:action-create-' + taxonomy.rest_base], false) : false, |
|
hasAssignAction: taxonomy ? Object(external_lodash_["get"])(getCurrentPost(), ['_links', 'wp:action-assign-' + taxonomy.rest_base], false) : false, |
|
terms: taxonomy ? select('core/editor').getEditedPostAttribute(taxonomy.rest_base) : [], |
|
taxonomy: taxonomy |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onUpdateTerms: function onUpdateTerms(terms, restBase) { |
|
dispatch('core/editor').editPost(Object(defineProperty["a" /* default */])({}, restBase, terms)); |
|
} |
|
}; |
|
}), Object(external_this_wp_components_["withFilters"])('editor.PostTaxonomyType'))(flat_term_selector_FlatTermSelector)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/maybe-tags-panel.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var maybe_tags_panel_TagsPanel = function TagsPanel() { |
|
var panelBodyTitle = [Object(external_this_wp_i18n_["__"])('Suggestion:'), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-post-publish-panel__link", |
|
key: "label" |
|
}, Object(external_this_wp_i18n_["__"])('Add tags'))]; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
initialOpen: false, |
|
title: panelBodyTitle |
|
}, Object(external_this_wp_element_["createElement"])("p", null, Object(external_this_wp_i18n_["__"])('Tags help users and search engines navigate your site and find your content. Add a few keywords to describe your post.')), Object(external_this_wp_element_["createElement"])(flat_term_selector, { |
|
slug: 'post_tag' |
|
})); |
|
}; |
|
|
|
var maybe_tags_panel_MaybeTagsPanel = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(MaybeTagsPanel, _Component); |
|
|
|
function MaybeTagsPanel(props) { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, MaybeTagsPanel); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(MaybeTagsPanel).call(this, props)); |
|
_this.state = { |
|
hadTagsWhenOpeningThePanel: props.hasTags |
|
}; |
|
return _this; |
|
} |
|
/* |
|
* We only want to show the tag panel if the post didn't have |
|
* any tags when the user hit the Publish button. |
|
* |
|
* We can't use the prop.hasTags because it'll change to true |
|
* if the user adds a new tag within the pre-publish panel. |
|
* This would force a re-render and a new prop.hasTags check, |
|
* hiding this panel and keeping the user from adding |
|
* more than one tag. |
|
*/ |
|
|
|
|
|
Object(createClass["a" /* default */])(MaybeTagsPanel, [{ |
|
key: "render", |
|
value: function render() { |
|
if (!this.state.hadTagsWhenOpeningThePanel) { |
|
return Object(external_this_wp_element_["createElement"])(maybe_tags_panel_TagsPanel, null); |
|
} |
|
|
|
return null; |
|
} |
|
}]); |
|
|
|
return MaybeTagsPanel; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var maybe_tags_panel = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var postType = select('core/editor').getCurrentPostType(); |
|
var tagsTaxonomy = select('core').getTaxonomy('post_tag'); |
|
var tags = tagsTaxonomy && select('core/editor').getEditedPostAttribute(tagsTaxonomy.rest_base); |
|
return { |
|
areTagsFetched: tagsTaxonomy !== undefined, |
|
isPostTypeSupported: tagsTaxonomy && Object(external_lodash_["some"])(tagsTaxonomy.types, function (type) { |
|
return type === postType; |
|
}), |
|
hasTags: tags && tags.length |
|
}; |
|
}), Object(external_this_wp_compose_["ifCondition"])(function (_ref) { |
|
var areTagsFetched = _ref.areTagsFetched, |
|
isPostTypeSupported = _ref.isPostTypeSupported; |
|
return isPostTypeSupported && areTagsFetched; |
|
}))(maybe_tags_panel_MaybeTagsPanel)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/maybe-post-format-panel.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies. |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies. |
|
*/ |
|
|
|
|
|
|
|
var maybe_post_format_panel_PostFormatSuggestion = function PostFormatSuggestion(_ref) { |
|
var suggestedPostFormat = _ref.suggestedPostFormat, |
|
suggestionText = _ref.suggestionText, |
|
onUpdatePostFormat = _ref.onUpdatePostFormat; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
isLink: true, |
|
onClick: function onClick() { |
|
return onUpdatePostFormat(suggestedPostFormat); |
|
} |
|
}, suggestionText); |
|
}; |
|
|
|
var maybe_post_format_panel_PostFormatPanel = function PostFormatPanel(_ref2) { |
|
var suggestion = _ref2.suggestion, |
|
onUpdatePostFormat = _ref2.onUpdatePostFormat; |
|
var panelBodyTitle = [Object(external_this_wp_i18n_["__"])('Suggestion:'), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-post-publish-panel__link", |
|
key: "label" |
|
}, Object(external_this_wp_i18n_["__"])('Use a post format'))]; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
initialOpen: false, |
|
title: panelBodyTitle |
|
}, Object(external_this_wp_element_["createElement"])("p", null, Object(external_this_wp_i18n_["__"])('Your theme uses post formats to highlight different kinds of content, like images or videos. Apply a post format to see this special styling.')), Object(external_this_wp_element_["createElement"])("p", null, Object(external_this_wp_element_["createElement"])(maybe_post_format_panel_PostFormatSuggestion, { |
|
onUpdatePostFormat: onUpdatePostFormat, |
|
suggestedPostFormat: suggestion.id, |
|
suggestionText: Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["__"])('Apply the "%1$s" format.'), suggestion.caption) |
|
}))); |
|
}; |
|
|
|
var maybe_post_format_panel_getSuggestion = function getSuggestion(supportedFormats, suggestedPostFormat) { |
|
var formats = POST_FORMATS.filter(function (format) { |
|
return Object(external_lodash_["includes"])(supportedFormats, format.id); |
|
}); |
|
return Object(external_lodash_["find"])(formats, function (format) { |
|
return format.id === suggestedPostFormat; |
|
}); |
|
}; |
|
|
|
/* harmony default export */ var maybe_post_format_panel = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getEditedPostAttribute = _select.getEditedPostAttribute, |
|
getSuggestedPostFormat = _select.getSuggestedPostFormat; |
|
|
|
var supportedFormats = Object(external_lodash_["get"])(select('core').getThemeSupports(), ['formats'], []); |
|
return { |
|
currentPostFormat: getEditedPostAttribute('format'), |
|
suggestion: maybe_post_format_panel_getSuggestion(supportedFormats, getSuggestedPostFormat()) |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onUpdatePostFormat: function onUpdatePostFormat(postFormat) { |
|
dispatch('core/editor').editPost({ |
|
format: postFormat |
|
}); |
|
} |
|
}; |
|
}), Object(external_this_wp_compose_["ifCondition"])(function (_ref3) { |
|
var suggestion = _ref3.suggestion, |
|
currentPostFormat = _ref3.currentPostFormat; |
|
return suggestion && suggestion.id !== currentPostFormat; |
|
}))(maybe_post_format_panel_PostFormatPanel)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/prepublish.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal Dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function PostPublishPanelPrepublish(_ref) { |
|
var hasPublishAction = _ref.hasPublishAction, |
|
isBeingScheduled = _ref.isBeingScheduled, |
|
children = _ref.children; |
|
var prePublishTitle, prePublishBodyText; |
|
|
|
if (!hasPublishAction) { |
|
prePublishTitle = Object(external_this_wp_i18n_["__"])('Are you ready to submit for review?'); |
|
prePublishBodyText = Object(external_this_wp_i18n_["__"])('When you’re ready, submit your work for review, and an Editor will be able to approve it for you.'); |
|
} else if (isBeingScheduled) { |
|
prePublishTitle = Object(external_this_wp_i18n_["__"])('Are you ready to schedule?'); |
|
prePublishBodyText = Object(external_this_wp_i18n_["__"])('Your work will be published at the specified date and time.'); |
|
} else { |
|
prePublishTitle = Object(external_this_wp_i18n_["__"])('Are you ready to publish?'); |
|
prePublishBodyText = Object(external_this_wp_i18n_["__"])('Double-check your settings before publishing.'); |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-publish-panel__prepublish" |
|
}, Object(external_this_wp_element_["createElement"])("div", null, Object(external_this_wp_element_["createElement"])("strong", null, prePublishTitle)), Object(external_this_wp_element_["createElement"])("p", null, prePublishBodyText), hasPublishAction && Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
initialOpen: false, |
|
title: [Object(external_this_wp_i18n_["__"])('Visibility:'), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-post-publish-panel__link", |
|
key: "label" |
|
}, Object(external_this_wp_element_["createElement"])(post_visibility_label, null))] |
|
}, Object(external_this_wp_element_["createElement"])(post_visibility, null)), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
initialOpen: false, |
|
title: [Object(external_this_wp_i18n_["__"])('Publish:'), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-post-publish-panel__link", |
|
key: "label" |
|
}, Object(external_this_wp_element_["createElement"])(post_schedule_label, null))] |
|
}, Object(external_this_wp_element_["createElement"])(post_schedule, null)), Object(external_this_wp_element_["createElement"])(maybe_post_format_panel, null), Object(external_this_wp_element_["createElement"])(maybe_tags_panel, null), children)); |
|
} |
|
|
|
/* harmony default export */ var prepublish = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getCurrentPost = _select.getCurrentPost, |
|
isEditedPostBeingScheduled = _select.isEditedPostBeingScheduled; |
|
|
|
return { |
|
hasPublishAction: Object(external_lodash_["get"])(getCurrentPost(), ['_links', 'wp:action-publish'], false), |
|
isBeingScheduled: isEditedPostBeingScheduled() |
|
}; |
|
})(PostPublishPanelPrepublish)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/postpublish.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External Dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress Dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var postpublish_PostPublishPanelPostpublish = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PostPublishPanelPostpublish, _Component); |
|
|
|
function PostPublishPanelPostpublish() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, PostPublishPanelPostpublish); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PostPublishPanelPostpublish).apply(this, arguments)); |
|
_this.state = { |
|
showCopyConfirmation: false |
|
}; |
|
_this.onCopy = _this.onCopy.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onSelectInput = _this.onSelectInput.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.postLink = Object(external_this_wp_element_["createRef"])(); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(PostPublishPanelPostpublish, [{ |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
if (this.props.focusOnMount) { |
|
this.postLink.current.focus(); |
|
} |
|
} |
|
}, { |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
clearTimeout(this.dismissCopyConfirmation); |
|
} |
|
}, { |
|
key: "onCopy", |
|
value: function onCopy() { |
|
var _this2 = this; |
|
|
|
this.setState({ |
|
showCopyConfirmation: true |
|
}); |
|
clearTimeout(this.dismissCopyConfirmation); |
|
this.dismissCopyConfirmation = setTimeout(function () { |
|
_this2.setState({ |
|
showCopyConfirmation: false |
|
}); |
|
}, 4000); |
|
} |
|
}, { |
|
key: "onSelectInput", |
|
value: function onSelectInput(event) { |
|
event.target.select(); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
children = _this$props.children, |
|
isScheduled = _this$props.isScheduled, |
|
post = _this$props.post, |
|
postType = _this$props.postType; |
|
var postLabel = Object(external_lodash_["get"])(postType, ['labels', 'singular_name']); |
|
var viewPostLabel = Object(external_lodash_["get"])(postType, ['labels', 'view_item']); |
|
var postPublishNonLinkHeader = isScheduled ? Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_i18n_["__"])('is now scheduled. It will go live on'), " ", Object(external_this_wp_element_["createElement"])(post_schedule_label, null), ".") : Object(external_this_wp_i18n_["__"])('is now live.'); |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "post-publish-panel__postpublish" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
className: "post-publish-panel__postpublish-header" |
|
}, Object(external_this_wp_element_["createElement"])("a", { |
|
ref: this.postLink, |
|
href: post.link |
|
}, post.title || Object(external_this_wp_i18n_["__"])('(no title)')), " ", postPublishNonLinkHeader), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], null, Object(external_this_wp_element_["createElement"])("p", { |
|
className: "post-publish-panel__postpublish-subheader" |
|
}, Object(external_this_wp_element_["createElement"])("strong", null, Object(external_this_wp_i18n_["__"])('What’s next?'))), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["TextControl"], { |
|
className: "post-publish-panel__postpublish-post-address", |
|
readOnly: true, |
|
label: Object(external_this_wp_i18n_["sprintf"])( |
|
/* translators: %s: post type singular name */ |
|
Object(external_this_wp_i18n_["__"])('%s address'), postLabel), |
|
value: post.link, |
|
onFocus: this.onSelectInput |
|
}), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "post-publish-panel__postpublish-buttons" |
|
}, !isScheduled && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
isDefault: true, |
|
href: post.link |
|
}, viewPostLabel), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["ClipboardButton"], { |
|
isDefault: true, |
|
text: post.link, |
|
onCopy: this.onCopy |
|
}, this.state.showCopyConfirmation ? Object(external_this_wp_i18n_["__"])('Copied!') : Object(external_this_wp_i18n_["__"])('Copy Link')))), children); |
|
} |
|
}]); |
|
|
|
return PostPublishPanelPostpublish; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var postpublish = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getEditedPostAttribute = _select.getEditedPostAttribute, |
|
getCurrentPost = _select.getCurrentPost, |
|
isCurrentPostScheduled = _select.isCurrentPostScheduled; |
|
|
|
var _select2 = select('core'), |
|
getPostType = _select2.getPostType; |
|
|
|
return { |
|
post: getCurrentPost(), |
|
postType: getPostType(getEditedPostAttribute('type')), |
|
isScheduled: isCurrentPostScheduled() |
|
}; |
|
})(postpublish_PostPublishPanelPostpublish)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-publish-panel/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal Dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
var post_publish_panel_PostPublishPanel = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PostPublishPanel, _Component); |
|
|
|
function PostPublishPanel() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, PostPublishPanel); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PostPublishPanel).apply(this, arguments)); |
|
_this.onSubmit = _this.onSubmit.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(PostPublishPanel, [{ |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
// Automatically collapse the publish sidebar when a post |
|
// is published and the user makes an edit. |
|
if (prevProps.isPublished && !this.props.isSaving && this.props.isDirty) { |
|
this.props.onClose(); |
|
} |
|
} |
|
}, { |
|
key: "onSubmit", |
|
value: function onSubmit() { |
|
var _this$props = this.props, |
|
onClose = _this$props.onClose, |
|
hasPublishAction = _this$props.hasPublishAction, |
|
isPostTypeViewable = _this$props.isPostTypeViewable; |
|
|
|
if (!hasPublishAction || !isPostTypeViewable) { |
|
onClose(); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props2 = this.props, |
|
forceIsDirty = _this$props2.forceIsDirty, |
|
forceIsSaving = _this$props2.forceIsSaving, |
|
isBeingScheduled = _this$props2.isBeingScheduled, |
|
isPublished = _this$props2.isPublished, |
|
isPublishSidebarEnabled = _this$props2.isPublishSidebarEnabled, |
|
isScheduled = _this$props2.isScheduled, |
|
isSaving = _this$props2.isSaving, |
|
onClose = _this$props2.onClose, |
|
onTogglePublishSidebar = _this$props2.onTogglePublishSidebar, |
|
PostPublishExtension = _this$props2.PostPublishExtension, |
|
PrePublishExtension = _this$props2.PrePublishExtension, |
|
additionalProps = Object(objectWithoutProperties["a" /* default */])(_this$props2, ["forceIsDirty", "forceIsSaving", "isBeingScheduled", "isPublished", "isPublishSidebarEnabled", "isScheduled", "isSaving", "onClose", "onTogglePublishSidebar", "PostPublishExtension", "PrePublishExtension"]); |
|
|
|
var propsForPanel = Object(external_lodash_["omit"])(additionalProps, ['hasPublishAction', 'isDirty', 'isPostTypeViewable']); |
|
var isPublishedOrScheduled = isPublished || isScheduled && isBeingScheduled; |
|
var isPrePublish = !isPublishedOrScheduled && !isSaving; |
|
var isPostPublish = isPublishedOrScheduled && !isSaving; |
|
return Object(external_this_wp_element_["createElement"])("div", Object(esm_extends["a" /* default */])({ |
|
className: "editor-post-publish-panel" |
|
}, propsForPanel), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-publish-panel__header" |
|
}, isPostPublish ? Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-publish-panel__header-published" |
|
}, isScheduled ? Object(external_this_wp_i18n_["__"])('Scheduled') : Object(external_this_wp_i18n_["__"])('Published')) : Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-publish-panel__header-publish-button" |
|
}, Object(external_this_wp_element_["createElement"])(post_publish_button, { |
|
focusOnMount: true, |
|
onSubmit: this.onSubmit, |
|
forceIsDirty: forceIsDirty, |
|
forceIsSaving: forceIsSaving |
|
}), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-post-publish-panel__spacer" |
|
})), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
"aria-expanded": true, |
|
onClick: onClose, |
|
icon: "no-alt", |
|
label: Object(external_this_wp_i18n_["__"])('Close panel') |
|
})), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-publish-panel__content" |
|
}, isPrePublish && Object(external_this_wp_element_["createElement"])(prepublish, null, PrePublishExtension && Object(external_this_wp_element_["createElement"])(PrePublishExtension, null)), isPostPublish && Object(external_this_wp_element_["createElement"])(postpublish, { |
|
focusOnMount: true |
|
}, PostPublishExtension && Object(external_this_wp_element_["createElement"])(PostPublishExtension, null)), isSaving && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Spinner"], null)), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-publish-panel__footer" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["CheckboxControl"], { |
|
label: Object(external_this_wp_i18n_["__"])('Always show pre-publish checks.'), |
|
checked: isPublishSidebarEnabled, |
|
onChange: onTogglePublishSidebar |
|
}))); |
|
} |
|
}]); |
|
|
|
return PostPublishPanel; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var post_publish_panel = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core'), |
|
getPostType = _select.getPostType; |
|
|
|
var _select2 = select('core/editor'), |
|
getCurrentPost = _select2.getCurrentPost, |
|
getEditedPostAttribute = _select2.getEditedPostAttribute, |
|
isCurrentPostPublished = _select2.isCurrentPostPublished, |
|
isCurrentPostScheduled = _select2.isCurrentPostScheduled, |
|
isEditedPostBeingScheduled = _select2.isEditedPostBeingScheduled, |
|
isEditedPostDirty = _select2.isEditedPostDirty, |
|
isSavingPost = _select2.isSavingPost; |
|
|
|
var _select3 = select('core/editor'), |
|
isPublishSidebarEnabled = _select3.isPublishSidebarEnabled; |
|
|
|
var postType = getPostType(getEditedPostAttribute('type')); |
|
return { |
|
hasPublishAction: Object(external_lodash_["get"])(getCurrentPost(), ['_links', 'wp:action-publish'], false), |
|
isPostTypeViewable: Object(external_lodash_["get"])(postType, ['viewable'], false), |
|
isBeingScheduled: isEditedPostBeingScheduled(), |
|
isDirty: isEditedPostDirty(), |
|
isPublished: isCurrentPostPublished(), |
|
isPublishSidebarEnabled: isPublishSidebarEnabled(), |
|
isSaving: isSavingPost(), |
|
isScheduled: isCurrentPostScheduled() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, _ref) { |
|
var isPublishSidebarEnabled = _ref.isPublishSidebarEnabled; |
|
|
|
var _dispatch = dispatch('core/editor'), |
|
disablePublishSidebar = _dispatch.disablePublishSidebar, |
|
enablePublishSidebar = _dispatch.enablePublishSidebar; |
|
|
|
return { |
|
onTogglePublishSidebar: function onTogglePublishSidebar() { |
|
if (isPublishSidebarEnabled) { |
|
disablePublishSidebar(); |
|
} else { |
|
enablePublishSidebar(); |
|
} |
|
} |
|
}; |
|
}), external_this_wp_components_["withFocusReturn"], external_this_wp_components_["withConstrainedTabbing"]])(post_publish_panel_PostPublishPanel)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-switch-to-draft-button/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
function PostSwitchToDraftButton(_ref) { |
|
var isSaving = _ref.isSaving, |
|
isPublished = _ref.isPublished, |
|
isScheduled = _ref.isScheduled, |
|
onClick = _ref.onClick; |
|
|
|
if (!isPublished && !isScheduled) { |
|
return null; |
|
} |
|
|
|
var onSwitch = function onSwitch() { |
|
var alertMessage; |
|
|
|
if (isPublished) { |
|
alertMessage = Object(external_this_wp_i18n_["__"])('Are you sure you want to unpublish this post?'); |
|
} else if (isScheduled) { |
|
alertMessage = Object(external_this_wp_i18n_["__"])('Are you sure you want to unschedule this post?'); |
|
} // eslint-disable-next-line no-alert |
|
|
|
|
|
if (window.confirm(alertMessage)) { |
|
onClick(); |
|
} |
|
}; |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
className: "editor-post-switch-to-draft", |
|
onClick: onSwitch, |
|
disabled: isSaving, |
|
isTertiary: true |
|
}, Object(external_this_wp_i18n_["__"])('Switch to Draft')); |
|
} |
|
|
|
/* harmony default export */ var post_switch_to_draft_button = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
isSavingPost = _select.isSavingPost, |
|
isCurrentPostPublished = _select.isCurrentPostPublished, |
|
isCurrentPostScheduled = _select.isCurrentPostScheduled; |
|
|
|
return { |
|
isSaving: isSavingPost(), |
|
isPublished: isCurrentPostPublished(), |
|
isScheduled: isCurrentPostScheduled() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
editPost = _dispatch.editPost, |
|
savePost = _dispatch.savePost; |
|
|
|
return { |
|
onClick: function onClick() { |
|
editPost({ |
|
status: 'draft' |
|
}); |
|
savePost(); |
|
} |
|
}; |
|
})])(PostSwitchToDraftButton)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-saved-state/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Component showing whether the post is saved or not and displaying save links. |
|
* |
|
* @param {Object} Props Component Props. |
|
*/ |
|
|
|
var post_saved_state_PostSavedState = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PostSavedState, _Component); |
|
|
|
function PostSavedState() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, PostSavedState); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PostSavedState).apply(this, arguments)); |
|
_this.state = { |
|
forceSavedMessage: false |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(PostSavedState, [{ |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
var _this2 = this; |
|
|
|
if (prevProps.isSaving && !this.props.isSaving) { |
|
this.setState({ |
|
forceSavedMessage: true |
|
}); |
|
this.props.setTimeout(function () { |
|
_this2.setState({ |
|
forceSavedMessage: false |
|
}); |
|
}, 1000); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
post = _this$props.post, |
|
isNew = _this$props.isNew, |
|
isScheduled = _this$props.isScheduled, |
|
isPublished = _this$props.isPublished, |
|
isDirty = _this$props.isDirty, |
|
isSaving = _this$props.isSaving, |
|
isSaveable = _this$props.isSaveable, |
|
onSave = _this$props.onSave, |
|
isAutosaving = _this$props.isAutosaving, |
|
isPending = _this$props.isPending, |
|
isLargeViewport = _this$props.isLargeViewport; |
|
var forceSavedMessage = this.state.forceSavedMessage; |
|
var hasPublishAction = Object(external_lodash_["get"])(post, ['_links', 'wp:action-publish'], false); |
|
|
|
if (isSaving) { |
|
// TODO: Classes generation should be common across all return |
|
// paths of this function, including proper naming convention for |
|
// the "Save Draft" button. |
|
var classes = classnames_default()('editor-post-saved-state', 'is-saving', { |
|
'is-autosaving': isAutosaving |
|
}); |
|
return Object(external_this_wp_element_["createElement"])("span", { |
|
className: classes |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Dashicon"], { |
|
icon: "cloud" |
|
}), isAutosaving ? Object(external_this_wp_i18n_["__"])('Autosaving') : Object(external_this_wp_i18n_["__"])('Saving')); |
|
} |
|
|
|
if (isPublished || isScheduled) { |
|
return Object(external_this_wp_element_["createElement"])(post_switch_to_draft_button, null); |
|
} |
|
|
|
if (!isSaveable) { |
|
return null; |
|
} |
|
|
|
if (forceSavedMessage || !isNew && !isDirty) { |
|
return Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-post-saved-state is-saved" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Dashicon"], { |
|
icon: "saved" |
|
}), Object(external_this_wp_i18n_["__"])('Saved')); |
|
} // Once the post has been submitted for review this button |
|
// is not needed for the contributor role. |
|
|
|
|
|
if (!hasPublishAction && isPending) { |
|
return null; |
|
} |
|
|
|
var label = isPending ? Object(external_this_wp_i18n_["__"])('Save as Pending') : Object(external_this_wp_i18n_["__"])('Save Draft'); |
|
|
|
if (!isLargeViewport) { |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
className: "editor-post-save-draft", |
|
label: label, |
|
onClick: onSave, |
|
shortcut: external_this_wp_keycodes_["displayShortcut"].primary('s'), |
|
icon: "cloud-upload" |
|
}); |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
className: "editor-post-save-draft", |
|
onClick: onSave, |
|
shortcut: external_this_wp_keycodes_["displayShortcut"].primary('s'), |
|
isTertiary: true |
|
}, label); |
|
} |
|
}]); |
|
|
|
return PostSavedState; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var post_saved_state = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, _ref) { |
|
var forceIsDirty = _ref.forceIsDirty, |
|
forceIsSaving = _ref.forceIsSaving; |
|
|
|
var _select = select('core/editor'), |
|
isEditedPostNew = _select.isEditedPostNew, |
|
isCurrentPostPublished = _select.isCurrentPostPublished, |
|
isCurrentPostScheduled = _select.isCurrentPostScheduled, |
|
isEditedPostDirty = _select.isEditedPostDirty, |
|
isSavingPost = _select.isSavingPost, |
|
isEditedPostSaveable = _select.isEditedPostSaveable, |
|
getCurrentPost = _select.getCurrentPost, |
|
isAutosavingPost = _select.isAutosavingPost, |
|
getEditedPostAttribute = _select.getEditedPostAttribute; |
|
|
|
return { |
|
post: getCurrentPost(), |
|
isNew: isEditedPostNew(), |
|
isPublished: isCurrentPostPublished(), |
|
isScheduled: isCurrentPostScheduled(), |
|
isDirty: forceIsDirty || isEditedPostDirty(), |
|
isSaving: forceIsSaving || isSavingPost(), |
|
isSaveable: isEditedPostSaveable(), |
|
isAutosaving: isAutosavingPost(), |
|
isPending: 'pending' === getEditedPostAttribute('status') |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onSave: dispatch('core/editor').savePost |
|
}; |
|
}), external_this_wp_compose_["withSafeTimeout"], Object(external_this_wp_viewport_["withViewportMatch"])({ |
|
isLargeViewport: 'medium' |
|
})])(post_saved_state_PostSavedState)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-schedule/check.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
function PostScheduleCheck(_ref) { |
|
var hasPublishAction = _ref.hasPublishAction, |
|
children = _ref.children; |
|
|
|
if (!hasPublishAction) { |
|
return null; |
|
} |
|
|
|
return children; |
|
} |
|
/* harmony default export */ var post_schedule_check = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getCurrentPost = _select.getCurrentPost, |
|
getCurrentPostType = _select.getCurrentPostType; |
|
|
|
return { |
|
hasPublishAction: Object(external_lodash_["get"])(getCurrentPost(), ['_links', 'wp:action-publish'], false), |
|
postType: getCurrentPostType() |
|
}; |
|
})])(PostScheduleCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-sticky/check.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
function PostStickyCheck(_ref) { |
|
var hasStickyAction = _ref.hasStickyAction, |
|
postType = _ref.postType, |
|
children = _ref.children; |
|
|
|
if (postType !== 'post' || !hasStickyAction) { |
|
return null; |
|
} |
|
|
|
return children; |
|
} |
|
/* harmony default export */ var post_sticky_check = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var post = select('core/editor').getCurrentPost(); |
|
return { |
|
hasStickyAction: Object(external_lodash_["get"])(post, ['_links', 'wp:action-sticky'], false), |
|
postType: select('core/editor').getCurrentPostType() |
|
}; |
|
})])(PostStickyCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-sticky/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
function PostSticky(_ref) { |
|
var onUpdateSticky = _ref.onUpdateSticky, |
|
_ref$postSticky = _ref.postSticky, |
|
postSticky = _ref$postSticky === void 0 ? false : _ref$postSticky; |
|
return Object(external_this_wp_element_["createElement"])(post_sticky_check, null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["CheckboxControl"], { |
|
label: Object(external_this_wp_i18n_["__"])('Stick to the Front Page'), |
|
checked: postSticky, |
|
onChange: function onChange() { |
|
return onUpdateSticky(!postSticky); |
|
} |
|
})); |
|
} |
|
/* harmony default export */ var post_sticky = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
postSticky: select('core/editor').getEditedPostAttribute('sticky') |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onUpdateSticky: function onUpdateSticky(postSticky) { |
|
dispatch('core/editor').editPost({ |
|
sticky: postSticky |
|
}); |
|
} |
|
}; |
|
})])(PostSticky)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/hierarchical-term-selector.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Module Constants |
|
*/ |
|
|
|
var hierarchical_term_selector_DEFAULT_QUERY = { |
|
per_page: -1, |
|
orderby: 'name', |
|
order: 'asc', |
|
_fields: 'id,name,parent' |
|
}; |
|
var MIN_TERMS_COUNT_FOR_FILTER = 8; |
|
|
|
var hierarchical_term_selector_HierarchicalTermSelector = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(HierarchicalTermSelector, _Component); |
|
|
|
function HierarchicalTermSelector() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, HierarchicalTermSelector); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(HierarchicalTermSelector).apply(this, arguments)); |
|
_this.findTerm = _this.findTerm.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onChange = _this.onChange.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onChangeFormName = _this.onChangeFormName.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onChangeFormParent = _this.onChangeFormParent.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onAddTerm = _this.onAddTerm.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onToggleForm = _this.onToggleForm.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.setFilterValue = _this.setFilterValue.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.sortBySelected = _this.sortBySelected.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.state = { |
|
loading: true, |
|
availableTermsTree: [], |
|
availableTerms: [], |
|
adding: false, |
|
formName: '', |
|
formParent: '', |
|
showForm: false, |
|
filterValue: '', |
|
filteredTermsTree: [] |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(HierarchicalTermSelector, [{ |
|
key: "onChange", |
|
value: function onChange(event) { |
|
var _this$props = this.props, |
|
onUpdateTerms = _this$props.onUpdateTerms, |
|
_this$props$terms = _this$props.terms, |
|
terms = _this$props$terms === void 0 ? [] : _this$props$terms, |
|
taxonomy = _this$props.taxonomy; |
|
var termId = parseInt(event.target.value, 10); |
|
var hasTerm = terms.indexOf(termId) !== -1; |
|
var newTerms = hasTerm ? Object(external_lodash_["without"])(terms, termId) : Object(toConsumableArray["a" /* default */])(terms).concat([termId]); |
|
onUpdateTerms(newTerms, taxonomy.rest_base); |
|
} |
|
}, { |
|
key: "onChangeFormName", |
|
value: function onChangeFormName(event) { |
|
var newValue = event.target.value.trim() === '' ? '' : event.target.value; |
|
this.setState({ |
|
formName: newValue |
|
}); |
|
} |
|
}, { |
|
key: "onChangeFormParent", |
|
value: function onChangeFormParent(newParent) { |
|
this.setState({ |
|
formParent: newParent |
|
}); |
|
} |
|
}, { |
|
key: "onToggleForm", |
|
value: function onToggleForm() { |
|
this.setState(function (state) { |
|
return { |
|
showForm: !state.showForm |
|
}; |
|
}); |
|
} |
|
}, { |
|
key: "findTerm", |
|
value: function findTerm(terms, parent, name) { |
|
return Object(external_lodash_["find"])(terms, function (term) { |
|
return (!term.parent && !parent || parseInt(term.parent) === parseInt(parent)) && term.name.toLowerCase() === name.toLowerCase(); |
|
}); |
|
} |
|
}, { |
|
key: "onAddTerm", |
|
value: function onAddTerm(event) { |
|
var _this2 = this; |
|
|
|
event.preventDefault(); |
|
var _this$props2 = this.props, |
|
onUpdateTerms = _this$props2.onUpdateTerms, |
|
taxonomy = _this$props2.taxonomy, |
|
terms = _this$props2.terms, |
|
slug = _this$props2.slug; |
|
var _this$state = this.state, |
|
formName = _this$state.formName, |
|
formParent = _this$state.formParent, |
|
adding = _this$state.adding, |
|
availableTerms = _this$state.availableTerms; |
|
|
|
if (formName === '' || adding) { |
|
return; |
|
} // check if the term we are adding already exists |
|
|
|
|
|
var existingTerm = this.findTerm(availableTerms, formParent, formName); |
|
|
|
if (existingTerm) { |
|
// if the term we are adding exists but is not selected select it |
|
if (!Object(external_lodash_["some"])(terms, function (term) { |
|
return term === existingTerm.id; |
|
})) { |
|
onUpdateTerms(Object(toConsumableArray["a" /* default */])(terms).concat([existingTerm.id]), taxonomy.rest_base); |
|
} |
|
|
|
this.setState({ |
|
formName: '', |
|
formParent: '' |
|
}); |
|
return; |
|
} |
|
|
|
this.setState({ |
|
adding: true |
|
}); |
|
this.addRequest = external_this_wp_apiFetch_default()({ |
|
path: "/wp/v2/".concat(taxonomy.rest_base), |
|
method: 'POST', |
|
data: { |
|
name: formName, |
|
parent: formParent ? formParent : undefined |
|
} |
|
}); // Tries to create a term or fetch it if it already exists |
|
|
|
var findOrCreatePromise = this.addRequest.catch(function (error) { |
|
var errorCode = error.code; |
|
|
|
if (errorCode === 'term_exists') { |
|
// search the new category created since last fetch |
|
_this2.addRequest = external_this_wp_apiFetch_default()({ |
|
path: Object(external_this_wp_url_["addQueryArgs"])("/wp/v2/".concat(taxonomy.rest_base), Object(objectSpread["a" /* default */])({}, hierarchical_term_selector_DEFAULT_QUERY, { |
|
parent: formParent || 0, |
|
search: formName |
|
})) |
|
}); |
|
return _this2.addRequest.then(function (searchResult) { |
|
return _this2.findTerm(searchResult, formParent, formName); |
|
}); |
|
} |
|
|
|
return Promise.reject(error); |
|
}); |
|
findOrCreatePromise.then(function (term) { |
|
var hasTerm = !!Object(external_lodash_["find"])(_this2.state.availableTerms, function (availableTerm) { |
|
return availableTerm.id === term.id; |
|
}); |
|
var newAvailableTerms = hasTerm ? _this2.state.availableTerms : [term].concat(Object(toConsumableArray["a" /* default */])(_this2.state.availableTerms)); |
|
var termAddedMessage = Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_x"])('%s added', 'term'), Object(external_lodash_["get"])(_this2.props.taxonomy, ['labels', 'singular_name'], slug === 'category' ? Object(external_this_wp_i18n_["__"])('Category') : Object(external_this_wp_i18n_["__"])('Term'))); |
|
|
|
_this2.props.speak(termAddedMessage, 'assertive'); |
|
|
|
_this2.addRequest = null; |
|
|
|
_this2.setState({ |
|
adding: false, |
|
formName: '', |
|
formParent: '', |
|
availableTerms: newAvailableTerms, |
|
availableTermsTree: _this2.sortBySelected(buildTermsTree(newAvailableTerms)) |
|
}); |
|
|
|
onUpdateTerms(Object(toConsumableArray["a" /* default */])(terms).concat([term.id]), taxonomy.rest_base); |
|
}, function (xhr) { |
|
if (xhr.statusText === 'abort') { |
|
return; |
|
} |
|
|
|
_this2.addRequest = null; |
|
|
|
_this2.setState({ |
|
adding: false |
|
}); |
|
}); |
|
} |
|
}, { |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
this.fetchTerms(); |
|
} |
|
}, { |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
Object(external_lodash_["invoke"])(this.fetchRequest, ['abort']); |
|
Object(external_lodash_["invoke"])(this.addRequest, ['abort']); |
|
} |
|
}, { |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
if (this.props.taxonomy !== prevProps.taxonomy) { |
|
this.fetchTerms(); |
|
} |
|
} |
|
}, { |
|
key: "fetchTerms", |
|
value: function fetchTerms() { |
|
var _this3 = this; |
|
|
|
var taxonomy = this.props.taxonomy; |
|
|
|
if (!taxonomy) { |
|
return; |
|
} |
|
|
|
this.fetchRequest = external_this_wp_apiFetch_default()({ |
|
path: Object(external_this_wp_url_["addQueryArgs"])("/wp/v2/".concat(taxonomy.rest_base), hierarchical_term_selector_DEFAULT_QUERY) |
|
}); |
|
this.fetchRequest.then(function (terms) { |
|
// resolve |
|
var availableTermsTree = _this3.sortBySelected(buildTermsTree(terms)); |
|
|
|
_this3.fetchRequest = null; |
|
|
|
_this3.setState({ |
|
loading: false, |
|
availableTermsTree: availableTermsTree, |
|
availableTerms: terms |
|
}); |
|
}, function (xhr) { |
|
// reject |
|
if (xhr.statusText === 'abort') { |
|
return; |
|
} |
|
|
|
_this3.fetchRequest = null; |
|
|
|
_this3.setState({ |
|
loading: false |
|
}); |
|
}); |
|
} |
|
}, { |
|
key: "sortBySelected", |
|
value: function sortBySelected(termsTree) { |
|
var terms = this.props.terms; |
|
|
|
var treeHasSelection = function treeHasSelection(termTree) { |
|
if (terms.indexOf(termTree.id) !== -1) { |
|
return true; |
|
} |
|
|
|
if (undefined === termTree.children) { |
|
return false; |
|
} |
|
|
|
var anyChildIsSelected = termTree.children.map(treeHasSelection).filter(function (child) { |
|
return child; |
|
}).length > 0; |
|
|
|
if (anyChildIsSelected) { |
|
return true; |
|
} |
|
|
|
return false; |
|
}; |
|
|
|
var termOrChildIsSelected = function termOrChildIsSelected(termA, termB) { |
|
var termASelected = treeHasSelection(termA); |
|
var termBSelected = treeHasSelection(termB); |
|
|
|
if (termASelected === termBSelected) { |
|
return 0; |
|
} |
|
|
|
if (termASelected && !termBSelected) { |
|
return -1; |
|
} |
|
|
|
if (!termASelected && termBSelected) { |
|
return 1; |
|
} |
|
|
|
return 0; |
|
}; |
|
|
|
termsTree.sort(termOrChildIsSelected); |
|
return termsTree; |
|
} |
|
}, { |
|
key: "setFilterValue", |
|
value: function setFilterValue(event) { |
|
var availableTermsTree = this.state.availableTermsTree; |
|
var filterValue = event.target.value; |
|
var filteredTermsTree = availableTermsTree.map(this.getFilterMatcher(filterValue)).filter(function (term) { |
|
return term; |
|
}); |
|
|
|
var getResultCount = function getResultCount(terms) { |
|
var count = 0; |
|
|
|
for (var i = 0; i < terms.length; i++) { |
|
count++; |
|
|
|
if (undefined !== terms[i].children) { |
|
count += getResultCount(terms[i].children); |
|
} |
|
} |
|
|
|
return count; |
|
}; |
|
|
|
this.setState({ |
|
filterValue: filterValue, |
|
filteredTermsTree: filteredTermsTree |
|
}); |
|
var resultCount = getResultCount(filteredTermsTree); |
|
var resultsFoundMessage = Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_n"])('%d result found.', '%d results found.', resultCount), resultCount); |
|
this.props.debouncedSpeak(resultsFoundMessage, 'assertive'); |
|
} |
|
}, { |
|
key: "getFilterMatcher", |
|
value: function getFilterMatcher(filterValue) { |
|
var matchTermsForFilter = function matchTermsForFilter(originalTerm) { |
|
if ('' === filterValue) { |
|
return originalTerm; |
|
} // Shallow clone, because we'll be filtering the term's children and |
|
// don't want to modify the original term. |
|
|
|
|
|
var term = Object(objectSpread["a" /* default */])({}, originalTerm); // Map and filter the children, recursive so we deal with grandchildren |
|
// and any deeper levels. |
|
|
|
|
|
if (term.children.length > 0) { |
|
term.children = term.children.map(matchTermsForFilter).filter(function (child) { |
|
return child; |
|
}); |
|
} // If the term's name contains the filterValue, or it has children |
|
// (i.e. some child matched at some point in the tree) then return it. |
|
|
|
|
|
if (-1 !== term.name.toLowerCase().indexOf(filterValue) || term.children.length > 0) { |
|
return term; |
|
} // Otherwise, return false. After mapping, the list of terms will need |
|
// to have false values filtered out. |
|
|
|
|
|
return false; |
|
}; |
|
|
|
return matchTermsForFilter; |
|
} |
|
}, { |
|
key: "renderTerms", |
|
value: function renderTerms(renderedTerms) { |
|
var _this4 = this; |
|
|
|
var _this$props$terms2 = this.props.terms, |
|
terms = _this$props$terms2 === void 0 ? [] : _this$props$terms2; |
|
return renderedTerms.map(function (term) { |
|
var id = "editor-post-taxonomies-hierarchical-term-".concat(term.id); |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
key: term.id, |
|
className: "editor-post-taxonomies__hierarchical-terms-choice" |
|
}, Object(external_this_wp_element_["createElement"])("input", { |
|
id: id, |
|
className: "editor-post-taxonomies__hierarchical-terms-input", |
|
type: "checkbox", |
|
checked: terms.indexOf(term.id) !== -1, |
|
value: term.id, |
|
onChange: _this4.onChange |
|
}), Object(external_this_wp_element_["createElement"])("label", { |
|
htmlFor: id |
|
}, Object(external_lodash_["unescape"])(term.name)), !!term.children.length && Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-taxonomies__hierarchical-terms-subchoices" |
|
}, _this4.renderTerms(term.children))); |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props3 = this.props, |
|
slug = _this$props3.slug, |
|
taxonomy = _this$props3.taxonomy, |
|
instanceId = _this$props3.instanceId, |
|
hasCreateAction = _this$props3.hasCreateAction, |
|
hasAssignAction = _this$props3.hasAssignAction; |
|
|
|
if (!hasAssignAction) { |
|
return null; |
|
} |
|
|
|
var _this$state2 = this.state, |
|
availableTermsTree = _this$state2.availableTermsTree, |
|
availableTerms = _this$state2.availableTerms, |
|
filteredTermsTree = _this$state2.filteredTermsTree, |
|
formName = _this$state2.formName, |
|
formParent = _this$state2.formParent, |
|
loading = _this$state2.loading, |
|
showForm = _this$state2.showForm, |
|
filterValue = _this$state2.filterValue; |
|
|
|
var labelWithFallback = function labelWithFallback(labelProperty, fallbackIsCategory, fallbackIsNotCategory) { |
|
return Object(external_lodash_["get"])(taxonomy, ['labels', labelProperty], slug === 'category' ? fallbackIsCategory : fallbackIsNotCategory); |
|
}; |
|
|
|
var newTermButtonLabel = labelWithFallback('add_new_item', Object(external_this_wp_i18n_["__"])('Add new category'), Object(external_this_wp_i18n_["__"])('Add new term')); |
|
var newTermLabel = labelWithFallback('new_item_name', Object(external_this_wp_i18n_["__"])('Add new category'), Object(external_this_wp_i18n_["__"])('Add new term')); |
|
var parentSelectLabel = labelWithFallback('parent_item', Object(external_this_wp_i18n_["__"])('Parent Category'), Object(external_this_wp_i18n_["__"])('Parent Term')); |
|
var noParentOption = "\u2014 ".concat(parentSelectLabel, " \u2014"); |
|
var newTermSubmitLabel = newTermButtonLabel; |
|
var inputId = "editor-post-taxonomies__hierarchical-terms-input-".concat(instanceId); |
|
var filterInputId = "editor-post-taxonomies__hierarchical-terms-filter-".concat(instanceId); |
|
var filterLabel = Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_x"])('Search %s', 'term'), Object(external_lodash_["get"])(this.props.taxonomy, ['name'], slug === 'category' ? Object(external_this_wp_i18n_["__"])('Categories') : Object(external_this_wp_i18n_["__"])('Terms'))); |
|
var groupLabel = Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_x"])('Available %s', 'term'), Object(external_lodash_["get"])(this.props.taxonomy, ['name'], slug === 'category' ? Object(external_this_wp_i18n_["__"])('Categories') : Object(external_this_wp_i18n_["__"])('Terms'))); |
|
var showFilter = availableTerms.length >= MIN_TERMS_COUNT_FOR_FILTER; |
|
return [showFilter && Object(external_this_wp_element_["createElement"])("label", { |
|
key: "filter-label", |
|
htmlFor: filterInputId |
|
}, filterLabel), showFilter && Object(external_this_wp_element_["createElement"])("input", { |
|
type: "search", |
|
id: filterInputId, |
|
value: filterValue, |
|
onChange: this.setFilterValue, |
|
className: "editor-post-taxonomies__hierarchical-terms-filter", |
|
key: "term-filter-input" |
|
}), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-taxonomies__hierarchical-terms-list", |
|
key: "term-list", |
|
tabIndex: "0", |
|
role: "group", |
|
"aria-label": groupLabel |
|
}, this.renderTerms('' !== filterValue ? filteredTermsTree : availableTermsTree)), !loading && hasCreateAction && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
key: "term-add-button", |
|
onClick: this.onToggleForm, |
|
className: "editor-post-taxonomies__hierarchical-terms-add", |
|
"aria-expanded": showForm, |
|
isLink: true |
|
}, newTermButtonLabel), showForm && Object(external_this_wp_element_["createElement"])("form", { |
|
onSubmit: this.onAddTerm, |
|
key: "hierarchical-terms-form" |
|
}, Object(external_this_wp_element_["createElement"])("label", { |
|
htmlFor: inputId, |
|
className: "editor-post-taxonomies__hierarchical-terms-label" |
|
}, newTermLabel), Object(external_this_wp_element_["createElement"])("input", { |
|
type: "text", |
|
id: inputId, |
|
className: "editor-post-taxonomies__hierarchical-terms-input", |
|
value: formName, |
|
onChange: this.onChangeFormName, |
|
required: true |
|
}), !!availableTerms.length && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["TreeSelect"], { |
|
label: parentSelectLabel, |
|
noOptionLabel: noParentOption, |
|
onChange: this.onChangeFormParent, |
|
selectedId: formParent, |
|
tree: availableTermsTree |
|
}), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
isDefault: true, |
|
type: "submit", |
|
className: "editor-post-taxonomies__hierarchical-terms-submit" |
|
}, newTermSubmitLabel))]; |
|
/* eslint-enable jsx-a11y/no-onchange */ |
|
} |
|
}]); |
|
|
|
return HierarchicalTermSelector; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var hierarchical_term_selector = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, _ref) { |
|
var slug = _ref.slug; |
|
|
|
var _select = select('core/editor'), |
|
getCurrentPost = _select.getCurrentPost; |
|
|
|
var _select2 = select('core'), |
|
getTaxonomy = _select2.getTaxonomy; |
|
|
|
var taxonomy = getTaxonomy(slug); |
|
return { |
|
hasCreateAction: taxonomy ? Object(external_lodash_["get"])(getCurrentPost(), ['_links', 'wp:action-create-' + taxonomy.rest_base], false) : false, |
|
hasAssignAction: taxonomy ? Object(external_lodash_["get"])(getCurrentPost(), ['_links', 'wp:action-assign-' + taxonomy.rest_base], false) : false, |
|
terms: taxonomy ? select('core/editor').getEditedPostAttribute(taxonomy.rest_base) : [], |
|
taxonomy: taxonomy |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
onUpdateTerms: function onUpdateTerms(terms, restBase) { |
|
dispatch('core/editor').editPost(Object(defineProperty["a" /* default */])({}, restBase, terms)); |
|
} |
|
}; |
|
}), external_this_wp_components_["withSpokenMessages"], external_this_wp_compose_["withInstanceId"], Object(external_this_wp_components_["withFilters"])('editor.PostTaxonomyType')])(hierarchical_term_selector_HierarchicalTermSelector)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/index.js |
|
|
|
|
|
/** |
|
* External Dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
function PostTaxonomies(_ref) { |
|
var postType = _ref.postType, |
|
taxonomies = _ref.taxonomies, |
|
_ref$taxonomyWrapper = _ref.taxonomyWrapper, |
|
taxonomyWrapper = _ref$taxonomyWrapper === void 0 ? external_lodash_["identity"] : _ref$taxonomyWrapper; |
|
var availableTaxonomies = Object(external_lodash_["filter"])(taxonomies, function (taxonomy) { |
|
return Object(external_lodash_["includes"])(taxonomy.types, postType); |
|
}); |
|
var visibleTaxonomies = Object(external_lodash_["filter"])(availableTaxonomies, function (taxonomy) { |
|
return taxonomy.visibility.show_ui; |
|
}); |
|
return visibleTaxonomies.map(function (taxonomy) { |
|
var TaxonomyComponent = taxonomy.hierarchical ? hierarchical_term_selector : flat_term_selector; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], { |
|
key: "taxonomy-".concat(taxonomy.slug) |
|
}, taxonomyWrapper(Object(external_this_wp_element_["createElement"])(TaxonomyComponent, { |
|
slug: taxonomy.slug |
|
}), taxonomy)); |
|
}); |
|
} |
|
/* harmony default export */ var post_taxonomies = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
postType: select('core/editor').getCurrentPostType(), |
|
taxonomies: select('core').getTaxonomies({ |
|
per_page: -1 |
|
}) |
|
}; |
|
})])(PostTaxonomies)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-taxonomies/check.js |
|
/** |
|
* External Dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
function PostTaxonomiesCheck(_ref) { |
|
var postType = _ref.postType, |
|
taxonomies = _ref.taxonomies, |
|
children = _ref.children; |
|
var hasTaxonomies = Object(external_lodash_["some"])(taxonomies, function (taxonomy) { |
|
return Object(external_lodash_["includes"])(taxonomy.types, postType); |
|
}); |
|
|
|
if (!hasTaxonomies) { |
|
return null; |
|
} |
|
|
|
return children; |
|
} |
|
/* harmony default export */ var post_taxonomies_check = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
postType: select('core/editor').getCurrentPostType(), |
|
taxonomies: select('core').getTaxonomies() |
|
}; |
|
})])(PostTaxonomiesCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-text-editor/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
var post_text_editor_PostTextEditor = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PostTextEditor, _Component); |
|
|
|
function PostTextEditor() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, PostTextEditor); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PostTextEditor).apply(this, arguments)); |
|
_this.edit = _this.edit.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.stopEditing = _this.stopEditing.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.state = {}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(PostTextEditor, [{ |
|
key: "edit", |
|
|
|
/** |
|
* Handles a textarea change event to notify the onChange prop callback and |
|
* reflect the new value in the component's own state. This marks the start |
|
* of the user's edits, if not already changed, preventing future props |
|
* changes to value from replacing the rendered value. This is expected to |
|
* be followed by a reset to dirty state via `stopEditing`. |
|
* |
|
* @see stopEditing |
|
* |
|
* @param {Event} event Change event. |
|
*/ |
|
value: function edit(event) { |
|
var value = event.target.value; |
|
this.props.onChange(value); |
|
this.setState({ |
|
value: value, |
|
isDirty: true |
|
}); |
|
} |
|
/** |
|
* Function called when the user has completed their edits, responsible for |
|
* ensuring that changes, if made, are surfaced to the onPersist prop |
|
* callback and resetting dirty state. |
|
*/ |
|
|
|
}, { |
|
key: "stopEditing", |
|
value: function stopEditing() { |
|
if (this.state.isDirty) { |
|
this.props.onPersist(this.state.value); |
|
this.setState({ |
|
isDirty: false |
|
}); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var value = this.state.value; |
|
var instanceId = this.props.instanceId; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])("label", { |
|
htmlFor: "post-content-".concat(instanceId), |
|
className: "screen-reader-text" |
|
}, Object(external_this_wp_i18n_["__"])('Type text or HTML')), Object(external_this_wp_element_["createElement"])(react_autosize_textarea_lib_default.a, { |
|
autoComplete: "off", |
|
dir: "auto", |
|
value: value, |
|
onChange: this.edit, |
|
onBlur: this.stopEditing, |
|
className: "editor-post-text-editor", |
|
id: "post-content-".concat(instanceId), |
|
placeholder: Object(external_this_wp_i18n_["__"])('Start writing with text or HTML') |
|
})); |
|
} |
|
}], [{ |
|
key: "getDerivedStateFromProps", |
|
value: function getDerivedStateFromProps(props, state) { |
|
if (state.isDirty) { |
|
return null; |
|
} |
|
|
|
return { |
|
value: props.value, |
|
isDirty: false |
|
}; |
|
} |
|
}]); |
|
|
|
return PostTextEditor; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var post_text_editor = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getEditedPostContent = _select.getEditedPostContent; |
|
|
|
return { |
|
value: getEditedPostContent() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
editPost = _dispatch.editPost, |
|
resetBlocks = _dispatch.resetBlocks; |
|
|
|
return { |
|
onChange: function onChange(content) { |
|
editPost({ |
|
content: content |
|
}); |
|
}, |
|
onPersist: function onPersist(content) { |
|
resetBlocks(Object(external_this_wp_blocks_["parse"])(content)); |
|
} |
|
}; |
|
}), external_this_wp_compose_["withInstanceId"]])(post_text_editor_PostTextEditor)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-permalink/editor.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var editor_PostPermalinkEditor = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PostPermalinkEditor, _Component); |
|
|
|
function PostPermalinkEditor(_ref) { |
|
var _this; |
|
|
|
var permalinkParts = _ref.permalinkParts, |
|
slug = _ref.slug; |
|
|
|
Object(classCallCheck["a" /* default */])(this, PostPermalinkEditor); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PostPermalinkEditor).apply(this, arguments)); |
|
_this.state = { |
|
editedPostName: slug || permalinkParts.postName |
|
}; |
|
_this.onSavePermalink = _this.onSavePermalink.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(PostPermalinkEditor, [{ |
|
key: "onSavePermalink", |
|
value: function onSavePermalink(event) { |
|
var postName = cleanForSlug(this.state.editedPostName); |
|
event.preventDefault(); |
|
this.props.onSave(); |
|
|
|
if (postName === this.props.postName) { |
|
return; |
|
} |
|
|
|
this.props.editPost({ |
|
slug: postName |
|
}); |
|
this.setState({ |
|
editedPostName: postName |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this2 = this; |
|
|
|
var _this$props$permalink = this.props.permalinkParts, |
|
prefix = _this$props$permalink.prefix, |
|
suffix = _this$props$permalink.suffix; |
|
var editedPostName = this.state.editedPostName; |
|
/* eslint-disable jsx-a11y/no-autofocus */ |
|
// Autofocus is allowed here, as this mini-UI is only loaded when the user clicks to open it. |
|
|
|
return Object(external_this_wp_element_["createElement"])("form", { |
|
className: "editor-post-permalink-editor", |
|
onSubmit: this.onSavePermalink |
|
}, Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-post-permalink__editor-container" |
|
}, Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-post-permalink-editor__prefix" |
|
}, prefix), Object(external_this_wp_element_["createElement"])("input", { |
|
className: "editor-post-permalink-editor__edit", |
|
"aria-label": Object(external_this_wp_i18n_["__"])('Edit post permalink'), |
|
value: editedPostName, |
|
onChange: function onChange(event) { |
|
return _this2.setState({ |
|
editedPostName: event.target.value |
|
}); |
|
}, |
|
type: "text", |
|
autoFocus: true |
|
}), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-post-permalink-editor__suffix" |
|
}, suffix), "\u200E"), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
className: "editor-post-permalink-editor__save", |
|
isLarge: true, |
|
onClick: this.onSavePermalink |
|
}, Object(external_this_wp_i18n_["__"])('Save'))); |
|
/* eslint-enable jsx-a11y/no-autofocus */ |
|
} |
|
}]); |
|
|
|
return PostPermalinkEditor; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var post_permalink_editor = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getPermalinkParts = _select.getPermalinkParts; |
|
|
|
return { |
|
permalinkParts: getPermalinkParts() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
editPost = _dispatch.editPost; |
|
|
|
return { |
|
editPost: editPost |
|
}; |
|
})])(editor_PostPermalinkEditor)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-permalink/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal Dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
var post_permalink_PostPermalink = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PostPermalink, _Component); |
|
|
|
function PostPermalink() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, PostPermalink); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PostPermalink).apply(this, arguments)); |
|
_this.addVisibilityCheck = _this.addVisibilityCheck.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onVisibilityChange = _this.onVisibilityChange.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.state = { |
|
isCopied: false, |
|
isEditingPermalink: false |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(PostPermalink, [{ |
|
key: "addVisibilityCheck", |
|
value: function addVisibilityCheck() { |
|
window.addEventListener('visibilitychange', this.onVisibilityChange); |
|
} |
|
}, { |
|
key: "onVisibilityChange", |
|
value: function onVisibilityChange() { |
|
var _this$props = this.props, |
|
isEditable = _this$props.isEditable, |
|
refreshPost = _this$props.refreshPost; // If the user just returned after having clicked the "Change Permalinks" button, |
|
// fetch a new copy of the post from the server, just in case they enabled permalinks. |
|
|
|
if (!isEditable && 'visible' === document.visibilityState) { |
|
refreshPost(); |
|
} |
|
} |
|
}, { |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps, prevState) { |
|
// If we've just stopped editing the permalink, focus on the new permalink. |
|
if (prevState.isEditingPermalink && !this.state.isEditingPermalink) { |
|
this.linkElement.focus(); |
|
} |
|
} |
|
}, { |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
window.removeEventListener('visibilitychange', this.addVisibilityCheck); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this2 = this; |
|
|
|
var _this$props2 = this.props, |
|
isNew = _this$props2.isNew, |
|
postLink = _this$props2.postLink, |
|
permalinkParts = _this$props2.permalinkParts, |
|
postSlug = _this$props2.postSlug, |
|
postTitle = _this$props2.postTitle, |
|
postID = _this$props2.postID, |
|
isEditable = _this$props2.isEditable, |
|
isPublished = _this$props2.isPublished; |
|
|
|
if (isNew || !postLink) { |
|
return null; |
|
} |
|
|
|
var _this$state = this.state, |
|
isCopied = _this$state.isCopied, |
|
isEditingPermalink = _this$state.isEditingPermalink; |
|
var ariaLabel = isCopied ? Object(external_this_wp_i18n_["__"])('Permalink copied') : Object(external_this_wp_i18n_["__"])('Copy the permalink'); |
|
var prefix = permalinkParts.prefix, |
|
suffix = permalinkParts.suffix; |
|
var slug = postSlug || cleanForSlug(postTitle) || postID; |
|
var samplePermalink = isEditable ? prefix + slug + suffix : prefix; |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-permalink" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["ClipboardButton"], { |
|
className: classnames_default()('editor-post-permalink__copy', { |
|
'is-copied': isCopied |
|
}), |
|
text: samplePermalink, |
|
label: ariaLabel, |
|
onCopy: function onCopy() { |
|
return _this2.setState({ |
|
isCopied: true |
|
}); |
|
}, |
|
"aria-disabled": isCopied, |
|
icon: "admin-links" |
|
}), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-post-permalink__label" |
|
}, Object(external_this_wp_i18n_["__"])('Permalink:')), !isEditingPermalink && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["ExternalLink"], { |
|
className: "editor-post-permalink__link", |
|
href: !isPublished ? postLink : samplePermalink, |
|
target: "_blank", |
|
ref: function ref(linkElement) { |
|
return _this2.linkElement = linkElement; |
|
} |
|
}, Object(external_this_wp_url_["safeDecodeURI"])(samplePermalink), "\u200E"), isEditingPermalink && Object(external_this_wp_element_["createElement"])(post_permalink_editor, { |
|
slug: slug, |
|
onSave: function onSave() { |
|
return _this2.setState({ |
|
isEditingPermalink: false |
|
}); |
|
} |
|
}), isEditable && !isEditingPermalink && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
className: "editor-post-permalink__edit", |
|
isLarge: true, |
|
onClick: function onClick() { |
|
return _this2.setState({ |
|
isEditingPermalink: true |
|
}); |
|
} |
|
}, Object(external_this_wp_i18n_["__"])('Edit')), !isEditable && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
className: "editor-post-permalink__change", |
|
isLarge: true, |
|
href: getWPAdminURL('options-permalink.php'), |
|
onClick: this.addVisibilityCheck, |
|
target: "_blank" |
|
}, Object(external_this_wp_i18n_["__"])('Change Permalinks'))); |
|
} |
|
}]); |
|
|
|
return PostPermalink; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var post_permalink = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
isEditedPostNew = _select.isEditedPostNew, |
|
isPermalinkEditable = _select.isPermalinkEditable, |
|
getCurrentPost = _select.getCurrentPost, |
|
getPermalinkParts = _select.getPermalinkParts, |
|
getEditedPostAttribute = _select.getEditedPostAttribute, |
|
isCurrentPostPublished = _select.isCurrentPostPublished; |
|
|
|
var _getCurrentPost = getCurrentPost(), |
|
id = _getCurrentPost.id, |
|
link = _getCurrentPost.link; |
|
|
|
return { |
|
isNew: isEditedPostNew(), |
|
postLink: link, |
|
permalinkParts: getPermalinkParts(), |
|
postSlug: getEditedPostAttribute('slug'), |
|
isEditable: isPermalinkEditable(), |
|
isPublished: isCurrentPostPublished(), |
|
postTitle: getEditedPostAttribute('title'), |
|
postID: id |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
refreshPost = _dispatch.refreshPost; |
|
|
|
return { |
|
refreshPost: refreshPost |
|
}; |
|
})])(post_permalink_PostPermalink)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-title/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Constants |
|
*/ |
|
|
|
var REGEXP_NEWLINES = /[\r\n]+/g; |
|
|
|
var post_title_PostTitle = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PostTitle, _Component); |
|
|
|
function PostTitle() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, PostTitle); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PostTitle).apply(this, arguments)); |
|
_this.onChange = _this.onChange.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onSelect = _this.onSelect.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onUnselect = _this.onUnselect.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onKeyDown = _this.onKeyDown.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.redirectHistory = _this.redirectHistory.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.state = { |
|
isSelected: false |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(PostTitle, [{ |
|
key: "handleFocusOutside", |
|
value: function handleFocusOutside() { |
|
this.onUnselect(); |
|
} |
|
}, { |
|
key: "onSelect", |
|
value: function onSelect() { |
|
this.setState({ |
|
isSelected: true |
|
}); |
|
this.props.clearSelectedBlock(); |
|
} |
|
}, { |
|
key: "onUnselect", |
|
value: function onUnselect() { |
|
this.setState({ |
|
isSelected: false |
|
}); |
|
} |
|
}, { |
|
key: "onChange", |
|
value: function onChange(event) { |
|
var newTitle = event.target.value.replace(REGEXP_NEWLINES, ' '); |
|
this.props.onUpdate(newTitle); |
|
} |
|
}, { |
|
key: "onKeyDown", |
|
value: function onKeyDown(event) { |
|
if (event.keyCode === external_this_wp_keycodes_["ENTER"]) { |
|
event.preventDefault(); |
|
this.props.onEnterPress(); |
|
} |
|
} |
|
/** |
|
* Emulates behavior of an undo or redo on its corresponding key press |
|
* combination. This is a workaround to React's treatment of undo in a |
|
* controlled textarea where characters are updated one at a time. |
|
* Instead, leverage the store's undo handling of title changes. |
|
* |
|
* @see https://github.com/facebook/react/issues/8514 |
|
* |
|
* @param {KeyboardEvent} event Key event. |
|
*/ |
|
|
|
}, { |
|
key: "redirectHistory", |
|
value: function redirectHistory(event) { |
|
if (event.shiftKey) { |
|
this.props.onRedo(); |
|
} else { |
|
this.props.onUndo(); |
|
} |
|
|
|
event.preventDefault(); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this$props = this.props, |
|
hasFixedToolbar = _this$props.hasFixedToolbar, |
|
isCleanNewPost = _this$props.isCleanNewPost, |
|
isFocusMode = _this$props.isFocusMode, |
|
isPostTypeViewable = _this$props.isPostTypeViewable, |
|
instanceId = _this$props.instanceId, |
|
placeholder = _this$props.placeholder, |
|
title = _this$props.title; |
|
var isSelected = this.state.isSelected; // The wp-block className is important for editor styles. |
|
|
|
var className = classnames_default()('wp-block editor-post-title__block', { |
|
'is-selected': isSelected, |
|
'is-focus-mode': isFocusMode, |
|
'has-fixed-toolbar': hasFixedToolbar |
|
}); |
|
var decodedPlaceholder = Object(external_this_wp_htmlEntities_["decodeEntities"])(placeholder); |
|
return Object(external_this_wp_element_["createElement"])(post_type_support_check, { |
|
supportKeys: "title" |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-post-title" |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: className |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["KeyboardShortcuts"], { |
|
shortcuts: { |
|
'mod+z': this.redirectHistory, |
|
'mod+shift+z': this.redirectHistory |
|
} |
|
}, Object(external_this_wp_element_["createElement"])("label", { |
|
htmlFor: "post-title-".concat(instanceId), |
|
className: "screen-reader-text" |
|
}, decodedPlaceholder || Object(external_this_wp_i18n_["__"])('Add title')), Object(external_this_wp_element_["createElement"])(react_autosize_textarea_lib_default.a, { |
|
id: "post-title-".concat(instanceId), |
|
className: "editor-post-title__input", |
|
value: title, |
|
onChange: this.onChange, |
|
placeholder: decodedPlaceholder || Object(external_this_wp_i18n_["__"])('Add title'), |
|
onFocus: this.onSelect, |
|
onKeyDown: this.onKeyDown, |
|
onKeyPress: this.onUnselect |
|
/* |
|
Only autofocus the title when the post is entirely empty. |
|
This should only happen for a new post, which means we |
|
focus the title on new post so the author can start typing |
|
right away, without needing to click anything. |
|
*/ |
|
|
|
/* eslint-disable jsx-a11y/no-autofocus */ |
|
, |
|
autoFocus: isCleanNewPost |
|
/* eslint-enable jsx-a11y/no-autofocus */ |
|
|
|
})), isSelected && isPostTypeViewable && Object(external_this_wp_element_["createElement"])(post_permalink, null)))); |
|
} |
|
}]); |
|
|
|
return PostTitle; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
var post_title_applyWithSelect = Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getEditedPostAttribute = _select.getEditedPostAttribute, |
|
getEditorSettings = _select.getEditorSettings, |
|
isCleanNewPost = _select.isCleanNewPost; |
|
|
|
var _select2 = select('core'), |
|
getPostType = _select2.getPostType; |
|
|
|
var postType = getPostType(getEditedPostAttribute('type')); |
|
|
|
var _getEditorSettings = getEditorSettings(), |
|
titlePlaceholder = _getEditorSettings.titlePlaceholder, |
|
focusMode = _getEditorSettings.focusMode, |
|
hasFixedToolbar = _getEditorSettings.hasFixedToolbar; |
|
|
|
return { |
|
isCleanNewPost: isCleanNewPost(), |
|
title: getEditedPostAttribute('title'), |
|
isPostTypeViewable: Object(external_lodash_["get"])(postType, ['viewable'], false), |
|
placeholder: titlePlaceholder, |
|
isFocusMode: focusMode, |
|
hasFixedToolbar: hasFixedToolbar |
|
}; |
|
}); |
|
var post_title_applyWithDispatch = Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
insertDefaultBlock = _dispatch.insertDefaultBlock, |
|
editPost = _dispatch.editPost, |
|
clearSelectedBlock = _dispatch.clearSelectedBlock, |
|
undo = _dispatch.undo, |
|
redo = _dispatch.redo; |
|
|
|
return { |
|
onEnterPress: function onEnterPress() { |
|
insertDefaultBlock(undefined, undefined, 0); |
|
}, |
|
onUpdate: function onUpdate(title) { |
|
editPost({ |
|
title: title |
|
}); |
|
}, |
|
onUndo: undo, |
|
onRedo: redo, |
|
clearSelectedBlock: clearSelectedBlock |
|
}; |
|
}); |
|
/* harmony default export */ var post_title = (Object(external_this_wp_compose_["compose"])(post_title_applyWithSelect, post_title_applyWithDispatch, external_this_wp_compose_["withInstanceId"], external_this_wp_components_["withFocusOutside"])(post_title_PostTitle)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-trash/index.js |
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
function PostTrash(_ref) { |
|
var isNew = _ref.isNew, |
|
postId = _ref.postId, |
|
postType = _ref.postType, |
|
props = Object(objectWithoutProperties["a" /* default */])(_ref, ["isNew", "postId", "postType"]); |
|
|
|
if (isNew || !postId) { |
|
return null; |
|
} |
|
|
|
var onClick = function onClick() { |
|
return props.trashPost(postId, postType); |
|
}; |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
className: "editor-post-trash button-link-delete", |
|
onClick: onClick, |
|
isDefault: true, |
|
isLarge: true |
|
}, Object(external_this_wp_i18n_["__"])('Move to trash')); |
|
} |
|
|
|
/* harmony default export */ var post_trash = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
isEditedPostNew = _select.isEditedPostNew, |
|
getCurrentPostId = _select.getCurrentPostId, |
|
getCurrentPostType = _select.getCurrentPostType; |
|
|
|
return { |
|
isNew: isEditedPostNew(), |
|
postId: getCurrentPostId(), |
|
postType: getCurrentPostType() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
return { |
|
trashPost: dispatch('core/editor').trashPost |
|
}; |
|
})])(PostTrash)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-trash/check.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
function PostTrashCheck(_ref) { |
|
var isNew = _ref.isNew, |
|
postId = _ref.postId, |
|
children = _ref.children; |
|
|
|
if (isNew || !postId) { |
|
return null; |
|
} |
|
|
|
return children; |
|
} |
|
|
|
/* harmony default export */ var post_trash_check = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
isEditedPostNew = _select.isEditedPostNew, |
|
getCurrentPostId = _select.getCurrentPostId; |
|
|
|
return { |
|
isNew: isEditedPostNew(), |
|
postId: getCurrentPostId() |
|
}; |
|
})(PostTrashCheck)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/post-visibility/check.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
function PostVisibilityCheck(_ref) { |
|
var hasPublishAction = _ref.hasPublishAction, |
|
render = _ref.render; |
|
var canEdit = hasPublishAction; |
|
return render({ |
|
canEdit: canEdit |
|
}); |
|
} |
|
/* harmony default export */ var post_visibility_check = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getCurrentPost = _select.getCurrentPost, |
|
getCurrentPostType = _select.getCurrentPostType; |
|
|
|
return { |
|
hasPublishAction: Object(external_lodash_["get"])(getCurrentPost(), ['_links', 'wp:action-publish'], false), |
|
postType: getCurrentPostType() |
|
}; |
|
})])(PostVisibilityCheck)); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","wordcount"]} |
|
var external_this_wp_wordcount_ = __webpack_require__(97); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/word-count/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
function WordCount(_ref) { |
|
var content = _ref.content; |
|
|
|
/* |
|
* translators: If your word count is based on single characters (e.g. East Asian characters), |
|
* enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'. |
|
* Do not translate into your own language. |
|
*/ |
|
var wordCountType = Object(external_this_wp_i18n_["_x"])('words', 'Word count type. Do not translate!'); |
|
|
|
return Object(external_this_wp_element_["createElement"])("span", { |
|
className: "word-count" |
|
}, Object(external_this_wp_wordcount_["count"])(content, wordCountType)); |
|
} |
|
|
|
/* harmony default export */ var word_count = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
content: select('core/editor').getEditedPostAttribute('content') |
|
}; |
|
})(WordCount)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/table-of-contents/panel.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
function TableOfContentsPanel(_ref) { |
|
var headingCount = _ref.headingCount, |
|
paragraphCount = _ref.paragraphCount, |
|
numberOfBlocks = _ref.numberOfBlocks; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "table-of-contents__counts", |
|
role: "note", |
|
"aria-label": Object(external_this_wp_i18n_["__"])('Document Statistics'), |
|
tabIndex: "0" |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "table-of-contents__count" |
|
}, Object(external_this_wp_i18n_["__"])('Words'), Object(external_this_wp_element_["createElement"])(word_count, null)), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "table-of-contents__count" |
|
}, Object(external_this_wp_i18n_["__"])('Headings'), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "table-of-contents__number" |
|
}, headingCount)), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "table-of-contents__count" |
|
}, Object(external_this_wp_i18n_["__"])('Paragraphs'), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "table-of-contents__number" |
|
}, paragraphCount)), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "table-of-contents__count" |
|
}, Object(external_this_wp_i18n_["__"])('Blocks'), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "table-of-contents__number" |
|
}, numberOfBlocks))), headingCount > 0 && Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])("hr", null), Object(external_this_wp_element_["createElement"])("span", { |
|
className: "table-of-contents__title" |
|
}, Object(external_this_wp_i18n_["__"])('Document Outline')), Object(external_this_wp_element_["createElement"])(document_outline, null))); |
|
} |
|
|
|
/* harmony default export */ var table_of_contents_panel = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getGlobalBlockCount = _select.getGlobalBlockCount; |
|
|
|
return { |
|
headingCount: getGlobalBlockCount('core/heading'), |
|
paragraphCount: getGlobalBlockCount('core/paragraph'), |
|
numberOfBlocks: getGlobalBlockCount() |
|
}; |
|
})(TableOfContentsPanel)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/table-of-contents/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
function TableOfContents(_ref) { |
|
var hasBlocks = _ref.hasBlocks; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Dropdown"], { |
|
position: "bottom", |
|
className: "table-of-contents", |
|
contentClassName: "table-of-contents__popover", |
|
renderToggle: function renderToggle(_ref2) { |
|
var isOpen = _ref2.isOpen, |
|
onToggle = _ref2.onToggle; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
onClick: hasBlocks ? onToggle : undefined, |
|
icon: "info-outline", |
|
"aria-expanded": isOpen, |
|
label: Object(external_this_wp_i18n_["__"])('Content structure'), |
|
labelPosition: "bottom", |
|
"aria-disabled": !hasBlocks |
|
}); |
|
}, |
|
renderContent: function renderContent() { |
|
return Object(external_this_wp_element_["createElement"])(table_of_contents_panel, null); |
|
} |
|
}); |
|
} |
|
|
|
/* harmony default export */ var table_of_contents = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
hasBlocks: !!select('core/editor').getBlockCount() |
|
}; |
|
})(TableOfContents)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/unsaved-changes-warning/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
var unsaved_changes_warning_UnsavedChangesWarning = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(UnsavedChangesWarning, _Component); |
|
|
|
function UnsavedChangesWarning() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, UnsavedChangesWarning); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(UnsavedChangesWarning).apply(this, arguments)); |
|
_this.warnIfUnsavedChanges = _this.warnIfUnsavedChanges.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(UnsavedChangesWarning, [{ |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
window.addEventListener('beforeunload', this.warnIfUnsavedChanges); |
|
} |
|
}, { |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
window.removeEventListener('beforeunload', this.warnIfUnsavedChanges); |
|
} |
|
/** |
|
* Warns the user if there are unsaved changes before leaving the editor. |
|
* |
|
* @param {Event} event `beforeunload` event. |
|
* |
|
* @return {?string} Warning prompt message, if unsaved changes exist. |
|
*/ |
|
|
|
}, { |
|
key: "warnIfUnsavedChanges", |
|
value: function warnIfUnsavedChanges(event) { |
|
var isDirty = this.props.isDirty; |
|
|
|
if (isDirty) { |
|
event.returnValue = Object(external_this_wp_i18n_["__"])('You have unsaved changes. If you proceed, they will be lost.'); |
|
return event.returnValue; |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
return null; |
|
} |
|
}]); |
|
|
|
return UnsavedChangesWarning; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var unsaved_changes_warning = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
isDirty: select('core/editor').isEditedPostDirty() |
|
}; |
|
})(unsaved_changes_warning_UnsavedChangesWarning)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/skip-to-selected-block/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal Dependencies |
|
*/ |
|
|
|
|
|
|
|
var skip_to_selected_block_SkipToSelectedBlock = function SkipToSelectedBlock(_ref) { |
|
var selectedBlockClientId = _ref.selectedBlockClientId; |
|
|
|
var onClick = function onClick() { |
|
var selectedBlockElement = getBlockFocusableWrapper(selectedBlockClientId); |
|
selectedBlockElement.focus(); |
|
}; |
|
|
|
return selectedBlockClientId && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
isDefault: true, |
|
type: "button", |
|
className: "editor-skip-to-selected-block", |
|
onClick: onClick |
|
}, Object(external_this_wp_i18n_["__"])('Skip to the selected block')); |
|
}; |
|
|
|
/* harmony default export */ var skip_to_selected_block = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
selectedBlockClientId: select('core/editor').getBlockSelectionStart() |
|
}; |
|
})(skip_to_selected_block_SkipToSelectedBlock)); |
|
|
|
// EXTERNAL MODULE: external {"this":["wp","tokenList"]} |
|
var external_this_wp_tokenList_ = __webpack_require__(124); |
|
var external_this_wp_tokenList_default = /*#__PURE__*/__webpack_require__.n(external_this_wp_tokenList_); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-styles/index.js |
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Returns the active style from the given className. |
|
* |
|
* @param {Array} styles Block style variations. |
|
* @param {string} className Class name |
|
* |
|
* @return {Object?} The active style. |
|
*/ |
|
|
|
function getActiveStyle(styles, className) { |
|
var _iteratorNormalCompletion = true; |
|
var _didIteratorError = false; |
|
var _iteratorError = undefined; |
|
|
|
try { |
|
for (var _iterator = new external_this_wp_tokenList_default.a(className).values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { |
|
var style = _step.value; |
|
|
|
if (style.indexOf('is-style-') === -1) { |
|
continue; |
|
} |
|
|
|
var potentialStyleName = style.substring(9); |
|
var activeStyle = Object(external_lodash_["find"])(styles, { |
|
name: potentialStyleName |
|
}); |
|
|
|
if (activeStyle) { |
|
return activeStyle; |
|
} |
|
} |
|
} catch (err) { |
|
_didIteratorError = true; |
|
_iteratorError = err; |
|
} finally { |
|
try { |
|
if (!_iteratorNormalCompletion && _iterator.return != null) { |
|
_iterator.return(); |
|
} |
|
} finally { |
|
if (_didIteratorError) { |
|
throw _iteratorError; |
|
} |
|
} |
|
} |
|
|
|
return Object(external_lodash_["find"])(styles, 'isDefault'); |
|
} |
|
/** |
|
* Replaces the active style in the block's className. |
|
* |
|
* @param {string} className Class name. |
|
* @param {Object?} activeStyle The replaced style. |
|
* @param {Object} newStyle The replacing style. |
|
* |
|
* @return {string} The updated className. |
|
*/ |
|
|
|
function replaceActiveStyle(className, activeStyle, newStyle) { |
|
var list = new external_this_wp_tokenList_default.a(className); |
|
|
|
if (activeStyle) { |
|
list.remove('is-style-' + activeStyle.name); |
|
} |
|
|
|
list.add('is-style-' + newStyle.name); |
|
return list.value; |
|
} |
|
|
|
function BlockStyles(_ref) { |
|
var styles = _ref.styles, |
|
className = _ref.className, |
|
onChangeClassName = _ref.onChangeClassName, |
|
name = _ref.name, |
|
attributes = _ref.attributes, |
|
_ref$onSwitch = _ref.onSwitch, |
|
onSwitch = _ref$onSwitch === void 0 ? external_lodash_["noop"] : _ref$onSwitch, |
|
_ref$onHoverClassName = _ref.onHoverClassName, |
|
onHoverClassName = _ref$onHoverClassName === void 0 ? external_lodash_["noop"] : _ref$onHoverClassName; |
|
|
|
if (!styles || styles.length === 0) { |
|
return null; |
|
} |
|
|
|
var activeStyle = getActiveStyle(styles, className); |
|
|
|
function updateClassName(style) { |
|
var updatedClassName = replaceActiveStyle(className, activeStyle, style); |
|
onChangeClassName(updatedClassName); |
|
onSwitch(); |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-styles" |
|
}, styles.map(function (style) { |
|
var styleClassName = replaceActiveStyle(className, activeStyle, style); |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
key: style.name, |
|
className: classnames_default()('editor-block-styles__item', { |
|
'is-active': activeStyle === style |
|
}), |
|
onClick: function onClick() { |
|
return updateClassName(style); |
|
}, |
|
onKeyDown: function onKeyDown(event) { |
|
if (external_this_wp_keycodes_["ENTER"] === event.keyCode || external_this_wp_keycodes_["SPACE"] === event.keyCode) { |
|
event.preventDefault(); |
|
updateClassName(style); |
|
} |
|
}, |
|
onMouseEnter: function onMouseEnter() { |
|
return onHoverClassName(styleClassName); |
|
}, |
|
onMouseLeave: function onMouseLeave() { |
|
return onHoverClassName(null); |
|
}, |
|
role: "button", |
|
tabIndex: "0", |
|
"aria-label": style.label || style.name |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-styles__item-preview" |
|
}, Object(external_this_wp_element_["createElement"])(BlockPreviewContent, { |
|
name: name, |
|
attributes: Object(objectSpread["a" /* default */])({}, attributes, { |
|
className: styleClassName |
|
}) |
|
})), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-styles__item-label" |
|
}, style.label || style.name)); |
|
})); |
|
} |
|
|
|
/* harmony default export */ var block_styles = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, _ref2) { |
|
var clientId = _ref2.clientId; |
|
|
|
var _select = select('core/editor'), |
|
getBlock = _select.getBlock; |
|
|
|
var _select2 = select('core/blocks'), |
|
getBlockStyles = _select2.getBlockStyles; |
|
|
|
var block = getBlock(clientId); |
|
return { |
|
name: block.name, |
|
attributes: block.attributes, |
|
className: block.attributes.className || '', |
|
styles: getBlockStyles(block.name) |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, _ref3) { |
|
var clientId = _ref3.clientId; |
|
return { |
|
onChangeClassName: function onChangeClassName(newClassName) { |
|
dispatch('core/editor').updateBlockAttributes(clientId, { |
|
className: newClassName |
|
}); |
|
} |
|
}; |
|
})])(BlockStyles)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/multi-selection-inspector/index.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal Dependencies |
|
*/ |
|
|
|
|
|
|
|
function MultiSelectionInspector(_ref) { |
|
var blocks = _ref.blocks; |
|
var words = Object(external_this_wp_wordcount_["count"])(Object(external_this_wp_blocks_["serialize"])(blocks), 'words'); |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-multi-selection-inspector__card" |
|
}, Object(external_this_wp_element_["createElement"])(BlockIcon, { |
|
icon: Object(external_this_wp_element_["createElement"])(external_this_wp_components_["SVG"], { |
|
xmlns: "http://www.w3.org/2000/svg", |
|
viewBox: "0 0 24 24" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Path"], { |
|
d: "M3 5H1v16c0 1.1.9 2 2 2h16v-2H3V5zm18-4H7c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V3c0-1.1-.9-2-2-2zm0 16H7V3h14v14z" |
|
})), |
|
showColors: true |
|
}), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-multi-selection-inspector__card-content" |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-multi-selection-inspector__card-title" |
|
}, |
|
/* translators: %d: number of blocks */ |
|
Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_n"])('%d block', '%d blocks', blocks.length), blocks.length)), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-multi-selection-inspector__card-description" |
|
}, |
|
/* translators: %d: number of words */ |
|
Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_n"])('%d word', '%d words', words), words)))); |
|
} |
|
|
|
/* harmony default export */ var multi_selection_inspector = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getMultiSelectedBlocks = _select.getMultiSelectedBlocks; |
|
|
|
return { |
|
blocks: getMultiSelectedBlocks() |
|
}; |
|
})(MultiSelectionInspector)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-inspector/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal Dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var block_inspector_BlockInspector = function BlockInspector(_ref) { |
|
var selectedBlockClientId = _ref.selectedBlockClientId, |
|
selectedBlockName = _ref.selectedBlockName, |
|
blockType = _ref.blockType, |
|
count = _ref.count, |
|
hasBlockStyles = _ref.hasBlockStyles; |
|
|
|
if (count > 1) { |
|
return Object(external_this_wp_element_["createElement"])(multi_selection_inspector, null); |
|
} |
|
|
|
var isSelectedBlockUnregistered = selectedBlockName === Object(external_this_wp_blocks_["getUnregisteredTypeHandlerName"])(); |
|
/* |
|
* If the selected block is of an unregistered type, avoid showing it as an actual selection |
|
* because we want the user to focus on the unregistered block warning, not block settings. |
|
*/ |
|
|
|
if (!blockType || !selectedBlockClientId || isSelectedBlockUnregistered) { |
|
return Object(external_this_wp_element_["createElement"])("span", { |
|
className: "editor-block-inspector__no-blocks" |
|
}, Object(external_this_wp_i18n_["__"])('No block selected.')); |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-inspector__card" |
|
}, Object(external_this_wp_element_["createElement"])(BlockIcon, { |
|
icon: blockType.icon, |
|
showColors: true |
|
}), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-inspector__card-content" |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-inspector__card-title" |
|
}, blockType.title), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-inspector__card-description" |
|
}, blockType.description))), hasBlockStyles && Object(external_this_wp_element_["createElement"])("div", null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
title: Object(external_this_wp_i18n_["__"])('Styles'), |
|
initialOpen: false |
|
}, Object(external_this_wp_element_["createElement"])(block_styles, { |
|
clientId: selectedBlockClientId |
|
}))), Object(external_this_wp_element_["createElement"])("div", null, Object(external_this_wp_element_["createElement"])(inspector_controls.Slot, null)), Object(external_this_wp_element_["createElement"])("div", null, Object(external_this_wp_element_["createElement"])(inspector_advanced_controls.Slot, null, function (fills) { |
|
return !Object(external_lodash_["isEmpty"])(fills) && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
className: "editor-block-inspector__advanced", |
|
title: Object(external_this_wp_i18n_["__"])('Advanced'), |
|
initialOpen: false |
|
}, fills); |
|
})), Object(external_this_wp_element_["createElement"])(skip_to_selected_block, { |
|
key: "back" |
|
})); |
|
}; |
|
|
|
/* harmony default export */ var block_inspector = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getSelectedBlockClientId = _select.getSelectedBlockClientId, |
|
getSelectedBlockCount = _select.getSelectedBlockCount, |
|
getBlockName = _select.getBlockName; |
|
|
|
var _select2 = select('core/blocks'), |
|
getBlockStyles = _select2.getBlockStyles; |
|
|
|
var selectedBlockClientId = getSelectedBlockClientId(); |
|
var selectedBlockName = selectedBlockClientId && getBlockName(selectedBlockClientId); |
|
var blockType = selectedBlockClientId && Object(external_this_wp_blocks_["getBlockType"])(selectedBlockName); |
|
var blockStyles = selectedBlockClientId && getBlockStyles(selectedBlockName); |
|
return { |
|
count: getSelectedBlockCount(), |
|
hasBlockStyles: blockStyles && blockStyles.length > 0, |
|
selectedBlockName: selectedBlockName, |
|
selectedBlockClientId: selectedBlockClientId, |
|
blockType: blockType |
|
}; |
|
})(block_inspector_BlockInspector)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-selection-clearer/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
var block_selection_clearer_BlockSelectionClearer = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockSelectionClearer, _Component); |
|
|
|
function BlockSelectionClearer() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, BlockSelectionClearer); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockSelectionClearer).apply(this, arguments)); |
|
_this.bindContainer = _this.bindContainer.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.clearSelectionIfFocusTarget = _this.clearSelectionIfFocusTarget.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockSelectionClearer, [{ |
|
key: "bindContainer", |
|
value: function bindContainer(ref) { |
|
this.container = ref; |
|
} |
|
/** |
|
* Clears the selected block on focus if the container is the target of the |
|
* focus. This assumes no other descendents have received focus until event |
|
* has bubbled to the container. |
|
* |
|
* @param {FocusEvent} event Focus event. |
|
*/ |
|
|
|
}, { |
|
key: "clearSelectionIfFocusTarget", |
|
value: function clearSelectionIfFocusTarget(event) { |
|
var _this$props = this.props, |
|
hasSelectedBlock = _this$props.hasSelectedBlock, |
|
hasMultiSelection = _this$props.hasMultiSelection, |
|
clearSelectedBlock = _this$props.clearSelectedBlock; |
|
var hasSelection = hasSelectedBlock || hasMultiSelection; |
|
|
|
if (event.target === this.container && hasSelection) { |
|
clearSelectedBlock(); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
return Object(external_this_wp_element_["createElement"])("div", Object(esm_extends["a" /* default */])({ |
|
tabIndex: -1, |
|
onFocus: this.clearSelectionIfFocusTarget, |
|
ref: this.bindContainer |
|
}, Object(external_lodash_["omit"])(this.props, ['clearSelectedBlock', 'hasSelectedBlock', 'hasMultiSelection']))); |
|
} |
|
}]); |
|
|
|
return BlockSelectionClearer; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var block_selection_clearer = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
hasSelectedBlock = _select.hasSelectedBlock, |
|
hasMultiSelection = _select.hasMultiSelection; |
|
|
|
return { |
|
hasSelectedBlock: hasSelectedBlock(), |
|
hasMultiSelection: hasMultiSelection() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
clearSelectedBlock = _dispatch.clearSelectedBlock; |
|
|
|
return { |
|
clearSelectedBlock: clearSelectedBlock |
|
}; |
|
})])(block_selection_clearer_BlockSelectionClearer)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-settings-menu/block-mode-toggle.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
function BlockModeToggle(_ref) { |
|
var blockType = _ref.blockType, |
|
mode = _ref.mode, |
|
onToggleMode = _ref.onToggleMode, |
|
_ref$small = _ref.small, |
|
small = _ref$small === void 0 ? false : _ref$small; |
|
|
|
if (!Object(external_this_wp_blocks_["hasBlockSupport"])(blockType, 'html', true)) { |
|
return null; |
|
} |
|
|
|
var label = mode === 'visual' ? Object(external_this_wp_i18n_["__"])('Edit as HTML') : Object(external_this_wp_i18n_["__"])('Edit visually'); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["MenuItem"], { |
|
className: "editor-block-settings-menu__control", |
|
onClick: onToggleMode, |
|
icon: "html", |
|
label: small ? label : undefined |
|
}, !small && label); |
|
} |
|
/* harmony default export */ var block_mode_toggle = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, _ref2) { |
|
var clientId = _ref2.clientId; |
|
|
|
var _select = select('core/editor'), |
|
getBlock = _select.getBlock, |
|
getBlockMode = _select.getBlockMode; |
|
|
|
var block = getBlock(clientId); |
|
return { |
|
mode: getBlockMode(clientId), |
|
blockType: block ? Object(external_this_wp_blocks_["getBlockType"])(block.name) : null |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, _ref3) { |
|
var _ref3$onToggle = _ref3.onToggle, |
|
onToggle = _ref3$onToggle === void 0 ? external_lodash_["noop"] : _ref3$onToggle, |
|
clientId = _ref3.clientId; |
|
return { |
|
onToggleMode: function onToggleMode() { |
|
dispatch('core/editor').toggleBlockMode(clientId); |
|
onToggle(); |
|
} |
|
}; |
|
})])(BlockModeToggle)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-settings-menu/reusable-block-convert-button.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function ReusableBlockConvertButton(_ref) { |
|
var isVisible = _ref.isVisible, |
|
isStaticBlock = _ref.isStaticBlock, |
|
onConvertToStatic = _ref.onConvertToStatic, |
|
onConvertToReusable = _ref.onConvertToReusable; |
|
|
|
if (!isVisible) { |
|
return null; |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, isStaticBlock && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["MenuItem"], { |
|
className: "editor-block-settings-menu__control", |
|
icon: "controls-repeat", |
|
onClick: onConvertToReusable |
|
}, Object(external_this_wp_i18n_["__"])('Add to Reusable Blocks')), !isStaticBlock && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["MenuItem"], { |
|
className: "editor-block-settings-menu__control", |
|
icon: "controls-repeat", |
|
onClick: onConvertToStatic |
|
}, Object(external_this_wp_i18n_["__"])('Convert to Regular Block'))); |
|
} |
|
/* harmony default export */ var reusable_block_convert_button = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, _ref2) { |
|
var clientIds = _ref2.clientIds; |
|
|
|
var _select = select('core/editor'), |
|
getBlocksByClientId = _select.getBlocksByClientId, |
|
canInsertBlockType = _select.canInsertBlockType, |
|
getReusableBlock = _select.__experimentalGetReusableBlock; |
|
|
|
var blocks = getBlocksByClientId(clientIds); |
|
var isVisible = // Hide 'Add to Reusable Blocks' when Reusable Blocks are disabled, i.e. when |
|
// core/block is not in the allowed_block_types filter. |
|
canInsertBlockType('core/block') && Object(external_lodash_["every"])(blocks, function (block) { |
|
return (// Guard against the case where a regular block has *just* been converted to a |
|
// reusable block and doesn't yet exist in the editor store. |
|
!!block && // Only show the option to covert to reusable blocks on valid blocks. |
|
block.isValid && // Make sure the block supports being converted into a reusable block (by default that is the case). |
|
Object(external_this_wp_blocks_["hasBlockSupport"])(block.name, 'reusable', true) |
|
); |
|
}); |
|
return { |
|
isVisible: isVisible, |
|
isStaticBlock: isVisible && (blocks.length !== 1 || !Object(external_this_wp_blocks_["isReusableBlock"])(blocks[0]) || !getReusableBlock(blocks[0].attributes.ref)) |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, _ref3) { |
|
var clientIds = _ref3.clientIds, |
|
_ref3$onToggle = _ref3.onToggle, |
|
onToggle = _ref3$onToggle === void 0 ? external_lodash_["noop"] : _ref3$onToggle; |
|
|
|
var _dispatch = dispatch('core/editor'), |
|
convertBlockToReusable = _dispatch.__experimentalConvertBlockToReusable, |
|
convertBlockToStatic = _dispatch.__experimentalConvertBlockToStatic; |
|
|
|
return { |
|
onConvertToStatic: function onConvertToStatic() { |
|
if (clientIds.length !== 1) { |
|
return; |
|
} |
|
|
|
convertBlockToStatic(clientIds[0]); |
|
onToggle(); |
|
}, |
|
onConvertToReusable: function onConvertToReusable() { |
|
convertBlockToReusable(clientIds); |
|
onToggle(); |
|
} |
|
}; |
|
})])(ReusableBlockConvertButton)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-settings-menu/reusable-block-delete-button.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
function ReusableBlockDeleteButton(_ref) { |
|
var reusableBlock = _ref.reusableBlock, |
|
onDelete = _ref.onDelete; |
|
|
|
if (!reusableBlock) { |
|
return null; |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["MenuItem"], { |
|
className: "editor-block-settings-menu__control", |
|
icon: "no", |
|
disabled: reusableBlock.isTemporary, |
|
onClick: function onClick() { |
|
return onDelete(reusableBlock.id); |
|
} |
|
}, Object(external_this_wp_i18n_["__"])('Remove from Reusable Blocks')); |
|
} |
|
/* harmony default export */ var reusable_block_delete_button = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select, _ref2) { |
|
var clientId = _ref2.clientId; |
|
|
|
var _select = select('core/editor'), |
|
getBlock = _select.getBlock, |
|
getReusableBlock = _select.__experimentalGetReusableBlock; |
|
|
|
var block = getBlock(clientId); |
|
return { |
|
reusableBlock: block && Object(external_this_wp_blocks_["isReusableBlock"])(block) ? getReusableBlock(block.attributes.ref) : null |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, _ref3) { |
|
var _ref3$onToggle = _ref3.onToggle, |
|
onToggle = _ref3$onToggle === void 0 ? external_lodash_["noop"] : _ref3$onToggle; |
|
|
|
var _dispatch = dispatch('core/editor'), |
|
deleteReusableBlock = _dispatch.__experimentalDeleteReusableBlock; |
|
|
|
return { |
|
onDelete: function onDelete(id) { |
|
// TODO: Make this a <Confirm /> component or similar |
|
// eslint-disable-next-line no-alert |
|
var hasConfirmed = window.confirm(Object(external_this_wp_i18n_["__"])('Are you sure you want to delete this Reusable Block?\n\n' + 'It will be permanently removed from all posts and pages that use it.')); |
|
|
|
if (hasConfirmed) { |
|
deleteReusableBlock(id); |
|
onToggle(); |
|
} |
|
} |
|
}; |
|
})])(ReusableBlockDeleteButton)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-settings-menu/block-convert-button.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
function BlockConvertButton(_ref) { |
|
var shouldRender = _ref.shouldRender, |
|
onClick = _ref.onClick, |
|
small = _ref.small; |
|
|
|
if (!shouldRender) { |
|
return null; |
|
} |
|
|
|
var label = Object(external_this_wp_i18n_["__"])('Convert to Blocks'); |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["MenuItem"], { |
|
className: "editor-block-settings-menu__control", |
|
onClick: onClick, |
|
icon: "screenoptions", |
|
label: small ? label : undefined |
|
}, !small && label); |
|
} |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-settings-menu/block-html-convert-button.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/* harmony default export */ var block_html_convert_button = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select, _ref) { |
|
var clientId = _ref.clientId; |
|
var block = select('core/editor').getBlock(clientId); |
|
return { |
|
block: block, |
|
shouldRender: block && block.name === 'core/html' |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, _ref2) { |
|
var block = _ref2.block; |
|
return { |
|
onClick: function onClick() { |
|
return dispatch('core/editor').replaceBlocks(block.clientId, Object(external_this_wp_blocks_["rawHandler"])({ |
|
HTML: Object(external_this_wp_blocks_["getBlockContent"])(block) |
|
})); |
|
} |
|
}; |
|
}))(BlockConvertButton)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-settings-menu/block-unknown-convert-button.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/* harmony default export */ var block_unknown_convert_button = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select, _ref) { |
|
var clientId = _ref.clientId; |
|
var block = select('core/editor').getBlock(clientId); |
|
return { |
|
block: block, |
|
shouldRender: block && block.name === Object(external_this_wp_blocks_["getFreeformContentHandlerName"])() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, _ref2) { |
|
var block = _ref2.block; |
|
return { |
|
onClick: function onClick() { |
|
return dispatch('core/editor').replaceBlocks(block.clientId, Object(external_this_wp_blocks_["rawHandler"])({ |
|
HTML: Object(external_this_wp_blocks_["serialize"])(block) |
|
})); |
|
} |
|
}; |
|
}))(BlockConvertButton)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-settings-menu/block-settings-menu-first-item.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
var block_settings_menu_first_item_createSlotFill = Object(external_this_wp_components_["createSlotFill"])('_BlockSettingsMenuFirstItem'), |
|
_BlockSettingsMenuFirstItem = block_settings_menu_first_item_createSlotFill.Fill, |
|
block_settings_menu_first_item_Slot = block_settings_menu_first_item_createSlotFill.Slot; |
|
|
|
_BlockSettingsMenuFirstItem.Slot = block_settings_menu_first_item_Slot; |
|
/* harmony default export */ var block_settings_menu_first_item = (_BlockSettingsMenuFirstItem); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-settings-menu/block-settings-menu-plugins-extension.js |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
var block_settings_menu_plugins_extension_createSlotFill = Object(external_this_wp_components_["createSlotFill"])('_BlockSettingsMenuPluginsExtension'), |
|
_BlockSettingsMenuPluginsExtension = block_settings_menu_plugins_extension_createSlotFill.Fill, |
|
block_settings_menu_plugins_extension_Slot = block_settings_menu_plugins_extension_createSlotFill.Slot; |
|
|
|
_BlockSettingsMenuPluginsExtension.Slot = block_settings_menu_plugins_extension_Slot; |
|
/* harmony default export */ var block_settings_menu_plugins_extension = (_BlockSettingsMenuPluginsExtension); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-settings-menu/index.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function BlockSettingsMenu(_ref) { |
|
var clientIds = _ref.clientIds, |
|
onSelect = _ref.onSelect; |
|
var blockClientIds = Object(external_lodash_["castArray"])(clientIds); |
|
var count = blockClientIds.length; |
|
var firstBlockClientId = blockClientIds[0]; |
|
return Object(external_this_wp_element_["createElement"])(block_actions, { |
|
clientIds: clientIds |
|
}, function (_ref2) { |
|
var onDuplicate = _ref2.onDuplicate, |
|
onRemove = _ref2.onRemove, |
|
onInsertAfter = _ref2.onInsertAfter, |
|
onInsertBefore = _ref2.onInsertBefore, |
|
canDuplicate = _ref2.canDuplicate, |
|
isLocked = _ref2.isLocked; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Dropdown"], { |
|
contentClassName: "editor-block-settings-menu__popover", |
|
position: "bottom right", |
|
renderToggle: function renderToggle(_ref3) { |
|
var onToggle = _ref3.onToggle, |
|
isOpen = _ref3.isOpen; |
|
var toggleClassname = classnames_default()('editor-block-settings-menu__toggle', { |
|
'is-opened': isOpen |
|
}); |
|
var label = isOpen ? Object(external_this_wp_i18n_["__"])('Hide options') : Object(external_this_wp_i18n_["__"])('More options'); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Toolbar"], { |
|
controls: [{ |
|
icon: 'ellipsis', |
|
title: label, |
|
onClick: function onClick() { |
|
if (count === 1) { |
|
onSelect(firstBlockClientId); |
|
} |
|
|
|
onToggle(); |
|
}, |
|
className: toggleClassname, |
|
extraProps: { |
|
'aria-expanded': isOpen |
|
} |
|
}] |
|
}); |
|
}, |
|
renderContent: function renderContent(_ref4) { |
|
var onClose = _ref4.onClose; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["NavigableMenu"], { |
|
className: "editor-block-settings-menu__content" |
|
}, Object(external_this_wp_element_["createElement"])(block_settings_menu_first_item.Slot, { |
|
fillProps: { |
|
onClose: onClose |
|
} |
|
}), count === 1 && Object(external_this_wp_element_["createElement"])(block_unknown_convert_button, { |
|
clientId: firstBlockClientId |
|
}), count === 1 && Object(external_this_wp_element_["createElement"])(block_html_convert_button, { |
|
clientId: firstBlockClientId |
|
}), !isLocked && canDuplicate && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["MenuItem"], { |
|
className: "editor-block-settings-menu__control", |
|
onClick: onDuplicate, |
|
icon: "admin-page", |
|
shortcut: shortcuts.duplicate.display |
|
}, Object(external_this_wp_i18n_["__"])('Duplicate')), !isLocked && Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["MenuItem"], { |
|
className: "editor-block-settings-menu__control", |
|
onClick: onInsertBefore, |
|
icon: "insert-before", |
|
shortcut: shortcuts.insertBefore.display |
|
}, Object(external_this_wp_i18n_["__"])('Insert Before')), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["MenuItem"], { |
|
className: "editor-block-settings-menu__control", |
|
onClick: onInsertAfter, |
|
icon: "insert-after", |
|
shortcut: shortcuts.insertAfter.display |
|
}, Object(external_this_wp_i18n_["__"])('Insert After'))), count === 1 && Object(external_this_wp_element_["createElement"])(block_mode_toggle, { |
|
clientId: firstBlockClientId, |
|
onToggle: onClose |
|
}), Object(external_this_wp_element_["createElement"])(reusable_block_convert_button, { |
|
clientIds: clientIds, |
|
onToggle: onClose |
|
}), Object(external_this_wp_element_["createElement"])(block_settings_menu_plugins_extension.Slot, { |
|
fillProps: { |
|
clientIds: clientIds, |
|
onClose: onClose |
|
} |
|
}), Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-settings-menu__separator" |
|
}), count === 1 && Object(external_this_wp_element_["createElement"])(reusable_block_delete_button, { |
|
clientId: firstBlockClientId, |
|
onToggle: onClose |
|
}), !isLocked && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["MenuItem"], { |
|
className: "editor-block-settings-menu__control", |
|
onClick: onRemove, |
|
icon: "trash", |
|
shortcut: shortcuts.removeBlock.display |
|
}, Object(external_this_wp_i18n_["__"])('Remove Block'))); |
|
} |
|
}); |
|
}); |
|
} |
|
/* harmony default export */ var block_settings_menu = (Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
selectBlock = _dispatch.selectBlock; |
|
|
|
return { |
|
onSelect: function onSelect(clientId) { |
|
selectBlock(clientId); |
|
} |
|
}; |
|
})(BlockSettingsMenu)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-switcher/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
var block_switcher_BlockSwitcher = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(BlockSwitcher, _Component); |
|
|
|
function BlockSwitcher() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, BlockSwitcher); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(BlockSwitcher).apply(this, arguments)); |
|
_this.state = { |
|
hoveredClassName: null |
|
}; |
|
_this.onHoverClassName = _this.onHoverClassName.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(BlockSwitcher, [{ |
|
key: "onHoverClassName", |
|
value: function onHoverClassName(className) { |
|
this.setState({ |
|
hoveredClassName: className |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var _this2 = this; |
|
|
|
var _this$props = this.props, |
|
blocks = _this$props.blocks, |
|
onTransform = _this$props.onTransform, |
|
inserterItems = _this$props.inserterItems, |
|
hasBlockStyles = _this$props.hasBlockStyles; |
|
var hoveredClassName = this.state.hoveredClassName; |
|
|
|
if (!blocks || !blocks.length) { |
|
return null; |
|
} |
|
|
|
var itemsByName = Object(external_lodash_["mapKeys"])(inserterItems, function (_ref) { |
|
var name = _ref.name; |
|
return name; |
|
}); |
|
var possibleBlockTransformations = Object(external_lodash_["orderBy"])(Object(external_lodash_["filter"])(Object(external_this_wp_blocks_["getPossibleBlockTransformations"])(blocks), function (block) { |
|
return block && !!itemsByName[block.name]; |
|
}), function (block) { |
|
return itemsByName[block.name].frecency; |
|
}, 'desc'); |
|
var sourceBlockName = blocks[0].name; |
|
var blockType = Object(external_this_wp_blocks_["getBlockType"])(sourceBlockName); |
|
|
|
if (!hasBlockStyles && !possibleBlockTransformations.length) { |
|
if (blocks.length > 1) { |
|
return null; |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Toolbar"], null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
disabled: true, |
|
className: "editor-block-switcher__no-switcher-icon", |
|
label: Object(external_this_wp_i18n_["__"])('Block icon') |
|
}, Object(external_this_wp_element_["createElement"])(BlockIcon, { |
|
icon: blockType.icon, |
|
showColors: true |
|
}))); |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Dropdown"], { |
|
position: "bottom right", |
|
className: "editor-block-switcher", |
|
contentClassName: "editor-block-switcher__popover", |
|
renderToggle: function renderToggle(_ref2) { |
|
var onToggle = _ref2.onToggle, |
|
isOpen = _ref2.isOpen; |
|
|
|
var openOnArrowDown = function openOnArrowDown(event) { |
|
if (!isOpen && event.keyCode === external_this_wp_keycodes_["DOWN"]) { |
|
event.preventDefault(); |
|
event.stopPropagation(); |
|
onToggle(); |
|
} |
|
}; |
|
|
|
var label = 1 === blocks.length ? Object(external_this_wp_i18n_["__"])('Change block type') : Object(external_this_wp_i18n_["sprintf"])(Object(external_this_wp_i18n_["_n"])('Change type of %d block', 'Change type of %d blocks', blocks.length), blocks.length); |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Toolbar"], null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["IconButton"], { |
|
className: "editor-block-switcher__toggle", |
|
onClick: onToggle, |
|
"aria-haspopup": "true", |
|
"aria-expanded": isOpen, |
|
label: label, |
|
tooltip: label, |
|
onKeyDown: openOnArrowDown |
|
}, Object(external_this_wp_element_["createElement"])(BlockIcon, { |
|
icon: blockType.icon, |
|
showColors: true |
|
}), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["SVG"], { |
|
className: "editor-block-switcher__transform", |
|
xmlns: "http://www.w3.org/2000/svg", |
|
viewBox: "0 0 24 24" |
|
}, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Path"], { |
|
d: "M6.5 8.9c.6-.6 1.4-.9 2.2-.9h6.9l-1.3 1.3 1.4 1.4L19.4 7l-3.7-3.7-1.4 1.4L15.6 6H8.7c-1.4 0-2.6.5-3.6 1.5l-2.8 2.8 1.4 1.4 2.8-2.8zm13.8 2.4l-2.8 2.8c-.6.6-1.3.9-2.1.9h-7l1.3-1.3-1.4-1.4L4.6 16l3.7 3.7 1.4-1.4L8.4 17h6.9c1.3 0 2.6-.5 3.5-1.5l2.8-2.8-1.3-1.4z" |
|
})))); |
|
}, |
|
renderContent: function renderContent(_ref3) { |
|
var onClose = _ref3.onClose; |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, hasBlockStyles && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
title: Object(external_this_wp_i18n_["__"])('Block Styles'), |
|
initialOpen: true |
|
}, Object(external_this_wp_element_["createElement"])(block_styles, { |
|
clientId: blocks[0].clientId, |
|
onSwitch: onClose, |
|
onHoverClassName: _this2.onHoverClassName |
|
})), possibleBlockTransformations.length !== 0 && Object(external_this_wp_element_["createElement"])(external_this_wp_components_["PanelBody"], { |
|
title: Object(external_this_wp_i18n_["__"])('Transform To:'), |
|
initialOpen: true |
|
}, Object(external_this_wp_element_["createElement"])(block_types_list, { |
|
items: possibleBlockTransformations.map(function (destinationBlockType) { |
|
return { |
|
id: destinationBlockType.name, |
|
icon: destinationBlockType.icon, |
|
title: destinationBlockType.title, |
|
hasChildBlocksWithInserterSupport: Object(external_this_wp_blocks_["hasChildBlocksWithInserterSupport"])(destinationBlockType.name) |
|
}; |
|
}), |
|
onSelect: function onSelect(item) { |
|
onTransform(blocks, item.id); |
|
onClose(); |
|
} |
|
})), hoveredClassName !== null && Object(external_this_wp_element_["createElement"])(block_preview, { |
|
name: blocks[0].name, |
|
attributes: Object(objectSpread["a" /* default */])({}, blocks[0].attributes, { |
|
className: hoveredClassName |
|
}) |
|
})); |
|
} |
|
}); |
|
} |
|
}]); |
|
|
|
return BlockSwitcher; |
|
}(external_this_wp_element_["Component"]); |
|
/* harmony default export */ var block_switcher = (Object(external_this_wp_compose_["compose"])(Object(external_this_wp_data_["withSelect"])(function (select, _ref4) { |
|
var clientIds = _ref4.clientIds; |
|
|
|
var _select = select('core/editor'), |
|
getBlocksByClientId = _select.getBlocksByClientId, |
|
getBlockRootClientId = _select.getBlockRootClientId, |
|
getInserterItems = _select.getInserterItems; |
|
|
|
var _select2 = select('core/blocks'), |
|
getBlockStyles = _select2.getBlockStyles; |
|
|
|
var rootClientId = getBlockRootClientId(Object(external_lodash_["first"])(Object(external_lodash_["castArray"])(clientIds))); |
|
var blocks = getBlocksByClientId(clientIds); |
|
var firstBlock = blocks && blocks.length === 1 ? blocks[0] : null; |
|
var styles = firstBlock && getBlockStyles(firstBlock.name); |
|
return { |
|
blocks: blocks, |
|
inserterItems: getInserterItems(rootClientId), |
|
hasBlockStyles: styles && styles.length > 0 |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch, ownProps) { |
|
return { |
|
onTransform: function onTransform(blocks, name) { |
|
dispatch('core/editor').replaceBlocks(ownProps.clientIds, Object(external_this_wp_blocks_["switchToBlockType"])(blocks, name)); |
|
} |
|
}; |
|
}))(block_switcher_BlockSwitcher)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-switcher/multi-blocks-switcher.js |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
function MultiBlocksSwitcher(_ref) { |
|
var isMultiBlockSelection = _ref.isMultiBlockSelection, |
|
selectedBlockClientIds = _ref.selectedBlockClientIds; |
|
|
|
if (!isMultiBlockSelection) { |
|
return null; |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(block_switcher, { |
|
key: "switcher", |
|
clientIds: selectedBlockClientIds |
|
}); |
|
} |
|
/* harmony default export */ var multi_blocks_switcher = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var selectedBlockClientIds = select('core/editor').getMultiSelectedBlockClientIds(); |
|
return { |
|
isMultiBlockSelection: selectedBlockClientIds.length > 1, |
|
selectedBlockClientIds: selectedBlockClientIds |
|
}; |
|
})(MultiBlocksSwitcher)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/block-toolbar/index.js |
|
|
|
|
|
/** |
|
* WordPress Dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Internal Dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function BlockToolbar(_ref) { |
|
var blockClientIds = _ref.blockClientIds, |
|
isValid = _ref.isValid, |
|
mode = _ref.mode; |
|
|
|
if (blockClientIds.length === 0) { |
|
return null; |
|
} |
|
|
|
if (blockClientIds.length > 1) { |
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-toolbar" |
|
}, Object(external_this_wp_element_["createElement"])(multi_blocks_switcher, null), Object(external_this_wp_element_["createElement"])(block_settings_menu, { |
|
clientIds: blockClientIds |
|
})); |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-block-toolbar" |
|
}, mode === 'visual' && isValid && Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])(block_switcher, { |
|
clientIds: blockClientIds |
|
}), Object(external_this_wp_element_["createElement"])(block_controls.Slot, null), Object(external_this_wp_element_["createElement"])(block_format_controls.Slot, null)), Object(external_this_wp_element_["createElement"])(block_settings_menu, { |
|
clientIds: blockClientIds |
|
})); |
|
} |
|
|
|
/* harmony default export */ var block_toolbar = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getSelectedBlockClientId = _select.getSelectedBlockClientId, |
|
getBlockMode = _select.getBlockMode, |
|
getMultiSelectedBlockClientIds = _select.getMultiSelectedBlockClientIds, |
|
isBlockValid = _select.isBlockValid; |
|
|
|
var selectedBlockClientId = getSelectedBlockClientId(); |
|
var blockClientIds = selectedBlockClientId ? [selectedBlockClientId] : getMultiSelectedBlockClientIds(); |
|
return { |
|
blockClientIds: blockClientIds, |
|
isValid: selectedBlockClientId ? isBlockValid(selectedBlockClientId) : null, |
|
mode: selectedBlockClientId ? getBlockMode(selectedBlockClientId) : null |
|
}; |
|
})(BlockToolbar)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/copy-handler/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
var copy_handler_CopyHandler = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(CopyHandler, _Component); |
|
|
|
function CopyHandler() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, CopyHandler); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(CopyHandler).apply(this, arguments)); |
|
|
|
_this.onCopy = function (event) { |
|
return _this.props.onCopy(event); |
|
}; |
|
|
|
_this.onCut = function (event) { |
|
return _this.props.onCut(event); |
|
}; |
|
|
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(CopyHandler, [{ |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
document.addEventListener('copy', this.onCopy); |
|
document.addEventListener('cut', this.onCut); |
|
} |
|
}, { |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
document.removeEventListener('copy', this.onCopy); |
|
document.removeEventListener('cut', this.onCut); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
return null; |
|
} |
|
}]); |
|
|
|
return CopyHandler; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var copy_handler = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withDispatch"])(function (dispatch, ownProps, _ref) { |
|
var select = _ref.select; |
|
|
|
var _select = select('core/editor'), |
|
getBlocksByClientId = _select.getBlocksByClientId, |
|
getMultiSelectedBlockClientIds = _select.getMultiSelectedBlockClientIds, |
|
getSelectedBlockClientId = _select.getSelectedBlockClientId, |
|
hasMultiSelection = _select.hasMultiSelection; |
|
|
|
var _dispatch = dispatch('core/editor'), |
|
removeBlocks = _dispatch.removeBlocks; |
|
|
|
var onCopy = function onCopy(event) { |
|
var selectedBlockClientIds = getSelectedBlockClientId() ? [getSelectedBlockClientId()] : getMultiSelectedBlockClientIds(); |
|
|
|
if (selectedBlockClientIds.length === 0) { |
|
return; |
|
} // Let native copy behaviour take over in input fields. |
|
|
|
|
|
if (!hasMultiSelection() && Object(external_this_wp_dom_["documentHasSelection"])()) { |
|
return; |
|
} |
|
|
|
var serialized = Object(external_this_wp_blocks_["serialize"])(getBlocksByClientId(selectedBlockClientIds)); |
|
event.clipboardData.setData('text/plain', serialized); |
|
event.clipboardData.setData('text/html', serialized); |
|
event.preventDefault(); |
|
}; |
|
|
|
return { |
|
onCopy: onCopy, |
|
onCut: function onCut(event) { |
|
onCopy(event); |
|
|
|
if (hasMultiSelection()) { |
|
var selectedBlockClientIds = getSelectedBlockClientId() ? [getSelectedBlockClientId()] : getMultiSelectedBlockClientIds(); |
|
removeBlocks(selectedBlockClientIds); |
|
} |
|
} |
|
}; |
|
})])(copy_handler_CopyHandler)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/error-boundary/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var error_boundary_ErrorBoundary = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(ErrorBoundary, _Component); |
|
|
|
function ErrorBoundary() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, ErrorBoundary); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(ErrorBoundary).apply(this, arguments)); |
|
_this.reboot = _this.reboot.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.getContent = _this.getContent.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.state = { |
|
error: null |
|
}; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(ErrorBoundary, [{ |
|
key: "componentDidCatch", |
|
value: function componentDidCatch(error) { |
|
this.setState({ |
|
error: error |
|
}); |
|
} |
|
}, { |
|
key: "reboot", |
|
value: function reboot() { |
|
this.props.onError(); |
|
} |
|
}, { |
|
key: "getContent", |
|
value: function getContent() { |
|
try { |
|
// While `select` in a component is generally discouraged, it is |
|
// used here because it (a) reduces the chance of data loss in the |
|
// case of additional errors by performing a direct retrieval and |
|
// (b) avoids the performance cost associated with unnecessary |
|
// content serialization throughout the lifetime of a non-erroring |
|
// application. |
|
return Object(external_this_wp_data_["select"])('core/editor').getEditedPostContent(); |
|
} catch (error) {} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var error = this.state.error; |
|
|
|
if (!error) { |
|
return this.props.children; |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(warning, { |
|
className: "editor-error-boundary", |
|
actions: [Object(external_this_wp_element_["createElement"])(external_this_wp_components_["Button"], { |
|
key: "recovery", |
|
onClick: this.reboot, |
|
isLarge: true |
|
}, Object(external_this_wp_i18n_["__"])('Attempt Recovery')), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["ClipboardButton"], { |
|
key: "copy-post", |
|
text: this.getContent, |
|
isLarge: true |
|
}, Object(external_this_wp_i18n_["__"])('Copy Post Text')), Object(external_this_wp_element_["createElement"])(external_this_wp_components_["ClipboardButton"], { |
|
key: "copy-error", |
|
text: error.stack, |
|
isLarge: true |
|
}, Object(external_this_wp_i18n_["__"])('Copy Error'))] |
|
}, Object(external_this_wp_i18n_["__"])('The editor has encountered an unexpected error.')); |
|
} |
|
}]); |
|
|
|
return ErrorBoundary; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var error_boundary = (error_boundary_ErrorBoundary); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/multi-select-scroll-into-view/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var multi_select_scroll_into_view_MultiSelectScrollIntoView = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(MultiSelectScrollIntoView, _Component); |
|
|
|
function MultiSelectScrollIntoView() { |
|
Object(classCallCheck["a" /* default */])(this, MultiSelectScrollIntoView); |
|
|
|
return Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(MultiSelectScrollIntoView).apply(this, arguments)); |
|
} |
|
|
|
Object(createClass["a" /* default */])(MultiSelectScrollIntoView, [{ |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate() { |
|
// Relies on expectation that `componentDidUpdate` will only be called |
|
// if value of `extentClientId` changes. |
|
this.scrollIntoView(); |
|
} |
|
/** |
|
* Ensures that if a multi-selection exists, the extent of the selection is |
|
* visible within the nearest scrollable container. |
|
* |
|
* @return {void} |
|
*/ |
|
|
|
}, { |
|
key: "scrollIntoView", |
|
value: function scrollIntoView() { |
|
var extentClientId = this.props.extentClientId; |
|
|
|
if (!extentClientId) { |
|
return; |
|
} |
|
|
|
var extentNode = getBlockDOMNode(extentClientId); |
|
|
|
if (!extentNode) { |
|
return; |
|
} |
|
|
|
var scrollContainer = Object(external_this_wp_dom_["getScrollContainer"])(extentNode); // If there's no scroll container, it follows that there's no scrollbar |
|
// and thus there's no need to try to scroll into view. |
|
|
|
if (!scrollContainer) { |
|
return; |
|
} |
|
|
|
dom_scroll_into_view_lib_default()(extentNode, scrollContainer, { |
|
onlyScrollIfNeeded: true |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
return null; |
|
} |
|
}]); |
|
|
|
return MultiSelectScrollIntoView; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var multi_select_scroll_into_view = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getLastMultiSelectedBlockClientId = _select.getLastMultiSelectedBlockClientId; |
|
|
|
return { |
|
extentClientId: getLastMultiSelectedBlockClientId() |
|
}; |
|
})(multi_select_scroll_into_view_MultiSelectScrollIntoView)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/observe-typing/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Set of key codes upon which typing is to be initiated on a keydown event. |
|
* |
|
* @type {number[]} |
|
*/ |
|
|
|
var KEY_DOWN_ELIGIBLE_KEY_CODES = [external_this_wp_keycodes_["UP"], external_this_wp_keycodes_["RIGHT"], external_this_wp_keycodes_["DOWN"], external_this_wp_keycodes_["LEFT"], external_this_wp_keycodes_["ENTER"], external_this_wp_keycodes_["BACKSPACE"]]; |
|
/** |
|
* Returns true if a given keydown event can be inferred as intent to start |
|
* typing, or false otherwise. A keydown is considered eligible if it is a |
|
* text navigation without shift active. |
|
* |
|
* @param {KeyboardEvent} event Keydown event to test. |
|
* |
|
* @return {boolean} Whether event is eligible to start typing. |
|
*/ |
|
|
|
function isKeyDownEligibleForStartTyping(event) { |
|
var keyCode = event.keyCode, |
|
shiftKey = event.shiftKey; |
|
return !shiftKey && Object(external_lodash_["includes"])(KEY_DOWN_ELIGIBLE_KEY_CODES, keyCode); |
|
} |
|
|
|
var observe_typing_ObserveTyping = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(ObserveTyping, _Component); |
|
|
|
function ObserveTyping() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, ObserveTyping); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(ObserveTyping).apply(this, arguments)); |
|
_this.stopTypingOnSelectionUncollapse = _this.stopTypingOnSelectionUncollapse.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.stopTypingOnMouseMove = _this.stopTypingOnMouseMove.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.startTypingInTextField = _this.startTypingInTextField.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.stopTypingOnNonTextField = _this.stopTypingOnNonTextField.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.stopTypingOnEscapeKey = _this.stopTypingOnEscapeKey.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.onKeyDown = Object(external_lodash_["over"])([_this.startTypingInTextField, _this.stopTypingOnEscapeKey]); |
|
_this.lastMouseMove = null; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(ObserveTyping, [{ |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
this.toggleEventBindings(this.props.isTyping); |
|
} |
|
}, { |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
if (this.props.isTyping !== prevProps.isTyping) { |
|
this.toggleEventBindings(this.props.isTyping); |
|
} |
|
} |
|
}, { |
|
key: "componentWillUnmount", |
|
value: function componentWillUnmount() { |
|
this.toggleEventBindings(false); |
|
} |
|
/** |
|
* Bind or unbind events to the document when typing has started or stopped |
|
* respectively, or when component has become unmounted. |
|
* |
|
* @param {boolean} isBound Whether event bindings should be applied. |
|
*/ |
|
|
|
}, { |
|
key: "toggleEventBindings", |
|
value: function toggleEventBindings(isBound) { |
|
var bindFn = isBound ? 'addEventListener' : 'removeEventListener'; |
|
document[bindFn]('selectionchange', this.stopTypingOnSelectionUncollapse); |
|
document[bindFn]('mousemove', this.stopTypingOnMouseMove); |
|
} |
|
/** |
|
* On mouse move, unset typing flag if user has moved cursor. |
|
* |
|
* @param {MouseEvent} event Mousemove event. |
|
*/ |
|
|
|
}, { |
|
key: "stopTypingOnMouseMove", |
|
value: function stopTypingOnMouseMove(event) { |
|
var clientX = event.clientX, |
|
clientY = event.clientY; // We need to check that the mouse really moved because Safari triggers |
|
// mousemove events when shift or ctrl are pressed. |
|
|
|
if (this.lastMouseMove) { |
|
var _this$lastMouseMove = this.lastMouseMove, |
|
lastClientX = _this$lastMouseMove.clientX, |
|
lastClientY = _this$lastMouseMove.clientY; |
|
|
|
if (lastClientX !== clientX || lastClientY !== clientY) { |
|
this.props.onStopTyping(); |
|
} |
|
} |
|
|
|
this.lastMouseMove = { |
|
clientX: clientX, |
|
clientY: clientY |
|
}; |
|
} |
|
/** |
|
* On selection change, unset typing flag if user has made an uncollapsed |
|
* (shift) selection. |
|
*/ |
|
|
|
}, { |
|
key: "stopTypingOnSelectionUncollapse", |
|
value: function stopTypingOnSelectionUncollapse() { |
|
var selection = window.getSelection(); |
|
var isCollapsed = selection.rangeCount > 0 && selection.getRangeAt(0).collapsed; |
|
|
|
if (!isCollapsed) { |
|
this.props.onStopTyping(); |
|
} |
|
} |
|
/** |
|
* Unsets typing flag if user presses Escape while typing flag is active. |
|
* |
|
* @param {KeyboardEvent} event Keypress or keydown event to interpret. |
|
*/ |
|
|
|
}, { |
|
key: "stopTypingOnEscapeKey", |
|
value: function stopTypingOnEscapeKey(event) { |
|
if (this.props.isTyping && event.keyCode === external_this_wp_keycodes_["ESCAPE"]) { |
|
this.props.onStopTyping(); |
|
} |
|
} |
|
/** |
|
* Handles a keypress or keydown event to infer intention to start typing. |
|
* |
|
* @param {KeyboardEvent} event Keypress or keydown event to interpret. |
|
*/ |
|
|
|
}, { |
|
key: "startTypingInTextField", |
|
value: function startTypingInTextField(event) { |
|
var _this$props = this.props, |
|
isTyping = _this$props.isTyping, |
|
onStartTyping = _this$props.onStartTyping; |
|
var type = event.type, |
|
target = event.target; // Abort early if already typing, or key press is incurred outside a |
|
// text field (e.g. arrow-ing through toolbar buttons). |
|
// Ignore typing in a block toolbar |
|
|
|
if (isTyping || !Object(external_this_wp_dom_["isTextField"])(target) || target.closest('.editor-block-toolbar')) { |
|
return; |
|
} // Special-case keydown because certain keys do not emit a keypress |
|
// event. Conversely avoid keydown as the canonical event since there |
|
// are many keydown which are explicitly not targeted for typing. |
|
|
|
|
|
if (type === 'keydown' && !isKeyDownEligibleForStartTyping(event)) { |
|
return; |
|
} |
|
|
|
onStartTyping(); |
|
} |
|
/** |
|
* Stops typing when focus transitions to a non-text field element. |
|
* |
|
* @param {FocusEvent} event Focus event. |
|
*/ |
|
|
|
}, { |
|
key: "stopTypingOnNonTextField", |
|
value: function stopTypingOnNonTextField(event) { |
|
var _this2 = this; |
|
|
|
event.persist(); // Since focus to a non-text field via arrow key will trigger before |
|
// the keydown event, wait until after current stack before evaluating |
|
// whether typing is to be stopped. Otherwise, typing will re-start. |
|
|
|
this.props.setTimeout(function () { |
|
var _this2$props = _this2.props, |
|
isTyping = _this2$props.isTyping, |
|
onStopTyping = _this2$props.onStopTyping; |
|
var target = event.target; |
|
|
|
if (isTyping && !Object(external_this_wp_dom_["isTextField"])(target)) { |
|
onStopTyping(); |
|
} |
|
}); |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var children = this.props.children; // Disable reason: This component is responsible for capturing bubbled |
|
// keyboard events which are interpreted as typing intent. |
|
|
|
/* eslint-disable jsx-a11y/no-static-element-interactions */ |
|
|
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
onFocus: this.stopTypingOnNonTextField, |
|
onKeyPress: this.startTypingInTextField, |
|
onKeyDown: this.onKeyDown |
|
}, children); |
|
/* eslint-enable jsx-a11y/no-static-element-interactions */ |
|
} |
|
}]); |
|
|
|
return ObserveTyping; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var observe_typing = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
isTyping = _select.isTyping; |
|
|
|
return { |
|
isTyping: isTyping() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
startTyping = _dispatch.startTyping, |
|
stopTyping = _dispatch.stopTyping; |
|
|
|
return { |
|
onStartTyping: startTyping, |
|
onStopTyping: stopTyping |
|
}; |
|
}), external_this_wp_compose_["withSafeTimeout"]])(observe_typing_ObserveTyping)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/preserve-scroll-in-reorder/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Non-visual component which preserves offset of selected block within nearest |
|
* scrollable container while reordering. |
|
* |
|
* @example |
|
* |
|
* ```jsx |
|
* <PreserveScrollInReorder /> |
|
* ``` |
|
*/ |
|
|
|
var preserve_scroll_in_reorder_PreserveScrollInReorder = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(PreserveScrollInReorder, _Component); |
|
|
|
function PreserveScrollInReorder() { |
|
Object(classCallCheck["a" /* default */])(this, PreserveScrollInReorder); |
|
|
|
return Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(PreserveScrollInReorder).apply(this, arguments)); |
|
} |
|
|
|
Object(createClass["a" /* default */])(PreserveScrollInReorder, [{ |
|
key: "getSnapshotBeforeUpdate", |
|
value: function getSnapshotBeforeUpdate(prevProps) { |
|
var _this$props = this.props, |
|
blockOrder = _this$props.blockOrder, |
|
selectionStart = _this$props.selectionStart; |
|
|
|
if (blockOrder !== prevProps.blockOrder && selectionStart) { |
|
return this.getOffset(selectionStart); |
|
} |
|
|
|
return null; |
|
} |
|
}, { |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps, prevState, snapshot) { |
|
if (snapshot) { |
|
this.restorePreviousOffset(snapshot); |
|
} |
|
} |
|
/** |
|
* Given the block client ID of the start of the selection, saves the |
|
* block's top offset as an instance property before a reorder is to occur. |
|
* |
|
* @param {string} selectionStart Client ID of selected block. |
|
* |
|
* @return {number?} The scroll offset. |
|
*/ |
|
|
|
}, { |
|
key: "getOffset", |
|
value: function getOffset(selectionStart) { |
|
var blockNode = getBlockDOMNode(selectionStart); |
|
|
|
if (!blockNode) { |
|
return null; |
|
} |
|
|
|
return blockNode.getBoundingClientRect().top; |
|
} |
|
/** |
|
* After a block reordering, restores the previous viewport top offset. |
|
* |
|
* @param {number} offset The scroll offset. |
|
*/ |
|
|
|
}, { |
|
key: "restorePreviousOffset", |
|
value: function restorePreviousOffset(offset) { |
|
var selectionStart = this.props.selectionStart; |
|
var blockNode = getBlockDOMNode(selectionStart); |
|
|
|
if (blockNode) { |
|
var scrollContainer = Object(external_this_wp_dom_["getScrollContainer"])(blockNode); |
|
|
|
if (scrollContainer) { |
|
scrollContainer.scrollTop = scrollContainer.scrollTop + blockNode.getBoundingClientRect().top - offset; |
|
} |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
return null; |
|
} |
|
}]); |
|
|
|
return PreserveScrollInReorder; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var preserve_scroll_in_reorder = (Object(external_this_wp_data_["withSelect"])(function (select) { |
|
return { |
|
blockOrder: select('core/editor').getBlockOrder(), |
|
selectionStart: select('core/editor').getBlockSelectionStart() |
|
}; |
|
})(preserve_scroll_in_reorder_PreserveScrollInReorder)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/writing-flow/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Browser constants |
|
*/ |
|
|
|
var writing_flow_window = window, |
|
writing_flow_getSelection = writing_flow_window.getSelection; |
|
/** |
|
* Given an element, returns true if the element is a tabbable text field, or |
|
* false otherwise. |
|
* |
|
* @param {Element} element Element to test. |
|
* |
|
* @return {boolean} Whether element is a tabbable text field. |
|
*/ |
|
|
|
var isTabbableTextField = Object(external_lodash_["overEvery"])([external_this_wp_dom_["isTextField"], external_this_wp_dom_["focus"].tabbable.isTabbableIndex]); |
|
/** |
|
* Returns true if the element should consider edge navigation upon a keyboard |
|
* event of the given directional key code, or false otherwise. |
|
* |
|
* @param {Element} element HTML element to test. |
|
* @param {number} keyCode KeyboardEvent keyCode to test. |
|
* @param {boolean} hasModifier Whether a modifier is pressed. |
|
* |
|
* @return {boolean} Whether element should consider edge navigation. |
|
*/ |
|
|
|
function isNavigationCandidate(element, keyCode, hasModifier) { |
|
var isVertical = keyCode === external_this_wp_keycodes_["UP"] || keyCode === external_this_wp_keycodes_["DOWN"]; // Currently, all elements support unmodified vertical navigation. |
|
|
|
if (isVertical && !hasModifier) { |
|
return true; |
|
} // Native inputs should not navigate horizontally. |
|
|
|
|
|
var tagName = element.tagName; |
|
return tagName !== 'INPUT' && tagName !== 'TEXTAREA'; |
|
} |
|
|
|
var writing_flow_WritingFlow = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(WritingFlow, _Component); |
|
|
|
function WritingFlow() { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, WritingFlow); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(WritingFlow).apply(this, arguments)); |
|
_this.onKeyDown = _this.onKeyDown.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.bindContainer = _this.bindContainer.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.clearVerticalRect = _this.clearVerticalRect.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
_this.focusLastTextField = _this.focusLastTextField.bind(Object(assertThisInitialized["a" /* default */])(Object(assertThisInitialized["a" /* default */])(_this))); |
|
/** |
|
* Here a rectangle is stored while moving the caret vertically so |
|
* vertical position of the start position can be restored. |
|
* This is to recreate browser behaviour across blocks. |
|
* |
|
* @type {?DOMRect} |
|
*/ |
|
|
|
_this.verticalRect = null; |
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(WritingFlow, [{ |
|
key: "bindContainer", |
|
value: function bindContainer(ref) { |
|
this.container = ref; |
|
} |
|
}, { |
|
key: "clearVerticalRect", |
|
value: function clearVerticalRect() { |
|
this.verticalRect = null; |
|
} |
|
/** |
|
* Returns the optimal tab target from the given focused element in the |
|
* desired direction. A preference is made toward text fields, falling back |
|
* to the block focus stop if no other candidates exist for the block. |
|
* |
|
* @param {Element} target Currently focused text field. |
|
* @param {boolean} isReverse True if considering as the first field. |
|
* |
|
* @return {?Element} Optimal tab target, if one exists. |
|
*/ |
|
|
|
}, { |
|
key: "getClosestTabbable", |
|
value: function getClosestTabbable(target, isReverse) { |
|
// Since the current focus target is not guaranteed to be a text field, |
|
// find all focusables. Tabbability is considered later. |
|
var focusableNodes = external_this_wp_dom_["focus"].focusable.find(this.container); |
|
|
|
if (isReverse) { |
|
focusableNodes = Object(external_lodash_["reverse"])(focusableNodes); |
|
} // Consider as candidates those focusables after the current target. |
|
// It's assumed this can only be reached if the target is focusable |
|
// (on its keydown event), so no need to verify it exists in the set. |
|
|
|
|
|
focusableNodes = focusableNodes.slice(focusableNodes.indexOf(target) + 1); |
|
|
|
function isTabCandidate(node, i, array) { |
|
// Not a candidate if the node is not tabbable. |
|
if (!external_this_wp_dom_["focus"].tabbable.isTabbableIndex(node)) { |
|
return false; |
|
} // Prefer text fields... |
|
|
|
|
|
if (Object(external_this_wp_dom_["isTextField"])(node)) { |
|
return true; |
|
} // ...but settle for block focus stop. |
|
|
|
|
|
if (!isBlockFocusStop(node)) { |
|
return false; |
|
} // If element contains inner blocks, stop immediately at its focus |
|
// wrapper. |
|
|
|
|
|
if (hasInnerBlocksContext(node)) { |
|
return true; |
|
} // If navigating out of a block (in reverse), don't consider its |
|
// block focus stop. |
|
|
|
|
|
if (node.contains(target)) { |
|
return false; |
|
} // In case of block focus stop, check to see if there's a better |
|
// text field candidate within. |
|
|
|
|
|
for (var offset = 1, nextNode; nextNode = array[i + offset]; offset++) { |
|
// Abort if no longer testing descendents of focus stop. |
|
if (!node.contains(nextNode)) { |
|
break; |
|
} // Apply same tests by recursion. This is important to consider |
|
// nestable blocks where we don't want to settle for the inner |
|
// block focus stop. |
|
|
|
|
|
if (isTabCandidate(nextNode, i + offset, array)) { |
|
return false; |
|
} |
|
} |
|
|
|
return true; |
|
} |
|
|
|
return Object(external_lodash_["find"])(focusableNodes, isTabCandidate); |
|
} |
|
}, { |
|
key: "expandSelection", |
|
value: function expandSelection(isReverse) { |
|
var _this$props = this.props, |
|
selectedBlockClientId = _this$props.selectedBlockClientId, |
|
selectionStartClientId = _this$props.selectionStartClientId, |
|
selectionBeforeEndClientId = _this$props.selectionBeforeEndClientId, |
|
selectionAfterEndClientId = _this$props.selectionAfterEndClientId; |
|
var nextSelectionEndClientId = isReverse ? selectionBeforeEndClientId : selectionAfterEndClientId; |
|
|
|
if (nextSelectionEndClientId) { |
|
this.props.onMultiSelect(selectionStartClientId || selectedBlockClientId, nextSelectionEndClientId); |
|
} |
|
} |
|
}, { |
|
key: "moveSelection", |
|
value: function moveSelection(isReverse) { |
|
var _this$props2 = this.props, |
|
selectedFirstClientId = _this$props2.selectedFirstClientId, |
|
selectedLastClientId = _this$props2.selectedLastClientId; |
|
var focusedBlockClientId = isReverse ? selectedFirstClientId : selectedLastClientId; |
|
|
|
if (focusedBlockClientId) { |
|
this.props.onSelectBlock(focusedBlockClientId); |
|
} |
|
} |
|
/** |
|
* Returns true if the given target field is the last in its block which |
|
* can be considered for tab transition. For example, in a block with two |
|
* text fields, this would return true when reversing from the first of the |
|
* two fields, but false when reversing from the second. |
|
* |
|
* @param {Element} target Currently focused text field. |
|
* @param {boolean} isReverse True if considering as the first field. |
|
* |
|
* @return {boolean} Whether field is at edge for tab transition. |
|
*/ |
|
|
|
}, { |
|
key: "isTabbableEdge", |
|
value: function isTabbableEdge(target, isReverse) { |
|
var closestTabbable = this.getClosestTabbable(target, isReverse); |
|
return !closestTabbable || !isInSameBlock(target, closestTabbable); |
|
} |
|
}, { |
|
key: "onKeyDown", |
|
value: function onKeyDown(event) { |
|
var _this$props3 = this.props, |
|
hasMultiSelection = _this$props3.hasMultiSelection, |
|
onMultiSelect = _this$props3.onMultiSelect, |
|
blocks = _this$props3.blocks; |
|
var keyCode = event.keyCode, |
|
target = event.target; |
|
var isUp = keyCode === external_this_wp_keycodes_["UP"]; |
|
var isDown = keyCode === external_this_wp_keycodes_["DOWN"]; |
|
var isLeft = keyCode === external_this_wp_keycodes_["LEFT"]; |
|
var isRight = keyCode === external_this_wp_keycodes_["RIGHT"]; |
|
var isReverse = isUp || isLeft; |
|
var isHorizontal = isLeft || isRight; |
|
var isVertical = isUp || isDown; |
|
var isNav = isHorizontal || isVertical; |
|
var isShift = event.shiftKey; |
|
var hasModifier = isShift || event.ctrlKey || event.altKey || event.metaKey; |
|
var isNavEdge = isVertical ? external_this_wp_dom_["isVerticalEdge"] : external_this_wp_dom_["isHorizontalEdge"]; // This logic inside this condition needs to be checked before |
|
// the check for event.nativeEvent.defaultPrevented. |
|
// The logic handles meta+a keypress and this event is default prevented by TinyMCE. |
|
|
|
if (!isNav) { |
|
// Set immediately before the meta+a combination can be pressed. |
|
if (external_this_wp_keycodes_["isKeyboardEvent"].primary(event)) { |
|
this.isEntirelySelected = Object(external_this_wp_dom_["isEntirelySelected"])(target); |
|
} |
|
|
|
if (external_this_wp_keycodes_["isKeyboardEvent"].primary(event, 'a')) { |
|
// When the target is contentEditable, selection will already |
|
// have been set by TinyMCE earlier in this call stack. We need |
|
// check the previous result, otherwise all blocks will be |
|
// selected right away. |
|
if (target.isContentEditable ? this.isEntirelySelected : Object(external_this_wp_dom_["isEntirelySelected"])(target)) { |
|
onMultiSelect(Object(external_lodash_["first"])(blocks), Object(external_lodash_["last"])(blocks)); |
|
event.preventDefault(); |
|
} // After pressing primary + A we can assume isEntirelySelected is true. |
|
// Calling right away isEntirelySelected after primary + A may still return false on some browsers. |
|
|
|
|
|
this.isEntirelySelected = true; |
|
} |
|
|
|
return; |
|
} // Abort if navigation has already been handled (e.g. TinyMCE inline |
|
// boundaries). |
|
|
|
|
|
if (event.nativeEvent.defaultPrevented) { |
|
return; |
|
} // Abort if our current target is not a candidate for navigation (e.g. |
|
// preserve native input behaviors). |
|
|
|
|
|
if (!isNavigationCandidate(target, keyCode, hasModifier)) { |
|
return; |
|
} |
|
|
|
if (!isVertical) { |
|
this.verticalRect = null; |
|
} else if (!this.verticalRect) { |
|
this.verticalRect = Object(external_this_wp_dom_["computeCaretRect"])(target); |
|
} |
|
|
|
if (isShift && (hasMultiSelection || this.isTabbableEdge(target, isReverse) && isNavEdge(target, isReverse))) { |
|
// Shift key is down, and there is multi selection or we're at the end of the current block. |
|
this.expandSelection(isReverse); |
|
event.preventDefault(); |
|
} else if (hasMultiSelection) { |
|
// Moving from block multi-selection to single block selection |
|
this.moveSelection(isReverse); |
|
event.preventDefault(); |
|
} else if (isVertical && Object(external_this_wp_dom_["isVerticalEdge"])(target, isReverse)) { |
|
var closestTabbable = this.getClosestTabbable(target, isReverse); |
|
|
|
if (closestTabbable) { |
|
Object(external_this_wp_dom_["placeCaretAtVerticalEdge"])(closestTabbable, isReverse, this.verticalRect); |
|
event.preventDefault(); |
|
} |
|
} else if (isHorizontal && writing_flow_getSelection().isCollapsed && Object(external_this_wp_dom_["isHorizontalEdge"])(target, isReverse)) { |
|
var _closestTabbable = this.getClosestTabbable(target, isReverse); |
|
|
|
Object(external_this_wp_dom_["placeCaretAtHorizontalEdge"])(_closestTabbable, isReverse); |
|
event.preventDefault(); |
|
} |
|
} |
|
/** |
|
* Sets focus to the end of the last tabbable text field, if one exists. |
|
*/ |
|
|
|
}, { |
|
key: "focusLastTextField", |
|
value: function focusLastTextField() { |
|
var focusableNodes = external_this_wp_dom_["focus"].focusable.find(this.container); |
|
var target = Object(external_lodash_["findLast"])(focusableNodes, isTabbableTextField); |
|
|
|
if (target) { |
|
Object(external_this_wp_dom_["placeCaretAtHorizontalEdge"])(target, true); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var children = this.props.children; // Disable reason: Wrapper itself is non-interactive, but must capture |
|
// bubbling events from children to determine focus transition intents. |
|
|
|
/* eslint-disable jsx-a11y/no-static-element-interactions */ |
|
|
|
return Object(external_this_wp_element_["createElement"])("div", { |
|
className: "editor-writing-flow" |
|
}, Object(external_this_wp_element_["createElement"])("div", { |
|
ref: this.bindContainer, |
|
onKeyDown: this.onKeyDown, |
|
onMouseDown: this.clearVerticalRect |
|
}, children), Object(external_this_wp_element_["createElement"])("div", { |
|
"aria-hidden": true, |
|
tabIndex: -1, |
|
onClick: this.focusLastTextField, |
|
className: "wp-block editor-writing-flow__click-redirect" |
|
})); |
|
/* eslint-disable jsx-a11y/no-static-element-interactions */ |
|
} |
|
}]); |
|
|
|
return WritingFlow; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var writing_flow = (Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getSelectedBlockClientId = _select.getSelectedBlockClientId, |
|
getMultiSelectedBlocksStartClientId = _select.getMultiSelectedBlocksStartClientId, |
|
getMultiSelectedBlocksEndClientId = _select.getMultiSelectedBlocksEndClientId, |
|
getPreviousBlockClientId = _select.getPreviousBlockClientId, |
|
getNextBlockClientId = _select.getNextBlockClientId, |
|
getFirstMultiSelectedBlockClientId = _select.getFirstMultiSelectedBlockClientId, |
|
getLastMultiSelectedBlockClientId = _select.getLastMultiSelectedBlockClientId, |
|
hasMultiSelection = _select.hasMultiSelection, |
|
getBlockOrder = _select.getBlockOrder; |
|
|
|
var selectedBlockClientId = getSelectedBlockClientId(); |
|
var selectionStartClientId = getMultiSelectedBlocksStartClientId(); |
|
var selectionEndClientId = getMultiSelectedBlocksEndClientId(); |
|
return { |
|
selectedBlockClientId: selectedBlockClientId, |
|
selectionStartClientId: selectionStartClientId, |
|
selectionBeforeEndClientId: getPreviousBlockClientId(selectionEndClientId || selectedBlockClientId), |
|
selectionAfterEndClientId: getNextBlockClientId(selectionEndClientId || selectedBlockClientId), |
|
selectedFirstClientId: getFirstMultiSelectedBlockClientId(), |
|
selectedLastClientId: getLastMultiSelectedBlockClientId(), |
|
hasMultiSelection: hasMultiSelection(), |
|
blocks: getBlockOrder() |
|
}; |
|
}), Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
multiSelect = _dispatch.multiSelect, |
|
selectBlock = _dispatch.selectBlock; |
|
|
|
return { |
|
onMultiSelect: multiSelect, |
|
onSelectBlock: selectBlock |
|
}; |
|
})])(writing_flow_WritingFlow)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/editor-styles/ast/parse.js |
|
|
|
// Adapted from https://github.com/reworkcss/css |
|
// because we needed to remove source map support. |
|
// http://www.w3.org/TR/CSS21/grammar.htm |
|
// https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027 |
|
var commentre = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//g; |
|
/* harmony default export */ var parse = (function (css, options) { |
|
options = options || {}; |
|
/** |
|
* Positional. |
|
*/ |
|
|
|
var lineno = 1; |
|
var column = 1; |
|
/** |
|
* Update lineno and column based on `str`. |
|
*/ |
|
|
|
function updatePosition(str) { |
|
var lines = str.match(/\n/g); |
|
|
|
if (lines) { |
|
lineno += lines.length; |
|
} |
|
|
|
var i = str.lastIndexOf('\n'); // eslint-disable-next-line no-bitwise |
|
|
|
column = ~i ? str.length - i : column + str.length; |
|
} |
|
/** |
|
* Mark position and patch `node.position`. |
|
*/ |
|
|
|
|
|
function position() { |
|
var start = { |
|
line: lineno, |
|
column: column |
|
}; |
|
return function (node) { |
|
node.position = new Position(start); |
|
whitespace(); |
|
return node; |
|
}; |
|
} |
|
/** |
|
* Store position information for a node |
|
*/ |
|
|
|
|
|
function Position(start) { |
|
this.start = start; |
|
this.end = { |
|
line: lineno, |
|
column: column |
|
}; |
|
this.source = options.source; |
|
} |
|
/** |
|
* Non-enumerable source string |
|
*/ |
|
|
|
|
|
Position.prototype.content = css; |
|
/** |
|
* Error `msg`. |
|
*/ |
|
|
|
var errorsList = []; |
|
|
|
function error(msg) { |
|
var err = new Error(options.source + ':' + lineno + ':' + column + ': ' + msg); |
|
err.reason = msg; |
|
err.filename = options.source; |
|
err.line = lineno; |
|
err.column = column; |
|
err.source = css; |
|
|
|
if (options.silent) { |
|
errorsList.push(err); |
|
} else { |
|
throw err; |
|
} |
|
} |
|
/** |
|
* Parse stylesheet. |
|
*/ |
|
|
|
|
|
function stylesheet() { |
|
var rulesList = rules(); |
|
return { |
|
type: 'stylesheet', |
|
stylesheet: { |
|
source: options.source, |
|
rules: rulesList, |
|
parsingErrors: errorsList |
|
} |
|
}; |
|
} |
|
/** |
|
* Opening brace. |
|
*/ |
|
|
|
|
|
function open() { |
|
return match(/^{\s*/); |
|
} |
|
/** |
|
* Closing brace. |
|
*/ |
|
|
|
|
|
function close() { |
|
return match(/^}/); |
|
} |
|
/** |
|
* Parse ruleset. |
|
*/ |
|
|
|
|
|
function rules() { |
|
var node; |
|
var accumulator = []; |
|
whitespace(); |
|
comments(accumulator); |
|
|
|
while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) { |
|
if (node !== false) { |
|
accumulator.push(node); |
|
comments(accumulator); |
|
} |
|
} |
|
|
|
return accumulator; |
|
} |
|
/** |
|
* Match `re` and return captures. |
|
*/ |
|
|
|
|
|
function match(re) { |
|
var m = re.exec(css); |
|
|
|
if (!m) { |
|
return; |
|
} |
|
|
|
var str = m[0]; |
|
updatePosition(str); |
|
css = css.slice(str.length); |
|
return m; |
|
} |
|
/** |
|
* Parse whitespace. |
|
*/ |
|
|
|
|
|
function whitespace() { |
|
match(/^\s*/); |
|
} |
|
/** |
|
* Parse comments; |
|
*/ |
|
|
|
|
|
function comments(accumulator) { |
|
var c; |
|
accumulator = accumulator || []; // eslint-disable-next-line no-cond-assign |
|
|
|
while (c = comment()) { |
|
if (c !== false) { |
|
accumulator.push(c); |
|
} |
|
} |
|
|
|
return accumulator; |
|
} |
|
/** |
|
* Parse comment. |
|
*/ |
|
|
|
|
|
function comment() { |
|
var pos = position(); |
|
|
|
if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) { |
|
return; |
|
} |
|
|
|
var i = 2; |
|
|
|
while ('' !== css.charAt(i) && ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1))) { |
|
++i; |
|
} |
|
|
|
i += 2; |
|
|
|
if ('' === css.charAt(i - 1)) { |
|
return error('End of comment missing'); |
|
} |
|
|
|
var str = css.slice(2, i - 2); |
|
column += 2; |
|
updatePosition(str); |
|
css = css.slice(i); |
|
column += 2; |
|
return pos({ |
|
type: 'comment', |
|
comment: str |
|
}); |
|
} |
|
/** |
|
* Parse selector. |
|
*/ |
|
|
|
|
|
function selector() { |
|
var m = match(/^([^{]+)/); |
|
|
|
if (!m) { |
|
return; |
|
} |
|
/* @fix Remove all comments from selectors |
|
* http://ostermiller.org/findcomment.html */ |
|
|
|
|
|
return trim(m[0]).replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*\/+/g, '').replace(/"(?:\\"|[^"])*"|'(?:\\'|[^'])*'/g, function (matched) { |
|
return matched.replace(/,/g, "\u200C"); |
|
}).split(/\s*(?![^(]*\)),\s*/).map(function (s) { |
|
return s.replace(/\u200C/g, ','); |
|
}); |
|
} |
|
/** |
|
* Parse declaration. |
|
*/ |
|
|
|
|
|
function declaration() { |
|
var pos = position(); // prop |
|
|
|
var prop = match(/^(\*?[-#\/\*\\\w]+(\[[0-9a-z_-]+\])?)\s*/); |
|
|
|
if (!prop) { |
|
return; |
|
} |
|
|
|
prop = trim(prop[0]); // : |
|
|
|
if (!match(/^:\s*/)) { |
|
return error("property missing ':'"); |
|
} // val |
|
|
|
|
|
var val = match(/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^\)]*?\)|[^};])+)/); |
|
var ret = pos({ |
|
type: 'declaration', |
|
property: prop.replace(commentre, ''), |
|
value: val ? trim(val[0]).replace(commentre, '') : '' |
|
}); // ; |
|
|
|
match(/^[;\s]*/); |
|
return ret; |
|
} |
|
/** |
|
* Parse declarations. |
|
*/ |
|
|
|
|
|
function declarations() { |
|
var decls = []; |
|
|
|
if (!open()) { |
|
return error("missing '{'"); |
|
} |
|
|
|
comments(decls); // declarations |
|
|
|
var decl; // eslint-disable-next-line no-cond-assign |
|
|
|
while (decl = declaration()) { |
|
if (decl !== false) { |
|
decls.push(decl); |
|
comments(decls); |
|
} |
|
} |
|
|
|
if (!close()) { |
|
return error("missing '}'"); |
|
} |
|
|
|
return decls; |
|
} |
|
/** |
|
* Parse keyframe. |
|
*/ |
|
|
|
|
|
function keyframe() { |
|
var m; |
|
var vals = []; |
|
var pos = position(); // eslint-disable-next-line no-cond-assign |
|
|
|
while (m = match(/^((\d+\.\d+|\.\d+|\d+)%?|[a-z]+)\s*/)) { |
|
vals.push(m[1]); |
|
match(/^,\s*/); |
|
} |
|
|
|
if (!vals.length) { |
|
return; |
|
} |
|
|
|
return pos({ |
|
type: 'keyframe', |
|
values: vals, |
|
declarations: declarations() |
|
}); |
|
} |
|
/** |
|
* Parse keyframes. |
|
*/ |
|
|
|
|
|
function atkeyframes() { |
|
var pos = position(); |
|
var m = match(/^@([-\w]+)?keyframes\s*/); |
|
|
|
if (!m) { |
|
return; |
|
} |
|
|
|
var vendor = m[1]; // identifier |
|
|
|
m = match(/^([-\w]+)\s*/); |
|
|
|
if (!m) { |
|
return error('@keyframes missing name'); |
|
} |
|
|
|
var name = m[1]; |
|
|
|
if (!open()) { |
|
return error("@keyframes missing '{'"); |
|
} |
|
|
|
var frame; |
|
var frames = comments(); // eslint-disable-next-line no-cond-assign |
|
|
|
while (frame = keyframe()) { |
|
frames.push(frame); |
|
frames = frames.concat(comments()); |
|
} |
|
|
|
if (!close()) { |
|
return error("@keyframes missing '}'"); |
|
} |
|
|
|
return pos({ |
|
type: 'keyframes', |
|
name: name, |
|
vendor: vendor, |
|
keyframes: frames |
|
}); |
|
} |
|
/** |
|
* Parse supports. |
|
*/ |
|
|
|
|
|
function atsupports() { |
|
var pos = position(); |
|
var m = match(/^@supports *([^{]+)/); |
|
|
|
if (!m) { |
|
return; |
|
} |
|
|
|
var supports = trim(m[1]); |
|
|
|
if (!open()) { |
|
return error("@supports missing '{'"); |
|
} |
|
|
|
var style = comments().concat(rules()); |
|
|
|
if (!close()) { |
|
return error("@supports missing '}'"); |
|
} |
|
|
|
return pos({ |
|
type: 'supports', |
|
supports: supports, |
|
rules: style |
|
}); |
|
} |
|
/** |
|
* Parse host. |
|
*/ |
|
|
|
|
|
function athost() { |
|
var pos = position(); |
|
var m = match(/^@host\s*/); |
|
|
|
if (!m) { |
|
return; |
|
} |
|
|
|
if (!open()) { |
|
return error("@host missing '{'"); |
|
} |
|
|
|
var style = comments().concat(rules()); |
|
|
|
if (!close()) { |
|
return error("@host missing '}'"); |
|
} |
|
|
|
return pos({ |
|
type: 'host', |
|
rules: style |
|
}); |
|
} |
|
/** |
|
* Parse media. |
|
*/ |
|
|
|
|
|
function atmedia() { |
|
var pos = position(); |
|
var m = match(/^@media *([^{]+)/); |
|
|
|
if (!m) { |
|
return; |
|
} |
|
|
|
var media = trim(m[1]); |
|
|
|
if (!open()) { |
|
return error("@media missing '{'"); |
|
} |
|
|
|
var style = comments().concat(rules()); |
|
|
|
if (!close()) { |
|
return error("@media missing '}'"); |
|
} |
|
|
|
return pos({ |
|
type: 'media', |
|
media: media, |
|
rules: style |
|
}); |
|
} |
|
/** |
|
* Parse custom-media. |
|
*/ |
|
|
|
|
|
function atcustommedia() { |
|
var pos = position(); |
|
var m = match(/^@custom-media\s+(--[^\s]+)\s*([^{;]+);/); |
|
|
|
if (!m) { |
|
return; |
|
} |
|
|
|
return pos({ |
|
type: 'custom-media', |
|
name: trim(m[1]), |
|
media: trim(m[2]) |
|
}); |
|
} |
|
/** |
|
* Parse paged media. |
|
*/ |
|
|
|
|
|
function atpage() { |
|
var pos = position(); |
|
var m = match(/^@page */); |
|
|
|
if (!m) { |
|
return; |
|
} |
|
|
|
var sel = selector() || []; |
|
|
|
if (!open()) { |
|
return error("@page missing '{'"); |
|
} |
|
|
|
var decls = comments(); // declarations |
|
|
|
var decl; // eslint-disable-next-line no-cond-assign |
|
|
|
while (decl = declaration()) { |
|
decls.push(decl); |
|
decls = decls.concat(comments()); |
|
} |
|
|
|
if (!close()) { |
|
return error("@page missing '}'"); |
|
} |
|
|
|
return pos({ |
|
type: 'page', |
|
selectors: sel, |
|
declarations: decls |
|
}); |
|
} |
|
/** |
|
* Parse document. |
|
*/ |
|
|
|
|
|
function atdocument() { |
|
var pos = position(); |
|
var m = match(/^@([-\w]+)?document *([^{]+)/); |
|
|
|
if (!m) { |
|
return; |
|
} |
|
|
|
var vendor = trim(m[1]); |
|
var doc = trim(m[2]); |
|
|
|
if (!open()) { |
|
return error("@document missing '{'"); |
|
} |
|
|
|
var style = comments().concat(rules()); |
|
|
|
if (!close()) { |
|
return error("@document missing '}'"); |
|
} |
|
|
|
return pos({ |
|
type: 'document', |
|
document: doc, |
|
vendor: vendor, |
|
rules: style |
|
}); |
|
} |
|
/** |
|
* Parse font-face. |
|
*/ |
|
|
|
|
|
function atfontface() { |
|
var pos = position(); |
|
var m = match(/^@font-face\s*/); |
|
|
|
if (!m) { |
|
return; |
|
} |
|
|
|
if (!open()) { |
|
return error("@font-face missing '{'"); |
|
} |
|
|
|
var decls = comments(); // declarations |
|
|
|
var decl; // eslint-disable-next-line no-cond-assign |
|
|
|
while (decl = declaration()) { |
|
decls.push(decl); |
|
decls = decls.concat(comments()); |
|
} |
|
|
|
if (!close()) { |
|
return error("@font-face missing '}'"); |
|
} |
|
|
|
return pos({ |
|
type: 'font-face', |
|
declarations: decls |
|
}); |
|
} |
|
/** |
|
* Parse import |
|
*/ |
|
|
|
|
|
var atimport = _compileAtrule('import'); |
|
/** |
|
* Parse charset |
|
*/ |
|
|
|
|
|
var atcharset = _compileAtrule('charset'); |
|
/** |
|
* Parse namespace |
|
*/ |
|
|
|
|
|
var atnamespace = _compileAtrule('namespace'); |
|
/** |
|
* Parse non-block at-rules |
|
*/ |
|
|
|
|
|
function _compileAtrule(name) { |
|
var re = new RegExp('^@' + name + '\\s*([^;]+);'); |
|
return function () { |
|
var pos = position(); |
|
var m = match(re); |
|
|
|
if (!m) { |
|
return; |
|
} |
|
|
|
var ret = { |
|
type: name |
|
}; |
|
ret[name] = m[1].trim(); |
|
return pos(ret); |
|
}; |
|
} |
|
/** |
|
* Parse at rule. |
|
*/ |
|
|
|
|
|
function atrule() { |
|
if (css[0] !== '@') { |
|
return; |
|
} |
|
|
|
return atkeyframes() || atmedia() || atcustommedia() || atsupports() || atimport() || atcharset() || atnamespace() || atdocument() || atpage() || athost() || atfontface(); |
|
} |
|
/** |
|
* Parse rule. |
|
*/ |
|
|
|
|
|
function rule() { |
|
var pos = position(); |
|
var sel = selector(); |
|
|
|
if (!sel) { |
|
return error('selector missing'); |
|
} |
|
|
|
comments(); |
|
return pos({ |
|
type: 'rule', |
|
selectors: sel, |
|
declarations: declarations() |
|
}); |
|
} |
|
|
|
return addParent(stylesheet()); |
|
}); |
|
/** |
|
* Trim `str`. |
|
*/ |
|
|
|
function trim(str) { |
|
return str ? str.replace(/^\s+|\s+$/g, '') : ''; |
|
} |
|
/** |
|
* Adds non-enumerable parent node reference to each node. |
|
*/ |
|
|
|
|
|
function addParent(obj, parent) { |
|
var isNode = obj && typeof obj.type === 'string'; |
|
var childParent = isNode ? obj : parent; |
|
|
|
for (var k in obj) { |
|
var value = obj[k]; |
|
|
|
if (Array.isArray(value)) { |
|
value.forEach(function (v) { |
|
addParent(v, childParent); |
|
}); |
|
} else if (value && Object(esm_typeof["a" /* default */])(value) === 'object') { |
|
addParent(value, childParent); |
|
} |
|
} |
|
|
|
if (isNode) { |
|
Object.defineProperty(obj, 'parent', { |
|
configurable: true, |
|
writable: true, |
|
enumerable: false, |
|
value: parent || null |
|
}); |
|
} |
|
|
|
return obj; |
|
} |
|
|
|
// EXTERNAL MODULE: ./node_modules/inherits/inherits_browser.js |
|
var inherits_browser = __webpack_require__(98); |
|
var inherits_browser_default = /*#__PURE__*/__webpack_require__.n(inherits_browser); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/editor-styles/ast/stringify/compiler.js |
|
// Adapted from https://github.com/reworkcss/css |
|
// because we needed to remove source map support. |
|
|
|
/** |
|
* Expose `Compiler`. |
|
*/ |
|
/* harmony default export */ var stringify_compiler = (Compiler); |
|
/** |
|
* Initialize a compiler. |
|
* |
|
* @param {Type} name |
|
* @return {Type} |
|
* @api public |
|
*/ |
|
|
|
function Compiler(opts) { |
|
this.options = opts || {}; |
|
} |
|
/** |
|
* Emit `str` |
|
*/ |
|
|
|
|
|
Compiler.prototype.emit = function (str) { |
|
return str; |
|
}; |
|
/** |
|
* Visit `node`. |
|
*/ |
|
|
|
|
|
Compiler.prototype.visit = function (node) { |
|
return this[node.type](node); |
|
}; |
|
/** |
|
* Map visit over array of `nodes`, optionally using a `delim` |
|
*/ |
|
|
|
|
|
Compiler.prototype.mapVisit = function (nodes, delim) { |
|
var buf = ''; |
|
delim = delim || ''; |
|
|
|
for (var i = 0, length = nodes.length; i < length; i++) { |
|
buf += this.visit(nodes[i]); |
|
|
|
if (delim && i < length - 1) { |
|
buf += this.emit(delim); |
|
} |
|
} |
|
|
|
return buf; |
|
}; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/editor-styles/ast/stringify/compress.js |
|
// Adapted from https://github.com/reworkcss/css |
|
// because we needed to remove source map support. |
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Expose compiler. |
|
*/ |
|
|
|
/* harmony default export */ var compress = (compress_Compiler); |
|
/** |
|
* Initialize a new `Compiler`. |
|
*/ |
|
|
|
function compress_Compiler(options) { |
|
stringify_compiler.call(this, options); |
|
} |
|
/** |
|
* Inherit from `Base.prototype`. |
|
*/ |
|
|
|
|
|
inherits_browser_default()(compress_Compiler, stringify_compiler); |
|
/** |
|
* Compile `node`. |
|
*/ |
|
|
|
compress_Compiler.prototype.compile = function (node) { |
|
return node.stylesheet.rules.map(this.visit, this).join(''); |
|
}; |
|
/** |
|
* Visit comment node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.comment = function (node) { |
|
return this.emit('', node.position); |
|
}; |
|
/** |
|
* Visit import node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.import = function (node) { |
|
return this.emit('@import ' + node.import + ';', node.position); |
|
}; |
|
/** |
|
* Visit media node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.media = function (node) { |
|
return this.emit('@media ' + node.media, node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}'); |
|
}; |
|
/** |
|
* Visit document node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.document = function (node) { |
|
var doc = '@' + (node.vendor || '') + 'document ' + node.document; |
|
return this.emit(doc, node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}'); |
|
}; |
|
/** |
|
* Visit charset node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.charset = function (node) { |
|
return this.emit('@charset ' + node.charset + ';', node.position); |
|
}; |
|
/** |
|
* Visit namespace node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.namespace = function (node) { |
|
return this.emit('@namespace ' + node.namespace + ';', node.position); |
|
}; |
|
/** |
|
* Visit supports node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.supports = function (node) { |
|
return this.emit('@supports ' + node.supports, node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}'); |
|
}; |
|
/** |
|
* Visit keyframes node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.keyframes = function (node) { |
|
return this.emit('@' + (node.vendor || '') + 'keyframes ' + node.name, node.position) + this.emit('{') + this.mapVisit(node.keyframes) + this.emit('}'); |
|
}; |
|
/** |
|
* Visit keyframe node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.keyframe = function (node) { |
|
var decls = node.declarations; |
|
return this.emit(node.values.join(','), node.position) + this.emit('{') + this.mapVisit(decls) + this.emit('}'); |
|
}; |
|
/** |
|
* Visit page node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.page = function (node) { |
|
var sel = node.selectors.length ? node.selectors.join(', ') : ''; |
|
return this.emit('@page ' + sel, node.position) + this.emit('{') + this.mapVisit(node.declarations) + this.emit('}'); |
|
}; |
|
/** |
|
* Visit font-face node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype['font-face'] = function (node) { |
|
return this.emit('@font-face', node.position) + this.emit('{') + this.mapVisit(node.declarations) + this.emit('}'); |
|
}; |
|
/** |
|
* Visit host node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.host = function (node) { |
|
return this.emit('@host', node.position) + this.emit('{') + this.mapVisit(node.rules) + this.emit('}'); |
|
}; |
|
/** |
|
* Visit custom-media node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype['custom-media'] = function (node) { |
|
return this.emit('@custom-media ' + node.name + ' ' + node.media + ';', node.position); |
|
}; |
|
/** |
|
* Visit rule node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.rule = function (node) { |
|
var decls = node.declarations; |
|
|
|
if (!decls.length) { |
|
return ''; |
|
} |
|
|
|
return this.emit(node.selectors.join(','), node.position) + this.emit('{') + this.mapVisit(decls) + this.emit('}'); |
|
}; |
|
/** |
|
* Visit declaration node. |
|
*/ |
|
|
|
|
|
compress_Compiler.prototype.declaration = function (node) { |
|
return this.emit(node.property + ':' + node.value, node.position) + this.emit(';'); |
|
}; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/editor-styles/ast/stringify/identity.js |
|
// Adapted from https://github.com/reworkcss/css |
|
// because we needed to remove source map support. |
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Expose compiler. |
|
*/ |
|
|
|
/* harmony default export */ var identity = (identity_Compiler); |
|
/** |
|
* Initialize a new `Compiler`. |
|
*/ |
|
|
|
function identity_Compiler(options) { |
|
options = options || {}; |
|
stringify_compiler.call(this, options); |
|
this.indentation = options.indent; |
|
} |
|
/** |
|
* Inherit from `Base.prototype`. |
|
*/ |
|
|
|
|
|
inherits_browser_default()(identity_Compiler, stringify_compiler); |
|
/** |
|
* Compile `node`. |
|
*/ |
|
|
|
identity_Compiler.prototype.compile = function (node) { |
|
return this.stylesheet(node); |
|
}; |
|
/** |
|
* Visit stylesheet node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.stylesheet = function (node) { |
|
return this.mapVisit(node.stylesheet.rules, '\n\n'); |
|
}; |
|
/** |
|
* Visit comment node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.comment = function (node) { |
|
return this.emit(this.indent() + '/*' + node.comment + '*/', node.position); |
|
}; |
|
/** |
|
* Visit import node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.import = function (node) { |
|
return this.emit('@import ' + node.import + ';', node.position); |
|
}; |
|
/** |
|
* Visit media node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.media = function (node) { |
|
return this.emit('@media ' + node.media, node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit(this.indent(-1) + '\n}'); |
|
}; |
|
/** |
|
* Visit document node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.document = function (node) { |
|
var doc = '@' + (node.vendor || '') + 'document ' + node.document; |
|
return this.emit(doc, node.position) + this.emit(' ' + ' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit(this.indent(-1) + '\n}'); |
|
}; |
|
/** |
|
* Visit charset node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.charset = function (node) { |
|
return this.emit('@charset ' + node.charset + ';', node.position); |
|
}; |
|
/** |
|
* Visit namespace node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.namespace = function (node) { |
|
return this.emit('@namespace ' + node.namespace + ';', node.position); |
|
}; |
|
/** |
|
* Visit supports node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.supports = function (node) { |
|
return this.emit('@supports ' + node.supports, node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit(this.indent(-1) + '\n}'); |
|
}; |
|
/** |
|
* Visit keyframes node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.keyframes = function (node) { |
|
return this.emit('@' + (node.vendor || '') + 'keyframes ' + node.name, node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.keyframes, '\n') + this.emit(this.indent(-1) + '}'); |
|
}; |
|
/** |
|
* Visit keyframe node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.keyframe = function (node) { |
|
var decls = node.declarations; |
|
return this.emit(this.indent()) + this.emit(node.values.join(', '), node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(decls, '\n') + this.emit(this.indent(-1) + '\n' + this.indent() + '}\n'); |
|
}; |
|
/** |
|
* Visit page node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.page = function (node) { |
|
var sel = node.selectors.length ? node.selectors.join(', ') + ' ' : ''; |
|
return this.emit('@page ' + sel, node.position) + this.emit('{\n') + this.emit(this.indent(1)) + this.mapVisit(node.declarations, '\n') + this.emit(this.indent(-1)) + this.emit('\n}'); |
|
}; |
|
/** |
|
* Visit font-face node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype['font-face'] = function (node) { |
|
return this.emit('@font-face ', node.position) + this.emit('{\n') + this.emit(this.indent(1)) + this.mapVisit(node.declarations, '\n') + this.emit(this.indent(-1)) + this.emit('\n}'); |
|
}; |
|
/** |
|
* Visit host node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.host = function (node) { |
|
return this.emit('@host', node.position) + this.emit(' {\n' + this.indent(1)) + this.mapVisit(node.rules, '\n\n') + this.emit(this.indent(-1) + '\n}'); |
|
}; |
|
/** |
|
* Visit custom-media node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype['custom-media'] = function (node) { |
|
return this.emit('@custom-media ' + node.name + ' ' + node.media + ';', node.position); |
|
}; |
|
/** |
|
* Visit rule node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.rule = function (node) { |
|
var indent = this.indent(); |
|
var decls = node.declarations; |
|
|
|
if (!decls.length) { |
|
return ''; |
|
} |
|
|
|
return this.emit(node.selectors.map(function (s) { |
|
return indent + s; |
|
}).join(',\n'), node.position) + this.emit(' {\n') + this.emit(this.indent(1)) + this.mapVisit(decls, '\n') + this.emit(this.indent(-1)) + this.emit('\n' + this.indent() + '}'); |
|
}; |
|
/** |
|
* Visit declaration node. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.declaration = function (node) { |
|
return this.emit(this.indent()) + this.emit(node.property + ': ' + node.value, node.position) + this.emit(';'); |
|
}; |
|
/** |
|
* Increase, decrease or return current indentation. |
|
*/ |
|
|
|
|
|
identity_Compiler.prototype.indent = function (level) { |
|
this.level = this.level || 1; |
|
|
|
if (null !== level) { |
|
this.level += level; |
|
return ''; |
|
} |
|
|
|
return Array(this.level).join(this.indentation || ' '); |
|
}; |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/editor-styles/ast/stringify/index.js |
|
// Adapted from https://github.com/reworkcss/css |
|
// because we needed to remove source map support. |
|
|
|
/** |
|
* Internal dependencies. |
|
*/ |
|
|
|
|
|
/** |
|
* Stringfy the given AST `node`. |
|
* |
|
* Options: |
|
* |
|
* - `compress` space-optimized output |
|
* - `sourcemap` return an object with `.code` and `.map` |
|
* |
|
* @param {Object} node |
|
* @param {Object} [options] |
|
* @return {String} |
|
* @api public |
|
*/ |
|
|
|
/* harmony default export */ var stringify = (function (node, options) { |
|
options = options || {}; |
|
var compiler = options.compress ? new compress(options) : new identity(options); |
|
var code = compiler.compile(node); |
|
return code; |
|
}); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/editor-styles/ast/index.js |
|
// Adapted from https://github.com/reworkcss/css |
|
// because we needed to remove source map support. |
|
|
|
|
|
|
|
// EXTERNAL MODULE: ./node_modules/traverse/index.js |
|
var traverse = __webpack_require__(193); |
|
var traverse_default = /*#__PURE__*/__webpack_require__.n(traverse); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/editor-styles/traverse.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
|
|
function traverseCSS(css, callback) { |
|
try { |
|
var parsed = parse(css); |
|
var updated = traverse_default.a.map(parsed, function (node) { |
|
if (!node) { |
|
return node; |
|
} |
|
|
|
var updatedNode = callback(node); |
|
return this.update(updatedNode); |
|
}); |
|
return stringify(updated); |
|
} catch (err) { |
|
// eslint-disable-next-line no-console |
|
console.warn('Error while traversing the CSS: ' + err); |
|
return null; |
|
} |
|
} |
|
|
|
/* harmony default export */ var editor_styles_traverse = (traverseCSS); |
|
|
|
// EXTERNAL MODULE: ./node_modules/url/url.js |
|
var url_url = __webpack_require__(75); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/editor-styles/transforms/url-rewrite.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* Return `true` if the given path is http/https. |
|
* |
|
* @param {string} filePath path |
|
* |
|
* @return {boolean} is remote path. |
|
*/ |
|
|
|
function isRemotePath(filePath) { |
|
return /^(?:https?:)?\/\//.test(filePath); |
|
} |
|
/** |
|
* Return `true` if the given filePath is an absolute url. |
|
* |
|
* @param {string} filePath path |
|
* |
|
* @return {boolean} is absolute path. |
|
*/ |
|
|
|
|
|
function isAbsolutePath(filePath) { |
|
return /^\/(?!\/)/.test(filePath); |
|
} |
|
/** |
|
* Whether or not the url should be inluded. |
|
* |
|
* @param {Object} meta url meta info |
|
* |
|
* @return {boolean} is valid. |
|
*/ |
|
|
|
|
|
function isValidURL(meta) { |
|
// ignore hashes or data uris |
|
if (meta.value.indexOf('data:') === 0 || meta.value.indexOf('#') === 0) { |
|
return false; |
|
} |
|
|
|
if (isAbsolutePath(meta.value)) { |
|
return false; |
|
} // do not handle the http/https urls if `includeRemote` is false |
|
|
|
|
|
if (isRemotePath(meta.value)) { |
|
return false; |
|
} |
|
|
|
return true; |
|
} |
|
/** |
|
* Get the absolute path of the url, relative to the basePath |
|
* |
|
* @param {string} str the url |
|
* @param {string} baseURL base URL |
|
* @param {string} absolutePath the absolute path |
|
* |
|
* @return {string} the full path to the file |
|
*/ |
|
|
|
|
|
function getResourcePath(str, baseURL) { |
|
var pathname = Object(url_url["parse"])(str).pathname; |
|
var filePath = Object(url_url["resolve"])(baseURL, pathname); |
|
return filePath; |
|
} |
|
/** |
|
* Process the single `url()` pattern |
|
* |
|
* @param {string} baseURL the base URL for relative URLs |
|
* @return {Promise} the Promise |
|
*/ |
|
|
|
|
|
function processURL(baseURL) { |
|
return function (meta) { |
|
var URL = getResourcePath(meta.value, baseURL); |
|
return Object(objectSpread["a" /* default */])({}, meta, { |
|
newUrl: 'url(' + meta.before + meta.quote + URL + meta.quote + meta.after + ')' |
|
}); |
|
}; |
|
} |
|
/** |
|
* Get all `url()`s, and return the meta info |
|
* |
|
* @param {string} value decl.value |
|
* |
|
* @return {Array} the urls |
|
*/ |
|
|
|
|
|
function getURLs(value) { |
|
var reg = /url\((\s*)(['"]?)(.+?)\2(\s*)\)/g; |
|
var match; |
|
var URLs = []; |
|
|
|
while ((match = reg.exec(value)) !== null) { |
|
var meta = { |
|
source: match[0], |
|
before: match[1], |
|
quote: match[2], |
|
value: match[3], |
|
after: match[4] |
|
}; |
|
|
|
if (isValidURL(meta)) { |
|
URLs.push(meta); |
|
} |
|
} |
|
|
|
return URLs; |
|
} |
|
/** |
|
* Replace the raw value's `url()` segment to the new value |
|
* |
|
* @param {string} raw the raw value |
|
* @param {Array} URLs the URLs to replace |
|
* |
|
* @return {string} the new value |
|
*/ |
|
|
|
|
|
function replaceURLs(raw, URLs) { |
|
URLs.forEach(function (item) { |
|
raw = raw.replace(item.source, item.newUrl); |
|
}); |
|
return raw; |
|
} |
|
|
|
var url_rewrite_rewrite = function rewrite(rootURL) { |
|
return function (node) { |
|
if (node.type === 'declaration') { |
|
var updatedURLs = getURLs(node.value).map(processURL(rootURL)); |
|
return Object(objectSpread["a" /* default */])({}, node, { |
|
value: replaceURLs(node.value, updatedURLs) |
|
}); |
|
} |
|
|
|
return node; |
|
}; |
|
}; |
|
|
|
/* harmony default export */ var url_rewrite = (url_rewrite_rewrite); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/editor-styles/transforms/wrap.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* @const string IS_ROOT_TAG Regex to check if the selector is a root tag selector. |
|
*/ |
|
|
|
var IS_ROOT_TAG = /^(body|html).*$/; |
|
|
|
var wrap_wrap = function wrap(namespace) { |
|
var ignore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; |
|
return function (node) { |
|
var updateSelector = function updateSelector(selector) { |
|
if (Object(external_lodash_["includes"])(ignore, selector.trim())) { |
|
return selector; |
|
} // Anything other than a root tag is always prefixed. |
|
|
|
|
|
{ |
|
if (!selector.match(IS_ROOT_TAG)) { |
|
return namespace + ' ' + selector; |
|
} |
|
} // HTML and Body elements cannot be contained within our container so lets extract their styles. |
|
|
|
return selector.replace(/^(body|html)/, namespace); |
|
}; |
|
|
|
if (node.type === 'rule') { |
|
return Object(objectSpread["a" /* default */])({}, node, { |
|
selectors: node.selectors.map(updateSelector) |
|
}); |
|
} |
|
|
|
return node; |
|
}; |
|
}; |
|
|
|
/* harmony default export */ var transforms_wrap = (wrap_wrap); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/editor-styles/index.js |
|
|
|
|
|
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/provider/index.js |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress Dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
var provider_EditorProvider = |
|
/*#__PURE__*/ |
|
function (_Component) { |
|
Object(inherits["a" /* default */])(EditorProvider, _Component); |
|
|
|
function EditorProvider(props) { |
|
var _this; |
|
|
|
Object(classCallCheck["a" /* default */])(this, EditorProvider); |
|
|
|
_this = Object(possibleConstructorReturn["a" /* default */])(this, Object(getPrototypeOf["a" /* default */])(EditorProvider).apply(this, arguments)); // Assume that we don't need to initialize in the case of an error recovery. |
|
|
|
if (props.recovery) { |
|
return Object(possibleConstructorReturn["a" /* default */])(_this); |
|
} |
|
|
|
props.updateEditorSettings(props.settings); |
|
props.updatePostLock(props.settings.postLock); |
|
props.setupEditor(props.post, props.initialEdits); |
|
|
|
if (props.settings.autosave) { |
|
props.createWarningNotice(Object(external_this_wp_i18n_["__"])('There is an autosave of this post that is more recent than the version below.'), { |
|
id: 'autosave-exists', |
|
actions: [{ |
|
label: Object(external_this_wp_i18n_["__"])('View the autosave'), |
|
url: props.settings.autosave.editLink |
|
}] |
|
}); |
|
} |
|
|
|
return _this; |
|
} |
|
|
|
Object(createClass["a" /* default */])(EditorProvider, [{ |
|
key: "componentDidMount", |
|
value: function componentDidMount() { |
|
if (!this.props.settings.styles) { |
|
return; |
|
} |
|
|
|
Object(external_lodash_["map"])(this.props.settings.styles, function (_ref) { |
|
var css = _ref.css, |
|
baseURL = _ref.baseURL; |
|
var transforms = [transforms_wrap('.editor-styles-wrapper')]; |
|
|
|
if (baseURL) { |
|
transforms.push(url_rewrite(baseURL)); |
|
} |
|
|
|
var updatedCSS = editor_styles_traverse(css, Object(external_this_wp_compose_["compose"])(transforms)); |
|
|
|
if (updatedCSS) { |
|
var node = document.createElement('style'); |
|
node.innerHTML = updatedCSS; |
|
document.body.appendChild(node); |
|
} |
|
}); |
|
} |
|
}, { |
|
key: "componentDidUpdate", |
|
value: function componentDidUpdate(prevProps) { |
|
if (this.props.settings !== prevProps.settings) { |
|
this.props.updateEditorSettings(this.props.settings); |
|
} |
|
} |
|
}, { |
|
key: "render", |
|
value: function render() { |
|
var children = this.props.children; |
|
var providers = [// Slot / Fill provider: |
|
// |
|
// - context.getSlot |
|
// - context.registerSlot |
|
// - context.unregisterSlot |
|
[external_this_wp_components_["SlotFillProvider"]], // DropZone provider: |
|
[external_this_wp_components_["DropZoneProvider"]]]; |
|
var createEditorElement = Object(external_lodash_["flow"])(providers.map(function (_ref2) { |
|
var _ref3 = Object(slicedToArray["a" /* default */])(_ref2, 2), |
|
Provider = _ref3[0], |
|
props = _ref3[1]; |
|
|
|
return function (arg) { |
|
return Object(external_this_wp_element_["createElement"])(Provider, props, arg); |
|
}; |
|
})); |
|
return createEditorElement(children); |
|
} |
|
}]); |
|
|
|
return EditorProvider; |
|
}(external_this_wp_element_["Component"]); |
|
|
|
/* harmony default export */ var provider = (Object(external_this_wp_data_["withDispatch"])(function (dispatch) { |
|
var _dispatch = dispatch('core/editor'), |
|
setupEditor = _dispatch.setupEditor, |
|
updateEditorSettings = _dispatch.updateEditorSettings, |
|
updatePostLock = _dispatch.updatePostLock; |
|
|
|
var _dispatch2 = dispatch('core/notices'), |
|
createWarningNotice = _dispatch2.createWarningNotice; |
|
|
|
return { |
|
setupEditor: setupEditor, |
|
updateEditorSettings: updateEditorSettings, |
|
updatePostLock: updatePostLock, |
|
createWarningNotice: createWarningNotice |
|
}; |
|
})(provider_EditorProvider)); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/components/index.js |
|
// Block Creation Components |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Post Related Components |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Content Related Components |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// State Related Components |
|
|
|
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/hooks/align.js |
|
|
|
|
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* An array which includes all possible valid alignments, |
|
* used to validate if an alignment is valid or not. |
|
* |
|
* @constant |
|
* @type {string[]} |
|
*/ |
|
|
|
var ALL_ALIGNMENTS = ['left', 'center', 'right', 'wide', 'full']; |
|
/** |
|
* An array which includes all wide alignments. |
|
* In order for this alignments to be valid they need to be supported by the block, |
|
* and by the theme. |
|
* |
|
* @constant |
|
* @type {string[]} |
|
*/ |
|
|
|
var WIDE_ALIGNMENTS = ['wide', 'full']; |
|
/** |
|
* Returns the valid alignments. |
|
* Takes into consideration the aligns supported by a block, if the block supports wide controls or not and if theme supports wide controls or not. |
|
* Exported just for testing purposes, not exported outside the module. |
|
* |
|
* @param {?boolean|string[]} blockAlign Aligns supported by the block. |
|
* @param {?boolean} hasWideBlockSupport True if block supports wide alignments. And False otherwise. |
|
* @param {?boolean} hasWideEnabled True if theme supports wide alignments. And False otherwise. |
|
* |
|
* @return {string[]} Valid alignments. |
|
*/ |
|
|
|
function getValidAlignments(blockAlign) { |
|
var hasWideBlockSupport = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; |
|
var hasWideEnabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; |
|
var validAlignments; |
|
|
|
if (Array.isArray(blockAlign)) { |
|
validAlignments = blockAlign; |
|
} else if (blockAlign === true) { |
|
// `true` includes all alignments... |
|
validAlignments = ALL_ALIGNMENTS; |
|
} else { |
|
validAlignments = []; |
|
} |
|
|
|
if (!hasWideEnabled || blockAlign === true && !hasWideBlockSupport) { |
|
return external_lodash_["without"].apply(void 0, [validAlignments].concat(WIDE_ALIGNMENTS)); |
|
} |
|
|
|
return validAlignments; |
|
} |
|
/** |
|
* Filters registered block settings, extending attributes to include `align`. |
|
* |
|
* @param {Object} settings Original block settings |
|
* @return {Object} Filtered block settings |
|
*/ |
|
|
|
function addAttribute(settings) { |
|
// allow blocks to specify their own attribute definition with default values if needed. |
|
if (Object(external_lodash_["has"])(settings.attributes, ['align', 'type'])) { |
|
return settings; |
|
} |
|
|
|
if (Object(external_this_wp_blocks_["hasBlockSupport"])(settings, 'align')) { |
|
// Use Lodash's assign to gracefully handle if attributes are undefined |
|
settings.attributes = Object(external_lodash_["assign"])(settings.attributes, { |
|
align: { |
|
type: 'string' |
|
} |
|
}); |
|
} |
|
|
|
return settings; |
|
} |
|
/** |
|
* Override the default edit UI to include new toolbar controls for block |
|
* alignment, if block defines support. |
|
* |
|
* @param {Function} BlockEdit Original component |
|
* @return {Function} Wrapped component |
|
*/ |
|
|
|
var withToolbarControls = Object(external_this_wp_compose_["createHigherOrderComponent"])(function (BlockEdit) { |
|
return function (props) { |
|
var blockName = props.name; // Compute valid alignments without taking into account, |
|
// if the theme supports wide alignments or not. |
|
// BlockAlignmentToolbar takes into account the theme support. |
|
|
|
var validAlignments = getValidAlignments(Object(external_this_wp_blocks_["getBlockSupport"])(blockName, 'align'), Object(external_this_wp_blocks_["hasBlockSupport"])(blockName, 'alignWide', true)); |
|
|
|
var updateAlignment = function updateAlignment(nextAlign) { |
|
if (!nextAlign) { |
|
var blockType = Object(external_this_wp_blocks_["getBlockType"])(props.name); |
|
var blockDefaultAlign = Object(external_lodash_["get"])(blockType, ['attributes', 'align', 'default']); |
|
|
|
if (blockDefaultAlign) { |
|
nextAlign = ''; |
|
} |
|
} |
|
|
|
props.setAttributes({ |
|
align: nextAlign |
|
}); |
|
}; |
|
|
|
return [validAlignments.length > 0 && props.isSelected && Object(external_this_wp_element_["createElement"])(block_controls, { |
|
key: "align-controls" |
|
}, Object(external_this_wp_element_["createElement"])(block_alignment_toolbar, { |
|
value: props.attributes.align, |
|
onChange: updateAlignment, |
|
controls: validAlignments |
|
})), Object(external_this_wp_element_["createElement"])(BlockEdit, Object(esm_extends["a" /* default */])({ |
|
key: "edit" |
|
}, props))]; |
|
}; |
|
}, 'withToolbarControls'); // Exported just for testing purposes, not exported outside the module. |
|
|
|
var align_insideSelectWithDataAlign = function insideSelectWithDataAlign(BlockListBlock) { |
|
return function (props) { |
|
var name = props.name, |
|
attributes = props.attributes, |
|
hasWideEnabled = props.hasWideEnabled; |
|
var align = attributes.align; |
|
var validAlignments = getValidAlignments(Object(external_this_wp_blocks_["getBlockSupport"])(name, 'align'), Object(external_this_wp_blocks_["hasBlockSupport"])(name, 'alignWide', true), hasWideEnabled); |
|
var wrapperProps = props.wrapperProps; |
|
|
|
if (Object(external_lodash_["includes"])(validAlignments, align)) { |
|
wrapperProps = Object(objectSpread["a" /* default */])({}, wrapperProps, { |
|
'data-align': align |
|
}); |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(BlockListBlock, Object(esm_extends["a" /* default */])({}, props, { |
|
wrapperProps: wrapperProps |
|
})); |
|
}; |
|
}; |
|
/** |
|
* Override the default block element to add alignment wrapper props. |
|
* |
|
* @param {Function} BlockListBlock Original component |
|
* @return {Function} Wrapped component |
|
*/ |
|
|
|
var withDataAlign = Object(external_this_wp_compose_["createHigherOrderComponent"])(Object(external_this_wp_compose_["compose"])([Object(external_this_wp_data_["withSelect"])(function (select) { |
|
var _select = select('core/editor'), |
|
getEditorSettings = _select.getEditorSettings; |
|
|
|
return { |
|
hasWideEnabled: !!getEditorSettings().alignWide |
|
}; |
|
}), align_insideSelectWithDataAlign])); |
|
/** |
|
* Override props assigned to save component to inject alignment class name if |
|
* block supports it. |
|
* |
|
* @param {Object} props Additional props applied to save element |
|
* @param {Object} blockType Block type |
|
* @param {Object} attributes Block attributes |
|
* @return {Object} Filtered props applied to save element |
|
*/ |
|
|
|
function addAssignedAlign(props, blockType, attributes) { |
|
var align = attributes.align; |
|
var blockAlign = Object(external_this_wp_blocks_["getBlockSupport"])(blockType, 'align'); |
|
var hasWideBlockSupport = Object(external_this_wp_blocks_["hasBlockSupport"])(blockType, 'alignWide', true); |
|
var isAlignValid = Object(external_lodash_["includes"])( // Compute valid alignments without taking into account, |
|
// if the theme supports wide alignments or not. |
|
// This way changing themes does not impacts the block save. |
|
getValidAlignments(blockAlign, hasWideBlockSupport), align); |
|
|
|
if (isAlignValid) { |
|
props.className = classnames_default()("align".concat(align), props.className); |
|
} |
|
|
|
return props; |
|
} |
|
Object(external_this_wp_hooks_["addFilter"])('blocks.registerBlockType', 'core/align/addAttribute', addAttribute); |
|
Object(external_this_wp_hooks_["addFilter"])('editor.BlockListBlock', 'core/editor/align/with-data-align', withDataAlign); |
|
Object(external_this_wp_hooks_["addFilter"])('editor.BlockEdit', 'core/editor/align/with-toolbar-controls', withToolbarControls); |
|
Object(external_this_wp_hooks_["addFilter"])('blocks.getSaveContent.extraProps', 'core/align/addAssignedAlign', addAssignedAlign); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/hooks/anchor.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Regular expression matching invalid anchor characters for replacement. |
|
* |
|
* @type {RegExp} |
|
*/ |
|
|
|
var ANCHOR_REGEX = /[\s#]/g; |
|
/** |
|
* Filters registered block settings, extending attributes with anchor using ID |
|
* of the first node. |
|
* |
|
* @param {Object} settings Original block settings. |
|
* |
|
* @return {Object} Filtered block settings. |
|
*/ |
|
|
|
function anchor_addAttribute(settings) { |
|
if (Object(external_this_wp_blocks_["hasBlockSupport"])(settings, 'anchor')) { |
|
// Use Lodash's assign to gracefully handle if attributes are undefined |
|
settings.attributes = Object(external_lodash_["assign"])(settings.attributes, { |
|
anchor: { |
|
type: 'string', |
|
source: 'attribute', |
|
attribute: 'id', |
|
selector: '*' |
|
} |
|
}); |
|
} |
|
|
|
return settings; |
|
} |
|
/** |
|
* Override the default edit UI to include a new block inspector control for |
|
* assigning the anchor ID, if block supports anchor. |
|
* |
|
* @param {function|Component} BlockEdit Original component. |
|
* |
|
* @return {string} Wrapped component. |
|
*/ |
|
|
|
var withInspectorControl = Object(external_this_wp_compose_["createHigherOrderComponent"])(function (BlockEdit) { |
|
return function (props) { |
|
var hasAnchor = Object(external_this_wp_blocks_["hasBlockSupport"])(props.name, 'anchor'); |
|
|
|
if (hasAnchor && props.isSelected) { |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])(BlockEdit, props), Object(external_this_wp_element_["createElement"])(inspector_advanced_controls, null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["TextControl"], { |
|
label: Object(external_this_wp_i18n_["__"])('HTML Anchor'), |
|
help: Object(external_this_wp_i18n_["__"])('Anchors lets you link directly to a section on a page.'), |
|
value: props.attributes.anchor || '', |
|
onChange: function onChange(nextValue) { |
|
nextValue = nextValue.replace(ANCHOR_REGEX, '-'); |
|
props.setAttributes({ |
|
anchor: nextValue |
|
}); |
|
} |
|
}))); |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(BlockEdit, props); |
|
}; |
|
}, 'withInspectorControl'); |
|
/** |
|
* Override props assigned to save component to inject anchor ID, if block |
|
* supports anchor. This is only applied if the block's save result is an |
|
* element and not a markup string. |
|
* |
|
* @param {Object} extraProps Additional props applied to save element. |
|
* @param {Object} blockType Block type. |
|
* @param {Object} attributes Current block attributes. |
|
* |
|
* @return {Object} Filtered props applied to save element. |
|
*/ |
|
|
|
function addSaveProps(extraProps, blockType, attributes) { |
|
if (Object(external_this_wp_blocks_["hasBlockSupport"])(blockType, 'anchor')) { |
|
extraProps.id = attributes.anchor === '' ? null : attributes.anchor; |
|
} |
|
|
|
return extraProps; |
|
} |
|
Object(external_this_wp_hooks_["addFilter"])('blocks.registerBlockType', 'core/anchor/attribute', anchor_addAttribute); |
|
Object(external_this_wp_hooks_["addFilter"])('editor.BlockEdit', 'core/editor/anchor/with-inspector-control', withInspectorControl); |
|
Object(external_this_wp_hooks_["addFilter"])('blocks.getSaveContent.extraProps', 'core/anchor/save-props', addSaveProps); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/hooks/custom-class-name.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
/** |
|
* Filters registered block settings, extending attributes with anchor using ID |
|
* of the first node. |
|
* |
|
* @param {Object} settings Original block settings. |
|
* |
|
* @return {Object} Filtered block settings. |
|
*/ |
|
|
|
function custom_class_name_addAttribute(settings) { |
|
if (Object(external_this_wp_blocks_["hasBlockSupport"])(settings, 'customClassName', true)) { |
|
// Use Lodash's assign to gracefully handle if attributes are undefined |
|
settings.attributes = Object(external_lodash_["assign"])(settings.attributes, { |
|
className: { |
|
type: 'string' |
|
} |
|
}); |
|
} |
|
|
|
return settings; |
|
} |
|
/** |
|
* Override the default edit UI to include a new block inspector control for |
|
* assigning the custom class name, if block supports custom class name. |
|
* |
|
* @param {function|Component} BlockEdit Original component. |
|
* |
|
* @return {string} Wrapped component. |
|
*/ |
|
|
|
var custom_class_name_withInspectorControl = Object(external_this_wp_compose_["createHigherOrderComponent"])(function (BlockEdit) { |
|
return function (props) { |
|
var hasCustomClassName = Object(external_this_wp_blocks_["hasBlockSupport"])(props.name, 'customClassName', true); |
|
|
|
if (hasCustomClassName && props.isSelected) { |
|
return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, Object(external_this_wp_element_["createElement"])(BlockEdit, props), Object(external_this_wp_element_["createElement"])(inspector_advanced_controls, null, Object(external_this_wp_element_["createElement"])(external_this_wp_components_["TextControl"], { |
|
label: Object(external_this_wp_i18n_["__"])('Additional CSS Class'), |
|
value: props.attributes.className || '', |
|
onChange: function onChange(nextValue) { |
|
props.setAttributes({ |
|
className: nextValue |
|
}); |
|
} |
|
}))); |
|
} |
|
|
|
return Object(external_this_wp_element_["createElement"])(BlockEdit, props); |
|
}; |
|
}, 'withInspectorControl'); |
|
/** |
|
* Override props assigned to save component to inject anchor ID, if block |
|
* supports anchor. This is only applied if the block's save result is an |
|
* element and not a markup string. |
|
* |
|
* @param {Object} extraProps Additional props applied to save element. |
|
* @param {Object} blockType Block type. |
|
* @param {Object} attributes Current block attributes. |
|
* |
|
* @return {Object} Filtered props applied to save element. |
|
*/ |
|
|
|
function custom_class_name_addSaveProps(extraProps, blockType, attributes) { |
|
if (Object(external_this_wp_blocks_["hasBlockSupport"])(blockType, 'customClassName', true) && attributes.className) { |
|
extraProps.className = classnames_default()(extraProps.className, attributes.className); |
|
} |
|
|
|
return extraProps; |
|
} |
|
/** |
|
* Given an HTML string, returns an array of class names assigned to the root |
|
* element in the markup. |
|
* |
|
* @param {string} innerHTML Markup string from which to extract classes. |
|
* |
|
* @return {string[]} Array of class names assigned to the root element. |
|
*/ |
|
|
|
function getHTMLRootElementClasses(innerHTML) { |
|
innerHTML = "<div data-custom-class-name>".concat(innerHTML, "</div>"); |
|
var parsed = Object(external_this_wp_blocks_["parseWithAttributeSchema"])(innerHTML, { |
|
type: 'string', |
|
source: 'attribute', |
|
selector: '[data-custom-class-name] > *', |
|
attribute: 'class' |
|
}); |
|
return parsed ? parsed.trim().split(/\s+/) : []; |
|
} |
|
/** |
|
* Given a parsed set of block attributes, if the block supports custom class |
|
* names and an unknown class (per the block's serialization behavior) is |
|
* found, the unknown classes are treated as custom classes. This prevents the |
|
* block from being considered as invalid. |
|
* |
|
* @param {Object} blockAttributes Original block attributes. |
|
* @param {Object} blockType Block type settings. |
|
* @param {string} innerHTML Original block markup. |
|
* |
|
* @return {Object} Filtered block attributes. |
|
*/ |
|
|
|
function addParsedDifference(blockAttributes, blockType, innerHTML) { |
|
if (Object(external_this_wp_blocks_["hasBlockSupport"])(blockType, 'customClassName', true)) { |
|
// To determine difference, serialize block given the known set of |
|
// attributes, with the exception of `className`. This will determine |
|
// the default set of classes. From there, any difference in innerHTML |
|
// can be considered as custom classes. |
|
var attributesSansClassName = Object(external_lodash_["omit"])(blockAttributes, ['className']); |
|
var serialized = Object(external_this_wp_blocks_["getSaveContent"])(blockType, attributesSansClassName); |
|
var defaultClasses = getHTMLRootElementClasses(serialized); |
|
var actualClasses = getHTMLRootElementClasses(innerHTML); |
|
var customClasses = Object(external_lodash_["difference"])(actualClasses, defaultClasses); |
|
|
|
if (customClasses.length) { |
|
blockAttributes.className = customClasses.join(' '); |
|
} else if (serialized) { |
|
delete blockAttributes.className; |
|
} |
|
} |
|
|
|
return blockAttributes; |
|
} |
|
Object(external_this_wp_hooks_["addFilter"])('blocks.registerBlockType', 'core/custom-class-name/attribute', custom_class_name_addAttribute); |
|
Object(external_this_wp_hooks_["addFilter"])('editor.BlockEdit', 'core/editor/custom-class-name/with-inspector-control', custom_class_name_withInspectorControl); |
|
Object(external_this_wp_hooks_["addFilter"])('blocks.getSaveContent.extraProps', 'core/custom-class-name/save-props', custom_class_name_addSaveProps); |
|
Object(external_this_wp_hooks_["addFilter"])('blocks.getBlockAttributes', 'core/custom-class-name/addParsedDifference', addParsedDifference); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/hooks/default-autocompleters.js |
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
var defaultAutocompleters = [autocompleters_user]; |
|
var default_autocompleters_fetchReusableBlocks = Object(external_lodash_["once"])(function () { |
|
return Object(external_this_wp_data_["dispatch"])('core/editor').__experimentalFetchReusableBlocks(); |
|
}); |
|
|
|
function setDefaultCompleters(completers, blockName) { |
|
if (!completers) { |
|
// Provide copies so filters may directly modify them. |
|
completers = defaultAutocompleters.map(external_lodash_["clone"]); // Add blocks autocompleter for Paragraph block |
|
|
|
if (blockName === Object(external_this_wp_blocks_["getDefaultBlockName"])()) { |
|
completers.push(Object(external_lodash_["clone"])(autocompleters_block)); |
|
/* |
|
* NOTE: This is a hack to help ensure reusable blocks are loaded |
|
* so they may be included in the block completer. It can be removed |
|
* once we have a way for completers to Promise options while |
|
* store-based data dependencies are being resolved. |
|
*/ |
|
|
|
default_autocompleters_fetchReusableBlocks(); |
|
} |
|
} |
|
|
|
return completers; |
|
} |
|
|
|
Object(external_this_wp_hooks_["addFilter"])('editor.Autocomplete.completers', 'editor/autocompleters/set-default-completers', setDefaultCompleters); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/hooks/generated-class-name.js |
|
|
|
|
|
/** |
|
* External dependencies |
|
*/ |
|
|
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
/** |
|
* Override props assigned to save component to inject generated className if |
|
* block supports it. This is only applied if the block's save result is an |
|
* element and not a markup string. |
|
* |
|
* @param {Object} extraProps Additional props applied to save element. |
|
* @param {Object} blockType Block type. |
|
* |
|
* @return {Object} Filtered props applied to save element. |
|
*/ |
|
|
|
function addGeneratedClassName(extraProps, blockType) { |
|
// Adding the generated className |
|
if (Object(external_this_wp_blocks_["hasBlockSupport"])(blockType, 'className', true)) { |
|
if (typeof extraProps.className === 'string') { |
|
// We have some extra classes and want to add the default classname |
|
// We use uniq to prevent duplicate classnames |
|
extraProps.className = Object(external_lodash_["uniq"])([Object(external_this_wp_blocks_["getBlockDefaultClassName"])(blockType.name)].concat(Object(toConsumableArray["a" /* default */])(extraProps.className.split(' ')))).join(' ').trim(); |
|
} else { |
|
// There is no string in the className variable, |
|
// so we just dump the default name in there |
|
extraProps.className = Object(external_this_wp_blocks_["getBlockDefaultClassName"])(blockType.name); |
|
} |
|
} |
|
|
|
return extraProps; |
|
} |
|
Object(external_this_wp_hooks_["addFilter"])('blocks.getSaveContent.extraProps', 'core/generated-class-name/save-props', addGeneratedClassName); |
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/hooks/index.js |
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
// CONCATENATED MODULE: ./node_modules/@wordpress/editor/build-module/index.js |
|
/* concated harmony reexport Autocomplete */__webpack_require__.d(__webpack_exports__, "Autocomplete", function() { return autocomplete; }); |
|
/* concated harmony reexport AlignmentToolbar */__webpack_require__.d(__webpack_exports__, "AlignmentToolbar", function() { return alignment_toolbar; }); |
|
/* concated harmony reexport BlockAlignmentToolbar */__webpack_require__.d(__webpack_exports__, "BlockAlignmentToolbar", function() { return block_alignment_toolbar; }); |
|
/* concated harmony reexport BlockControls */__webpack_require__.d(__webpack_exports__, "BlockControls", function() { return block_controls; }); |
|
/* concated harmony reexport BlockEdit */__webpack_require__.d(__webpack_exports__, "BlockEdit", function() { return block_edit; }); |
|
/* concated harmony reexport BlockFormatControls */__webpack_require__.d(__webpack_exports__, "BlockFormatControls", function() { return block_format_controls; }); |
|
/* concated harmony reexport BlockNavigationDropdown */__webpack_require__.d(__webpack_exports__, "BlockNavigationDropdown", function() { return dropdown; }); |
|
/* concated harmony reexport BlockIcon */__webpack_require__.d(__webpack_exports__, "BlockIcon", function() { return BlockIcon; }); |
|
/* concated harmony reexport ColorPalette */__webpack_require__.d(__webpack_exports__, "ColorPalette", function() { return color_palette; }); |
|
/* concated harmony reexport withColorContext */__webpack_require__.d(__webpack_exports__, "withColorContext", function() { return with_color_context; }); |
|
/* concated harmony reexport ContrastChecker */__webpack_require__.d(__webpack_exports__, "ContrastChecker", function() { return contrast_checker; }); |
|
/* concated harmony reexport InnerBlocks */__webpack_require__.d(__webpack_exports__, "InnerBlocks", function() { return inner_blocks; }); |
|
/* concated harmony reexport InspectorAdvancedControls */__webpack_require__.d(__webpack_exports__, "InspectorAdvancedControls", function() { return inspector_advanced_controls; }); |
|
/* concated harmony reexport InspectorControls */__webpack_require__.d(__webpack_exports__, "InspectorControls", function() { return inspector_controls; }); |
|
/* concated harmony reexport PanelColorSettings */__webpack_require__.d(__webpack_exports__, "PanelColorSettings", function() { return panel_color_settings; }); |
|
/* concated harmony reexport PlainText */__webpack_require__.d(__webpack_exports__, "PlainText", function() { return plain_text; }); |
|
/* concated harmony reexport RichText */__webpack_require__.d(__webpack_exports__, "RichText", function() { return rich_text; }); |
|
/* concated harmony reexport RichTextShortcut */__webpack_require__.d(__webpack_exports__, "RichTextShortcut", function() { return shortcut_RichTextShortcut; }); |
|
/* concated harmony reexport RichTextToolbarButton */__webpack_require__.d(__webpack_exports__, "RichTextToolbarButton", function() { return RichTextToolbarButton; }); |
|
/* concated harmony reexport RichTextInserterItem */__webpack_require__.d(__webpack_exports__, "RichTextInserterItem", function() { return RichTextInserterItem; }); |
|
/* concated harmony reexport ServerSideRender */__webpack_require__.d(__webpack_exports__, "ServerSideRender", function() { return server_side_render; }); |
|
/* concated harmony reexport MediaPlaceholder */__webpack_require__.d(__webpack_exports__, "MediaPlaceholder", function() { return media_placeholder; }); |
|
/* concated harmony reexport MediaUpload */__webpack_require__.d(__webpack_exports__, "MediaUpload", function() { return media_upload; }); |
|
/* concated harmony reexport MediaUploadCheck */__webpack_require__.d(__webpack_exports__, "MediaUploadCheck", function() { return check; }); |
|
/* concated harmony reexport URLInput */__webpack_require__.d(__webpack_exports__, "URLInput", function() { return url_input; }); |
|
/* concated harmony reexport URLInputButton */__webpack_require__.d(__webpack_exports__, "URLInputButton", function() { return url_input_button; }); |
|
/* concated harmony reexport URLPopover */__webpack_require__.d(__webpack_exports__, "URLPopover", function() { return url_popover; }); |
|
/* concated harmony reexport AutosaveMonitor */__webpack_require__.d(__webpack_exports__, "AutosaveMonitor", function() { return autosave_monitor; }); |
|
/* concated harmony reexport DocumentOutline */__webpack_require__.d(__webpack_exports__, "DocumentOutline", function() { return document_outline; }); |
|
/* concated harmony reexport DocumentOutlineCheck */__webpack_require__.d(__webpack_exports__, "DocumentOutlineCheck", function() { return document_outline_check; }); |
|
/* concated harmony reexport EditorGlobalKeyboardShortcuts */__webpack_require__.d(__webpack_exports__, "EditorGlobalKeyboardShortcuts", function() { return editor_global_keyboard_shortcuts; }); |
|
/* concated harmony reexport EditorHistoryRedo */__webpack_require__.d(__webpack_exports__, "EditorHistoryRedo", function() { return editor_history_redo; }); |
|
/* concated harmony reexport EditorHistoryUndo */__webpack_require__.d(__webpack_exports__, "EditorHistoryUndo", function() { return editor_history_undo; }); |
|
/* concated harmony reexport EditorNotices */__webpack_require__.d(__webpack_exports__, "EditorNotices", function() { return editor_notices; }); |
|
/* concated harmony reexport PageAttributesCheck */__webpack_require__.d(__webpack_exports__, "PageAttributesCheck", function() { return page_attributes_check; }); |
|
/* concated harmony reexport PageAttributesOrder */__webpack_require__.d(__webpack_exports__, "PageAttributesOrder", function() { return page_attributes_order; }); |
|
/* concated harmony reexport PageAttributesParent */__webpack_require__.d(__webpack_exports__, "PageAttributesParent", function() { return page_attributes_parent; }); |
|
/* concated harmony reexport PageTemplate */__webpack_require__.d(__webpack_exports__, "PageTemplate", function() { return page_attributes_template; }); |
|
/* concated harmony reexport PostAuthor */__webpack_require__.d(__webpack_exports__, "PostAuthor", function() { return post_author; }); |
|
/* concated harmony reexport PostAuthorCheck */__webpack_require__.d(__webpack_exports__, "PostAuthorCheck", function() { return post_author_check; }); |
|
/* concated harmony reexport PostComments */__webpack_require__.d(__webpack_exports__, "PostComments", function() { return post_comments; }); |
|
/* concated harmony reexport PostExcerpt */__webpack_require__.d(__webpack_exports__, "PostExcerpt", function() { return post_excerpt; }); |
|
/* concated harmony reexport PostExcerptCheck */__webpack_require__.d(__webpack_exports__, "PostExcerptCheck", function() { return post_excerpt_check; }); |
|
/* concated harmony reexport PostFeaturedImage */__webpack_require__.d(__webpack_exports__, "PostFeaturedImage", function() { return post_featured_image; }); |
|
/* concated harmony reexport PostFeaturedImageCheck */__webpack_require__.d(__webpack_exports__, "PostFeaturedImageCheck", function() { return post_featured_image_check; }); |
|
/* concated harmony reexport PostFormat */__webpack_require__.d(__webpack_exports__, "PostFormat", function() { return post_format; }); |
|
/* concated harmony reexport PostFormatCheck */__webpack_require__.d(__webpack_exports__, "PostFormatCheck", function() { return post_format_check; }); |
|
/* concated harmony reexport PostLastRevision */__webpack_require__.d(__webpack_exports__, "PostLastRevision", function() { return post_last_revision; }); |
|
/* concated harmony reexport PostLastRevisionCheck */__webpack_require__.d(__webpack_exports__, "PostLastRevisionCheck", function() { return post_last_revision_check; }); |
|
/* concated harmony reexport PostLockedModal */__webpack_require__.d(__webpack_exports__, "PostLockedModal", function() { return post_locked_modal; }); |
|
/* concated harmony reexport PostPendingStatus */__webpack_require__.d(__webpack_exports__, "PostPendingStatus", function() { return post_pending_status; }); |
|
/* concated harmony reexport PostPendingStatusCheck */__webpack_require__.d(__webpack_exports__, "PostPendingStatusCheck", function() { return post_pending_status_check; }); |
|
/* concated harmony reexport PostPingbacks */__webpack_require__.d(__webpack_exports__, "PostPingbacks", function() { return post_pingbacks; }); |
|
/* concated harmony reexport PostPreviewButton */__webpack_require__.d(__webpack_exports__, "PostPreviewButton", function() { return post_preview_button; }); |
|
/* concated harmony reexport PostPublishButton */__webpack_require__.d(__webpack_exports__, "PostPublishButton", function() { return post_publish_button; }); |
|
/* concated harmony reexport PostPublishButtonLabel */__webpack_require__.d(__webpack_exports__, "PostPublishButtonLabel", function() { return post_publish_button_label; }); |
|
/* concated harmony reexport PostPublishPanel */__webpack_require__.d(__webpack_exports__, "PostPublishPanel", function() { return post_publish_panel; }); |
|
/* concated harmony reexport PostSavedState */__webpack_require__.d(__webpack_exports__, "PostSavedState", function() { return post_saved_state; }); |
|
/* concated harmony reexport PostSchedule */__webpack_require__.d(__webpack_exports__, "PostSchedule", function() { return post_schedule; }); |
|
/* concated harmony reexport PostScheduleCheck */__webpack_require__.d(__webpack_exports__, "PostScheduleCheck", function() { return post_schedule_check; }); |
|
/* concated harmony reexport PostScheduleLabel */__webpack_require__.d(__webpack_exports__, "PostScheduleLabel", function() { return post_schedule_label; }); |
|
/* concated harmony reexport PostSticky */__webpack_require__.d(__webpack_exports__, "PostSticky", function() { return post_sticky; }); |
|
/* concated harmony reexport PostStickyCheck */__webpack_require__.d(__webpack_exports__, "PostStickyCheck", function() { return post_sticky_check; }); |
|
/* concated harmony reexport PostSwitchToDraftButton */__webpack_require__.d(__webpack_exports__, "PostSwitchToDraftButton", function() { return post_switch_to_draft_button; }); |
|
/* concated harmony reexport PostTaxonomies */__webpack_require__.d(__webpack_exports__, "PostTaxonomies", function() { return post_taxonomies; }); |
|
/* concated harmony reexport PostTaxonomiesCheck */__webpack_require__.d(__webpack_exports__, "PostTaxonomiesCheck", function() { return post_taxonomies_check; }); |
|
/* concated harmony reexport PostTextEditor */__webpack_require__.d(__webpack_exports__, "PostTextEditor", function() { return post_text_editor; }); |
|
/* concated harmony reexport PostTitle */__webpack_require__.d(__webpack_exports__, "PostTitle", function() { return post_title; }); |
|
/* concated harmony reexport PostTrash */__webpack_require__.d(__webpack_exports__, "PostTrash", function() { return post_trash; }); |
|
/* concated harmony reexport PostTrashCheck */__webpack_require__.d(__webpack_exports__, "PostTrashCheck", function() { return post_trash_check; }); |
|
/* concated harmony reexport PostTypeSupportCheck */__webpack_require__.d(__webpack_exports__, "PostTypeSupportCheck", function() { return post_type_support_check; }); |
|
/* concated harmony reexport PostVisibility */__webpack_require__.d(__webpack_exports__, "PostVisibility", function() { return post_visibility; }); |
|
/* concated harmony reexport PostVisibilityLabel */__webpack_require__.d(__webpack_exports__, "PostVisibilityLabel", function() { return post_visibility_label; }); |
|
/* concated harmony reexport PostVisibilityCheck */__webpack_require__.d(__webpack_exports__, "PostVisibilityCheck", function() { return post_visibility_check; }); |
|
/* concated harmony reexport TableOfContents */__webpack_require__.d(__webpack_exports__, "TableOfContents", function() { return table_of_contents; }); |
|
/* concated harmony reexport UnsavedChangesWarning */__webpack_require__.d(__webpack_exports__, "UnsavedChangesWarning", function() { return unsaved_changes_warning; }); |
|
/* concated harmony reexport WordCount */__webpack_require__.d(__webpack_exports__, "WordCount", function() { return word_count; }); |
|
/* concated harmony reexport BlockInspector */__webpack_require__.d(__webpack_exports__, "BlockInspector", function() { return block_inspector; }); |
|
/* concated harmony reexport BlockList */__webpack_require__.d(__webpack_exports__, "BlockList", function() { return block_list; }); |
|
/* concated harmony reexport BlockMover */__webpack_require__.d(__webpack_exports__, "BlockMover", function() { return block_mover; }); |
|
/* concated harmony reexport BlockSelectionClearer */__webpack_require__.d(__webpack_exports__, "BlockSelectionClearer", function() { return block_selection_clearer; }); |
|
/* concated harmony reexport BlockSettingsMenu */__webpack_require__.d(__webpack_exports__, "BlockSettingsMenu", function() { return block_settings_menu; }); |
|
/* concated harmony reexport _BlockSettingsMenuFirstItem */__webpack_require__.d(__webpack_exports__, "_BlockSettingsMenuFirstItem", function() { return block_settings_menu_first_item; }); |
|
/* concated harmony reexport _BlockSettingsMenuPluginsExtension */__webpack_require__.d(__webpack_exports__, "_BlockSettingsMenuPluginsExtension", function() { return block_settings_menu_plugins_extension; }); |
|
/* concated harmony reexport BlockTitle */__webpack_require__.d(__webpack_exports__, "BlockTitle", function() { return block_title; }); |
|
/* concated harmony reexport BlockToolbar */__webpack_require__.d(__webpack_exports__, "BlockToolbar", function() { return block_toolbar; }); |
|
/* concated harmony reexport CopyHandler */__webpack_require__.d(__webpack_exports__, "CopyHandler", function() { return copy_handler; }); |
|
/* concated harmony reexport DefaultBlockAppender */__webpack_require__.d(__webpack_exports__, "DefaultBlockAppender", function() { return default_block_appender; }); |
|
/* concated harmony reexport ErrorBoundary */__webpack_require__.d(__webpack_exports__, "ErrorBoundary", function() { return error_boundary; }); |
|
/* concated harmony reexport Inserter */__webpack_require__.d(__webpack_exports__, "Inserter", function() { return inserter; }); |
|
/* concated harmony reexport MultiBlocksSwitcher */__webpack_require__.d(__webpack_exports__, "MultiBlocksSwitcher", function() { return multi_blocks_switcher; }); |
|
/* concated harmony reexport MultiSelectScrollIntoView */__webpack_require__.d(__webpack_exports__, "MultiSelectScrollIntoView", function() { return multi_select_scroll_into_view; }); |
|
/* concated harmony reexport NavigableToolbar */__webpack_require__.d(__webpack_exports__, "NavigableToolbar", function() { return navigable_toolbar; }); |
|
/* concated harmony reexport ObserveTyping */__webpack_require__.d(__webpack_exports__, "ObserveTyping", function() { return observe_typing; }); |
|
/* concated harmony reexport PreserveScrollInReorder */__webpack_require__.d(__webpack_exports__, "PreserveScrollInReorder", function() { return preserve_scroll_in_reorder; }); |
|
/* concated harmony reexport SkipToSelectedBlock */__webpack_require__.d(__webpack_exports__, "SkipToSelectedBlock", function() { return skip_to_selected_block; }); |
|
/* concated harmony reexport Warning */__webpack_require__.d(__webpack_exports__, "Warning", function() { return warning; }); |
|
/* concated harmony reexport WritingFlow */__webpack_require__.d(__webpack_exports__, "WritingFlow", function() { return writing_flow; }); |
|
/* concated harmony reexport EditorProvider */__webpack_require__.d(__webpack_exports__, "EditorProvider", function() { return provider; }); |
|
/* concated harmony reexport blockAutocompleter */__webpack_require__.d(__webpack_exports__, "blockAutocompleter", function() { return autocompleters_block; }); |
|
/* concated harmony reexport userAutocompleter */__webpack_require__.d(__webpack_exports__, "userAutocompleter", function() { return autocompleters_user; }); |
|
/* concated harmony reexport getColorClassName */__webpack_require__.d(__webpack_exports__, "getColorClassName", function() { return getColorClassName; }); |
|
/* concated harmony reexport getColorObjectByAttributeValues */__webpack_require__.d(__webpack_exports__, "getColorObjectByAttributeValues", function() { return utils_getColorObjectByAttributeValues; }); |
|
/* concated harmony reexport getColorObjectByColorValue */__webpack_require__.d(__webpack_exports__, "getColorObjectByColorValue", function() { return utils_getColorObjectByColorValue; }); |
|
/* concated harmony reexport withColors */__webpack_require__.d(__webpack_exports__, "withColors", function() { return with_colors; }); |
|
/* concated harmony reexport getFontSize */__webpack_require__.d(__webpack_exports__, "getFontSize", function() { return utils_getFontSize; }); |
|
/* concated harmony reexport getFontSizeClass */__webpack_require__.d(__webpack_exports__, "getFontSizeClass", function() { return getFontSizeClass; }); |
|
/* concated harmony reexport FontSizePicker */__webpack_require__.d(__webpack_exports__, "FontSizePicker", function() { return font_size_picker; }); |
|
/* concated harmony reexport withFontSizes */__webpack_require__.d(__webpack_exports__, "withFontSizes", function() { return with_font_sizes; }); |
|
/* concated harmony reexport mediaUpload */__webpack_require__.d(__webpack_exports__, "mediaUpload", function() { return utils_media_upload; }); |
|
/* concated harmony reexport cleanForSlug */__webpack_require__.d(__webpack_exports__, "cleanForSlug", function() { return cleanForSlug; }); |
|
/** |
|
* WordPress dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
* Internal dependencies |
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/***/ }) |
|
/******/ ]); |