diff -r 3d4e9c994f10 -r a86126ab1dd4 wp/wp-includes/js/dist/rich-text.js --- a/wp/wp-includes/js/dist/rich-text.js Tue Oct 22 16:11:46 2019 +0200 +++ b/wp/wp-includes/js/dist/rich-text.js Tue Dec 15 13:49:49 2020 +0100 @@ -82,7 +82,7 @@ /******/ /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 361); +/******/ return __webpack_require__(__webpack_require__.s = 440); /******/ }) /************************************************************************/ /******/ ({ @@ -94,82 +94,180 @@ /***/ }), +/***/ 11: +/***/ (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 {} +}()); + + +/***/ }), + +/***/ 14: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; + +// EXPORTS +__webpack_require__.d(__webpack_exports__, "a", function() { return /* binding */ _slicedToArray; }); + +// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +var arrayWithHoles = __webpack_require__(38); + +// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js +function _iterableToArrayLimit(arr, i) { + if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; + 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/unsupportedIterableToArray.js +var unsupportedIterableToArray = __webpack_require__(29); + +// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +var nonIterableRest = __webpack_require__(39); + +// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js + + + + +function _slicedToArray(arr, i) { + return Object(arrayWithHoles["a" /* default */])(arr) || _iterableToArrayLimit(arr, i) || Object(unsupportedIterableToArray["a" /* default */])(arr, i) || Object(nonIterableRest["a" /* default */])(); +} + +/***/ }), + /***/ 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; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _objectWithoutProperties; }); +/* harmony import */ var _objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(41); + +function _objectWithoutProperties(source, excluded) { + if (source == null) return {}; + var target = Object(_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(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 obj; + return target; } /***/ }), -/***/ 17: +/***/ 18: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +// EXPORTS +__webpack_require__.d(__webpack_exports__, "a", function() { return /* binding */ _toConsumableArray; }); + +// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +var arrayLikeToArray = __webpack_require__(26); + // 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; - } + if (Array.isArray(arr)) return Object(arrayLikeToArray["a" /* default */])(arr); } // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js -var iterableToArray = __webpack_require__(34); +var iterableToArray = __webpack_require__(35); + +// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +var unsupportedIterableToArray = __webpack_require__(29); // CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance"); + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } // 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(); -} - -/***/ }), - -/***/ 19: -/***/ (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); + return _arrayWithoutHoles(arr) || Object(iterableToArray["a" /* default */])(arr) || Object(unsupportedIterableToArray["a" /* default */])(arr) || _nonIterableSpread(); } /***/ }), @@ -181,14 +279,141 @@ /***/ }), -/***/ 26: +/***/ 21: /***/ (function(module, exports) { -(function() { module.exports = this["wp"]["hooks"]; }()); +(function() { module.exports = this["wp"]["keycodes"]; }()); + +/***/ }), + +/***/ 26: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _arrayLikeToArray; }); +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) { + arr2[i] = arr[i]; + } + + return arr2; +} + +/***/ }), + +/***/ 29: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _unsupportedIterableToArray; }); +/* harmony import */ var _arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(26); + +function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return Object(_arrayLikeToArray__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(o, minLen); +} + +/***/ }), + +/***/ 35: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _iterableToArray; }); +function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); +} + +/***/ }), + +/***/ 37: +/***/ (function(module, exports) { + +(function() { module.exports = this["wp"]["deprecated"]; }()); /***/ }), -/***/ 30: +/***/ 38: +/***/ (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; +} + +/***/ }), + +/***/ 39: +/***/ (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.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +/***/ }), + +/***/ 4: +/***/ (function(module, exports) { + +(function() { module.exports = this["wp"]["data"]; }()); + +/***/ }), + +/***/ 40: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _typeof; }); +function _typeof(obj) { + "@babel/helpers - typeof"; + + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function _typeof(obj) { + return typeof obj; + }; + } else { + _typeof = function _typeof(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); +} + +/***/ }), + +/***/ 41: +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return _objectWithoutPropertiesLoose; }); +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; +} + +/***/ }), + +/***/ 42: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -470,68 +695,80 @@ /***/ }), -/***/ 32: +/***/ 440: /***/ (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); -} - -/***/ }), - -/***/ 34: -/***/ (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); -} - -/***/ }), - -/***/ 361: -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; +// ESM COMPAT FLAG __webpack_require__.r(__webpack_exports__); + +// EXPORTS +__webpack_require__.d(__webpack_exports__, "applyFormat", function() { return /* reexport */ applyFormat; }); +__webpack_require__.d(__webpack_exports__, "concat", function() { return /* reexport */ concat; }); +__webpack_require__.d(__webpack_exports__, "create", function() { return /* reexport */ create; }); +__webpack_require__.d(__webpack_exports__, "getActiveFormat", function() { return /* reexport */ getActiveFormat; }); +__webpack_require__.d(__webpack_exports__, "getActiveObject", function() { return /* reexport */ getActiveObject; }); +__webpack_require__.d(__webpack_exports__, "getTextContent", function() { return /* reexport */ getTextContent; }); +__webpack_require__.d(__webpack_exports__, "__unstableIsListRootSelected", function() { return /* reexport */ isListRootSelected; }); +__webpack_require__.d(__webpack_exports__, "__unstableIsActiveListType", function() { return /* reexport */ isActiveListType; }); +__webpack_require__.d(__webpack_exports__, "isCollapsed", function() { return /* reexport */ isCollapsed; }); +__webpack_require__.d(__webpack_exports__, "isEmpty", function() { return /* reexport */ isEmpty; }); +__webpack_require__.d(__webpack_exports__, "__unstableIsEmptyLine", function() { return /* reexport */ isEmptyLine; }); +__webpack_require__.d(__webpack_exports__, "join", function() { return /* reexport */ join; }); +__webpack_require__.d(__webpack_exports__, "registerFormatType", function() { return /* reexport */ registerFormatType; }); +__webpack_require__.d(__webpack_exports__, "removeFormat", function() { return /* reexport */ removeFormat; }); +__webpack_require__.d(__webpack_exports__, "remove", function() { return /* reexport */ remove_remove; }); +__webpack_require__.d(__webpack_exports__, "replace", function() { return /* reexport */ replace_replace; }); +__webpack_require__.d(__webpack_exports__, "insert", function() { return /* reexport */ insert; }); +__webpack_require__.d(__webpack_exports__, "__unstableInsertLineSeparator", function() { return /* reexport */ insertLineSeparator; }); +__webpack_require__.d(__webpack_exports__, "__unstableRemoveLineSeparator", function() { return /* reexport */ removeLineSeparator; }); +__webpack_require__.d(__webpack_exports__, "insertObject", function() { return /* reexport */ insertObject; }); +__webpack_require__.d(__webpack_exports__, "slice", function() { return /* reexport */ slice; }); +__webpack_require__.d(__webpack_exports__, "split", function() { return /* reexport */ split; }); +__webpack_require__.d(__webpack_exports__, "__unstableToDom", function() { return /* reexport */ toDom; }); +__webpack_require__.d(__webpack_exports__, "toHTMLString", function() { return /* reexport */ toHTMLString; }); +__webpack_require__.d(__webpack_exports__, "toggleFormat", function() { return /* reexport */ toggleFormat; }); +__webpack_require__.d(__webpack_exports__, "__UNSTABLE_LINE_SEPARATOR", function() { return /* reexport */ LINE_SEPARATOR; }); +__webpack_require__.d(__webpack_exports__, "unregisterFormatType", function() { return /* reexport */ unregisterFormatType; }); +__webpack_require__.d(__webpack_exports__, "__unstableCanIndentListItems", function() { return /* reexport */ canIndentListItems; }); +__webpack_require__.d(__webpack_exports__, "__unstableCanOutdentListItems", function() { return /* reexport */ canOutdentListItems; }); +__webpack_require__.d(__webpack_exports__, "__unstableIndentListItems", function() { return /* reexport */ indentListItems; }); +__webpack_require__.d(__webpack_exports__, "__unstableOutdentListItems", function() { return /* reexport */ outdentListItems; }); +__webpack_require__.d(__webpack_exports__, "__unstableChangeListType", function() { return /* reexport */ changeListType; }); +__webpack_require__.d(__webpack_exports__, "__unstableCreateElement", function() { return /* reexport */ createElement; }); +__webpack_require__.d(__webpack_exports__, "__experimentalRichText", function() { return /* reexport */ component; }); +__webpack_require__.d(__webpack_exports__, "__unstableFormatEdit", function() { return /* reexport */ FormatEdit; }); + +// NAMESPACE OBJECT: ./node_modules/@wordpress/rich-text/build-module/store/selectors.js var selectors_namespaceObject = {}; __webpack_require__.r(selectors_namespaceObject); __webpack_require__.d(selectors_namespaceObject, "getFormatTypes", function() { return getFormatTypes; }); __webpack_require__.d(selectors_namespaceObject, "getFormatType", function() { return getFormatType; }); __webpack_require__.d(selectors_namespaceObject, "getFormatTypeForBareElement", function() { return getFormatTypeForBareElement; }); __webpack_require__.d(selectors_namespaceObject, "getFormatTypeForClassName", function() { return getFormatTypeForClassName; }); + +// NAMESPACE OBJECT: ./node_modules/@wordpress/rich-text/build-module/store/actions.js var actions_namespaceObject = {}; __webpack_require__.r(actions_namespaceObject); __webpack_require__.d(actions_namespaceObject, "addFormatTypes", function() { return addFormatTypes; }); __webpack_require__.d(actions_namespaceObject, "removeFormatTypes", function() { return removeFormatTypes; }); // EXTERNAL MODULE: external {"this":["wp","data"]} -var external_this_wp_data_ = __webpack_require__(5); - -// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/objectSpread.js -var objectSpread = __webpack_require__(7); - -// EXTERNAL MODULE: external "lodash" -var external_lodash_ = __webpack_require__(2); +var external_this_wp_data_ = __webpack_require__(4); + +// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js +var defineProperty = __webpack_require__(5); + +// EXTERNAL MODULE: external {"this":"lodash"} +var external_this_lodash_ = __webpack_require__(2); // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/store/reducer.js +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + /** * External dependencies */ @@ -556,10 +793,10 @@ switch (action.type) { case 'ADD_FORMAT_TYPES': - return Object(objectSpread["a" /* default */])({}, state, Object(external_lodash_["keyBy"])(action.formatTypes, 'name')); + return _objectSpread({}, state, {}, Object(external_this_lodash_["keyBy"])(action.formatTypes, 'name')); case 'REMOVE_FORMAT_TYPES': - return Object(external_lodash_["omit"])(state, action.names); + return Object(external_this_lodash_["omit"])(state, action.names); } return state; @@ -569,7 +806,7 @@ })); // EXTERNAL MODULE: ./node_modules/rememo/es/rememo.js -var rememo = __webpack_require__(30); +var rememo = __webpack_require__(42); // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/store/selectors.js /** @@ -613,9 +850,10 @@ */ function getFormatTypeForBareElement(state, bareElementTagName) { - return Object(external_lodash_["find"])(getFormatTypes(state), function (_ref) { - var tagName = _ref.tagName; - return bareElementTagName === tagName; + return Object(external_this_lodash_["find"])(getFormatTypes(state), function (_ref) { + var className = _ref.className, + tagName = _ref.tagName; + return className === null && bareElementTagName === tagName; }); } /** @@ -628,7 +866,7 @@ */ function getFormatTypeForClassName(state, elementClassName) { - return Object(external_lodash_["find"])(getFormatTypes(state), function (_ref2) { + return Object(external_this_lodash_["find"])(getFormatTypes(state), function (_ref2) { var className = _ref2.className; if (className === null) { @@ -656,7 +894,7 @@ function addFormatTypes(formatTypes) { return { type: 'ADD_FORMAT_TYPES', - formatTypes: Object(external_lodash_["castArray"])(formatTypes) + formatTypes: Object(external_this_lodash_["castArray"])(formatTypes) }; } /** @@ -670,7 +908,7 @@ function removeFormatTypes(names) { return { type: 'REMOVE_FORMAT_TYPES', - names: Object(external_lodash_["castArray"])(names) + names: Object(external_this_lodash_["castArray"])(names) }; } @@ -693,7 +931,7 @@ }); // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js + 2 modules -var toConsumableArray = __webpack_require__(17); +var toConsumableArray = __webpack_require__(18); // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/is-format-equal.js /** @@ -754,6 +992,10 @@ // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/normalise-formats.js +function normalise_formats_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function normalise_formats_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { normalise_formats_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { normalise_formats_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + /** * Internal dependencies */ @@ -784,7 +1026,7 @@ newFormats[index] = newFormatsAtIndex; } }); - return Object(objectSpread["a" /* default */])({}, value, { + return normalise_formats_objectSpread({}, value, { formats: newFormats }); } @@ -793,6 +1035,10 @@ +function apply_format_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function apply_format_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { apply_format_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { apply_format_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + /** * External dependencies */ @@ -802,6 +1048,12 @@ */ + +function replace(array, index, value) { + array = array.slice(); + array[index] = value; + return array; +} /** * Apply a format object to a Rich Text value from the given `startIndex` to the * given `endIndex`. Indices are retrieved from the selection if none are @@ -815,6 +1067,7 @@ * @return {Object} A new value with the format applied. */ + function applyFormat(value, format) { var startIndex = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : value.start; var endIndex = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : value.end; @@ -823,71 +1076,65 @@ var newFormats = formats.slice(); // The selection is collapsed. if (startIndex === endIndex) { - var startFormat = Object(external_lodash_["find"])(newFormats[startIndex], { + var startFormat = Object(external_this_lodash_["find"])(newFormats[startIndex], { type: format.type }); // If the caret is at a format of the same type, expand start and end to // the edges of the format. This is useful to apply new attributes. if (startFormat) { - while (Object(external_lodash_["find"])(newFormats[startIndex], startFormat)) { - applyFormats(newFormats, startIndex, format); + var index = newFormats[startIndex].indexOf(startFormat); + + while (newFormats[startIndex] && newFormats[startIndex][index] === startFormat) { + newFormats[startIndex] = replace(newFormats[startIndex], index, format); startIndex--; } endIndex++; - while (Object(external_lodash_["find"])(newFormats[endIndex], startFormat)) { - applyFormats(newFormats, endIndex, format); + while (newFormats[endIndex] && newFormats[endIndex][index] === startFormat) { + newFormats[endIndex] = replace(newFormats[endIndex], index, format); endIndex++; } } } else { - for (var index = startIndex; index < endIndex; index++) { - applyFormats(newFormats, index, format); + // Determine the highest position the new format can be inserted at. + var position = +Infinity; + + for (var _index = startIndex; _index < endIndex; _index++) { + if (newFormats[_index]) { + newFormats[_index] = newFormats[_index].filter(function (_ref) { + var type = _ref.type; + return type !== format.type; + }); + var length = newFormats[_index].length; + + if (length < position) { + position = length; + } + } else { + newFormats[_index] = []; + position = 0; + } + } + + for (var _index2 = startIndex; _index2 < endIndex; _index2++) { + newFormats[_index2].splice(position, 0, format); } } - return normaliseFormats(Object(objectSpread["a" /* default */])({}, value, { + return normaliseFormats(apply_format_objectSpread({}, value, { formats: newFormats, // Always revise active formats. This serves as a placeholder for new // inputs with the format so new input appears with the format applied, // and ensures a format of the same type uses the latest values. - activeFormats: [].concat(Object(toConsumableArray["a" /* default */])(Object(external_lodash_["reject"])(activeFormats, { + activeFormats: [].concat(Object(toConsumableArray["a" /* default */])(Object(external_this_lodash_["reject"])(activeFormats, { type: format.type })), [format]) })); } -function applyFormats(formats, index, format) { - if (formats[index]) { - var newFormatsAtIndex = formats[index].filter(function (_ref) { - var type = _ref.type; - return type !== format.type; - }); - newFormatsAtIndex.push(format); - formats[index] = newFormatsAtIndex; - } else { - formats[index] = [format]; - } -} - -// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/char-at.js -/** - * Gets the character at the specified index, or returns `undefined` if no - * character was found. - * - * @param {Object} value Value to get the character from. - * @param {string} index Index to use. - * - * @return {string|undefined} A one character long string, or undefined. - */ -function charAt(_ref, index) { - var text = _ref.text; - return text[index]; -} - // EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/typeof.js -var esm_typeof = __webpack_require__(32); +var esm_typeof = __webpack_require__(40); // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/create-element.js /** @@ -919,16 +1166,30 @@ // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/special-characters.js /** - * Line separator character. + * Line separator character, used for multiline text. */ var LINE_SEPARATOR = "\u2028"; +/** + * Object replacement character, used as a placeholder for objects. + */ + var OBJECT_REPLACEMENT_CHARACTER = "\uFFFC"; +/** + * Zero width non-breaking space, used as padding in the editable DOM tree when + * it is empty otherwise. + */ + +var ZWNBSP = "\uFEFF"; // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/create.js +function create_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function create_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { create_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { create_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + /** * WordPress dependencies */ @@ -941,13 +1202,6 @@ -/** - * Browser dependencies - */ - -var _window$Node = window.Node, - TEXT_NODE = _window$Node.TEXT_NODE, - ELEMENT_NODE = _window$Node.ELEMENT_NODE; function createEmptyValue() { return { @@ -1062,6 +1316,8 @@ * multiline. * @param {Array} [$1.multilineWrapperTags] Tags where lines can be found if * nesting is possible. + * @param {?boolean} [$1.preserveWhiteSpace] Whether or not to collapse white + * space characters. * * @return {Object} A rich text value. */ @@ -1075,7 +1331,8 @@ range = _ref2.range, multilineTag = _ref2.multilineTag, multilineWrapperTags = _ref2.multilineWrapperTags, - isEditableTree = _ref2.__unstableIsEditableTree; + isEditableTree = _ref2.__unstableIsEditableTree, + preserveWhiteSpace = _ref2.preserveWhiteSpace; if (typeof text === 'string' && text.length > 0) { return { @@ -1086,6 +1343,8 @@ } if (typeof html === 'string' && html.length > 0) { + // It does not matter which document this is, we're just using it to + // parse. element = createElement(document, html); } @@ -1097,7 +1356,8 @@ return createFromElement({ element: element, range: range, - isEditableTree: isEditableTree + isEditableTree: isEditableTree, + preserveWhiteSpace: preserveWhiteSpace }); } @@ -1106,7 +1366,8 @@ range: range, multilineTag: multilineTag, multilineWrapperTags: multilineWrapperTags, - isEditableTree: isEditableTree + isEditableTree: isEditableTree, + preserveWhiteSpace: preserveWhiteSpace }); } /** @@ -1133,7 +1394,7 @@ if (value.start !== undefined) { accumulator.start = currentLength + value.start; // Range indicates that the current node has selection. - } else if (node === startContainer && node.nodeType === TEXT_NODE) { + } else if (node === startContainer && node.nodeType === node.TEXT_NODE) { accumulator.start = currentLength + startOffset; // Range indicates that the current node is selected. } else if (parentNode === startContainer && node === startContainer.childNodes[startOffset]) { accumulator.start = currentLength; // Range indicates that the selection is after the current node. @@ -1146,7 +1407,7 @@ if (value.end !== undefined) { accumulator.end = currentLength + value.end; // Range indicates that the current node has selection. - } else if (node === endContainer && node.nodeType === TEXT_NODE) { + } else if (node === endContainer && node.nodeType === node.TEXT_NODE) { accumulator.end = currentLength + endOffset; // Range indicates that the current node is selected. } else if (parentNode === endContainer && node === endContainer.childNodes[endOffset - 1]) { accumulator.end = currentLength + value.text.length; // Range indicates that the selection is before the current node. @@ -1192,12 +1453,28 @@ endOffset: endOffset }; } - -function filterString(string) { - // Reduce any whitespace used for HTML formatting to one space - // character, because it will also be displayed as such by the browser. +/** + * Collapse any whitespace used for HTML formatting to one space character, + * because it will also be displayed as such by the browser. + * + * @param {string} string + */ + + +function collapseWhiteSpace(string) { return string.replace(/[\n\r\t]+/g, ' '); } + +var ZWNBSPRegExp = new RegExp(ZWNBSP, 'g'); +/** + * Removes padding (zero width non breaking spaces) added by `toTree`. + * + * @param {string} string + */ + +function removePadding(string) { + return string.replace(ZWNBSPRegExp, ''); +} /** * Creates a Rich Text value from a DOM element and range. * @@ -1208,6 +1485,8 @@ * multiline. * @param {?Array} $1.multilineWrapperTags Tags where lines can be found if * nesting is possible. + * @param {?boolean} $1.preserveWhiteSpace Whether or not to collapse white + * space characters. * * @return {Object} A rich text value. */ @@ -1220,7 +1499,8 @@ multilineWrapperTags = _ref3.multilineWrapperTags, _ref3$currentWrapperT = _ref3.currentWrapperTags, currentWrapperTags = _ref3$currentWrapperT === void 0 ? [] : _ref3$currentWrapperT, - isEditableTree = _ref3.isEditableTree; + isEditableTree = _ref3.isEditableTree, + preserveWhiteSpace = _ref3.preserveWhiteSpace; var accumulator = createEmptyValue(); if (!element) { @@ -1238,9 +1518,17 @@ var node = element.childNodes[index]; var type = node.nodeName.toLowerCase(); - if (node.nodeType === TEXT_NODE) { - var text = filterString(node.nodeValue); - range = filterRange(node, range, filterString); + if (node.nodeType === node.TEXT_NODE) { + var filter = removePadding; + + if (!preserveWhiteSpace) { + filter = function filter(string) { + return removePadding(collapseWhiteSpace(string)); + }; + } + + var text = filter(node.nodeValue); + range = filterRange(node, range, filter); accumulateSelection(accumulator, node, range, { text: text }); // Create a sparse array of the same length as `text`, in which @@ -1252,11 +1540,13 @@ return "continue"; } - if (node.nodeType !== ELEMENT_NODE) { + if (node.nodeType !== node.ELEMENT_NODE) { return "continue"; } - if (node.getAttribute('data-rich-text-padding') || isEditableTree && type === 'br' && !node.getAttribute('data-rich-text-line-break')) { + if (isEditableTree && ( // Ignore any placeholders. + node.getAttribute('data-rich-text-placeholder') || // Ignore any line breaks that are not inserted by us. + type === 'br' && !node.getAttribute('data-rich-text-line-break'))) { accumulateSelection(accumulator, node, range, createEmptyValue()); return "continue"; } @@ -1286,7 +1576,8 @@ multilineTag: multilineTag, multilineWrapperTags: multilineWrapperTags, currentWrapperTags: [].concat(Object(toConsumableArray["a" /* default */])(currentWrapperTags), [format]), - isEditableTree: isEditableTree + isEditableTree: isEditableTree, + preserveWhiteSpace: preserveWhiteSpace }); accumulateSelection(accumulator, node, range, _value); @@ -1299,7 +1590,8 @@ range: range, multilineTag: multilineTag, multilineWrapperTags: multilineWrapperTags, - isEditableTree: isEditableTree + isEditableTree: isEditableTree, + preserveWhiteSpace: preserveWhiteSpace }); accumulateSelection(accumulator, node, range, value); @@ -1314,10 +1606,24 @@ }); } } else { - mergePair(accumulator, Object(objectSpread["a" /* default */])({}, value, { - formats: Array.from(value.formats, function (formats) { - return formats ? [format].concat(Object(toConsumableArray["a" /* default */])(formats)) : [format]; - }) + // Indices should share a reference to the same formats array. + // Only create a new reference if `formats` changes. + function mergeFormats(formats) { + if (mergeFormats.formats === formats) { + return mergeFormats.newFormats; + } + + var newFormats = formats ? [format].concat(Object(toConsumableArray["a" /* default */])(formats)) : [format]; + mergeFormats.formats = formats; + mergeFormats.newFormats = newFormats; + return newFormats; + } // Since the formats parameter can be `undefined`, preset + // `mergeFormats` with a new reference. + + + mergeFormats.newFormats = [format]; + mergePair(accumulator, create_objectSpread({}, value, { + formats: Array.from(value.formats, mergeFormats) })); } }; @@ -1334,15 +1640,17 @@ * Creates a rich text value from a DOM element and range that should be * multiline. * - * @param {Object} $1 Named argements. - * @param {?Element} $1.element Element to create value from. - * @param {?Range} $1.range Range to create value from. - * @param {?string} $1.multilineTag Multiline tag if the structure is - * multiline. - * @param {?Array} $1.multilineWrapperTags Tags where lines can be found if - * nesting is possible. - * @param {boolean} $1.currentWrapperTags Whether to prepend a line - * separator. + * @param {Object} $1 Named argements. + * @param {?Element} $1.element Element to create value from. + * @param {?Range} $1.range Range to create value from. + * @param {?string} $1.multilineTag Multiline tag if the structure is + * multiline. + * @param {?Array} $1.multilineWrapperTags Tags where lines can be found if + * nesting is possible. + * @param {boolean} $1.currentWrapperTags Whether to prepend a line + * separator. + * @param {?boolean} $1.preserveWhiteSpace Whether or not to collapse white + * space characters. * * @return {Object} A rich text value. */ @@ -1355,7 +1663,8 @@ multilineWrapperTags = _ref4.multilineWrapperTags, _ref4$currentWrapperT = _ref4.currentWrapperTags, currentWrapperTags = _ref4$currentWrapperT === void 0 ? [] : _ref4$currentWrapperT, - isEditableTree = _ref4.isEditableTree; + isEditableTree = _ref4.isEditableTree, + preserveWhiteSpace = _ref4.preserveWhiteSpace; var accumulator = createEmptyValue(); if (!element || !element.hasChildNodes()) { @@ -1377,7 +1686,8 @@ multilineTag: multilineTag, multilineWrapperTags: multilineWrapperTags, currentWrapperTags: currentWrapperTags, - isEditableTree: isEditableTree + isEditableTree: isEditableTree, + preserveWhiteSpace: preserveWhiteSpace }); // Multiline value text should be separated by a line separator. if (index !== 0 || currentWrapperTags.length > 0) { @@ -1474,7 +1784,13 @@ /** * Gets the all format objects at the start of the selection. * - * @param {Object} value Value to inspect. + * @param {Object} value Value to inspect. + * @param {Array} value.formats Formats object data values. + * @param {number} value.start Index to start from. + * @param {number} value.end Index to end. + * @param {Array} value.activeFormats Array to return if there are active formats. + * @param {Array} EMPTY_ACTIVE_FORMATS Array to return if there are no active + * formats. * * @return {?Object} Active format objects. */ @@ -1483,9 +1799,10 @@ start = _ref.start, end = _ref.end, activeFormats = _ref.activeFormats; + var EMPTY_ACTIVE_FORMATS = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; if (start === undefined) { - return []; + return EMPTY_ACTIVE_FORMATS; } if (start === end) { @@ -1494,8 +1811,8 @@ return activeFormats; } - var formatsBefore = formats[start - 1] || []; - var formatsAfter = formats[start] || []; // By default, select the lowest amount of formats possible (which means + var formatsBefore = formats[start - 1] || EMPTY_ACTIVE_FORMATS; + var formatsAfter = formats[start] || EMPTY_ACTIVE_FORMATS; // By default, select the lowest amount of formats possible (which means // the caret is positioned outside the format boundary). The user can // then use arrow keys to define `activeFormats`. @@ -1506,7 +1823,7 @@ return formatsAfter; } - return formats[start] || []; + return formats[start] || EMPTY_ACTIVE_FORMATS; } // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-active-format.js @@ -1532,7 +1849,7 @@ */ function getActiveFormat(value, formatType) { - return Object(external_lodash_["find"])(getActiveFormats(value), { + return Object(external_this_lodash_["find"])(getActiveFormats(value), { type: formatType }); } @@ -1563,36 +1880,6 @@ return replacements[start]; } -// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-selection-end.js -/** - * Gets the end index of the current selection, or returns `undefined` if no - * selection exists. The selection ends right before the character at this - * index. - * - * @param {Object} value Value to get the selection from. - * - * @return {number|undefined} Index where the selection ends. - */ -function getSelectionEnd(_ref) { - var end = _ref.end; - return end; -} - -// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-selection-start.js -/** - * Gets the start index of the current selection, or returns `undefined` if no - * selection exists. The selection starts right before the character at this - * index. - * - * @param {Object} value Value to get the selection from. - * - * @return {number|undefined} Index where the selection starts. - */ -function getSelectionStart(_ref) { - var start = _ref.start; - return start; -} - // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-text-content.js /** * Get the textual content of a Rich Text value. This is similar to @@ -1607,6 +1894,88 @@ return text; } +// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-line-index.js +/** + * Internal dependencies + */ + +/** + * Gets the currently selected line index, or the first line index if the + * selection spans over multiple items. + * + * @param {Object} value Value to get the line index from. + * @param {boolean} startIndex Optional index that should be contained by the + * line. Defaults to the selection start of the + * value. + * + * @return {?boolean} The line index. Undefined if not found. + */ + +function getLineIndex(_ref) { + var start = _ref.start, + text = _ref.text; + var startIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : start; + var index = startIndex; + + while (index--) { + if (text[index] === LINE_SEPARATOR) { + return index; + } + } +} + +// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/is-list-root-selected.js +/** + * Internal dependencies + */ + +/** + * Whether or not the root list is selected. + * + * @param {Object} value The value to check. + * + * @return {boolean} True if the root list or nothing is selected, false if an + * inner list is selected. + */ + +function isListRootSelected(value) { + var replacements = value.replacements, + start = value.start; + var lineIndex = getLineIndex(value, start); + var replacement = replacements[lineIndex]; + return !replacement || replacement.length < 1; +} + +// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/is-active-list-type.js +/** + * Internal dependencies + */ + +/** + * Wether or not the selected list has the given tag name. + * + * @param {Object} value The value to check. + * @param {string} type The tag name the list should have. + * @param {string} rootType The current root tag name, to compare with in case + * nothing is selected. + * + * @return {boolean} True if the current list type matches `type`, false if not. + */ + +function isActiveListType(value, type, rootType) { + var replacements = value.replacements, + start = value.start; + var lineIndex = getLineIndex(value, start); + var replacement = replacements[lineIndex]; + + if (!replacement || replacement.length === 0) { + return type === rootType; + } + + var lastFormat = replacement[replacement.length - 1]; + return lastFormat.type === type; +} + // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/is-collapsed.js /** * Check if the selection of a Rich Text value is collapsed or not. Collapsed @@ -1719,72 +2088,43 @@ })); } -// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js -var defineProperty = __webpack_require__(15); - -// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js -var esm_extends = __webpack_require__(19); - -// EXTERNAL MODULE: external {"this":["wp","element"]} -var external_this_wp_element_ = __webpack_require__(0); - -// 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","hooks"]} -var external_this_wp_hooks_ = __webpack_require__(26); - -// EXTERNAL MODULE: external {"this":["wp","compose"]} -var external_this_wp_compose_ = __webpack_require__(6); - // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/register-format-type.js - - - - -/** - * External dependencies - */ - +function register_format_type_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function register_format_type_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { register_format_type_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { register_format_type_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } /** * WordPress dependencies */ - - - /** - * 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. + * @typedef {Object} WPFormat * - * @type {Array} + * @property {string} name A string identifying the format. Must be + * unique across all registered formats. + * @property {string} tagName The HTML tag this format will wrap the + * selection with. + * @property {string} [className] A class to match the format. + * @property {string} title Name of the format. + * @property {Function} edit Should return a component for the user to + * interact with the new registered format. */ -var EMPTY_ARRAY = []; /** * Registers a new format provided a unique name and an object defining its * behavior. * * @param {string} name Format name. - * @param {Object} settings Format settings. - * @param {string} settings.tagName The HTML tag this format will wrap the selection with. - * @param {string} [settings.className] A class to match the format. - * @param {string} settings.title Name of the format. - * @param {Function} settings.edit Should return a component for the user to interact with the new registered format. + * @param {WPFormat} settings Format settings. * * @return {WPFormat|undefined} The format, if it has been successfully registered; * otherwise `undefined`. */ function registerFormatType(name, settings) { - settings = Object(objectSpread["a" /* default */])({ + settings = register_format_type_objectSpread({ name: name }, settings); @@ -1850,88 +2190,16 @@ } Object(external_this_wp_data_["dispatch"])('core/rich-text').addFormatTypes(settings); - var getFunctionStackMemoized = memize_default()(function () { - var previousStack = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : EMPTY_ARRAY; - var newFunction = arguments.length > 1 ? arguments[1] : undefined; - return [].concat(Object(toConsumableArray["a" /* default */])(previousStack), [newFunction]); - }); - - if (settings.__experimentalCreatePrepareEditableTree) { - Object(external_this_wp_hooks_["addFilter"])('experimentalRichText', name, function (OriginalComponent) { - var Component = OriginalComponent; - - if (settings.__experimentalCreatePrepareEditableTree || settings.__experimentalCreateFormatToValue || settings.__experimentalCreateValueToFormat) { - Component = function Component(props) { - var additionalProps = {}; - - if (settings.__experimentalCreatePrepareEditableTree) { - additionalProps.prepareEditableTree = getFunctionStackMemoized(props.prepareEditableTree, settings.__experimentalCreatePrepareEditableTree(props["format_".concat(name)], { - richTextIdentifier: props.identifier, - blockClientId: props.clientId - })); - } - - if (settings.__experimentalCreateOnChangeEditableValue) { - var dispatchProps = Object.keys(props).reduce(function (accumulator, propKey) { - var propValue = props[propKey]; - var keyPrefix = "format_".concat(name, "_dispatch_"); - - if (propKey.startsWith(keyPrefix)) { - var realKey = propKey.replace(keyPrefix, ''); - accumulator[realKey] = propValue; - } - - return accumulator; - }, {}); - additionalProps.onChangeEditableValue = getFunctionStackMemoized(props.onChangeEditableValue, settings.__experimentalCreateOnChangeEditableValue(Object(objectSpread["a" /* default */])({}, props["format_".concat(name)], dispatchProps), { - richTextIdentifier: props.identifier, - blockClientId: props.clientId - })); - } - - return Object(external_this_wp_element_["createElement"])(OriginalComponent, Object(esm_extends["a" /* default */])({}, props, additionalProps)); - }; - } - - var hocs = []; - - if (settings.__experimentalGetPropsForEditableTreePreparation) { - hocs.push(Object(external_this_wp_data_["withSelect"])(function (sel, _ref) { - var clientId = _ref.clientId, - identifier = _ref.identifier; - return Object(defineProperty["a" /* default */])({}, "format_".concat(name), settings.__experimentalGetPropsForEditableTreePreparation(sel, { - richTextIdentifier: identifier, - blockClientId: clientId - })); - })); - } - - if (settings.__experimentalGetPropsForEditableTreeChangeHandler) { - hocs.push(Object(external_this_wp_data_["withDispatch"])(function (disp, _ref3) { - var clientId = _ref3.clientId, - identifier = _ref3.identifier; - - var dispatchProps = settings.__experimentalGetPropsForEditableTreeChangeHandler(disp, { - richTextIdentifier: identifier, - blockClientId: clientId - }); - - return Object(external_lodash_["mapKeys"])(dispatchProps, function (value, key) { - return "format_".concat(name, "_dispatch_").concat(key); - }); - })); - } - - return Object(external_this_wp_compose_["compose"])(hocs)(Component); - }); - } - return settings; } // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/remove-format.js +function remove_format_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function remove_format_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { remove_format_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { remove_format_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + /** * External dependencies */ @@ -1963,19 +2231,19 @@ // format. if (startIndex === endIndex) { - var format = Object(external_lodash_["find"])(newFormats[startIndex], { + var format = Object(external_this_lodash_["find"])(newFormats[startIndex], { type: formatType }); if (format) { - while (Object(external_lodash_["find"])(newFormats[startIndex], format)) { + while (Object(external_this_lodash_["find"])(newFormats[startIndex], format)) { filterFormats(newFormats, startIndex, formatType); startIndex--; } endIndex++; - while (Object(external_lodash_["find"])(newFormats[endIndex], format)) { + while (Object(external_this_lodash_["find"])(newFormats[endIndex], format)) { filterFormats(newFormats, endIndex, formatType); endIndex++; } @@ -1988,9 +2256,9 @@ } } - return normaliseFormats(Object(objectSpread["a" /* default */])({}, value, { + return normaliseFormats(remove_format_objectSpread({}, value, { formats: newFormats, - activeFormats: Object(external_lodash_["reject"])(activeFormats, { + activeFormats: Object(external_this_lodash_["reject"])(activeFormats, { type: formatType }) })); @@ -2097,7 +2365,7 @@ * @return {Object} A new value with replacements applied. */ -function replace(_ref, pattern, replacement) { +function replace_replace(_ref, pattern, replacement) { var formats = _ref.formats, replacements = _ref.replacements, text = _ref.text, @@ -2148,23 +2416,6 @@ }); } -// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/insert-line-break.js -/** - * Internal dependencies - */ - -/** - * Inserts a line break at the given or selected position. - * - * @param {Object} value Value to modify. - * - * @return {Object} The value with the line break inserted. - */ - -function insertLineBreak(value) { - return insert(value, '\n'); -} - // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/insert-line-separator.js /** * Internal dependencies @@ -2204,6 +2455,66 @@ return insert(value, valueToInsert, startIndex, endIndex); } +// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/remove-line-separator.js + + +function remove_line_separator_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function remove_line_separator_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { remove_line_separator_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { remove_line_separator_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +/** + * Internal dependencies + */ + + + +/** + * Removes a line separator character, if existing, from a Rich Text value at the current + * indices. If no line separator exists on the indices it will return undefined. + * + * @param {Object} value Value to modify. + * @param {boolean} backward indicates if are removing from the start index or the end index. + * + * @return {Object|undefined} A new value with the line separator removed. Or undefined if no line separator is found on the position. + */ + +function removeLineSeparator(value) { + var backward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; + var replacements = value.replacements, + text = value.text, + start = value.start, + end = value.end; + var collapsed = isCollapsed(value); + var index = start - 1; + var removeStart = collapsed ? start - 1 : start; + var removeEnd = end; + + if (!backward) { + index = end; + removeStart = start; + removeEnd = collapsed ? end + 1 : end; + } + + if (text[index] !== LINE_SEPARATOR) { + return; + } + + var newValue; // If the line separator that is about te be removed + // contains wrappers, remove the wrappers first. + + if (collapsed && replacements[index] && replacements[index].length) { + var newReplacements = replacements.slice(); + newReplacements[index] = replacements[index].slice(0, -1); + newValue = remove_line_separator_objectSpread({}, value, { + replacements: newReplacements + }); + } else { + newValue = remove_remove(value, removeStart, removeEnd); + } + + return newValue; +} + // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/insert-object.js /** * Internal dependencies @@ -2235,6 +2546,10 @@ // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/slice.js +function slice_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function slice_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { slice_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { slice_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + /** * Slice a Rich Text value from `startIndex` to `endIndex`. Indices are * retrieved from the selection if none are provided. This is similar to @@ -2254,7 +2569,7 @@ text = value.text; if (startIndex === undefined || endIndex === undefined) { - return Object(objectSpread["a" /* default */])({}, value); + return slice_objectSpread({}, value); } return { @@ -2274,9 +2589,13 @@ * split at the given separator. This is similar to `String.prototype.split`. * Indices are retrieved from the selection if none are provided. * - * @param {Object} value Value to modify. + * @param {Object} value + * @param {Object[]} value.formats + * @param {Object[]} value.replacements + * @param {string} value.text + * @param {number} value.start + * @param {number} value.end * @param {number|string} [string] Start index, or string at which to split. - * @param {number} [endStr] End index. * * @return {Array} An array of new values. */ @@ -2341,7 +2660,7 @@ end: 0 }; return [// Ensure newlines are trimmed. - replace(before, /\u2028+$/, ''), replace(after, /^\u2028+/, '')]; + replace_replace(before, /\u2028+$/, ''), replace_replace(after, /^\u2028+/, '')]; } // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-format-type.js @@ -2365,6 +2684,10 @@ +function to_tree_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function to_tree_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { to_tree_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { to_tree_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + /** * Internal dependencies */ @@ -2403,7 +2726,7 @@ if (!formatType) { if (attributes) { - elementAttributes = Object(objectSpread["a" /* default */])({}, attributes, elementAttributes); + elementAttributes = to_tree_objectSpread({}, attributes, {}, elementAttributes); } return { @@ -2413,7 +2736,7 @@ }; } - elementAttributes = Object(objectSpread["a" /* default */])({}, unregisteredAttributes, elementAttributes); + elementAttributes = to_tree_objectSpread({}, unregisteredAttributes, {}, elementAttributes); for (var name in attributes) { var key = formatType.attributes ? formatType.attributes[name] : false; @@ -2439,17 +2762,29 @@ attributes: elementAttributes }; } - -var padding = { - type: 'br', - attributes: { - 'data-rich-text-padding': 'true' - }, - object: true -}; +/** + * Checks if both arrays of formats up until a certain index are equal. + * + * @param {Array} a Array of formats to compare. + * @param {Array} b Array of formats to compare. + * @param {number} index Index to check until. + */ + + +function isEqualUntil(a, b, index) { + do { + if (a[index] !== b[index]) { + return false; + } + } while (index--); + + return true; +} + function toTree(_ref2) { var value = _ref2.value, multilineTag = _ref2.multilineTag, + preserveWhiteSpace = _ref2.preserveWhiteSpace, createEmpty = _ref2.createEmpty, append = _ref2.append, getLastChild = _ref2.getLastChild, @@ -2460,7 +2795,8 @@ appendText = _ref2.appendText, onStartIndex = _ref2.onStartIndex, onEndIndex = _ref2.onEndIndex, - isEditableTree = _ref2.isEditableTree; + isEditableTree = _ref2.isEditableTree, + placeholder = _ref2.placeholder; var formats = value.formats, replacements = value.replacements, text = value.text, @@ -2514,8 +2850,7 @@ node = getLastChild(node); } - append(getParent(node), padding); - append(getParent(node), ''); + append(getParent(node), ZWNBSP); } // Set selection for the start of line. @@ -2537,7 +2872,8 @@ if (characterFormats) { characterFormats.forEach(function (format, formatIndex) { - if (pointer && lastCharacterFormats && format === lastCharacterFormats[formatIndex] && ( // Do not reuse the last element if the character is a + if (pointer && lastCharacterFormats && // Reuse the last element if all formats remain the same. + isEqualUntil(characterFormats, lastCharacterFormats, formatIndex) && ( // Do not reuse the last element if the character is a // line separator. character !== LINE_SEPARATOR || characterFormats.length - 1 !== formatIndex)) { pointer = getLastChild(pointer); @@ -2583,12 +2919,12 @@ } if (character === OBJECT_REPLACEMENT_CHARACTER) { - pointer = append(getParent(pointer), fromFormat(Object(objectSpread["a" /* default */])({}, replacements[i], { + pointer = append(getParent(pointer), fromFormat(to_tree_objectSpread({}, replacements[i], { object: true }))); // Ensure pointer is text node. pointer = append(getParent(pointer), ''); - } else if (character === '\n') { + } else if (!preserveWhiteSpace && character === '\n') { pointer = append(getParent(pointer), { type: 'br', attributes: isEditableTree ? { @@ -2613,7 +2949,20 @@ } if (shouldInsertPadding && i === text.length) { - append(getParent(pointer), padding); + append(getParent(pointer), ZWNBSP); + + if (placeholder && text.length === 0) { + append(getParent(pointer), { + type: 'span', + attributes: { + 'data-rich-text-placeholder': placeholder, + // Necessary to prevent the placeholder from catching + // selection. The placeholder is also not editable after + // all. + contenteditable: 'false' + } + }); + } } lastCharacterFormats = characterFormats; @@ -2633,17 +2982,16 @@ +function to_dom_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function to_dom_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { to_dom_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { to_dom_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + /** * Internal dependencies */ /** - * Browser dependencies - */ - -var to_dom_TEXT_NODE = window.Node.TEXT_NODE; -/** * Creates a path as an array of indices from the given root node to the given * node. * @@ -2692,21 +3040,6 @@ offset: path[0] }; } -/** - * Returns a new instance of a DOM tree upon which RichText operations can be - * applied. - * - * Note: The current implementation will return a shared reference, reset on - * each call to `createEmpty`. Therefore, you should not hold a reference to - * the value to operate upon asynchronously, as it may have unexpected results. - * - * @return {WPRichTextTree} RichText tree. - */ - - -var to_dom_createEmpty = function createEmpty() { - return createElement(document, ''); -}; function to_dom_append(element, child) { if (typeof child === 'string') { @@ -2742,13 +3075,12 @@ return parentNode; } -function to_dom_isText(_ref3) { - var nodeType = _ref3.nodeType; - return nodeType === to_dom_TEXT_NODE; +function to_dom_isText(node) { + return node.nodeType === node.TEXT_NODE; } -function to_dom_getText(_ref4) { - var nodeValue = _ref4.nodeValue; +function to_dom_getText(_ref3) { + var nodeValue = _ref3.nodeValue; return nodeValue; } @@ -2756,28 +3088,43 @@ return node.parentNode.removeChild(node); } -function prepareFormats() { - var prepareEditableTree = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; - var value = arguments.length > 1 ? arguments[1] : undefined; - return prepareEditableTree.reduce(function (accumlator, fn) { - return fn(accumlator, value.text); - }, value.formats); -} - -function toDom(_ref5) { - var value = _ref5.value, - multilineTag = _ref5.multilineTag, - prepareEditableTree = _ref5.prepareEditableTree, - _ref5$isEditableTree = _ref5.isEditableTree, - isEditableTree = _ref5$isEditableTree === void 0 ? true : _ref5$isEditableTree; +function toDom(_ref4) { + var value = _ref4.value, + multilineTag = _ref4.multilineTag, + prepareEditableTree = _ref4.prepareEditableTree, + _ref4$isEditableTree = _ref4.isEditableTree, + isEditableTree = _ref4$isEditableTree === void 0 ? true : _ref4$isEditableTree, + placeholder = _ref4.placeholder, + _ref4$doc = _ref4.doc, + doc = _ref4$doc === void 0 ? document : _ref4$doc; var startPath = []; var endPath = []; + + if (prepareEditableTree) { + value = to_dom_objectSpread({}, value, { + formats: prepareEditableTree(value) + }); + } + /** + * Returns a new instance of a DOM tree upon which RichText operations can be + * applied. + * + * Note: The current implementation will return a shared reference, reset on + * each call to `createEmpty`. Therefore, you should not hold a reference to + * the value to operate upon asynchronously, as it may have unexpected results. + * + * @return {Object} RichText tree. + */ + + + var createEmpty = function createEmpty() { + return createElement(doc, ''); + }; + var tree = toTree({ - value: Object(objectSpread["a" /* default */])({}, value, { - formats: prepareFormats(prepareEditableTree, value) - }), + value: value, multilineTag: multilineTag, - createEmpty: to_dom_createEmpty, + createEmpty: createEmpty, append: to_dom_append, getLastChild: to_dom_getLastChild, getParent: to_dom_getParent, @@ -2791,7 +3138,8 @@ onEndIndex: function onEndIndex(body, pointer) { endPath = createPathToNode(pointer, body, [pointer.nodeValue.length]); }, - isEditableTree: isEditableTree + isEditableTree: isEditableTree, + placeholder: placeholder }); return { body: tree, @@ -2813,18 +3161,21 @@ * @param {Array} [$1.multilineWrapperTags] Tags where lines can be found if nesting is possible. */ -function apply(_ref6) { - var value = _ref6.value, - current = _ref6.current, - multilineTag = _ref6.multilineTag, - prepareEditableTree = _ref6.prepareEditableTree, - __unstableDomOnly = _ref6.__unstableDomOnly; +function apply(_ref5) { + var value = _ref5.value, + current = _ref5.current, + multilineTag = _ref5.multilineTag, + prepareEditableTree = _ref5.prepareEditableTree, + __unstableDomOnly = _ref5.__unstableDomOnly, + placeholder = _ref5.placeholder; // Construct a new element tree in memory. var _toDom = toDom({ value: value, multilineTag: multilineTag, - prepareEditableTree: prepareEditableTree + prepareEditableTree: prepareEditableTree, + placeholder: placeholder, + doc: current.ownerDocument }), body = _toDom.body, selection = _toDom.selection; @@ -2845,14 +3196,17 @@ if (!currentChild) { current.appendChild(futureChild); } else if (!currentChild.isEqualNode(futureChild)) { - if (currentChild.nodeName !== futureChild.nodeName || currentChild.nodeType === to_dom_TEXT_NODE && currentChild.data !== futureChild.data) { + if (currentChild.nodeName !== futureChild.nodeName || currentChild.nodeType === currentChild.TEXT_NODE && currentChild.data !== futureChild.data) { current.replaceChild(futureChild, currentChild); } else { var currentAttributes = currentChild.attributes; var futureAttributes = futureChild.attributes; if (currentAttributes) { - for (var ii = 0; ii < currentAttributes.length; ii++) { + var ii = currentAttributes.length; // Reverse loop because `removeAttribute` on `currentChild` + // changes `currentAttributes`. + + while (ii--) { var name = currentAttributes[ii].name; if (!futureChild.getAttribute(name)) { @@ -2864,11 +3218,11 @@ if (futureAttributes) { for (var _ii = 0; _ii < futureAttributes.length; _ii++) { var _futureAttributes$_ii = futureAttributes[_ii], - name = _futureAttributes$_ii.name, + _name = _futureAttributes$_ii.name, value = _futureAttributes$_ii.value; - if (currentChild.getAttribute(name) !== value) { - currentChild.setAttribute(name, value); + if (currentChild.getAttribute(_name) !== value) { + currentChild.setAttribute(_name, value); } } } @@ -2902,9 +3256,9 @@ return a.startContainer === b.startContainer && a.startOffset === b.startOffset && a.endContainer === b.endContainer && a.endOffset === b.endOffset; } -function applySelection(_ref7, current) { - var startPath = _ref7.startPath, - endPath = _ref7.endPath; +function applySelection(_ref6, current) { + var startPath = _ref6.startPath, + endPath = _ref6.endPath; var _getNodeByPath = getNodeByPath(current, startPath), startContainer = _getNodeByPath.node, @@ -2914,32 +3268,42 @@ endContainer = _getNodeByPath2.node, endOffset = _getNodeByPath2.offset; - var selection = window.getSelection(); var ownerDocument = current.ownerDocument; + var defaultView = ownerDocument.defaultView; + var selection = defaultView.getSelection(); var range = ownerDocument.createRange(); range.setStart(startContainer, startOffset); range.setEnd(endContainer, endOffset); + var activeElement = ownerDocument.activeElement; if (selection.rangeCount > 0) { // If the to be added range and the live range are the same, there's no // need to remove the live range and add the equivalent range. if (isRangeEqual(range, selection.getRangeAt(0))) { - // Set back focus if focus is lost. - if (ownerDocument.activeElement !== current) { - current.focus(); - } - return; } selection.removeAllRanges(); } - selection.addRange(range); + selection.addRange(range); // This function is not intended to cause a shift in focus. Since the above + // selection manipulations may shift focus, ensure that focus is restored to + // its previous state. + + if (activeElement !== ownerDocument.activeElement) { + // The `instanceof` checks protect against edge cases where the focused + // element is not of the interface HTMLElement (does not have a `focus` + // or `blur` property). + // + // See: https://github.com/Microsoft/TypeScript/issues/5901#issuecomment-431649653 + if (activeElement instanceof defaultView.HTMLElement) { + activeElement.focus(); + } + } } // EXTERNAL MODULE: external {"this":["wp","escapeHtml"]} -var external_this_wp_escapeHtml_ = __webpack_require__(69); +var external_this_wp_escapeHtml_ = __webpack_require__(89); // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/to-html-string.js /** @@ -2955,19 +3319,23 @@ * Create an HTML string from a Rich Text value. If a `multilineTag` is * provided, text separated by a line separator will be wrapped in it. * - * @param {Object} $1 Named argements. - * @param {Object} $1.value Rich text value. - * @param {string} [$1.multilineTag] Multiline tag. + * @param {Object} $1 Named argements. + * @param {Object} $1.value Rich text value. + * @param {string} [$1.multilineTag] Multiline tag. + * @param {?boolean} [$1.preserveWhiteSpace] Whether or not to use newline + * characters for line breaks. * * @return {string} HTML string. */ function toHTMLString(_ref) { var value = _ref.value, - multilineTag = _ref.multilineTag; + multilineTag = _ref.multilineTag, + preserveWhiteSpace = _ref.preserveWhiteSpace; var tree = toTree({ value: value, multilineTag: multilineTag, + preserveWhiteSpace: preserveWhiteSpace, createEmpty: to_html_string_createEmpty, append: to_html_string_append, getLastChild: to_html_string_getLastChild, @@ -3056,7 +3424,7 @@ function createChildrenHTML() { var children = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; return children.map(function (child) { - return child.text === undefined ? createElementHTML(child) : Object(external_this_wp_escapeHtml_["escapeHTML"])(child.text); + return child.text === undefined ? createElementHTML(child) : Object(external_this_wp_escapeHtml_["escapeEditableHTML"])(child.text); }).join(''); } @@ -3089,6 +3457,7 @@ * WordPress dependencies */ +/** @typedef {import('./register-format-type').WPFormat} WPFormat */ /** * Unregisters a format. @@ -3107,52 +3476,72 @@ return; } - if (oldFormat.__experimentalCreatePrepareEditableTree && oldFormat.__experimentalGetPropsForEditableTreePreparation) { - Object(external_this_wp_hooks_["removeFilter"])('experimentalRichText', name); - } - Object(external_this_wp_data_["dispatch"])('core/rich-text').removeFormatTypes(name); return oldFormat; } -// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-line-index.js +// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/can-indent-list-items.js /** * Internal dependencies */ /** - * Gets the currently selected line index, or the first line index if the - * selection spans over multiple items. + * Checks if the selected list item can be indented. * - * @param {Object} value Value to get the line index from. - * @param {boolean} startIndex Optional index that should be contained by the - * line. Defaults to the selection start of the - * value. + * @param {Object} value Value to check. * - * @return {?boolean} The line index. Undefined if not found. + * @return {boolean} Whether or not the selected list item can be indented. */ -function getLineIndex(_ref) { - var start = _ref.start, - text = _ref.text; - var startIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : start; - var index = startIndex; - - while (index--) { - if (text[index] === LINE_SEPARATOR) { - return index; - } +function canIndentListItems(value) { + var lineIndex = getLineIndex(value); // There is only one line, so the line cannot be indented. + + if (lineIndex === undefined) { + return false; } + + var replacements = value.replacements; + var previousLineIndex = getLineIndex(value, lineIndex); + var formatsAtLineIndex = replacements[lineIndex] || []; + var formatsAtPreviousLineIndex = replacements[previousLineIndex] || []; // If the indentation of the current line is greater than previous line, + // then the line cannot be furter indented. + + return formatsAtLineIndex.length <= formatsAtPreviousLineIndex.length; +} + +// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/can-outdent-list-items.js +/** + * Internal dependencies + */ + +/** + * Checks if the selected list item can be outdented. + * + * @param {Object} value Value to check. + * + * @return {boolean} Whether or not the selected list item can be outdented. + */ + +function canOutdentListItems(value) { + var replacements = value.replacements, + start = value.start; + var startingLineIndex = getLineIndex(value, start); + return replacements[startingLineIndex] !== undefined; } // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/indent-list-items.js +function indent_list_items_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function indent_list_items_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { indent_list_items_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { indent_list_items_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + /** * Internal dependencies */ + /** * Gets the line index of the first previous list item with higher indentation. * @@ -3194,24 +3583,15 @@ function indentListItems(value, rootFormat) { - var lineIndex = getLineIndex(value); // There is only one line, so the line cannot be indented. - - if (lineIndex === undefined) { + if (!canIndentListItems(value)) { return value; } + var lineIndex = getLineIndex(value); + var previousLineIndex = getLineIndex(value, lineIndex); var text = value.text, replacements = value.replacements, end = value.end; - var previousLineIndex = getLineIndex(value, lineIndex); - var formatsAtLineIndex = replacements[lineIndex] || []; - var formatsAtPreviousLineIndex = replacements[previousLineIndex] || []; // The the indentation of the current line is greater than previous line, - // then the line cannot be furter indented. - - if (formatsAtLineIndex.length > formatsAtPreviousLineIndex.length) { - return value; - } - var newFormats = replacements.slice(); var targetLevelLineIndex = getTargetLevelLineIndex(value, lineIndex); @@ -3233,7 +3613,7 @@ } } - return Object(objectSpread["a" /* default */])({}, value, { + return indent_list_items_objectSpread({}, value, { replacements: newFormats }); } @@ -3317,6 +3697,10 @@ // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/outdent-list-items.js +function outdent_list_items_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function outdent_list_items_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { outdent_list_items_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { outdent_list_items_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + /** * Internal dependencies */ @@ -3324,6 +3708,7 @@ + /** * Outdents any selected list items if possible. * @@ -3333,16 +3718,15 @@ */ function outdentListItems(value) { + if (!canOutdentListItems(value)) { + return value; + } + var text = value.text, replacements = value.replacements, start = value.start, end = value.end; - var startingLineIndex = getLineIndex(value, start); // Return early if the starting line index cannot be further outdented. - - if (replacements[startingLineIndex] === undefined) { - return value; - } - + var startingLineIndex = getLineIndex(value, start); var newFormats = replacements.slice(0); var parentFormats = replacements[getParentLineIndex(value, startingLineIndex)] || []; var endingLineIndex = getLineIndex(value, end); @@ -3366,7 +3750,7 @@ } } - return Object(objectSpread["a" /* default */])({}, value, { + return outdent_list_items_objectSpread({}, value, { replacements: newFormats }); } @@ -3374,6 +3758,10 @@ // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/change-list-type.js +function change_list_type_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function change_list_type_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { change_list_type_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { change_list_type_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + /** * Internal dependencies */ @@ -3430,11 +3818,90 @@ return value; } - return Object(objectSpread["a" /* default */])({}, value, { + return change_list_type_objectSpread({}, value, { replacements: newReplacements }); } +// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/extends.js +var esm_extends = __webpack_require__(8); + +// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js + 1 modules +var slicedToArray = __webpack_require__(14); + +// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +var objectWithoutProperties = __webpack_require__(15); + +// 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__(11); +var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames); + +// EXTERNAL MODULE: external {"this":["wp","keycodes"]} +var external_this_wp_keycodes_ = __webpack_require__(21); + +// EXTERNAL MODULE: external {"this":["wp","deprecated"]} +var external_this_wp_deprecated_ = __webpack_require__(37); +var external_this_wp_deprecated_default = /*#__PURE__*/__webpack_require__.n(external_this_wp_deprecated_); + +// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/component/format-edit.js + + +/** + * Internal dependencies + */ + + +/** + * Set of all interactive content tags. + * + * @see https://html.spec.whatwg.org/multipage/dom.html#interactive-content + */ + +var interactiveContentTags = new Set(['a', 'audio', 'button', 'details', 'embed', 'iframe', 'input', 'label', 'select', 'textarea', 'video']); +function FormatEdit(_ref) { + var formatTypes = _ref.formatTypes, + onChange = _ref.onChange, + onFocus = _ref.onFocus, + value = _ref.value, + allowedFormats = _ref.allowedFormats, + withoutInteractiveFormatting = _ref.withoutInteractiveFormatting; + return formatTypes.map(function (_ref2) { + var name = _ref2.name, + Edit = _ref2.edit, + tagName = _ref2.tagName; + + if (!Edit) { + return null; + } + + if (allowedFormats && allowedFormats.indexOf(name) === -1) { + return null; + } + + if (withoutInteractiveFormatting && interactiveContentTags.has(tagName)) { + return null; + } + + var activeFormat = getActiveFormat(value, name); + var isActive = activeFormat !== undefined; + var activeObject = getActiveObject(value); + var isObjectActive = activeObject !== undefined && activeObject.type === name; + return Object(external_this_wp_element_["createElement"])(Edit, { + key: name, + isActive: isActive, + activeAttributes: isActive ? activeFormat.attributes || {} : {}, + isObjectActive: isObjectActive, + activeObjectAttributes: isObjectActive ? activeObject.attributes || {} : {}, + value: value, + onChange: onChange, + onFocus: onFocus + }); + }); +} + // CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/update-formats.js /** * Internal dependencies @@ -3487,41 +3954,203 @@ return value; } -// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/index.js -/* concated harmony reexport applyFormat */__webpack_require__.d(__webpack_exports__, "applyFormat", function() { return applyFormat; }); -/* concated harmony reexport charAt */__webpack_require__.d(__webpack_exports__, "charAt", function() { return charAt; }); -/* concated harmony reexport concat */__webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); -/* concated harmony reexport create */__webpack_require__.d(__webpack_exports__, "create", function() { return create; }); -/* concated harmony reexport getActiveFormat */__webpack_require__.d(__webpack_exports__, "getActiveFormat", function() { return getActiveFormat; }); -/* concated harmony reexport getActiveObject */__webpack_require__.d(__webpack_exports__, "getActiveObject", function() { return getActiveObject; }); -/* concated harmony reexport getSelectionEnd */__webpack_require__.d(__webpack_exports__, "getSelectionEnd", function() { return getSelectionEnd; }); -/* concated harmony reexport getSelectionStart */__webpack_require__.d(__webpack_exports__, "getSelectionStart", function() { return getSelectionStart; }); -/* concated harmony reexport getTextContent */__webpack_require__.d(__webpack_exports__, "getTextContent", function() { return getTextContent; }); -/* concated harmony reexport isCollapsed */__webpack_require__.d(__webpack_exports__, "isCollapsed", function() { return isCollapsed; }); -/* concated harmony reexport isEmpty */__webpack_require__.d(__webpack_exports__, "isEmpty", function() { return isEmpty; }); -/* concated harmony reexport isEmptyLine */__webpack_require__.d(__webpack_exports__, "isEmptyLine", function() { return isEmptyLine; }); -/* concated harmony reexport join */__webpack_require__.d(__webpack_exports__, "join", function() { return join; }); -/* concated harmony reexport registerFormatType */__webpack_require__.d(__webpack_exports__, "registerFormatType", function() { return registerFormatType; }); -/* concated harmony reexport removeFormat */__webpack_require__.d(__webpack_exports__, "removeFormat", function() { return removeFormat; }); -/* concated harmony reexport remove */__webpack_require__.d(__webpack_exports__, "remove", function() { return remove_remove; }); -/* concated harmony reexport replace */__webpack_require__.d(__webpack_exports__, "replace", function() { return replace; }); -/* concated harmony reexport insert */__webpack_require__.d(__webpack_exports__, "insert", function() { return insert; }); -/* concated harmony reexport insertLineBreak */__webpack_require__.d(__webpack_exports__, "insertLineBreak", function() { return insertLineBreak; }); -/* concated harmony reexport insertLineSeparator */__webpack_require__.d(__webpack_exports__, "insertLineSeparator", function() { return insertLineSeparator; }); -/* concated harmony reexport insertObject */__webpack_require__.d(__webpack_exports__, "insertObject", function() { return insertObject; }); -/* concated harmony reexport slice */__webpack_require__.d(__webpack_exports__, "slice", function() { return slice; }); -/* concated harmony reexport split */__webpack_require__.d(__webpack_exports__, "split", function() { return split; }); -/* concated harmony reexport apply */__webpack_require__.d(__webpack_exports__, "apply", function() { return apply; }); -/* concated harmony reexport unstableToDom */__webpack_require__.d(__webpack_exports__, "unstableToDom", function() { return toDom; }); -/* concated harmony reexport toHTMLString */__webpack_require__.d(__webpack_exports__, "toHTMLString", function() { return toHTMLString; }); -/* concated harmony reexport toggleFormat */__webpack_require__.d(__webpack_exports__, "toggleFormat", function() { return toggleFormat; }); -/* concated harmony reexport LINE_SEPARATOR */__webpack_require__.d(__webpack_exports__, "LINE_SEPARATOR", function() { return LINE_SEPARATOR; }); -/* concated harmony reexport unregisterFormatType */__webpack_require__.d(__webpack_exports__, "unregisterFormatType", function() { return unregisterFormatType; }); -/* concated harmony reexport indentListItems */__webpack_require__.d(__webpack_exports__, "indentListItems", function() { return indentListItems; }); -/* concated harmony reexport outdentListItems */__webpack_require__.d(__webpack_exports__, "outdentListItems", function() { return outdentListItems; }); -/* concated harmony reexport changeListType */__webpack_require__.d(__webpack_exports__, "changeListType", function() { return changeListType; }); -/* concated harmony reexport __unstableUpdateFormats */__webpack_require__.d(__webpack_exports__, "__unstableUpdateFormats", function() { return updateFormats; }); -/* concated harmony reexport __unstableGetActiveFormats */__webpack_require__.d(__webpack_exports__, "__unstableGetActiveFormats", function() { return getActiveFormats; }); +// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/component/with-format-types.js + + + + +function with_format_types_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function with_format_types_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { with_format_types_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { with_format_types_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +/** + * External dependencies + */ + +/** + * WordPress dependencies + */ + + + + +function formatTypesSelector(select) { + return select('core/rich-text').getFormatTypes(); +} +/** + * This higher-order component provides RichText with the `formatTypes` prop + * and its derived props from experimental format type settings. + * + * @param {WPComponent} RichText The rich text component to add props for. + * + * @return {WPComponent} New enhanced component. + */ + + +function withFormatTypes(RichText) { + return function WithFormatTypes(props) { + var clientId = props.clientId, + identifier = props.identifier; + var formatTypes = Object(external_this_wp_data_["useSelect"])(formatTypesSelector, []); + var selectProps = Object(external_this_wp_data_["useSelect"])(function (select) { + return formatTypes.reduce(function (acc, settings) { + if (!settings.__experimentalGetPropsForEditableTreePreparation) { + return acc; + } + + var selectPrefix = "format_prepare_props_(".concat(settings.name, ")_"); + return with_format_types_objectSpread({}, acc, {}, Object(external_this_lodash_["mapKeys"])(settings.__experimentalGetPropsForEditableTreePreparation(select, { + richTextIdentifier: identifier, + blockClientId: clientId + }), function (value, key) { + return selectPrefix + key; + })); + }, {}); + }, [formatTypes, clientId, identifier]); + + var dispatchProps = Object(external_this_wp_data_["__unstableUseDispatchWithMap"])(function (dispatch) { + return formatTypes.reduce(function (acc, settings) { + if (!settings.__experimentalGetPropsForEditableTreeChangeHandler) { + return acc; + } + + var dispatchPrefix = "format_on_change_props_(".concat(settings.name, ")_"); + return with_format_types_objectSpread({}, acc, {}, Object(external_this_lodash_["mapKeys"])(settings.__experimentalGetPropsForEditableTreeChangeHandler(dispatch, { + richTextIdentifier: identifier, + blockClientId: clientId + }), function (value, key) { + return dispatchPrefix + key; + })); + }, {}); + }, [formatTypes, clientId, identifier]); + + var newProps = Object(external_this_wp_element_["useMemo"])(function () { + return formatTypes.reduce(function (acc, settings) { + if (!settings.__experimentalCreatePrepareEditableTree) { + return acc; + } + + var args = { + richTextIdentifier: identifier, + blockClientId: clientId + }; + + var combined = with_format_types_objectSpread({}, selectProps, {}, dispatchProps); + + var name = settings.name; + var selectPrefix = "format_prepare_props_(".concat(name, ")_"); + var dispatchPrefix = "format_on_change_props_(".concat(name, ")_"); + var propsByPrefix = Object.keys(combined).reduce(function (accumulator, key) { + if (key.startsWith(selectPrefix)) { + accumulator[key.slice(selectPrefix.length)] = combined[key]; + } + + if (key.startsWith(dispatchPrefix)) { + accumulator[key.slice(dispatchPrefix.length)] = combined[key]; + } + + return accumulator; + }, {}); + + if (settings.__experimentalCreateOnChangeEditableValue) { + var _objectSpread2; + + return with_format_types_objectSpread({}, acc, (_objectSpread2 = {}, Object(defineProperty["a" /* default */])(_objectSpread2, "format_value_functions_(".concat(name, ")"), settings.__experimentalCreatePrepareEditableTree(propsByPrefix, args)), Object(defineProperty["a" /* default */])(_objectSpread2, "format_on_change_functions_(".concat(name, ")"), settings.__experimentalCreateOnChangeEditableValue(propsByPrefix, args)), _objectSpread2)); + } + + return with_format_types_objectSpread({}, acc, Object(defineProperty["a" /* default */])({}, "format_prepare_functions_(".concat(name, ")"), settings.__experimentalCreatePrepareEditableTree(propsByPrefix, args))); + }, {}); + }, [formatTypes, clientId, identifier, selectProps, dispatchProps]); + return Object(external_this_wp_element_["createElement"])(RichText, Object(esm_extends["a" /* default */])({}, props, selectProps, newProps, { + formatTypes: formatTypes + })); + }; +} + +// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/component/use-boundary-style.js +/** + * WordPress dependencies + */ + +/** + * Calculates and renders the format boundary style when the active formats + * change. + */ + +function useBoundaryStyle(_ref) { + var activeFormats = _ref.activeFormats, + ref = _ref.ref; + Object(external_this_wp_element_["useEffect"])(function () { + // There's no need to recalculate the boundary styles if no formats are + // active, because no boundary styles will be visible. + if (!activeFormats || !activeFormats.length) { + return; + } + + var boundarySelector = '*[data-rich-text-format-boundary]'; + var element = ref.current.querySelector(boundarySelector); + + if (!element) { + return; + } + + var ownerDocument = element.ownerDocument; + var defaultView = ownerDocument.defaultView; + var computedStyle = defaultView.getComputedStyle(element); + var newColor = computedStyle.color.replace(')', ', 0.2)').replace('rgb', 'rgba'); + var selector = ".rich-text:focus ".concat(boundarySelector); + var rule = "background-color: ".concat(newColor); + var style = "".concat(selector, " {").concat(rule, "}"); + var globalStyleId = 'rich-text-boundary-style'; + var globalStyle = ownerDocument.getElementById(globalStyleId); + + if (!globalStyle) { + globalStyle = ownerDocument.createElement('style'); + globalStyle.id = globalStyleId; + ownerDocument.head.appendChild(globalStyle); + } + + if (globalStyle.innerHTML !== style) { + globalStyle.innerHTML = style; + } + }, [activeFormats]); +} + +// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/component/use-inline-warning.js +/** + * WordPress dependencies + */ + +function useInlineWarning(_ref) { + var ref = _ref.ref; + Object(external_this_wp_element_["useEffect"])(function () { + if (false) { var computedStyle, defaultView, target; } + }, []); +} + +// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/component/index.js + + + + + + +function component_ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function component_objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { component_ownKeys(Object(source), true).forEach(function (key) { Object(defineProperty["a" /* default */])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { component_ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +/** + * External dependencies + */ + + +/** + * WordPress dependencies + */ + + + + /** * Internal dependencies */ @@ -3543,6 +4172,1108 @@ +/** @typedef {import('@wordpress/element').WPSyntheticEvent} WPSyntheticEvent */ + +/** + * All inserting input types that would insert HTML into the DOM. + * + * @see https://www.w3.org/TR/input-events-2/#interface-InputEvent-Attributes + * + * @type {Set} + */ + +var INSERTION_INPUT_TYPES_TO_IGNORE = new Set(['insertParagraph', 'insertOrderedList', 'insertUnorderedList', 'insertHorizontalRule', 'insertLink']); +/** + * In HTML, leading and trailing spaces are not visible, and multiple spaces + * elsewhere are visually reduced to one space. This rule prevents spaces from + * collapsing so all space is visible in the editor and can be removed. It also + * prevents some browsers from inserting non-breaking spaces at the end of a + * line to prevent the space from visually disappearing. Sometimes these non + * breaking spaces can linger in the editor causing unwanted non breaking spaces + * in between words. If also prevent Firefox from inserting a trailing `br` node + * to visualise any trailing space, causing the element to be saved. + * + * > Authors are encouraged to set the 'white-space' property on editing hosts + * > and on markup that was originally created through these editing mechanisms + * > to the value 'pre-wrap'. Default HTML whitespace handling is not well + * > suited to WYSIWYG editing, and line wrapping will not work correctly in + * > some corner cases if 'white-space' is left at its default value. + * + * https://html.spec.whatwg.org/multipage/interaction.html#best-practices-for-in-page-editors + * + * @type {string} + */ + +var whiteSpace = 'pre-wrap'; +/** + * Default style object for the editable element. + * + * @type {Object} + */ + +var defaultStyle = { + whiteSpace: whiteSpace +}; +var EMPTY_ACTIVE_FORMATS = []; + +function createPrepareEditableTree(props, prefix) { + var fns = Object.keys(props).reduce(function (accumulator, key) { + if (key.startsWith(prefix)) { + accumulator.push(props[key]); + } + + return accumulator; + }, []); + return function (value) { + return fns.reduce(function (accumulator, fn) { + return fn(accumulator, value.text); + }, value.formats); + }; +} +/** + * If the selection is set on the placeholder element, collapse the selection to + * the start (before the placeholder). + * + * @param {Window} defaultView + */ + + +function fixPlaceholderSelection(defaultView) { + var selection = defaultView.getSelection(); + var anchorNode = selection.anchorNode, + anchorOffset = selection.anchorOffset; + + if (anchorNode.nodeType !== anchorNode.ELEMENT_NODE) { + return; + } + + var targetNode = anchorNode.childNodes[anchorOffset]; + + if (!targetNode || targetNode.nodeType !== targetNode.ELEMENT_NODE || !targetNode.getAttribute('data-rich-text-placeholder')) { + return; + } + + selection.collapseToStart(); +} + +function component_RichText(_ref) { + var _ref$tagName = _ref.tagName, + TagName = _ref$tagName === void 0 ? 'div' : _ref$tagName, + _ref$value = _ref.value, + value = _ref$value === void 0 ? '' : _ref$value, + selectionStart = _ref.selectionStart, + selectionEnd = _ref.selectionEnd, + children = _ref.children, + allowedFormats = _ref.allowedFormats, + withoutInteractiveFormatting = _ref.withoutInteractiveFormatting, + formatTypes = _ref.formatTypes, + style = _ref.style, + className = _ref.className, + placeholder = _ref.placeholder, + disabled = _ref.disabled, + preserveWhiteSpace = _ref.preserveWhiteSpace, + onPaste = _ref.onPaste, + _ref$format = _ref.format, + format = _ref$format === void 0 ? 'string' : _ref$format, + onDelete = _ref.onDelete, + onEnter = _ref.onEnter, + onSelectionChange = _ref.onSelectionChange, + onChange = _ref.onChange, + onFocus = _ref.unstableOnFocus, + setFocusedElement = _ref.setFocusedElement, + instanceId = _ref.instanceId, + multilineTag = _ref.__unstableMultilineTag, + multilineRootTag = _ref.__unstableMultilineRootTag, + disableFormats = _ref.__unstableDisableFormats, + didAutomaticChange = _ref.__unstableDidAutomaticChange, + inputRule = _ref.__unstableInputRule, + markAutomaticChange = _ref.__unstableMarkAutomaticChange, + allowPrefixTransformations = _ref.__unstableAllowPrefixTransformations, + undo = _ref.__unstableUndo, + isCaretWithinFormattedText = _ref.__unstableIsCaretWithinFormattedText, + onEnterFormattedText = _ref.__unstableOnEnterFormattedText, + onExitFormattedText = _ref.__unstableOnExitFormattedText, + onCreateUndoLevel = _ref.__unstableOnCreateUndoLevel, + isSelected = _ref.__unstableIsSelected, + ref = _ref.forwardedRef, + remainingProps = Object(objectWithoutProperties["a" /* default */])(_ref, ["tagName", "value", "selectionStart", "selectionEnd", "children", "allowedFormats", "withoutInteractiveFormatting", "formatTypes", "style", "className", "placeholder", "disabled", "preserveWhiteSpace", "onPaste", "format", "onDelete", "onEnter", "onSelectionChange", "onChange", "unstableOnFocus", "setFocusedElement", "instanceId", "__unstableMultilineTag", "__unstableMultilineRootTag", "__unstableDisableFormats", "__unstableDidAutomaticChange", "__unstableInputRule", "__unstableMarkAutomaticChange", "__unstableAllowPrefixTransformations", "__unstableUndo", "__unstableIsCaretWithinFormattedText", "__unstableOnEnterFormattedText", "__unstableOnExitFormattedText", "__unstableOnCreateUndoLevel", "__unstableIsSelected", "forwardedRef"]); + + var _useState = Object(external_this_wp_element_["useState"])(), + _useState2 = Object(slicedToArray["a" /* default */])(_useState, 2), + _useState2$ = _useState2[0], + activeFormats = _useState2$ === void 0 ? [] : _useState2$, + setActiveFormats = _useState2[1]; // For backward compatibility, fall back to tagName if it's a string. + // tagName can now be a component for light blocks. + + + if (!multilineRootTag && typeof TagName === 'string') { + multilineRootTag = TagName; + } + + function getDoc() { + return ref.current.ownerDocument; + } + + function getWin() { + return getDoc().defaultView; + } + /** + * Converts the outside data structure to our internal representation. + * + * @param {*} string The outside value, data type depends on props. + * + * @return {Object} An internal rich-text value. + */ + + + function formatToValue(string) { + if (disableFormats) { + return { + text: string, + formats: Array(string.length), + replacements: Array(string.length) + }; + } + + if (format !== 'string') { + return string; + } + + var prepare = createPrepareEditableTree(remainingProps, 'format_value_functions'); + var result = create({ + html: string, + multilineTag: multilineTag, + multilineWrapperTags: multilineTag === 'li' ? ['ul', 'ol'] : undefined, + preserveWhiteSpace: preserveWhiteSpace + }); + result.formats = prepare(result); + return result; + } + /** + * 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} val The internal rich-text value. + * + * @return {Object} A new rich-text value. + */ + + + function removeEditorOnlyFormats(val) { + formatTypes.forEach(function (formatType) { + // Remove formats created by prepareEditableTree, because they are editor only. + if (formatType.__experimentalCreatePrepareEditableTree) { + val = removeFormat(val, formatType.name, 0, val.text.length); + } + }); + return val; + } + /** + * Converts the internal value to the external data format. + * + * @param {Object} val The internal rich-text value. + * + * @return {*} The external data format, data type depends on props. + */ + + + function valueToFormat(val) { + if (disableFormats) { + return val.text; + } + + val = removeEditorOnlyFormats(val); + + if (format !== 'string') { + return; + } + + return toHTMLString({ + value: val, + multilineTag: multilineTag, + preserveWhiteSpace: preserveWhiteSpace + }); + } // Internal values are updated synchronously, unlike props and state. + + + var _value = Object(external_this_wp_element_["useRef"])(value); + + var record = Object(external_this_wp_element_["useRef"])(Object(external_this_wp_element_["useMemo"])(function () { + var initialRecord = formatToValue(value); + initialRecord.start = selectionStart; + initialRecord.end = selectionEnd; + return initialRecord; + }, [])); + + function createRecord() { + var selection = getWin().getSelection(); + var range = selection.rangeCount > 0 ? selection.getRangeAt(0) : null; + return create({ + element: ref.current, + range: range, + multilineTag: multilineTag, + multilineWrapperTags: multilineTag === 'li' ? ['ul', 'ol'] : undefined, + __unstableIsEditableTree: true, + preserveWhiteSpace: preserveWhiteSpace + }); + } + + function applyRecord(newRecord) { + var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + domOnly = _ref2.domOnly; + + apply({ + value: newRecord, + current: ref.current, + multilineTag: multilineTag, + multilineWrapperTags: multilineTag === 'li' ? ['ul', 'ol'] : undefined, + prepareEditableTree: createPrepareEditableTree(remainingProps, 'format_prepare_functions'), + __unstableDomOnly: domOnly, + placeholder: placeholder + }); + } + /** + * Handles a paste event. + * + * Saves the pasted data as plain text in `pastedPlainText`. + * + * @param {ClipboardEvent} event The paste event. + */ + + + function handlePaste(event) { + if (!isSelected) { + event.preventDefault(); + return; + } + + 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_this_lodash_["isNil"])(items) ? [] : items; + files = Object(external_this_lodash_["isNil"])(files) ? [] : files; + 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); + + if (disableFormats) { + handleChange(insert(record.current, plainText)); + return; + } + + var transformed = formatTypes.reduce(function (accumlator, _ref3) { + var __unstablePasteRule = _ref3.__unstablePasteRule; + + // Only allow one transform. + if (__unstablePasteRule && accumlator === record.current) { + accumlator = __unstablePasteRule(record.current, { + html: html, + plainText: plainText + }); + } + + return accumlator; + }, record.current); + + if (transformed !== record.current) { + handleChange(transformed); + return; + } + + if (onPaste) { + files = Array.from(files); + Array.from(items).forEach(function (item) { + if (!item.getAsFile) { + return; + } + + var file = item.getAsFile(); + + if (!file) { + return; + } + + var name = file.name, + type = file.type, + size = file.size; + + if (!Object(external_this_lodash_["find"])(files, { + name: name, + type: type, + size: size + })) { + files.push(file); + } + }); + onPaste({ + value: removeEditorOnlyFormats(record.current), + onChange: handleChange, + html: html, + plainText: plainText, + files: files, + activeFormats: activeFormats + }); + } + } + /** + * Handles delete on keydown: + * - outdent list items, + * - delete content if everything is selected, + * - trigger the onDelete prop when selection is uncollapsed and at an edge. + * + * @param {WPSyntheticEvent} event A synthetic keyboard event. + */ + + + function handleDelete(event) { + var keyCode = event.keyCode; + + if (keyCode !== external_this_wp_keycodes_["DELETE"] && keyCode !== external_this_wp_keycodes_["BACKSPACE"] && keyCode !== external_this_wp_keycodes_["ESCAPE"]) { + return; + } + + if (didAutomaticChange) { + event.preventDefault(); + undo(); + return; + } + + if (keyCode === external_this_wp_keycodes_["ESCAPE"]) { + return; + } + + var currentValue = createRecord(); + var start = currentValue.start, + end = currentValue.end, + text = currentValue.text; + var isReverse = keyCode === external_this_wp_keycodes_["BACKSPACE"]; // Always handle full content deletion ourselves. + + if (start === 0 && end !== 0 && end === text.length) { + handleChange(remove_remove(currentValue)); + event.preventDefault(); + return; + } + + if (multilineTag) { + var newValue; // Check to see if we should remove the first item if empty. + + if (isReverse && currentValue.start === 0 && currentValue.end === 0 && isEmptyLine(currentValue)) { + newValue = removeLineSeparator(currentValue, !isReverse); + } else { + newValue = removeLineSeparator(currentValue, isReverse); + } + + if (newValue) { + handleChange(newValue); + event.preventDefault(); + return; + } + } // Only process delete if the key press occurs at an uncollapsed edge. + + + if (!onDelete || !isCollapsed(currentValue) || activeFormats.length || isReverse && start !== 0 || !isReverse && end !== text.length) { + return; + } + + onDelete({ + isReverse: isReverse, + value: currentValue + }); + event.preventDefault(); + } + /** + * Triggers the `onEnter` prop on keydown. + * + * @param {WPSyntheticEvent} event A synthetic keyboard event. + */ + + + function handleEnter(event) { + if (event.keyCode !== external_this_wp_keycodes_["ENTER"]) { + return; + } + + event.preventDefault(); + + if (!onEnter) { + return; + } + + onEnter({ + value: removeEditorOnlyFormats(createRecord()), + onChange: handleChange, + shiftKey: event.shiftKey + }); + } + /** + * Indents list items on space keydown. + * + * @param {WPSyntheticEvent} event A synthetic keyboard event. + */ + + + function handleSpace(event) { + var keyCode = event.keyCode, + shiftKey = event.shiftKey, + altKey = event.altKey, + metaKey = event.metaKey, + ctrlKey = event.ctrlKey; + + if ( // Only override when no modifiers are pressed. + shiftKey || altKey || metaKey || ctrlKey || keyCode !== external_this_wp_keycodes_["SPACE"] || multilineTag !== 'li') { + return; + } + + var currentValue = createRecord(); + + if (!isCollapsed(currentValue)) { + return; + } + + var text = currentValue.text, + start = currentValue.start; + var characterBefore = text[start - 1]; // The caret must be at the start of a line. + + if (characterBefore && characterBefore !== LINE_SEPARATOR) { + return; + } + + handleChange(indentListItems(currentValue, { + type: multilineRootTag + })); + event.preventDefault(); + } + /** + * Handles horizontal keyboard navigation when no modifiers are pressed. The + * navigation is handled separately to move correctly around format + * boundaries. + * + * @param {WPSyntheticEvent} event A synthetic keyboard event. + */ + + + function handleHorizontalNavigation(event) { + var keyCode = event.keyCode, + shiftKey = event.shiftKey, + altKey = event.altKey, + metaKey = event.metaKey, + ctrlKey = event.ctrlKey; + + if ( // Only override left and right keys without modifiers pressed. + shiftKey || altKey || metaKey || ctrlKey || keyCode !== external_this_wp_keycodes_["LEFT"] && keyCode !== external_this_wp_keycodes_["RIGHT"]) { + return; + } + + var _record$current = record.current, + text = _record$current.text, + formats = _record$current.formats, + start = _record$current.start, + end = _record$current.end, + _record$current$activ = _record$current.activeFormats, + currentActiveFormats = _record$current$activ === void 0 ? [] : _record$current$activ; + var collapsed = isCollapsed(record.current); // To do: ideally, we should look at visual position instead. + + var _getWin$getComputedSt = getWin().getComputedStyle(ref.current), + direction = _getWin$getComputedSt.direction; + + var reverseKey = direction === 'rtl' ? external_this_wp_keycodes_["RIGHT"] : external_this_wp_keycodes_["LEFT"]; + var isReverse = event.keyCode === reverseKey; // If the selection is collapsed and at the very start, do nothing if + // navigating backward. + // If the selection is collapsed and at the very end, do nothing if + // navigating forward. + + if (collapsed && currentActiveFormats.length === 0) { + if (start === 0 && isReverse) { + return; + } + + if (end === text.length && !isReverse) { + return; + } + } // If the selection is not collapsed, let the browser handle collapsing + // the selection for now. Later we could expand this logic to set + // boundary positions if needed. + + + if (!collapsed) { + return; + } // In all other cases, prevent default behaviour. + + + event.preventDefault(); + var formatsBefore = formats[start - 1] || EMPTY_ACTIVE_FORMATS; + var formatsAfter = formats[start] || EMPTY_ACTIVE_FORMATS; + var newActiveFormatsLength = currentActiveFormats.length; + var source = formatsAfter; + + if (formatsBefore.length > formatsAfter.length) { + source = formatsBefore; + } // If the amount of formats before the caret and after the caret is + // different, the caret is at a format boundary. + + + if (formatsBefore.length < formatsAfter.length) { + if (!isReverse && currentActiveFormats.length < formatsAfter.length) { + newActiveFormatsLength++; + } + + if (isReverse && currentActiveFormats.length > formatsBefore.length) { + newActiveFormatsLength--; + } + } else if (formatsBefore.length > formatsAfter.length) { + if (!isReverse && currentActiveFormats.length > formatsAfter.length) { + newActiveFormatsLength--; + } + + if (isReverse && currentActiveFormats.length < formatsBefore.length) { + newActiveFormatsLength++; + } + } + + if (newActiveFormatsLength !== currentActiveFormats.length) { + var _newActiveFormats = source.slice(0, newActiveFormatsLength); + + var _newValue = component_objectSpread({}, record.current, { + activeFormats: _newActiveFormats + }); + + record.current = _newValue; + applyRecord(_newValue); + setActiveFormats(_newActiveFormats); + return; + } + + var newPos = start + (isReverse ? -1 : 1); + var newActiveFormats = isReverse ? formatsBefore : formatsAfter; + + var newValue = component_objectSpread({}, record.current, { + start: newPos, + end: newPos, + activeFormats: newActiveFormats + }); + + record.current = newValue; + applyRecord(newValue); + onSelectionChange(newPos, newPos); + setActiveFormats(newActiveFormats); + } + + function handleKeyDown(event) { + if (event.defaultPrevented) { + return; + } + + handleDelete(event); + handleEnter(event); + handleSpace(event); + handleHorizontalNavigation(event); + } + + var lastHistoryValue = Object(external_this_wp_element_["useRef"])(value); + + function createUndoLevel() { + // If the content is the same, no level needs to be created. + if (lastHistoryValue.current === _value.current) { + return; + } + + onCreateUndoLevel(); + lastHistoryValue.current = _value.current; + } + + var isComposing = Object(external_this_wp_element_["useRef"])(false); + var timeout = Object(external_this_wp_element_["useRef"])(); + /** + * Handle input on the next selection change event. + * + * @param {WPSyntheticEvent} event Synthetic input event. + */ + + function handleInput(event) { + // Do not trigger a change if characters are being composed. Browsers + // will usually emit a final `input` event when the characters are + // composed. + // As of December 2019, Safari doesn't support nativeEvent.isComposing. + if (isComposing.current) { + return; + } + + var inputType; + + if (event) { + inputType = event.inputType; + } + + if (!inputType && event && event.nativeEvent) { + inputType = event.nativeEvent.inputType; + } // The browser formatted something or tried to insert HTML. + // Overwrite it. It will be handled later by the format library if + // needed. + + + if (inputType && (inputType.indexOf('format') === 0 || INSERTION_INPUT_TYPES_TO_IGNORE.has(inputType))) { + applyRecord(record.current); + return; + } + + var currentValue = createRecord(); + var _record$current2 = record.current, + start = _record$current2.start, + _record$current2$acti = _record$current2.activeFormats, + oldActiveFormats = _record$current2$acti === void 0 ? [] : _record$current2$acti; // Update the formats between the last and new caret position. + + var change = updateFormats({ + value: currentValue, + start: start, + end: currentValue.start, + formats: oldActiveFormats + }); + handleChange(change, { + withoutHistory: true + }); // Create an undo level when input stops for over a second. + + getWin().clearTimeout(timeout.current); + timeout.current = getWin().setTimeout(createUndoLevel, 1000); // Only run input rules when inserting text. + + if (inputType !== 'insertText') { + return; + } + + if (allowPrefixTransformations && inputRule) { + inputRule(change, valueToFormat); + } + + var transformed = formatTypes.reduce(function (accumlator, _ref4) { + var __unstableInputRule = _ref4.__unstableInputRule; + + if (__unstableInputRule) { + accumlator = __unstableInputRule(accumlator); + } + + return accumlator; + }, change); + + if (transformed !== change) { + createUndoLevel(); + handleChange(component_objectSpread({}, transformed, { + activeFormats: oldActiveFormats + })); + markAutomaticChange(); + } + } + + function handleCompositionStart() { + isComposing.current = true; // Do not update the selection when characters are being composed as + // this rerenders the component and might distroy internal browser + // editing state. + + getDoc().removeEventListener('selectionchange', handleSelectionChange); + } + + function handleCompositionEnd() { + isComposing.current = false; // Ensure the value is up-to-date for browsers that don't emit a final + // input event after composition. + + handleInput({ + inputType: 'insertText' + }); // Tracking selection changes can be resumed. + + getDoc().addEventListener('selectionchange', handleSelectionChange); + } + + var didMount = Object(external_this_wp_element_["useRef"])(false); + /** + * Syncs the selection to local state. A callback for the `selectionchange` + * native events, `keyup`, `mouseup` and `touchend` synthetic events, and + * animation frames after the `focus` event. + * + * @param {Event|WPSyntheticEvent|DOMHighResTimeStamp} event + */ + + function handleSelectionChange(event) { + if (!ref.current) { + return; + } + + if (document.activeElement !== ref.current) { + return; + } + + if (event.type !== 'selectionchange' && !isSelected) { + return; + } + + if (disabled) { + return; + } // In case of a keyboard event, ignore selection changes during + // composition. + + + if (isComposing.current) { + return; + } + + var _createRecord = createRecord(), + start = _createRecord.start, + end = _createRecord.end, + text = _createRecord.text; + + var oldRecord = record.current; // Fallback mechanism for IE11, which doesn't support the input event. + // Any input results in a selection change. + + if (text !== oldRecord.text) { + handleInput(); + return; + } + + if (start === oldRecord.start && end === oldRecord.end) { + // Sometimes the browser may set the selection on the placeholder + // element, in which case the caret is not visible. We need to set + // the caret before the placeholder if that's the case. + if (oldRecord.text.length === 0 && start === 0) { + fixPlaceholderSelection(getWin()); + } + + return; + } + + var newValue = component_objectSpread({}, oldRecord, { + start: start, + end: end, + // Allow `getActiveFormats` to get new `activeFormats`. + activeFormats: undefined + }); + + var newActiveFormats = getActiveFormats(newValue, EMPTY_ACTIVE_FORMATS); // Update the value with the new active formats. + + newValue.activeFormats = newActiveFormats; + + if (!isCaretWithinFormattedText && newActiveFormats.length) { + onEnterFormattedText(); + } else if (isCaretWithinFormattedText && !newActiveFormats.length) { + onExitFormattedText(); + } // It is important that the internal value is updated first, + // otherwise the value will be wrong on render! + + + record.current = newValue; + applyRecord(newValue, { + domOnly: true + }); + onSelectionChange(start, end); + setActiveFormats(newActiveFormats); + } + /** + * Sync the value to global state. The node tree and selection will also be + * updated if differences are found. + * + * @param {Object} newRecord The record to sync and apply. + * @param {Object} $2 Named options. + * @param {boolean} $2.withoutHistory If true, no undo level will be + * created. + */ + + + function handleChange(newRecord) { + var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + withoutHistory = _ref5.withoutHistory; + + if (disableFormats) { + newRecord.formats = Array(newRecord.text.length); + newRecord.replacements = Array(newRecord.text.length); + } + + applyRecord(newRecord); + var start = newRecord.start, + end = newRecord.end, + _newRecord$activeForm = newRecord.activeFormats, + newActiveFormats = _newRecord$activeForm === void 0 ? [] : _newRecord$activeForm; + var changeHandlers = Object(external_this_lodash_["pickBy"])(remainingProps, function (v, key) { + return key.startsWith('format_on_change_functions_'); + }); + Object.values(changeHandlers).forEach(function (changeHandler) { + changeHandler(newRecord.formats, newRecord.text); + }); + _value.current = valueToFormat(newRecord); + record.current = newRecord; // Selection must be updated first, so it is recorded in history when + // the content change happens. + + onSelectionChange(start, end); + onChange(_value.current); + setActiveFormats(newActiveFormats); + + if (!withoutHistory) { + createUndoLevel(); + } + } + /** + * Select object when they are clicked. The browser will not set any + * selection when clicking e.g. an image. + * + * @param {WPSyntheticEvent} event Synthetic mousedown or touchstart event. + */ + + + function handlePointerDown(event) { + var target = event.target; // If the child element has no text content, it must be an object. + + if (target === ref.current || target.textContent) { + return; + } + + var parentNode = target.parentNode; + var index = Array.from(parentNode.childNodes).indexOf(target); + var range = getDoc().createRange(); + var selection = getWin().getSelection(); + range.setStart(target.parentNode, index); + range.setEnd(target.parentNode, index + 1); + selection.removeAllRanges(); + selection.addRange(range); + } + + var rafId = Object(external_this_wp_element_["useRef"])(); + /** + * 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 + */ + + function handleFocus() { + if (onFocus) { + onFocus(); + } + + if (!isSelected) { + // We know for certain that on focus, the old selection is invalid. + // It will be recalculated on the next mouseup, keyup, or touchend + // event. + var index = undefined; + record.current = component_objectSpread({}, record.current, { + start: index, + end: index, + activeFormats: EMPTY_ACTIVE_FORMATS + }); + onSelectionChange(index, index); + setActiveFormats(EMPTY_ACTIVE_FORMATS); + } else { + onSelectionChange(record.current.start, record.current.end); + setActiveFormats(getActiveFormats(component_objectSpread({}, record.current, { + activeFormats: undefined + }), EMPTY_ACTIVE_FORMATS)); + } // Update selection as soon as possible, which is at the next animation + // frame. The event listener for selection changes may be added too late + // at this point, but this focus event is still too early to calculate + // the selection. + + + rafId.current = getWin().requestAnimationFrame(handleSelectionChange); + getDoc().addEventListener('selectionchange', handleSelectionChange); + + if (setFocusedElement) { + external_this_wp_deprecated_default()('wp.blockEditor.RichText setFocusedElement prop', { + alternative: 'selection state from the block editor store.' + }); + setFocusedElement(instanceId); + } + } + + function handleBlur() { + getDoc().removeEventListener('selectionchange', handleSelectionChange); + } + + function applyFromProps() { + _value.current = value; + record.current = formatToValue(value); + record.current.start = selectionStart; + record.current.end = selectionEnd; + applyRecord(record.current); + } + + Object(external_this_wp_element_["useEffect"])(function () { + if (didMount.current) { + applyFromProps(); + } + }, [TagName, placeholder]); + Object(external_this_wp_element_["useEffect"])(function () { + if (didMount.current && value !== _value.current) { + applyFromProps(); + } + }, [value]); + Object(external_this_wp_element_["useEffect"])(function () { + if (!didMount.current) { + return; + } + + if (isSelected && (selectionStart !== record.current.start || selectionEnd !== record.current.end)) { + applyFromProps(); + } else { + record.current = component_objectSpread({}, record.current, { + start: selectionStart, + end: selectionEnd + }); + } + }, [selectionStart, selectionEnd, isSelected]); + var prefix = 'format_prepare_props_'; + + var predicate = function predicate(v, key) { + return key.startsWith(prefix); + }; + + var prepareProps = Object(external_this_lodash_["pickBy"])(remainingProps, predicate); + Object(external_this_wp_element_["useEffect"])(function () { + if (didMount.current) { + applyFromProps(); + } + }, Object.values(prepareProps)); + Object(external_this_wp_element_["useLayoutEffect"])(function () { + applyRecord(record.current, { + domOnly: true + }); + didMount.current = true; + return function () { + getDoc().removeEventListener('selectionchange', handleSelectionChange); + getWin().cancelAnimationFrame(rafId.current); + getWin().clearTimeout(timeout.current); + }; + }, []); + + function focus() { + ref.current.focus(); + applyRecord(record.current); + } + + var ariaProps = Object(external_this_lodash_["pickBy"])(remainingProps, function (v, key) { + return Object(external_this_lodash_["startsWith"])(key, 'aria-'); + }); + + var editableProps = component_objectSpread({ + // Overridable props. + role: 'textbox', + 'aria-multiline': true, + 'aria-label': placeholder + }, ariaProps, { + ref: ref, + style: style ? component_objectSpread({}, style, { + whiteSpace: whiteSpace + }) : defaultStyle, + className: classnames_default()('rich-text', className), + onPaste: handlePaste, + onInput: handleInput, + onCompositionStart: handleCompositionStart, + onCompositionEnd: handleCompositionEnd, + onKeyDown: handleKeyDown, + onFocus: handleFocus, + onBlur: handleBlur, + onMouseDown: handlePointerDown, + onTouchStart: handlePointerDown, + // Selection updates must be done at these events as they + // happen before the `selectionchange` event. In some cases, + // the `selectionchange` event may not even fire, for + // example when the window receives focus again on click. + onKeyUp: handleSelectionChange, + onMouseUp: handleSelectionChange, + onTouchEnd: handleSelectionChange, + // Do not set the attribute if disabled. + contentEditable: disabled ? undefined : true, + suppressContentEditableWarning: !disabled + }); + + useBoundaryStyle({ + ref: ref, + activeFormats: activeFormats + }); + useInlineWarning({ + ref: ref + }); + return Object(external_this_wp_element_["createElement"])(external_this_wp_element_["Fragment"], null, isSelected && Object(external_this_wp_element_["createElement"])(FormatEdit, { + allowedFormats: allowedFormats, + withoutInteractiveFormatting: withoutInteractiveFormatting, + value: record.current, + onChange: handleChange, + onFocus: focus, + formatTypes: formatTypes + }), children && children({ + isSelected: isSelected, + value: record.current, + onChange: handleChange, + onFocus: focus, + editableProps: editableProps, + editableTagName: TagName + }), !children && Object(external_this_wp_element_["createElement"])(TagName, editableProps)); +} + +var RichTextWrapper = withFormatTypes(component_RichText); +/** + * Renders a rich content input, providing users with the option to format the + * content. + */ + +/* harmony default export */ var component = (Object(external_this_wp_element_["forwardRef"])(function (props, ref) { + return Object(external_this_wp_element_["createElement"])(RichTextWrapper, Object(esm_extends["a" /* default */])({}, props, { + forwardedRef: ref + })); +})); + +// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/index.js +/** + * Internal dependencies + */ + + + + + + + + + + + + + + + + + + + + @@ -3562,171 +5293,58 @@ /***/ }), -/***/ 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; -}; - +/***/ 5: +/***/ (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; +} /***/ }), -/***/ 5: -/***/ (function(module, exports) { - -(function() { module.exports = this["wp"]["data"]; }()); +/***/ 8: +/***/ (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); +} /***/ }), -/***/ 6: -/***/ (function(module, exports) { - -(function() { module.exports = this["wp"]["compose"]; }()); - -/***/ }), - -/***/ 69: +/***/ 89: /***/ (function(module, exports) { (function() { module.exports = this["wp"]["escapeHtml"]; }()); -/***/ }), - -/***/ 7: -/***/ (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; -} - /***/ }) /******/ }); \ No newline at end of file