2018-12-14 05:41:57 +01:00
this [ "wp" ] = this [ "wp" ] || { } ; this [ "wp" ] [ "richText" ] =
/******/ ( function ( modules ) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = { } ;
/******/
/******/ // The require function
/******/ function _ _webpack _require _ _ ( moduleId ) {
/******/
/******/ // Check if module is in cache
/******/ if ( installedModules [ moduleId ] ) {
/******/ return installedModules [ moduleId ] . exports ;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules [ moduleId ] = {
/******/ i : moduleId ,
/******/ l : false ,
/******/ exports : { }
/******/ } ;
/******/
/******/ // Execute the module function
/******/ modules [ moduleId ] . call ( module . exports , module , module . exports , _ _webpack _require _ _ ) ;
/******/
/******/ // Flag the module as loaded
/******/ module . l = true ;
/******/
/******/ // Return the exports of the module
/******/ return module . exports ;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ _ _webpack _require _ _ . m = modules ;
/******/
/******/ // expose the module cache
/******/ _ _webpack _require _ _ . c = installedModules ;
/******/
/******/ // define getter function for harmony exports
/******/ _ _webpack _require _ _ . d = function ( exports , name , getter ) {
/******/ if ( ! _ _webpack _require _ _ . o ( exports , name ) ) {
/******/ Object . defineProperty ( exports , name , { enumerable : true , get : getter } ) ;
/******/ }
/******/ } ;
/******/
/******/ // define __esModule on exports
/******/ _ _webpack _require _ _ . r = function ( exports ) {
/******/ if ( typeof Symbol !== 'undefined' && Symbol . toStringTag ) {
/******/ Object . defineProperty ( exports , Symbol . toStringTag , { value : 'Module' } ) ;
/******/ }
/******/ Object . defineProperty ( exports , '__esModule' , { value : true } ) ;
/******/ } ;
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ _ _webpack _require _ _ . t = function ( value , mode ) {
/******/ if ( mode & 1 ) value = _ _webpack _require _ _ ( value ) ;
/******/ if ( mode & 8 ) return value ;
/******/ if ( ( mode & 4 ) && typeof value === 'object' && value && value . _ _esModule ) return value ;
/******/ var ns = Object . create ( null ) ;
/******/ _ _webpack _require _ _ . r ( ns ) ;
/******/ Object . defineProperty ( ns , 'default' , { enumerable : true , value : value } ) ;
/******/ if ( mode & 2 && typeof value != 'string' ) for ( var key in value ) _ _webpack _require _ _ . d ( ns , key , function ( key ) { return value [ key ] ; } . bind ( null , key ) ) ;
/******/ return ns ;
/******/ } ;
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ _ _webpack _require _ _ . n = function ( module ) {
/******/ var getter = module && module . _ _esModule ?
/******/ function getDefault ( ) { return module [ 'default' ] ; } :
/******/ function getModuleExports ( ) { return module ; } ;
/******/ _ _webpack _require _ _ . d ( getter , 'a' , getter ) ;
/******/ return getter ;
/******/ } ;
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ _ _webpack _require _ _ . o = function ( object , property ) { return Object . prototype . hasOwnProperty . call ( object , property ) ; } ;
/******/
/******/ // __webpack_public_path__
/******/ _ _webpack _require _ _ . p = "" ;
/******/
/******/
/******/ // Load entry module and return exports
2020-10-20 15:36:16 +02:00
/******/ return _ _webpack _require _ _ ( _ _webpack _require _ _ . s = 458 ) ;
2018-12-14 05:41:57 +01:00
/******/ } )
/************************************************************************/
/******/ ( {
2018-12-18 04:14:52 +01:00
/***/ 0 :
/***/ ( function ( module , exports ) {
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
( function ( ) { module . exports = this [ "wp" ] [ "element" ] ; } ( ) ) ;
2018-12-14 05:41:57 +01:00
/***/ } ) ,
2020-10-13 15:10:30 +02:00
/***/ 107 :
/***/ ( function ( module , exports ) {
2018-12-14 05:41:57 +01:00
2020-10-13 15:10:30 +02:00
( function ( ) { module . exports = this [ "wp" ] [ "escapeHtml" ] ; } ( ) ) ;
2018-12-14 05:41:57 +01:00
2019-09-19 17:19:18 +02:00
/***/ } ) ,
2020-10-13 15:10:30 +02:00
/***/ 12 :
2019-09-19 17:19:18 +02:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
2020-06-29 13:50:29 +02:00
// EXPORTS
_ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return /* binding */ _slicedToArray ; } ) ;
2020-06-26 15:33:47 +02:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js
var arrayWithHoles = _ _webpack _require _ _ ( 38 ) ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
// 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 ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
try {
for ( var _i = arr [ Symbol . iterator ] ( ) , _s ; ! ( _n = ( _s = _i . next ( ) ) . done ) ; _n = true ) {
_arr . push ( _s . value ) ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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 ;
}
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
return _arr ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js
2020-10-13 15:10:30 +02:00
var unsupportedIterableToArray = _ _webpack _require _ _ ( 30 ) ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js
var nonIterableRest = _ _webpack _require _ _ ( 39 ) ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
function _slicedToArray ( arr , i ) {
return Object ( arrayWithHoles [ "a" /* default */ ] ) ( arr ) || _iterableToArrayLimit ( arr , i ) || Object ( unsupportedIterableToArray [ "a" /* default */ ] ) ( arr , i ) || Object ( nonIterableRest [ "a" /* default */ ] ) ( ) ;
2019-09-19 17:19:18 +02:00
}
/***/ } ) ,
2020-10-20 15:36:16 +02:00
/***/ 17 :
2018-12-17 05:52:00 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2018-12-14 05:41:57 +01:00
"use strict" ;
2020-06-29 13:50:29 +02:00
// EXPORTS
_ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return /* binding */ _toConsumableArray ; } ) ;
2020-03-24 00:40:19 +01:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js
2020-10-13 15:10:30 +02:00
var arrayLikeToArray = _ _webpack _require _ _ ( 27 ) ;
2020-03-24 00:40:19 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js
2018-12-14 05:41:57 +01:00
2020-03-24 00:40:19 +01:00
function _arrayWithoutHoles ( arr ) {
if ( Array . isArray ( arr ) ) return Object ( arrayLikeToArray [ "a" /* default */ ] ) ( arr ) ;
2018-12-18 04:14:52 +01:00
}
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/iterableToArray.js
2020-10-13 15:10:30 +02:00
var iterableToArray = _ _webpack _require _ _ ( 37 ) ;
2020-03-24 00:40:19 +01:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js
2020-10-13 15:10:30 +02:00
var unsupportedIterableToArray = _ _webpack _require _ _ ( 30 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js
2018-12-14 05:41:57 +01:00
function _nonIterableSpread ( ) {
2020-03-24 00:40:19 +01:00
throw new TypeError ( "Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method." ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js
2018-12-14 05:41:57 +01:00
2020-03-24 00:40:19 +01:00
2018-12-18 04:14:52 +01:00
function _toConsumableArray ( arr ) {
2020-03-24 00:40:19 +01:00
return _arrayWithoutHoles ( arr ) || Object ( iterableToArray [ "a" /* default */ ] ) ( arr ) || Object ( unsupportedIterableToArray [ "a" /* default */ ] ) ( arr ) || _nonIterableSpread ( ) ;
2018-12-14 05:41:57 +01:00
}
/***/ } ) ,
2020-10-20 15:36:16 +02:00
/***/ 18 :
2018-12-18 04:14:52 +01:00
/***/ ( function ( module , exports ) {
2018-12-14 05:41:57 +01:00
2020-10-13 15:10:30 +02:00
( function ( ) { module . exports = this [ "wp" ] [ "keycodes" ] ; } ( ) ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/***/ } ) ,
2018-12-14 05:41:57 +01:00
2020-10-13 15:10:30 +02:00
/***/ 2 :
2020-02-06 22:03:31 +01:00
/***/ ( function ( module , exports ) {
2018-12-14 05:41:57 +01:00
2020-10-13 15:10:30 +02:00
( function ( ) { module . exports = this [ "lodash" ] ; } ( ) ) ;
2018-12-14 05:41:57 +01:00
/***/ } ) ,
2020-10-13 15:10:30 +02:00
/***/ 27 :
2020-03-24 00:40:19 +01:00
/***/ ( 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 ;
}
/***/ } ) ,
2020-10-13 15:10:30 +02:00
/***/ 30 :
2020-03-24 00:40:19 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return _unsupportedIterableToArray ; } ) ;
2020-10-13 15:10:30 +02:00
/* harmony import */ var _arrayLikeToArray _ _WEBPACK _IMPORTED _MODULE _0 _ _ = _ _webpack _require _ _ ( 27 ) ;
2020-03-24 00:40:19 +01:00
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 ;
2020-06-26 15:33:47 +02:00
if ( n === "Map" || n === "Set" ) return Array . from ( o ) ;
2020-03-24 00:40:19 +01:00
if ( n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/ . test ( n ) ) return Object ( _arrayLikeToArray _ _WEBPACK _IMPORTED _MODULE _0 _ _ [ /* default */ "a" ] ) ( o , minLen ) ;
}
/***/ } ) ,
2020-10-20 15:36:16 +02:00
/***/ 36 :
2020-10-13 15:10:30 +02:00
/***/ ( function ( module , exports ) {
( function ( ) { module . exports = this [ "wp" ] [ "deprecated" ] ; } ( ) ) ;
/***/ } ) ,
/***/ 37 :
2019-09-19 17:19:18 +02:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
2020-06-26 15:33:47 +02:00
/* 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 ) ;
}
2020-02-06 22:03:31 +01:00
2020-06-26 15:33:47 +02:00
/***/ } ) ,
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
/***/ 38 :
2020-03-16 23:07:16 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
2020-06-26 15:33:47 +02:00
/* harmony export (binding) */ _ _webpack _require _ _ . d ( _ _webpack _exports _ _ , "a" , function ( ) { return _arrayWithHoles ; } ) ;
function _arrayWithHoles ( arr ) {
if ( Array . isArray ( arr ) ) return arr ;
2020-03-16 23:07:16 +01:00
}
/***/ } ) ,
2020-06-26 15:33:47 +02:00
/***/ 39 :
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2020-01-08 12:57:23 +01:00
2020-06-26 15:33:47 +02:00
"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." ) ;
}
2020-01-08 12:57:23 +01:00
/***/ } ) ,
2020-03-24 00:40:19 +01:00
/***/ 4 :
/***/ ( function ( module , exports ) {
( function ( ) { module . exports = this [ "wp" ] [ "data" ] ; } ( ) ) ;
/***/ } ) ,
/***/ 40 :
2019-03-07 10:09:59 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2020-06-26 15:33:47 +02:00
"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 ) ;
}
/***/ } ) ,
2020-10-20 15:36:16 +02:00
/***/ 42 :
2020-06-26 15:33:47 +02:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2019-03-07 10:09:59 +01:00
"use strict" ;
2020-01-22 23:06:21 +01:00
var LEAF _KEY , hasWeakMap ;
2019-03-07 10:09:59 +01:00
/ * *
2020-01-22 23:06:21 +01:00
* Arbitrary value used as key for referencing cache object in WeakMap tree .
*
* @ type { Object }
2019-03-07 10:09:59 +01:00
* /
2020-01-22 23:06:21 +01:00
LEAF _KEY = { } ;
2019-03-07 10:09:59 +01:00
/ * *
2020-01-22 23:06:21 +01:00
* Whether environment supports WeakMap .
*
* @ type { boolean }
2019-03-07 10:09:59 +01:00
* /
2020-01-22 23:06:21 +01:00
hasWeakMap = typeof WeakMap !== 'undefined' ;
2019-03-07 10:09:59 +01:00
/ * *
2020-01-22 23:06:21 +01:00
* Returns the first argument as the sole entry in an array .
2019-03-07 10:09:59 +01:00
*
2020-01-22 23:06:21 +01:00
* @ param { * } value Value to return .
2019-03-07 10:09:59 +01:00
*
2020-01-22 23:06:21 +01:00
* @ return { Array } Value returned as entry in array .
2019-03-07 10:09:59 +01:00
* /
2020-01-22 23:06:21 +01:00
function arrayOf ( value ) {
return [ value ] ;
2019-03-07 10:09:59 +01:00
}
/ * *
2020-01-22 23:06:21 +01:00
* Returns true if the value passed is object - like , or false otherwise . A value
* is object - like if it can support property assignment , e . g . object or array .
2019-03-07 10:09:59 +01:00
*
2020-01-22 23:06:21 +01:00
* @ param { * } value Value to test .
2019-03-07 10:09:59 +01:00
*
2020-01-22 23:06:21 +01:00
* @ return { boolean } Whether value is object - like .
2019-03-07 10:09:59 +01:00
* /
2020-01-22 23:06:21 +01:00
function isObjectLike ( value ) {
return ! ! value && 'object' === typeof value ;
}
2019-03-07 10:09:59 +01:00
/ * *
2020-01-22 23:06:21 +01:00
* Creates and returns a new cache object .
2019-03-07 10:09:59 +01:00
*
2020-01-22 23:06:21 +01:00
* @ return { Object } Cache object .
2019-03-07 10:09:59 +01:00
* /
2020-01-22 23:06:21 +01:00
function createCache ( ) {
var cache = {
clear : function ( ) {
cache . head = null ;
} ,
} ;
2019-03-07 10:09:59 +01:00
2020-01-22 23:06:21 +01:00
return cache ;
2019-03-07 10:09:59 +01:00
}
/ * *
2020-01-22 23:06:21 +01:00
* Returns true if entries within the two arrays are strictly equal by
* reference from a starting index .
2019-03-07 10:09:59 +01:00
*
2020-01-22 23:06:21 +01:00
* @ param { Array } a First array .
* @ param { Array } b Second array .
* @ param { number } fromIndex Index from which to start comparison .
*
* @ return { boolean } Whether arrays are shallowly equal .
2019-03-07 10:09:59 +01:00
* /
2020-01-22 23:06:21 +01:00
function isShallowEqual ( a , b , fromIndex ) {
var i ;
2019-03-07 10:09:59 +01:00
2020-01-22 23:06:21 +01:00
if ( a . length !== b . length ) {
return false ;
}
2019-03-07 10:09:59 +01:00
2020-01-22 23:06:21 +01:00
for ( i = fromIndex ; i < a . length ; i ++ ) {
if ( a [ i ] !== b [ i ] ) {
return false ;
}
}
2019-03-07 10:09:59 +01:00
2020-01-22 23:06:21 +01:00
return true ;
2019-03-07 10:09:59 +01:00
}
/ * *
2020-01-22 23:06:21 +01:00
* Returns a memoized selector function . The getDependants function argument is
* called before the memoized selector and is expected to return an immutable
* reference or array of references on which the selector depends for computing
* its own return value . The memoize cache is preserved only as long as those
* dependant references remain the same . If getDependants returns a different
* reference ( s ) , the cache is cleared and the selector value regenerated .
2019-03-07 10:09:59 +01:00
*
2020-01-22 23:06:21 +01:00
* @ param { Function } selector Selector function .
* @ param { Function } getDependants Dependant getter returning an immutable
* reference or array of reference used in
* cache bust consideration .
2019-03-07 10:09:59 +01:00
*
2020-01-22 23:06:21 +01:00
* @ return { Function } Memoized selector .
2019-03-07 10:09:59 +01:00
* /
2020-01-22 23:06:21 +01:00
/* harmony default export */ _ _webpack _exports _ _ [ "a" ] = ( function ( selector , getDependants ) {
var rootCache , getCache ;
2019-03-07 10:09:59 +01:00
2020-01-22 23:06:21 +01:00
// Use object source as dependant if getter not provided
if ( ! getDependants ) {
getDependants = arrayOf ;
}
/ * *
* Returns the root cache . If WeakMap is supported , this is assigned to the
* root WeakMap cache set , otherwise it is a shared instance of the default
* cache object .
*
* @ return { ( WeakMap | Object ) } Root cache object .
* /
function getRootCache ( ) {
return rootCache ;
}
/ * *
* Returns the cache for a given dependants array . When possible , a WeakMap
* will be used to create a unique cache for each set of dependants . This
* is feasible due to the nature of WeakMap in allowing garbage collection
* to occur on entries where the key object is no longer referenced . Since
* WeakMap requires the key to be an object , this is only possible when the
* dependant is object - like . The root cache is created as a hierarchy where
* each top - level key is the first entry in a dependants set , the value a
* WeakMap where each key is the next dependant , and so on . This continues
* so long as the dependants are object - like . If no dependants are object -
* like , then the cache is shared across all invocations .
*
* @ see isObjectLike
*
* @ param { Array } dependants Selector dependants .
*
* @ return { Object } Cache object .
* /
function getWeakMapCache ( dependants ) {
var caches = rootCache ,
isUniqueByDependants = true ,
i , dependant , map , cache ;
for ( i = 0 ; i < dependants . length ; i ++ ) {
dependant = dependants [ i ] ;
// Can only compose WeakMap from object-like key.
if ( ! isObjectLike ( dependant ) ) {
isUniqueByDependants = false ;
break ;
}
// Does current segment of cache already have a WeakMap?
if ( caches . has ( dependant ) ) {
// Traverse into nested WeakMap.
caches = caches . get ( dependant ) ;
} else {
// Create, set, and traverse into a new one.
map = new WeakMap ( ) ;
caches . set ( dependant , map ) ;
caches = map ;
}
}
// We use an arbitrary (but consistent) object as key for the last item
// in the WeakMap to serve as our running cache.
if ( ! caches . has ( LEAF _KEY ) ) {
cache = createCache ( ) ;
cache . isUniqueByDependants = isUniqueByDependants ;
caches . set ( LEAF _KEY , cache ) ;
}
return caches . get ( LEAF _KEY ) ;
}
// Assign cache handler by availability of WeakMap
getCache = hasWeakMap ? getWeakMapCache : getRootCache ;
/ * *
* Resets root memoization cache .
* /
function clear ( ) {
rootCache = hasWeakMap ? new WeakMap ( ) : createCache ( ) ;
}
// eslint-disable-next-line jsdoc/check-param-names
/ * *
* The augmented selector call , considering first whether dependants have
* changed before passing it to underlying memoize function .
*
* @ param { Object } source Source object for derivation .
* @ param { ... * } extraArgs Additional arguments to pass to selector .
*
* @ return { * } Selector result .
* /
function callSelector ( /* source, ...extraArgs */ ) {
var len = arguments . length ,
cache , node , i , args , dependants ;
// Create copy of arguments (avoid leaking deoptimization).
args = new Array ( len ) ;
for ( i = 0 ; i < len ; i ++ ) {
args [ i ] = arguments [ i ] ;
}
dependants = getDependants . apply ( null , args ) ;
cache = getCache ( dependants ) ;
// If not guaranteed uniqueness by dependants (primitive type or lack
// of WeakMap support), shallow compare against last dependants and, if
// references have changed, destroy cache to recalculate result.
if ( ! cache . isUniqueByDependants ) {
if ( cache . lastDependants && ! isShallowEqual ( dependants , cache . lastDependants , 0 ) ) {
cache . clear ( ) ;
}
cache . lastDependants = dependants ;
}
node = cache . head ;
while ( node ) {
// Check whether node arguments match arguments
if ( ! isShallowEqual ( node . args , args , 1 ) ) {
node = node . next ;
continue ;
}
// At this point we can assume we've found a match
// Surface matched node to head if not already
if ( node !== cache . head ) {
// Adjust siblings to point to each other.
node . prev . next = node . next ;
if ( node . next ) {
node . next . prev = node . prev ;
}
node . next = cache . head ;
node . prev = null ;
cache . head . prev = node ;
cache . head = node ;
}
// Return immediately
return node . val ;
}
// No cached value found. Continue to insertion phase:
node = {
// Generate the result from original function
val : selector . apply ( null , args ) ,
} ;
// Avoid including the source object in the cache.
args [ 0 ] = null ;
node . args = args ;
// Don't need to check whether node is already head, since it would
// have been returned above already if it was
// Shift existing head down list
if ( cache . head ) {
cache . head . prev = node ;
node . next = cache . head ;
}
cache . head = node ;
return node . val ;
}
callSelector . getDependants = getDependants ;
callSelector . clear = clear ;
clear ( ) ;
return callSelector ;
} ) ;
/***/ } ) ,
2020-10-20 15:36:16 +02:00
/***/ 458 :
2020-01-22 23:06:21 +01:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
"use strict" ;
2020-06-29 13:50:29 +02:00
// ESM COMPAT FLAG
2020-01-22 23:06:21 +01:00
_ _webpack _require _ _ . r ( _ _webpack _exports _ _ ) ;
2020-06-29 13:50:29 +02:00
// 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
2020-01-22 23:06:21 +01:00
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 ; } ) ;
2020-06-29 13:50:29 +02:00
// NAMESPACE OBJECT: ./node_modules/@wordpress/rich-text/build-module/store/actions.js
2020-01-22 23:06:21 +01:00
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 _ _ ( 4 ) ;
2020-02-06 22:03:31 +01:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js
var defineProperty = _ _webpack _require _ _ ( 5 ) ;
2020-01-22 23:06:21 +01:00
// EXTERNAL MODULE: external {"this":"lodash"}
var external _this _lodash _ = _ _webpack _require _ _ ( 2 ) ;
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/store/reducer.js
2020-02-06 22:03:31 +01:00
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 ; }
2020-01-22 23:06:21 +01:00
/ * *
* External dependencies
* /
/ * *
* WordPress dependencies
* /
/ * *
* Reducer managing the format types
*
* @ param { Object } state Current state .
* @ param { Object } action Dispatched action .
*
* @ return { Object } Updated state .
* /
function reducer _formatTypes ( ) {
var state = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : { } ;
var action = arguments . length > 1 ? arguments [ 1 ] : undefined ;
switch ( action . type ) {
case 'ADD_FORMAT_TYPES' :
2020-10-13 15:10:30 +02:00
return _objectSpread ( _objectSpread ( { } , state ) , Object ( external _this _lodash _ [ "keyBy" ] ) ( action . formatTypes , 'name' ) ) ;
2020-01-22 23:06:21 +01:00
case 'REMOVE_FORMAT_TYPES' :
return Object ( external _this _lodash _ [ "omit" ] ) ( state , action . names ) ;
}
return state ;
}
/* harmony default export */ var reducer = ( Object ( external _this _wp _data _ [ "combineReducers" ] ) ( {
formatTypes : reducer _formatTypes
} ) ) ;
// EXTERNAL MODULE: ./node_modules/rememo/es/rememo.js
2020-10-20 15:36:16 +02:00
var rememo = _ _webpack _require _ _ ( 42 ) ;
2020-01-22 23:06:21 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/store/selectors.js
/ * *
* External dependencies
* /
/ * *
* Returns all the available format types .
*
* @ param { Object } state Data state .
*
* @ return { Array } Format types .
* /
var getFormatTypes = Object ( rememo [ "a" /* default */ ] ) ( function ( state ) {
return Object . values ( state . formatTypes ) ;
} , function ( state ) {
return [ state . formatTypes ] ;
} ) ;
/ * *
* Returns a format type by name .
*
* @ param { Object } state Data state .
* @ param { string } name Format type name .
*
* @ return { Object ? } Format type .
* /
function getFormatType ( state , name ) {
return state . formatTypes [ name ] ;
}
/ * *
* Gets the format type , if any , that can handle a bare element ( without a
* data - format - type attribute ) , given the tag name of this element .
*
* @ param { Object } state Data state .
* @ param { string } bareElementTagName The tag name of the element to find a
* format type for .
* @ return { ? Object } Format type .
* /
function getFormatTypeForBareElement ( state , bareElementTagName ) {
return Object ( external _this _lodash _ [ "find" ] ) ( getFormatTypes ( state ) , function ( _ref ) {
var className = _ref . className ,
tagName = _ref . tagName ;
return className === null && bareElementTagName === tagName ;
} ) ;
}
/ * *
* Gets the format type , if any , that can handle an element , given its classes .
*
* @ param { Object } state Data state .
* @ param { string } elementClassName The classes of the element to find a format
* type for .
* @ return { ? Object } Format type .
* /
function getFormatTypeForClassName ( state , elementClassName ) {
return Object ( external _this _lodash _ [ "find" ] ) ( getFormatTypes ( state ) , function ( _ref2 ) {
var className = _ref2 . className ;
if ( className === null ) {
return false ;
}
return " " . concat ( elementClassName , " " ) . indexOf ( " " . concat ( className , " " ) ) >= 0 ;
} ) ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/store/actions.js
/ * *
* External dependencies
* /
/ * *
* Returns an action object used in signalling that format types have been
* added .
*
* @ param { Array | Object } formatTypes Format types received .
*
* @ return { Object } Action object .
* /
function addFormatTypes ( formatTypes ) {
return {
type : 'ADD_FORMAT_TYPES' ,
formatTypes : Object ( external _this _lodash _ [ "castArray" ] ) ( formatTypes )
} ;
}
/ * *
* Returns an action object used to remove a registered format type .
*
* @ param { string | Array } names Format name .
*
* @ return { Object } Action object .
* /
2019-03-07 10:09:59 +01:00
function removeFormatTypes ( names ) {
2018-12-18 04:14:52 +01:00
return {
type : 'REMOVE_FORMAT_TYPES' ,
2020-01-03 14:17:24 +01:00
names : Object ( external _this _lodash _ [ "castArray" ] ) ( names )
2018-12-18 04:14:52 +01:00
} ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/store/index.js
2018-12-14 12:02:53 +01:00
/ * *
2018-12-17 05:52:00 +01:00
* WordPress dependencies
2018-12-14 12:02:53 +01:00
* /
2018-12-14 05:41:57 +01:00
/ * *
* Internal dependencies
* /
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
Object ( external _this _wp _data _ [ "registerStore" ] ) ( 'core/rich-text' , {
reducer : reducer ,
selectors : selectors _namespaceObject ,
actions : actions _namespaceObject
} ) ;
2018-12-14 12:02:53 +01:00
2019-03-21 13:48:00 +01:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js + 2 modules
2020-10-20 15:36:16 +02:00
var toConsumableArray = _ _webpack _require _ _ ( 17 ) ;
2019-03-21 13:48:00 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/is-format-equal.js
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextFormat} RichTextFormat */
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Optimised equality check for format objects .
*
2020-10-13 15:10:30 +02:00
* @ param { ? RichTextFormat } format1 Format to compare .
* @ param { ? RichTextFormat } format2 Format to compare .
2018-12-18 04:14:52 +01:00
*
* @ return { boolean } True if formats are equal , false if not .
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
function isFormatEqual ( format1 , format2 ) {
// Both not defined.
if ( format1 === format2 ) {
return true ;
} // Either not defined.
2018-12-14 05:41:57 +01:00
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( ! format1 || ! format2 ) {
return false ;
2018-12-14 12:02:53 +01:00
}
2018-12-18 04:14:52 +01:00
if ( format1 . type !== format2 . type ) {
return false ;
}
2018-12-17 05:52:00 +01:00
2018-12-18 04:14:52 +01:00
var attributes1 = format1 . attributes ;
var attributes2 = format2 . attributes ; // Both not defined.
2018-12-17 05:52:00 +01:00
2018-12-18 04:14:52 +01:00
if ( attributes1 === attributes2 ) {
return true ;
} // Either not defined.
2018-12-17 05:52:00 +01:00
2018-12-18 04:14:52 +01:00
if ( ! attributes1 || ! attributes2 ) {
return false ;
2018-12-17 05:52:00 +01:00
}
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
var keys1 = Object . keys ( attributes1 ) ;
var keys2 = Object . keys ( attributes2 ) ;
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( keys1 . length !== keys2 . length ) {
return false ;
2018-12-14 12:02:53 +01:00
}
2018-12-18 04:14:52 +01:00
var length = keys1 . length ; // Optimise for speed.
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
for ( var i = 0 ; i < length ; i ++ ) {
var name = keys1 [ i ] ;
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( attributes1 [ name ] !== attributes2 [ name ] ) {
return false ;
2018-12-14 12:02:53 +01:00
}
}
2018-12-18 04:14:52 +01:00
return true ;
2018-12-14 12:02:53 +01:00
}
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/normalise-formats.js
2019-03-21 13:48:00 +01:00
2020-02-06 22:03:31 +01:00
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 ; }
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-18 04:14:52 +01:00
/ * *
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
* Normalises formats : ensures subsequent adjacent equal formats have the same
* reference .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to normalise formats of .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } New value with normalised formats .
2018-12-14 05:41:57 +01:00
* /
2019-03-21 13:48:00 +01:00
function normaliseFormats ( value ) {
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
var newFormats = value . formats . slice ( ) ;
newFormats . forEach ( function ( formatsAtIndex , index ) {
var formatsAtPreviousIndex = newFormats [ index - 1 ] ;
2018-12-14 05:41:57 +01:00
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
if ( formatsAtPreviousIndex ) {
var newFormatsAtIndex = formatsAtIndex . slice ( ) ;
newFormatsAtIndex . forEach ( function ( format , formatIndex ) {
var previousFormat = formatsAtPreviousIndex [ formatIndex ] ;
2018-12-14 05:41:57 +01:00
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
if ( isFormatEqual ( format , previousFormat ) ) {
newFormatsAtIndex [ formatIndex ] = previousFormat ;
}
} ) ;
newFormats [ index ] = newFormatsAtIndex ;
}
2018-12-18 04:14:52 +01:00
} ) ;
2020-10-13 15:10:30 +02:00
return normalise _formats _objectSpread ( normalise _formats _objectSpread ( { } , value ) , { } , {
2019-03-21 13:48:00 +01:00
formats : newFormats
} ) ;
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/apply-format.js
2019-03-21 13:48:00 +01:00
2020-02-06 22:03:31 +01:00
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 ; }
2018-12-18 04:14:52 +01:00
/ * *
* External dependencies
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
/ * *
* Internal dependencies
* /
2018-12-14 05:41:57 +01:00
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
/** @typedef {import('./create').RichTextFormat} RichTextFormat */
2019-09-19 17:19:18 +02:00
function replace ( array , index , value ) {
array = array . slice ( ) ;
array [ index ] = value ;
return array ;
}
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* 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
* provided .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to modify .
* @ param { RichTextFormat } format Format to apply .
* @ param { number } [ startIndex ] Start index .
* @ param { number } [ endIndex ] End index .
2018-12-18 04:14:52 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A new value with the format applied .
2018-12-14 05:41:57 +01:00
* /
2019-09-19 17:19:18 +02:00
2019-03-21 13:48:00 +01:00
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 ;
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
var formats = value . formats ,
2019-05-16 20:08:00 +02:00
activeFormats = value . activeFormats ;
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
var newFormats = formats . slice ( ) ; // The selection is collapsed.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( startIndex === endIndex ) {
2020-01-03 14:17:24 +01:00
var startFormat = Object ( external _this _lodash _ [ "find" ] ) ( newFormats [ startIndex ] , {
2018-12-18 04:14:52 +01:00
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.
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( startFormat ) {
2019-09-19 17:19:18 +02:00
var index = newFormats [ startIndex ] . indexOf ( startFormat ) ;
while ( newFormats [ startIndex ] && newFormats [ startIndex ] [ index ] === startFormat ) {
newFormats [ startIndex ] = replace ( newFormats [ startIndex ] , index , format ) ;
2018-12-18 04:14:52 +01:00
startIndex -- ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
endIndex ++ ;
2018-12-14 05:41:57 +01:00
2019-09-19 17:19:18 +02:00
while ( newFormats [ endIndex ] && newFormats [ endIndex ] [ index ] === startFormat ) {
newFormats [ endIndex ] = replace ( newFormats [ endIndex ] , index , format ) ;
2018-12-18 04:14:52 +01:00
endIndex ++ ;
2019-05-16 20:08:00 +02:00
}
2018-12-18 04:14:52 +01:00
}
} else {
2019-09-19 17:19:18 +02:00
// 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 ) ;
2018-12-14 05:41:57 +01:00
}
}
2020-10-13 15:10:30 +02:00
return normaliseFormats ( apply _format _objectSpread ( apply _format _objectSpread ( { } , value ) , { } , {
2019-05-16 20:08:00 +02:00
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.
2020-01-03 14:17:24 +01:00
activeFormats : [ ] . concat ( Object ( toConsumableArray [ "a" /* default */ ] ) ( Object ( external _this _lodash _ [ "reject" ] ) ( activeFormats , {
2019-05-16 20:08:00 +02:00
type : format . type
} ) ) , [ format ] )
2019-03-21 13:48:00 +01:00
} ) ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/typeof.js
2020-06-26 15:33:47 +02:00
var esm _typeof = _ _webpack _require _ _ ( 40 ) ;
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/create-element.js
2018-12-15 12:00:40 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Parse the given HTML into a body element .
2018-12-15 12:00:40 +01:00
*
2018-12-19 04:16:48 +01:00
* Note : The current implementation will return a shared reference , reset on
* each call to ` createElement ` . Therefore , you should not hold a reference to
* the value to operate upon asynchronously , as it may have unexpected results .
*
2018-12-18 04:14:52 +01:00
* @ param { HTMLDocument } document The HTML document to use to parse .
* @ param { string } html The HTML to parse .
2018-12-15 12:00:40 +01:00
*
2018-12-18 04:14:52 +01:00
* @ return { HTMLBodyElement } Body element with parsed HTML .
2018-12-15 12:00:40 +01:00
* /
2018-12-18 04:14:52 +01:00
function createElement ( _ref , html ) {
var implementation = _ref . implementation ;
2018-12-19 04:16:48 +01:00
// Because `createHTMLDocument` is an expensive operation, and with this
// function being internal to `rich-text` (full control in avoiding a risk
// of asynchronous operations on the shared reference), a single document
// is reused and reset for each call to the function.
if ( ! createElement . body ) {
createElement . body = implementation . createHTMLDocument ( '' ) . body ;
}
2018-12-18 04:14:52 +01:00
2018-12-19 04:16:48 +01:00
createElement . body . innerHTML = html ;
return createElement . body ;
2018-12-15 12:00:40 +01:00
}
2019-03-21 13:48:00 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/special-characters.js
/ * *
2019-09-19 17:19:18 +02:00
* Line separator character , used for multiline text .
2019-03-21 13:48:00 +01:00
* /
var LINE _SEPARATOR = "\u2028" ;
2019-09-19 17:19:18 +02:00
/ * *
* Object replacement character , used as a placeholder for objects .
* /
2019-03-21 13:48:00 +01:00
var OBJECT _REPLACEMENT _CHARACTER = "\uFFFC" ;
2019-09-19 17:19:18 +02:00
/ * *
* Zero width non - breaking space , used as padding in the editable DOM tree when
* it is empty otherwise .
* /
var ZWNBSP = "\uFEFF" ;
2019-03-21 13:48:00 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/create.js
2018-12-15 12:00:40 +01:00
2019-03-21 13:48:00 +01:00
2020-02-06 22:03:31 +01:00
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 ; }
2018-12-15 12:00:40 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* WordPress dependencies
2018-12-15 12:00:40 +01:00
* /
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Internal dependencies
2018-12-14 05:41:57 +01:00
* /
2018-12-14 12:02:53 +01:00
2020-10-13 15:10:30 +02:00
/ * *
* @ typedef { Object } RichTextFormat
*
* @ property { string } type Format type .
* /
/ * *
* @ typedef { Array < RichTextFormat > } RichTextFormatList
* /
/ * *
* @ typedef { Object } RichTextValue
*
* @ property { string } text Text .
* @ property { Array < RichTextFormatList > } formats Formats .
* @ property { Array < RichTextFormat > } replacements Replacements .
* @ property { number | undefined } start Selection start .
* @ property { number | undefined } end Selection end .
* /
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
function createEmptyValue ( ) {
return {
formats : [ ] ,
2019-03-21 13:48:00 +01:00
replacements : [ ] ,
2018-12-18 04:14:52 +01:00
text : ''
} ;
}
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
function simpleFindKey ( object , value ) {
for ( var key in object ) {
if ( object [ key ] === value ) {
return key ;
}
}
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function toFormat ( _ref ) {
var type = _ref . type ,
attributes = _ref . attributes ;
var formatType ;
2018-12-15 12:00:40 +01:00
2018-12-18 04:14:52 +01:00
if ( attributes && attributes . class ) {
formatType = Object ( external _this _wp _data _ [ "select" ] ) ( 'core/rich-text' ) . getFormatTypeForClassName ( attributes . class ) ;
2018-12-15 12:00:40 +01:00
2018-12-18 04:14:52 +01:00
if ( formatType ) {
// Preserve any additional classes.
attributes . class = " " . concat ( attributes . class , " " ) . replace ( " " . concat ( formatType . className , " " ) , ' ' ) . trim ( ) ;
2018-12-15 12:00:40 +01:00
2018-12-18 04:14:52 +01:00
if ( ! attributes . class ) {
delete attributes . class ;
}
}
}
2018-12-15 12:00:40 +01:00
2018-12-18 04:14:52 +01:00
if ( ! formatType ) {
formatType = Object ( external _this _wp _data _ [ "select" ] ) ( 'core/rich-text' ) . getFormatTypeForBareElement ( type ) ;
}
2018-12-15 12:00:40 +01:00
2018-12-18 04:14:52 +01:00
if ( ! formatType ) {
return attributes ? {
type : type ,
attributes : attributes
} : {
type : type
} ;
}
2018-12-15 12:00:40 +01:00
2019-03-21 13:48:00 +01:00
if ( formatType . _ _experimentalCreatePrepareEditableTree && ! formatType . _ _experimentalCreateOnChangeEditableValue ) {
return null ;
}
2018-12-18 04:14:52 +01:00
if ( ! attributes ) {
return {
type : formatType . name
} ;
}
2018-12-15 12:00:40 +01:00
2018-12-18 04:14:52 +01:00
var registeredAttributes = { } ;
var unregisteredAttributes = { } ;
2018-12-15 12:00:40 +01:00
2018-12-18 04:14:52 +01:00
for ( var name in attributes ) {
var key = simpleFindKey ( formatType . attributes , name ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( key ) {
registeredAttributes [ key ] = attributes [ name ] ;
} else {
unregisteredAttributes [ name ] = attributes [ name ] ;
}
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return {
type : formatType . name ,
attributes : registeredAttributes ,
unregisteredAttributes : unregisteredAttributes
} ;
}
/ * *
* Create a RichText value from an ` Element ` tree ( DOM ) , an HTML string or a
* plain text string , with optionally a ` Range ` object to set the selection . If
* called without any input , an empty value will be created . If
* ` multilineTag ` is provided , any content of direct children whose type matches
* ` multilineTag ` will be separated by two newlines . The optional functions can
* be used to filter out content .
*
2019-03-21 13:48:00 +01:00
* A value will have the following shape , which you are strongly encouraged not
* to modify without the use of helper functions :
*
* ` ` ` js
* {
* text : string ,
* formats : Array ,
* replacements : Array ,
* ? start : number ,
* ? end : number ,
* }
* ` ` `
*
* As you can see , text and formatting are separated . ` text ` holds the text ,
* including any replacement characters for objects and lines . ` formats ` ,
* ` objects ` and ` lines ` are all sparse arrays of the same length as ` text ` . It
* holds information about the formatting at the relevant text indices . Finally
* ` start ` and ` end ` state which text indices are selected . They are only
* provided if a ` Range ` was given .
*
* @ param { Object } [ $1 ] Optional named arguments .
* @ param { Element } [ $1 . element ] Element to create value from .
* @ param { string } [ $1 . text ] Text to create value from .
* @ param { string } [ $1 . html ] HTML to create value from .
* @ param { Range } [ $1 . range ] Range to create value from .
* @ param { string } [ $1 . multilineTag ] Multiline tag if the structure is
2018-12-18 04:14:52 +01:00
* multiline .
2019-03-21 13:48:00 +01:00
* @ param { Array } [ $1 . multilineWrapperTags ] Tags where lines can be found if
2018-12-18 04:14:52 +01:00
* nesting is possible .
2020-10-13 15:10:30 +02:00
* @ param { boolean } [ $1 . preserveWhiteSpace ] Whether or not to collapse white
2020-01-08 12:57:23 +01:00
* space characters .
2020-10-13 15:10:30 +02:00
* @ param { boolean } [ $1 . _ _unstableIsEditableTree ]
2018-12-18 04:14:52 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A rich text value .
2018-12-18 04:14:52 +01:00
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function create ( ) {
var _ref2 = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : { } ,
element = _ref2 . element ,
text = _ref2 . text ,
html = _ref2 . html ,
range = _ref2 . range ,
multilineTag = _ref2 . multilineTag ,
2019-03-21 13:48:00 +01:00
multilineWrapperTags = _ref2 . multilineWrapperTags ,
2020-01-08 12:57:23 +01:00
isEditableTree = _ref2 . _ _unstableIsEditableTree ,
preserveWhiteSpace = _ref2 . preserveWhiteSpace ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( typeof text === 'string' && text . length > 0 ) {
return {
formats : Array ( text . length ) ,
2019-03-21 13:48:00 +01:00
replacements : Array ( text . length ) ,
2018-12-18 04:14:52 +01:00
text : text
} ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( typeof html === 'string' && html . length > 0 ) {
2020-06-26 15:33:47 +02:00
// It does not matter which document this is, we're just using it to
// parse.
2018-12-18 04:14:52 +01:00
element = createElement ( document , html ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( Object ( esm _typeof [ "a" /* default */ ] ) ( element ) !== 'object' ) {
return createEmptyValue ( ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! multilineTag ) {
return createFromElement ( {
element : element ,
2019-03-21 13:48:00 +01:00
range : range ,
2020-01-08 12:57:23 +01:00
isEditableTree : isEditableTree ,
preserveWhiteSpace : preserveWhiteSpace
2018-12-18 04:14:52 +01:00
} ) ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return createFromMultilineElement ( {
element : element ,
range : range ,
multilineTag : multilineTag ,
2019-03-21 13:48:00 +01:00
multilineWrapperTags : multilineWrapperTags ,
2020-01-08 12:57:23 +01:00
isEditableTree : isEditableTree ,
preserveWhiteSpace : preserveWhiteSpace
2018-12-18 04:14:52 +01:00
} ) ;
}
/ * *
* Helper to accumulate the value ' s selection start and end from the current
* node and range .
*
* @ param { Object } accumulator Object to accumulate into .
* @ param { Node } node Node to create value with .
* @ param { Range } range Range to create value with .
* @ param { Object } value Value that is being accumulated .
* /
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
function accumulateSelection ( accumulator , node , range , value ) {
if ( ! range ) {
return ;
}
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
var parentNode = node . parentNode ;
var startContainer = range . startContainer ,
startOffset = range . startOffset ,
endContainer = range . endContainer ,
endOffset = range . endOffset ;
var currentLength = accumulator . text . length ; // Selection can be extracted from value.
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( value . start !== undefined ) {
accumulator . start = currentLength + value . start ; // Range indicates that the current node has selection.
2020-06-26 15:33:47 +02:00
} else if ( node === startContainer && node . nodeType === node . TEXT _NODE ) {
2018-12-18 04:14:52 +01:00
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.
} else if ( parentNode === startContainer && node === startContainer . childNodes [ startOffset - 1 ] ) {
accumulator . start = currentLength + value . text . length ; // Fallback if no child inside handled the selection.
} else if ( node === startContainer ) {
accumulator . start = currentLength ;
} // Selection can be extracted from value.
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( value . end !== undefined ) {
accumulator . end = currentLength + value . end ; // Range indicates that the current node has selection.
2020-06-26 15:33:47 +02:00
} else if ( node === endContainer && node . nodeType === node . TEXT _NODE ) {
2018-12-18 04:14:52 +01:00
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.
} else if ( parentNode === endContainer && node === endContainer . childNodes [ endOffset ] ) {
accumulator . end = currentLength ; // Fallback if no child inside handled the selection.
} else if ( node === endContainer ) {
accumulator . end = currentLength + endOffset ;
}
}
/ * *
* Adjusts the start and end offsets from a range based on a text filter .
*
* @ param { Node } node Node of which the text should be filtered .
* @ param { Range } range The range to filter .
* @ param { Function } filter Function to use to filter the text .
*
2020-10-13 15:10:30 +02:00
* @ return { Object | void } Object containing range properties .
2018-12-18 04:14:52 +01:00
* /
2018-12-14 12:02:53 +01:00
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function filterRange ( node , range , filter ) {
if ( ! range ) {
return ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var startContainer = range . startContainer ,
endContainer = range . endContainer ;
var startOffset = range . startOffset ,
endOffset = range . endOffset ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( node === startContainer ) {
startOffset = filter ( node . nodeValue . slice ( 0 , startOffset ) ) . length ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( node === endContainer ) {
endOffset = filter ( node . nodeValue . slice ( 0 , endOffset ) ) . length ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return {
startContainer : startContainer ,
startOffset : startOffset ,
endContainer : endContainer ,
endOffset : endOffset
} ;
}
2020-01-08 12:57:23 +01:00
/ * *
* 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 , ' ' ) ;
}
2019-03-07 10:09:59 +01:00
2019-09-19 17:19:18 +02:00
var ZWNBSPRegExp = new RegExp ( ZWNBSP , 'g' ) ;
2020-01-08 12:57:23 +01:00
/ * *
* Removes padding ( zero width non breaking spaces ) added by ` toTree ` .
*
* @ param { string } string
* /
2019-09-19 17:19:18 +02:00
2020-01-08 12:57:23 +01:00
function removePadding ( string ) {
return string . replace ( ZWNBSPRegExp , '' ) ;
2019-03-07 10:09:59 +01:00
}
2018-12-18 04:14:52 +01:00
/ * *
* Creates a Rich Text value from a DOM element and range .
*
2020-10-13 15:10:30 +02:00
* @ 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
2018-12-18 04:14:52 +01:00
* multiline .
2020-10-13 15:10:30 +02:00
* @ param { Array } [ $1 . multilineWrapperTags ] Tags where lines can be found if
2018-12-18 04:14:52 +01:00
* nesting is possible .
2020-10-13 15:10:30 +02:00
* @ param { boolean } [ $1 . preserveWhiteSpace ] Whether or not to collapse white
2020-01-08 12:57:23 +01:00
* space characters .
2020-10-13 15:10:30 +02:00
* @ param { Array } [ $1 . currentWrapperTags ]
* @ param { boolean } [ $1 . isEditableTree ]
2018-12-18 04:14:52 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A rich text value .
2018-12-18 04:14:52 +01:00
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function createFromElement ( _ref3 ) {
var element = _ref3 . element ,
range = _ref3 . range ,
multilineTag = _ref3 . multilineTag ,
multilineWrapperTags = _ref3 . multilineWrapperTags ,
_ref3$currentWrapperT = _ref3 . currentWrapperTags ,
2019-03-21 13:48:00 +01:00
currentWrapperTags = _ref3$currentWrapperT === void 0 ? [ ] : _ref3$currentWrapperT ,
2020-01-08 12:57:23 +01:00
isEditableTree = _ref3 . isEditableTree ,
preserveWhiteSpace = _ref3 . preserveWhiteSpace ;
2018-12-18 04:14:52 +01:00
var accumulator = createEmptyValue ( ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! element ) {
return accumulator ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! element . hasChildNodes ( ) ) {
accumulateSelection ( accumulator , element , range , createEmptyValue ( ) ) ;
return accumulator ;
}
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
var length = element . childNodes . length ; // Optimise for speed.
2018-12-14 05:41:57 +01:00
2019-03-21 13:48:00 +01:00
var _loop = function _loop ( index ) {
2018-12-18 04:14:52 +01:00
var node = element . childNodes [ index ] ;
var type = node . nodeName . toLowerCase ( ) ;
2018-12-14 05:41:57 +01:00
2020-06-26 15:33:47 +02:00
if ( node . nodeType === node . TEXT _NODE ) {
2020-01-08 12:57:23 +01:00
var filter = removePadding ;
if ( ! preserveWhiteSpace ) {
filter = function filter ( string ) {
return removePadding ( collapseWhiteSpace ( string ) ) ;
} ;
}
var text = filter ( node . nodeValue ) ;
range = filterRange ( node , range , filter ) ;
2018-12-18 04:14:52 +01:00
accumulateSelection ( accumulator , node , range , {
2019-03-21 13:48:00 +01:00
text : text
} ) ; // Create a sparse array of the same length as `text`, in which
2018-12-18 04:14:52 +01:00
// formats can be added.
2018-12-14 05:41:57 +01:00
2019-03-21 13:48:00 +01:00
accumulator . formats . length += text . length ;
accumulator . replacements . length += text . length ;
accumulator . text += text ;
return "continue" ;
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2020-06-26 15:33:47 +02:00
if ( node . nodeType !== node . ELEMENT _NODE ) {
2019-03-21 13:48:00 +01:00
return "continue" ;
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2019-09-19 17:19:18 +02:00
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' ) ) ) {
2018-12-18 04:14:52 +01:00
accumulateSelection ( accumulator , node , range , createEmptyValue ( ) ) ;
2019-03-21 13:48:00 +01:00
return "continue" ;
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( type === 'br' ) {
accumulateSelection ( accumulator , node , range , createEmptyValue ( ) ) ;
2019-03-21 13:48:00 +01:00
mergePair ( accumulator , create ( {
text : '\n'
} ) ) ;
return "continue" ;
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var lastFormats = accumulator . formats [ accumulator . formats . length - 1 ] ;
var lastFormat = lastFormats && lastFormats [ lastFormats . length - 1 ] ;
2019-03-07 10:09:59 +01:00
var newFormat = toFormat ( {
type : type ,
attributes : getAttributes ( {
element : node
} )
} ) ;
2019-03-21 13:48:00 +01:00
var format = isFormatEqual ( newFormat , lastFormat ) ? lastFormat : newFormat ;
2019-03-07 10:09:59 +01:00
2018-12-18 04:14:52 +01:00
if ( multilineWrapperTags && multilineWrapperTags . indexOf ( type ) !== - 1 ) {
2019-03-21 13:48:00 +01:00
var _value = createFromMultilineElement ( {
2018-12-18 04:14:52 +01:00
element : node ,
range : range ,
multilineTag : multilineTag ,
multilineWrapperTags : multilineWrapperTags ,
2019-03-21 13:48:00 +01:00
currentWrapperTags : [ ] . concat ( Object ( toConsumableArray [ "a" /* default */ ] ) ( currentWrapperTags ) , [ format ] ) ,
2020-01-08 12:57:23 +01:00
isEditableTree : isEditableTree ,
preserveWhiteSpace : preserveWhiteSpace
2018-12-18 04:14:52 +01:00
} ) ;
2018-12-15 12:00:40 +01:00
2019-03-21 13:48:00 +01:00
accumulateSelection ( accumulator , node , range , _value ) ;
mergePair ( accumulator , _value ) ;
return "continue" ;
2018-12-18 04:14:52 +01:00
}
2018-12-15 12:00:40 +01:00
2019-03-21 13:48:00 +01:00
var value = createFromElement ( {
element : node ,
range : range ,
multilineTag : multilineTag ,
multilineWrapperTags : multilineWrapperTags ,
2020-01-08 12:57:23 +01:00
isEditableTree : isEditableTree ,
preserveWhiteSpace : preserveWhiteSpace
2019-03-21 13:48:00 +01:00
} ) ;
accumulateSelection ( accumulator , node , range , value ) ;
2018-12-15 12:00:40 +01:00
2019-03-21 13:48:00 +01:00
if ( ! format ) {
mergePair ( accumulator , value ) ;
} else if ( value . text . length === 0 ) {
if ( format . attributes ) {
mergePair ( accumulator , {
formats : [ , ] ,
replacements : [ format ] ,
text : OBJECT _REPLACEMENT _CHARACTER
} ) ;
2018-12-18 04:14:52 +01:00
}
} else {
2020-01-22 23:06:21 +01:00
// Indices should share a reference to the same formats array.
// Only create a new reference if `formats` changes.
2020-02-06 22:03:31 +01:00
function mergeFormats ( formats ) {
2020-01-22 23:06:21 +01:00
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 ;
2020-02-06 22:03:31 +01:00
} // Since the formats parameter can be `undefined`, preset
2020-01-22 23:06:21 +01:00
// `mergeFormats` with a new reference.
mergeFormats . newFormats = [ format ] ;
2020-10-13 15:10:30 +02:00
mergePair ( accumulator , create _objectSpread ( create _objectSpread ( { } , value ) , { } , {
2020-01-22 23:06:21 +01:00
formats : Array . from ( value . formats , mergeFormats )
2019-03-21 13:48:00 +01:00
} ) ) ;
}
} ;
2018-12-15 12:00:40 +01:00
2019-03-21 13:48:00 +01:00
for ( var index = 0 ; index < length ; index ++ ) {
var _ret = _loop ( index ) ;
2018-12-15 12:00:40 +01:00
2019-03-21 13:48:00 +01:00
if ( _ret === "continue" ) continue ;
2018-12-15 12:00:40 +01:00
}
2018-12-18 04:14:52 +01:00
return accumulator ;
2018-12-15 12:00:40 +01:00
}
2018-12-14 12:02:53 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Creates a rich text value from a DOM element and range that should be
* multiline .
2018-12-14 12:02:53 +01:00
*
2020-10-13 15:10:30 +02:00
* @ 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 .
* @ param { boolean } [ $1 . isEditableTree ]
2018-12-14 12:02:53 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A rich text value .
2018-12-14 12:02:53 +01:00
* /
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
function createFromMultilineElement ( _ref4 ) {
var element = _ref4 . element ,
range = _ref4 . range ,
multilineTag = _ref4 . multilineTag ,
multilineWrapperTags = _ref4 . multilineWrapperTags ,
_ref4$currentWrapperT = _ref4 . currentWrapperTags ,
2019-03-21 13:48:00 +01:00
currentWrapperTags = _ref4$currentWrapperT === void 0 ? [ ] : _ref4$currentWrapperT ,
2020-01-08 12:57:23 +01:00
isEditableTree = _ref4 . isEditableTree ,
preserveWhiteSpace = _ref4 . preserveWhiteSpace ;
2018-12-18 04:14:52 +01:00
var accumulator = createEmptyValue ( ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( ! element || ! element . hasChildNodes ( ) ) {
return accumulator ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var length = element . children . length ; // Optimise for speed.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( var index = 0 ; index < length ; index ++ ) {
var node = element . children [ index ] ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( node . nodeName . toLowerCase ( ) !== multilineTag ) {
continue ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
var value = createFromElement ( {
element : node ,
range : range ,
multilineTag : multilineTag ,
multilineWrapperTags : multilineWrapperTags ,
2019-03-21 13:48:00 +01:00
currentWrapperTags : currentWrapperTags ,
2020-01-08 12:57:23 +01:00
isEditableTree : isEditableTree ,
preserveWhiteSpace : preserveWhiteSpace
2019-03-21 13:48:00 +01:00
} ) ; // Multiline value text should be separated by a line separator.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( index !== 0 || currentWrapperTags . length > 0 ) {
2019-03-21 13:48:00 +01:00
mergePair ( accumulator , {
formats : [ , ] ,
replacements : currentWrapperTags . length > 0 ? [ currentWrapperTags ] : [ , ] ,
text : LINE _SEPARATOR
} ) ;
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
accumulateSelection ( accumulator , node , range , value ) ;
2019-03-21 13:48:00 +01:00
mergePair ( accumulator , value ) ;
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return accumulator ;
}
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Gets the attributes of an element in object shape .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ param { Object } $1 Named argements .
* @ param { Element } $1 . element Element to get attributes from .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { Object | void } Attribute object or ` undefined ` if the element has no
* attributes .
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
function getAttributes ( _ref5 ) {
2019-03-07 10:09:59 +01:00
var element = _ref5 . element ;
2018-12-18 04:14:52 +01:00
if ( ! element . hasAttributes ( ) ) {
2018-12-14 05:41:57 +01:00
return ;
}
2018-12-18 04:14:52 +01:00
var length = element . attributes . length ;
var accumulator ; // Optimise for speed.
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
for ( var i = 0 ; i < length ; i ++ ) {
var _element$attributes$i = element . attributes [ i ] ,
name = _element$attributes$i . name ,
value = _element$attributes$i . value ;
2018-12-14 05:41:57 +01:00
2019-03-21 13:48:00 +01:00
if ( name . indexOf ( 'data-rich-text-' ) === 0 ) {
2018-12-18 04:14:52 +01:00
continue ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
accumulator = accumulator || { } ;
accumulator [ name ] = value ;
}
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
return accumulator ;
}
2019-03-21 13:48:00 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/concat.js
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2019-03-21 13:48:00 +01:00
/ * *
* Concats a pair of rich text values . Not that this mutates ` a ` and does NOT
* normalise formats !
*
2020-10-13 15:10:30 +02:00
* @ param { Object } a Value to mutate .
* @ param { Object } b Value to add read from .
2019-03-21 13:48:00 +01:00
*
* @ return { Object } ` a ` , mutated .
* /
function mergePair ( a , b ) {
a . formats = a . formats . concat ( b . formats ) ;
a . replacements = a . replacements . concat ( b . replacements ) ;
a . text += b . text ;
return a ;
}
/ * *
* Combine all Rich Text values into one . This is similar to
* ` String.prototype.concat ` .
*
2020-10-13 15:10:30 +02:00
* @ param { ... RichTextValue } values Objects to combine .
2019-03-21 13:48:00 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A new value combining all given records .
2019-03-21 13:48:00 +01:00
* /
function concat ( ) {
for ( var _len = arguments . length , values = new Array ( _len ) , _key = 0 ; _key < _len ; _key ++ ) {
values [ _key ] = arguments [ _key ] ;
}
return normaliseFormats ( values . reduce ( mergePair , create ( ) ) ) ;
}
2019-03-07 10:09:59 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-active-formats.js
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
/** @typedef {import('./create').RichTextFormatList} RichTextFormatList */
2019-03-07 10:09:59 +01:00
/ * *
* Gets the all format objects at the start of the selection .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to inspect .
* @ param { Array } EMPTY _ACTIVE _FORMATS Array to return if there are no
* active formats .
2019-03-07 10:09:59 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextFormatList } Active format objects .
2019-03-07 10:09:59 +01:00
* /
function getActiveFormats ( _ref ) {
var formats = _ref . formats ,
start = _ref . start ,
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
end = _ref . end ,
activeFormats = _ref . activeFormats ;
2020-01-22 23:06:21 +01:00
var EMPTY _ACTIVE _FORMATS = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : [ ] ;
2019-03-07 10:09:59 +01:00
if ( start === undefined ) {
2020-01-22 23:06:21 +01:00
return EMPTY _ACTIVE _FORMATS ;
2019-03-07 10:09:59 +01:00
}
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
if ( start === end ) {
// For a collapsed caret, it is possible to override the active formats.
if ( activeFormats ) {
return activeFormats ;
}
2020-01-22 23:06:21 +01:00
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
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
// the caret is positioned outside the format boundary). The user can
// then use arrow keys to define `activeFormats`.
if ( formatsBefore . length < formatsAfter . length ) {
return formatsBefore ;
}
2019-03-07 10:09:59 +01:00
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
return formatsAfter ;
2019-03-07 10:09:59 +01:00
}
2020-01-22 23:06:21 +01:00
return formats [ start ] || EMPTY _ACTIVE _FORMATS ;
2018-12-18 04:14:52 +01:00
}
2018-12-15 12:00:40 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-active-format.js
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* External dependencies
2018-12-14 05:41:57 +01:00
* /
2018-12-15 12:00:40 +01:00
2019-03-07 10:09:59 +01:00
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
/** @typedef {import('./create').RichTextFormat} RichTextFormat */
2018-12-14 05:41:57 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Gets the format object by type at the start of the selection . This can be
* used to get e . g . the URL of a link format at the current selection , but also
* to check if a format is active at the selection . Returns undefined if there
* is no format at the selection .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to inspect .
* @ param { string } formatType Format type to look for .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextFormat | undefined } Active format object of the specified
* type , or undefined .
2018-12-14 05:41:57 +01:00
* /
2019-03-07 10:09:59 +01:00
function getActiveFormat ( value , formatType ) {
2020-01-03 14:17:24 +01:00
return Object ( external _this _lodash _ [ "find" ] ) ( getActiveFormats ( value ) , {
2018-12-18 04:14:52 +01:00
type : formatType
} ) ;
2018-12-14 05:41:57 +01:00
}
2019-03-21 13:48:00 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-active-object.js
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
/** @typedef {import('./create').RichTextFormat} RichTextFormat */
2019-03-21 13:48:00 +01:00
/ * *
* Gets the active object , if there is any .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to inspect .
2019-03-21 13:48:00 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextFormat | void } Active object , or undefined .
2019-03-21 13:48:00 +01:00
* /
function getActiveObject ( _ref ) {
var start = _ref . start ,
end = _ref . end ,
replacements = _ref . replacements ,
text = _ref . text ;
if ( start + 1 !== end || text [ start ] !== OBJECT _REPLACEMENT _CHARACTER ) {
return ;
}
return replacements [ start ] ;
}
2019-09-19 17:19:18 +02:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-text-content.js
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2019-09-19 17:19:18 +02:00
/ * *
* Get the textual content of a Rich Text value . This is similar to
* ` Element.textContent ` .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to use .
2019-09-19 17:19:18 +02:00
*
* @ return { string } The text content .
* /
function getTextContent ( _ref ) {
var text = _ref . text ;
return text ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-line-index.js
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-14 05:41:57 +01:00
/ * *
2019-09-19 17:19:18 +02:00
* Gets the currently selected line index , or the first line index if the
* selection spans over multiple items .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } 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 .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { number | void } The line index . Undefined if not found .
2018-12-14 05:41:57 +01:00
* /
2019-09-19 17:19:18 +02:00
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 ;
}
}
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2019-09-19 17:19:18 +02:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/is-list-root-selected.js
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-18 04:14:52 +01:00
/ * *
2019-09-19 17:19:18 +02:00
* Whether or not the root list is selected .
2018-12-18 04:14:52 +01:00
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value The value to check .
2018-12-18 04:14:52 +01:00
*
2019-09-19 17:19:18 +02:00
* @ return { boolean } True if the root list or nothing is selected , false if an
* inner list is selected .
2018-12-18 04:14:52 +01:00
* /
2019-09-19 17:19:18 +02:00
function isListRootSelected ( value ) {
var replacements = value . replacements ,
start = value . start ;
var lineIndex = getLineIndex ( value , start ) ;
var replacement = replacements [ lineIndex ] ;
return ! replacement || replacement . length < 1 ;
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2019-09-19 17:19:18 +02:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/is-active-list-type.js
2018-12-18 04:14:52 +01:00
/ * *
2019-09-19 17:19:18 +02:00
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2019-09-19 17:19:18 +02:00
/ * *
* Wether or not the selected list has the given tag name .
2018-12-18 04:14:52 +01:00
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } 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 .
2018-12-18 04:14:52 +01:00
*
2019-09-19 17:19:18 +02:00
* @ return { boolean } True if the current list type matches ` type ` , false if not .
2018-12-18 04:14:52 +01:00
* /
2019-09-19 17:19:18 +02:00
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 ;
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/is-collapsed.js
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-18 04:14:52 +01:00
/ * *
* Check if the selection of a Rich Text value is collapsed or not . Collapsed
* means that no characters are selected , but there is a caret present . If there
* is no selection , ` undefined ` will be returned . This is similar to
* ` window.getSelection().isCollapsed() ` .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value The rich text value to check .
2018-12-18 04:14:52 +01:00
*
2019-03-21 13:48:00 +01:00
* @ return { boolean | undefined } True if the selection is collapsed , false if not ,
* undefined if there is no selection .
2018-12-18 04:14:52 +01:00
* /
function isCollapsed ( _ref ) {
var start = _ref . start ,
end = _ref . end ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
if ( start === undefined || end === undefined ) {
return ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
return start === end ;
2018-12-14 05:41:57 +01:00
}
2019-03-21 13:48:00 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/is-empty.js
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2019-03-21 13:48:00 +01:00
/ * *
* Check if a Rich Text value is Empty , meaning it contains no text or any
* objects ( such as images ) .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to use .
2019-03-21 13:48:00 +01:00
*
* @ return { boolean } True if the value is empty , false if not .
* /
function isEmpty ( _ref ) {
var text = _ref . text ;
return text . length === 0 ;
}
/ * *
* Check if the current collapsed selection is on an empty line in case of a
* multiline value .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value te check .
2019-03-21 13:48:00 +01:00
*
* @ return { boolean } True if the line is empty , false if not .
* /
function isEmptyLine ( _ref2 ) {
var text = _ref2 . text ,
start = _ref2 . start ,
end = _ref2 . end ;
if ( start !== end ) {
return false ;
}
if ( text . length === 0 ) {
return true ;
}
if ( start === 0 && text . slice ( 0 , 1 ) === LINE _SEPARATOR ) {
return true ;
}
if ( start === text . length && text . slice ( - 1 ) === LINE _SEPARATOR ) {
return true ;
}
return text . slice ( start - 1 , end + 1 ) === "" . concat ( LINE _SEPARATOR ) . concat ( LINE _SEPARATOR ) ;
}
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/join.js
2018-12-14 05:41:57 +01:00
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-14 05:41:57 +01:00
/ * *
* Combine an array of Rich Text values into one , optionally separated by
* ` separator ` , which can be a Rich Text value , HTML string , or plain text
* string . This is similar to ` Array.prototype.join ` .
*
2020-10-13 15:10:30 +02:00
* @ param { Array < RichTextValue > } values An array of values to join .
* @ param { string | RichTextValue } [ separator ] Separator string or value .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A new combined value .
2018-12-14 05:41:57 +01:00
* /
function join ( values ) {
var separator = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : '' ;
if ( typeof separator === 'string' ) {
2018-12-18 04:14:52 +01:00
separator = create ( {
2018-12-14 05:41:57 +01:00
text : separator
} ) ;
}
2018-12-18 04:14:52 +01:00
return normaliseFormats ( values . reduce ( function ( accumlator , _ref ) {
2018-12-14 05:41:57 +01:00
var formats = _ref . formats ,
2019-03-21 13:48:00 +01:00
replacements = _ref . replacements ,
2018-12-14 05:41:57 +01:00
text = _ref . text ;
return {
2019-03-21 13:48:00 +01:00
formats : accumlator . formats . concat ( separator . formats , formats ) ,
replacements : accumlator . replacements . concat ( separator . replacements , replacements ) ,
text : accumlator . text + separator . text + text
2018-12-14 05:41:57 +01:00
} ;
} ) ) ;
}
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/register-format-type.js
Block Editor: Update `@wordpress` dependencies to match Gutenberg 4.5.1.
- Update the annotations, api-fetch, block-library, blocks, components, compose, core-data, data, date, dom, edit-post, editor, element, format-library, html-entities, i18n, jest-console, jest-preset-default, keycodes, list-reusable-blocks, notices, nux, plugins, rich-text, scripts, token-lists, url, viewport packages.
- Upgrades React from 16.5.2 to 16.6.3.
- Adds a missing `wp-date` dependency to the editor script.
- Updates changed dependencies in `script-loader.php`.
- Fixes undefined notices in some blocks.
- Removes incorrect `gutenberg` textdomain.
Merges [43891], [43903], and [43919] to trunk.
Props atimmer, aduth, youknowriad, danielbachhuber.
See #45145.
Built from https://develop.svn.wordpress.org/trunk@44262
git-svn-id: http://core.svn.wordpress.org/trunk@44092 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-17 16:37:00 +01:00
2018-12-17 05:52:00 +01:00
2020-02-06 22:03:31 +01:00
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 ; }
2018-12-14 12:02:53 +01:00
/ * *
* WordPress dependencies
* /
2020-01-08 12:57:23 +01:00
/ * *
* @ typedef { Object } WPFormat
*
* @ 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 .
* /
2018-12-14 12:02:53 +01:00
/ * *
* Registers a new format provided a unique name and an object defining its
* behavior .
*
2019-03-21 13:48:00 +01:00
* @ param { string } name Format name .
2020-01-08 12:57:23 +01:00
* @ param { WPFormat } settings Format settings .
2018-12-14 12:02:53 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { WPFormat | undefined } The format , if it has been successfully
* registered ; otherwise ` undefined ` .
2018-12-14 12:02:53 +01:00
* /
function registerFormatType ( name , settings ) {
2020-02-06 22:03:31 +01:00
settings = register _format _type _objectSpread ( {
2018-12-14 12:02:53 +01:00
name : name
} , settings ) ;
if ( typeof settings . name !== 'string' ) {
window . console . error ( 'Format names must be strings.' ) ;
return ;
}
if ( ! /^[a-z][a-z0-9-]*\/[a-z][a-z0-9-]*$/ . test ( settings . name ) ) {
window . console . error ( 'Format names must contain a namespace prefix, include only lowercase alphanumeric characters or dashes, and start with a letter. Example: my-plugin/my-custom-format' ) ;
return ;
}
2018-12-18 04:14:52 +01:00
if ( Object ( external _this _wp _data _ [ "select" ] ) ( 'core/rich-text' ) . getFormatType ( settings . name ) ) {
2018-12-14 12:02:53 +01:00
window . console . error ( 'Format "' + settings . name + '" is already registered.' ) ;
return ;
}
2018-12-17 05:52:00 +01:00
if ( typeof settings . tagName !== 'string' || settings . tagName === '' ) {
window . console . error ( 'Format tag names must be a string.' ) ;
return ;
}
if ( ( typeof settings . className !== 'string' || settings . className === '' ) && settings . className !== null ) {
window . console . error ( 'Format class names must be a string, or null to handle bare elements.' ) ;
return ;
}
if ( ! /^[_a-zA-Z]+[a-zA-Z0-9-]*$/ . test ( settings . className ) ) {
window . console . error ( 'A class name must begin with a letter, followed by any number of hyphens, letters, or numbers.' ) ;
2018-12-14 12:02:53 +01:00
return ;
}
2018-12-17 05:52:00 +01:00
if ( settings . className === null ) {
2018-12-18 04:14:52 +01:00
var formatTypeForBareElement = Object ( external _this _wp _data _ [ "select" ] ) ( 'core/rich-text' ) . getFormatTypeForBareElement ( settings . tagName ) ;
2018-12-17 05:52:00 +01:00
if ( formatTypeForBareElement ) {
window . console . error ( "Format \"" . concat ( formatTypeForBareElement . name , "\" is already registered to handle bare tag name \"" ) . concat ( settings . tagName , "\"." ) ) ;
return ;
}
} else {
2018-12-18 04:14:52 +01:00
var formatTypeForClassName = Object ( external _this _wp _data _ [ "select" ] ) ( 'core/rich-text' ) . getFormatTypeForClassName ( settings . className ) ;
2018-12-17 05:52:00 +01:00
if ( formatTypeForClassName ) {
window . console . error ( "Format \"" . concat ( formatTypeForClassName . name , "\" is already registered to handle class name \"" ) . concat ( settings . className , "\"." ) ) ;
return ;
}
}
2018-12-14 12:02:53 +01:00
if ( ! ( 'title' in settings ) || settings . title === '' ) {
window . console . error ( 'The format "' + settings . name + '" must have a title.' ) ;
return ;
}
if ( 'keywords' in settings && settings . keywords . length > 3 ) {
window . console . error ( 'The format "' + settings . name + '" can have a maximum of 3 keywords.' ) ;
2020-01-22 23:06:21 +01:00
return ;
}
Block Editor: Update `@wordpress` dependencies to match Gutenberg 4.5.1.
- Update the annotations, api-fetch, block-library, blocks, components, compose, core-data, data, date, dom, edit-post, editor, element, format-library, html-entities, i18n, jest-console, jest-preset-default, keycodes, list-reusable-blocks, notices, nux, plugins, rich-text, scripts, token-lists, url, viewport packages.
- Upgrades React from 16.5.2 to 16.6.3.
- Adds a missing `wp-date` dependency to the editor script.
- Updates changed dependencies in `script-loader.php`.
- Fixes undefined notices in some blocks.
- Removes incorrect `gutenberg` textdomain.
Merges [43891], [43903], and [43919] to trunk.
Props atimmer, aduth, youknowriad, danielbachhuber.
See #45145.
Built from https://develop.svn.wordpress.org/trunk@44262
git-svn-id: http://core.svn.wordpress.org/trunk@44092 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2018-12-17 16:37:00 +01:00
2020-01-22 23:06:21 +01:00
if ( typeof settings . title !== 'string' ) {
window . console . error ( 'Format titles must be strings.' ) ;
return ;
2018-12-17 05:52:00 +01:00
}
2020-01-22 23:06:21 +01:00
Object ( external _this _wp _data _ [ "dispatch" ] ) ( 'core/rich-text' ) . addFormatTypes ( settings ) ;
2018-12-14 12:02:53 +01:00
return settings ;
}
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/remove-format.js
2019-03-21 13:48:00 +01:00
2020-02-06 22:03:31 +01:00
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 ; }
2018-12-14 05:41:57 +01:00
/ * *
* External dependencies
* /
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-14 05:41:57 +01:00
/ * *
* Remove any format object from a Rich Text value by type from the given
* ` startIndex ` to the given ` endIndex ` . Indices are retrieved from the
* selection if none are provided .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to modify .
* @ param { string } formatType Format type to remove .
* @ param { number } [ startIndex ] Start index .
* @ param { number } [ endIndex ] End index .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A new value with the format applied .
2018-12-14 05:41:57 +01:00
* /
2019-03-21 13:48:00 +01:00
function removeFormat ( value , formatType ) {
var startIndex = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : value . start ;
var endIndex = arguments . length > 3 && arguments [ 3 ] !== undefined ? arguments [ 3 ] : value . end ;
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
var formats = value . formats ,
activeFormats = value . activeFormats ;
var newFormats = formats . slice ( ) ; // If the selection is collapsed, expand start and end to the edges of the
2018-12-14 05:41:57 +01:00
// format.
if ( startIndex === endIndex ) {
2020-01-03 14:17:24 +01:00
var format = Object ( external _this _lodash _ [ "find" ] ) ( newFormats [ startIndex ] , {
2018-12-14 05:41:57 +01:00
type : formatType
} ) ;
2019-03-21 13:48:00 +01:00
if ( format ) {
2020-01-03 14:17:24 +01:00
while ( Object ( external _this _lodash _ [ "find" ] ) ( newFormats [ startIndex ] , format ) ) {
2019-03-21 13:48:00 +01:00
filterFormats ( newFormats , startIndex , formatType ) ;
startIndex -- ;
}
2018-12-14 05:41:57 +01:00
endIndex ++ ;
2019-03-21 13:48:00 +01:00
2020-01-03 14:17:24 +01:00
while ( Object ( external _this _lodash _ [ "find" ] ) ( newFormats [ endIndex ] , format ) ) {
2019-03-21 13:48:00 +01:00
filterFormats ( newFormats , endIndex , formatType ) ;
endIndex ++ ;
}
2018-12-14 05:41:57 +01:00
}
} else {
for ( var i = startIndex ; i < endIndex ; i ++ ) {
if ( newFormats [ i ] ) {
filterFormats ( newFormats , i , formatType ) ;
}
}
}
2020-10-13 15:10:30 +02:00
return normaliseFormats ( remove _format _objectSpread ( remove _format _objectSpread ( { } , value ) , { } , {
2019-05-16 20:08:00 +02:00
formats : newFormats ,
2020-01-03 14:17:24 +01:00
activeFormats : Object ( external _this _lodash _ [ "reject" ] ) ( activeFormats , {
2019-05-16 20:08:00 +02:00
type : formatType
} )
2019-03-21 13:48:00 +01:00
} ) ) ;
2018-12-14 05:41:57 +01:00
}
function filterFormats ( formats , index , formatType ) {
2019-03-21 13:48:00 +01:00
var newFormats = formats [ index ] . filter ( function ( _ref ) {
var type = _ref . type ;
2018-12-14 05:41:57 +01:00
return type !== formatType ;
} ) ;
if ( newFormats . length ) {
formats [ index ] = newFormats ;
} else {
delete formats [ index ] ;
}
}
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/insert.js
/ * *
* Internal dependencies
* /
2018-12-14 05:41:57 +01:00
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-18 04:14:52 +01:00
/ * *
* Insert a Rich Text value , an HTML string , or a plain text string , into a
* Rich Text value at the given ` startIndex ` . Any content between ` startIndex `
* and ` endIndex ` will be removed . Indices are retrieved from the selection if
* none are provided .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to modify .
* @ param { RichTextValue | string } valueToInsert Value to insert .
* @ param { number } [ startIndex ] Start index .
* @ param { number } [ endIndex ] End index .
2018-12-18 04:14:52 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A new value with the value inserted .
2018-12-18 04:14:52 +01:00
* /
2018-12-14 05:41:57 +01:00
2019-03-21 13:48:00 +01:00
function insert ( value , valueToInsert ) {
var startIndex = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : value . start ;
var endIndex = arguments . length > 3 && arguments [ 3 ] !== undefined ? arguments [ 3 ] : value . end ;
var formats = value . formats ,
replacements = value . replacements ,
text = value . text ;
2018-12-18 04:14:52 +01:00
if ( typeof valueToInsert === 'string' ) {
valueToInsert = create ( {
text : valueToInsert
} ) ;
}
var index = startIndex + valueToInsert . text . length ;
return normaliseFormats ( {
formats : formats . slice ( 0 , startIndex ) . concat ( valueToInsert . formats , formats . slice ( endIndex ) ) ,
2019-03-21 13:48:00 +01:00
replacements : replacements . slice ( 0 , startIndex ) . concat ( valueToInsert . replacements , replacements . slice ( endIndex ) ) ,
2018-12-18 04:14:52 +01:00
text : text . slice ( 0 , startIndex ) + valueToInsert . text + text . slice ( endIndex ) ,
start : index ,
end : index
} ) ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/remove.js
2018-12-14 05:41:57 +01:00
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-14 05:41:57 +01:00
/ * *
* Remove content from a Rich Text value between the given ` startIndex ` and
* ` endIndex ` . Indices are retrieved from the selection if none are provided .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to modify .
* @ param { number } [ startIndex ] Start index .
* @ param { number } [ endIndex ] End index .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A new value with the content removed .
2018-12-14 05:41:57 +01:00
* /
2018-12-18 04:14:52 +01:00
function remove _remove ( value , startIndex , endIndex ) {
return insert ( value , create ( ) , startIndex , endIndex ) ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/replace.js
2018-12-14 05:41:57 +01:00
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-14 05:41:57 +01:00
/ * *
* Search a Rich Text value and replace the match ( es ) with ` replacement ` . This
* is similar to ` String.prototype.replace ` .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value The value to modify .
2018-12-14 05:41:57 +01:00
* @ param { RegExp | string } pattern A RegExp object or literal . Can also be
* a string . It is treated as a verbatim
* string and is not interpreted as a
* regular expression . Only the first
* occurrence will be replaced .
* @ param { Function | string } replacement The match or matches are replaced with
* the specified or the value returned by
* the specified function .
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A new value with replacements applied .
2018-12-14 05:41:57 +01:00
* /
2019-09-19 17:19:18 +02:00
function replace _replace ( _ref , pattern , replacement ) {
2018-12-14 05:41:57 +01:00
var formats = _ref . formats ,
2019-03-21 13:48:00 +01:00
replacements = _ref . replacements ,
2018-12-14 05:41:57 +01:00
text = _ref . text ,
start = _ref . start ,
end = _ref . end ;
text = text . replace ( pattern , function ( match ) {
for ( var _len = arguments . length , rest = new Array ( _len > 1 ? _len - 1 : 0 ) , _key = 1 ; _key < _len ; _key ++ ) {
rest [ _key - 1 ] = arguments [ _key ] ;
}
var offset = rest [ rest . length - 2 ] ;
var newText = replacement ;
var newFormats ;
2019-03-21 13:48:00 +01:00
var newReplacements ;
2018-12-14 05:41:57 +01:00
if ( typeof newText === 'function' ) {
newText = replacement . apply ( void 0 , [ match ] . concat ( rest ) ) ;
}
2018-12-18 04:14:52 +01:00
if ( Object ( esm _typeof [ "a" /* default */ ] ) ( newText ) === 'object' ) {
2018-12-14 05:41:57 +01:00
newFormats = newText . formats ;
2019-03-21 13:48:00 +01:00
newReplacements = newText . replacements ;
2018-12-14 05:41:57 +01:00
newText = newText . text ;
} else {
newFormats = Array ( newText . length ) ;
2019-03-21 13:48:00 +01:00
newReplacements = Array ( newText . length ) ;
2018-12-14 05:41:57 +01:00
if ( formats [ offset ] ) {
newFormats = newFormats . fill ( formats [ offset ] ) ;
}
}
formats = formats . slice ( 0 , offset ) . concat ( newFormats , formats . slice ( offset + match . length ) ) ;
2019-03-21 13:48:00 +01:00
replacements = replacements . slice ( 0 , offset ) . concat ( newReplacements , replacements . slice ( offset + match . length ) ) ;
2018-12-14 05:41:57 +01:00
if ( start ) {
start = end = offset + newText . length ;
}
return newText ;
} ) ;
2018-12-18 04:14:52 +01:00
return normaliseFormats ( {
2018-12-14 05:41:57 +01:00
formats : formats ,
2019-03-21 13:48:00 +01:00
replacements : replacements ,
2018-12-14 05:41:57 +01:00
text : text ,
start : start ,
end : end
} ) ;
}
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/insert-line-separator.js
/ * *
* Internal dependencies
* /
2018-12-14 05:41:57 +01:00
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-18 04:14:52 +01:00
/ * *
* Insert a line break character into a Rich Text value at the given
* ` startIndex ` . Any content between ` startIndex ` and ` endIndex ` will be
* removed . Indices are retrieved from the selection if none are provided .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to modify .
* @ param { number } [ startIndex ] Start index .
* @ param { number } [ endIndex ] End index .
2018-12-18 04:14:52 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A new value with the value inserted .
2018-12-18 04:14:52 +01:00
* /
function insertLineSeparator ( value ) {
var startIndex = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : value . start ;
var endIndex = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : value . end ;
var beforeText = getTextContent ( value ) . slice ( 0 , startIndex ) ;
var previousLineSeparatorIndex = beforeText . lastIndexOf ( LINE _SEPARATOR ) ;
2019-03-21 13:48:00 +01:00
var previousLineSeparatorFormats = value . replacements [ previousLineSeparatorIndex ] ;
var replacements = [ , ] ;
2018-12-18 04:14:52 +01:00
if ( previousLineSeparatorFormats ) {
2019-03-21 13:48:00 +01:00
replacements = [ previousLineSeparatorFormats ] ;
2018-12-18 04:14:52 +01:00
}
var valueToInsert = {
2019-03-21 13:48:00 +01:00
formats : [ , ] ,
replacements : replacements ,
2018-12-18 04:14:52 +01:00
text : LINE _SEPARATOR
} ;
return insert ( value , valueToInsert , startIndex , endIndex ) ;
}
2019-09-19 17:19:18 +02:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/remove-line-separator.js
2020-02-06 22:03:31 +01:00
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 ; }
2019-09-19 17:19:18 +02:00
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2019-09-19 17:19:18 +02:00
/ * *
2020-10-13 15:10:30 +02:00
* 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 .
2019-09-19 17:19:18 +02:00
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to modify .
* @ param { boolean } backward Indicates if are removing from the start
* index or the end index .
2019-09-19 17:19:18 +02:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue | undefined } A new value with the line separator
* removed . Or undefined if no line separator
* is found on the position .
2019-09-19 17:19:18 +02:00
* /
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 ) ;
2020-10-13 15:10:30 +02:00
newValue = remove _line _separator _objectSpread ( remove _line _separator _objectSpread ( { } , value ) , { } , {
2019-09-19 17:19:18 +02:00
replacements : newReplacements
} ) ;
} else {
newValue = remove _remove ( value , removeStart , removeEnd ) ;
}
return newValue ;
}
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/insert-object.js
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
/** @typedef {import('./create').RichTextFormat} RichTextFormat */
2018-12-18 04:14:52 +01:00
/ * *
* Insert a format as an object into a Rich Text value at the given
* ` startIndex ` . Any content between ` startIndex ` and ` endIndex ` will be
* removed . Indices are retrieved from the selection if none are provided .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to modify .
* @ param { RichTextFormat } formatToInsert Format to insert as object .
* @ param { number } [ startIndex ] Start index .
* @ param { number } [ endIndex ] End index .
2018-12-18 04:14:52 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A new value with the object inserted .
2018-12-18 04:14:52 +01:00
* /
function insertObject ( value , formatToInsert , startIndex , endIndex ) {
var valueToInsert = {
2019-03-21 13:48:00 +01:00
formats : [ , ] ,
replacements : [ formatToInsert ] ,
2020-10-13 15:10:30 +02:00
text : OBJECT _REPLACEMENT _CHARACTER
2018-12-18 04:14:52 +01:00
} ;
return insert ( value , valueToInsert , startIndex , endIndex ) ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/slice.js
2019-03-21 13:48:00 +01:00
2020-02-06 22:03:31 +01:00
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 ; }
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-14 05:41:57 +01:00
/ * *
* Slice a Rich Text value from ` startIndex ` to ` endIndex ` . Indices are
* retrieved from the selection if none are provided . This is similar to
* ` String.prototype.slice ` .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to modify .
* @ param { number } [ startIndex ] Start index .
* @ param { number } [ endIndex ] End index .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A new extracted value .
2018-12-14 05:41:57 +01:00
* /
2019-03-21 13:48:00 +01:00
function slice ( value ) {
var startIndex = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : value . start ;
var endIndex = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : value . end ;
var formats = value . formats ,
replacements = value . replacements ,
text = value . text ;
2018-12-14 05:41:57 +01:00
if ( startIndex === undefined || endIndex === undefined ) {
2020-02-06 22:03:31 +01:00
return slice _objectSpread ( { } , value ) ;
2018-12-14 05:41:57 +01:00
}
return {
formats : formats . slice ( startIndex , endIndex ) ,
2019-03-21 13:48:00 +01:00
replacements : replacements . slice ( startIndex , endIndex ) ,
2018-12-14 05:41:57 +01:00
text : text . slice ( startIndex , endIndex )
} ;
}
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/split.js
2018-12-14 05:41:57 +01:00
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-14 05:41:57 +01:00
/ * *
* Split a Rich Text value in two at the given ` startIndex ` and ` endIndex ` , or
* split at the given separator . This is similar to ` String.prototype.split ` .
* Indices are retrieved from the selection if none are provided .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value
2019-03-21 13:48:00 +01:00
* @ param { number | string } [ string ] Start index , or string at which to split .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { Array < RichTextValue > } An array of new values .
2018-12-14 05:41:57 +01:00
* /
function split ( _ref , string ) {
var formats = _ref . formats ,
2019-03-21 13:48:00 +01:00
replacements = _ref . replacements ,
2018-12-14 05:41:57 +01:00
text = _ref . text ,
start = _ref . start ,
end = _ref . end ;
if ( typeof string !== 'string' ) {
return splitAtSelection . apply ( void 0 , arguments ) ;
}
var nextStart = 0 ;
return text . split ( string ) . map ( function ( substring ) {
var startIndex = nextStart ;
var value = {
formats : formats . slice ( startIndex , startIndex + substring . length ) ,
2019-03-21 13:48:00 +01:00
replacements : replacements . slice ( startIndex , startIndex + substring . length ) ,
2018-12-14 05:41:57 +01:00
text : substring
} ;
nextStart += string . length + substring . length ;
if ( start !== undefined && end !== undefined ) {
if ( start >= startIndex && start < nextStart ) {
value . start = start - startIndex ;
} else if ( start < startIndex && end > startIndex ) {
value . start = 0 ;
}
if ( end >= startIndex && end < nextStart ) {
value . end = end - startIndex ;
} else if ( start < nextStart && end > nextStart ) {
value . end = substring . length ;
}
}
return value ;
} ) ;
}
function splitAtSelection ( _ref2 ) {
var formats = _ref2 . formats ,
2019-03-21 13:48:00 +01:00
replacements = _ref2 . replacements ,
2018-12-14 05:41:57 +01:00
text = _ref2 . text ,
start = _ref2 . start ,
end = _ref2 . end ;
var startIndex = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : start ;
var endIndex = arguments . length > 2 && arguments [ 2 ] !== undefined ? arguments [ 2 ] : end ;
var before = {
formats : formats . slice ( 0 , startIndex ) ,
2019-03-21 13:48:00 +01:00
replacements : replacements . slice ( 0 , startIndex ) ,
2018-12-14 05:41:57 +01:00
text : text . slice ( 0 , startIndex )
} ;
var after = {
formats : formats . slice ( endIndex ) ,
2019-03-21 13:48:00 +01:00
replacements : replacements . slice ( endIndex ) ,
2018-12-14 05:41:57 +01:00
text : text . slice ( endIndex ) ,
start : 0 ,
end : 0
} ;
return [ // Ensure newlines are trimmed.
2019-09-19 17:19:18 +02:00
replace _replace ( before , /\u2028+$/ , '' ) , replace _replace ( after , /^\u2028+/ , '' ) ] ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-format-type.js
2018-12-14 12:02:53 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* WordPress dependencies
2018-12-14 12:02:53 +01:00
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./register-format-type').RichTextFormatType} RichTextFormatType */
2018-12-14 12:02:53 +01:00
/ * *
2018-12-18 04:14:52 +01:00
* Returns a registered format type .
2018-12-14 12:02:53 +01:00
*
2018-12-18 04:14:52 +01:00
* @ param { string } name Format name .
2018-12-14 12:02:53 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextFormatType | undefined } Format type .
2018-12-14 12:02:53 +01:00
* /
2018-12-18 04:14:52 +01:00
function get _format _type _getFormatType ( name ) {
return Object ( external _this _wp _data _ [ "select" ] ) ( 'core/rich-text' ) . getFormatType ( name ) ;
2018-12-14 12:02:53 +01:00
}
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/to-tree.js
2018-12-14 12:02:53 +01:00
2020-02-06 22:03:31 +01:00
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 ; }
2018-12-14 12:02:53 +01:00
/ * *
* Internal dependencies
* /
2019-03-07 10:09:59 +01:00
/ * *
* Converts a format object to information that can be used to create an element
* from ( type , attributes and object ) .
*
* @ param { Object } $1 Named parameters .
* @ param { string } $1 . type The format type .
* @ param { Object } $1 . attributes The format attributes .
* @ param { Object } $1 . unregisteredAttributes The unregistered format
* attributes .
* @ param { boolean } $1 . object Wether or not it is an object
* format .
* @ param { boolean } $1 . boundaryClass Wether or not to apply a boundary
* class .
* @ return { Object } Information to be used for
* element creation .
* /
2018-12-18 04:14:52 +01:00
function fromFormat ( _ref ) {
var type = _ref . type ,
attributes = _ref . attributes ,
unregisteredAttributes = _ref . unregisteredAttributes ,
2019-03-07 10:09:59 +01:00
object = _ref . object ,
boundaryClass = _ref . boundaryClass ;
2018-12-18 04:14:52 +01:00
var formatType = get _format _type _getFormatType ( type ) ;
2019-03-07 10:09:59 +01:00
var elementAttributes = { } ;
if ( boundaryClass ) {
elementAttributes [ 'data-rich-text-format-boundary' ] = 'true' ;
}
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( ! formatType ) {
2019-03-07 10:09:59 +01:00
if ( attributes ) {
2020-10-13 15:10:30 +02:00
elementAttributes = to _tree _objectSpread ( to _tree _objectSpread ( { } , attributes ) , elementAttributes ) ;
2019-03-07 10:09:59 +01:00
}
2018-12-18 04:14:52 +01:00
return {
type : type ,
2019-03-07 10:09:59 +01:00
attributes : elementAttributes ,
2018-12-18 04:14:52 +01:00
object : object
} ;
}
2018-12-14 12:02:53 +01:00
2020-10-13 15:10:30 +02:00
elementAttributes = to _tree _objectSpread ( to _tree _objectSpread ( { } , unregisteredAttributes ) , elementAttributes ) ;
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
for ( var name in attributes ) {
2019-03-07 10:09:59 +01:00
var key = formatType . attributes ? formatType . attributes [ name ] : false ;
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( key ) {
elementAttributes [ key ] = attributes [ name ] ;
} else {
elementAttributes [ name ] = attributes [ name ] ;
}
}
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( formatType . className ) {
if ( elementAttributes . class ) {
elementAttributes . class = "" . concat ( formatType . className , " " ) . concat ( elementAttributes . class ) ;
} else {
elementAttributes . class = formatType . className ;
}
}
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
return {
type : formatType . tagName ,
object : formatType . object ,
attributes : elementAttributes
} ;
}
2020-01-22 23:06:21 +01:00
/ * *
* 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 ;
}
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
function toTree ( _ref2 ) {
var value = _ref2 . value ,
multilineTag = _ref2 . multilineTag ,
2020-01-08 12:57:23 +01:00
preserveWhiteSpace = _ref2 . preserveWhiteSpace ,
2018-12-18 04:14:52 +01:00
createEmpty = _ref2 . createEmpty ,
append = _ref2 . append ,
getLastChild = _ref2 . getLastChild ,
getParent = _ref2 . getParent ,
isText = _ref2 . isText ,
getText = _ref2 . getText ,
remove = _ref2 . remove ,
appendText = _ref2 . appendText ,
onStartIndex = _ref2 . onStartIndex ,
onEndIndex = _ref2 . onEndIndex ,
2019-09-19 17:19:18 +02:00
isEditableTree = _ref2 . isEditableTree ,
placeholder = _ref2 . placeholder ;
2018-12-18 04:14:52 +01:00
var formats = value . formats ,
2019-03-21 13:48:00 +01:00
replacements = value . replacements ,
2018-12-18 04:14:52 +01:00
text = value . text ,
start = value . start ,
2019-03-07 10:09:59 +01:00
end = value . end ;
2018-12-18 04:14:52 +01:00
var formatsLength = formats . length + 1 ;
var tree = createEmpty ( ) ;
var multilineFormat = {
type : multilineTag
} ;
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
var activeFormats = getActiveFormats ( value ) ;
var deepestActiveFormat = activeFormats [ activeFormats . length - 1 ] ;
2018-12-18 04:14:52 +01:00
var lastSeparatorFormats ;
var lastCharacterFormats ;
var lastCharacter ; // If we're building a multiline tree, start off with a multiline element.
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( multilineTag ) {
append ( append ( tree , {
type : multilineTag
} ) , '' ) ;
lastCharacterFormats = lastSeparatorFormats = [ multilineFormat ] ;
} else {
append ( tree , '' ) ;
}
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
var _loop = function _loop ( i ) {
var character = text . charAt ( i ) ;
2019-03-21 13:48:00 +01:00
var shouldInsertPadding = isEditableTree && ( // Pad the line if the line is empty.
! lastCharacter || lastCharacter === LINE _SEPARATOR || // Pad the line if the previous character is a line break, otherwise
// the line break won't be visible.
lastCharacter === '\n' ) ;
2018-12-18 04:14:52 +01:00
var characterFormats = formats [ i ] ; // Set multiline tags in queue for building the tree.
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( multilineTag ) {
if ( character === LINE _SEPARATOR ) {
2019-03-21 13:48:00 +01:00
characterFormats = lastSeparatorFormats = ( replacements [ i ] || [ ] ) . reduce ( function ( accumulator , format ) {
accumulator . push ( format , multilineFormat ) ;
2018-12-18 04:14:52 +01:00
return accumulator ;
} , [ multilineFormat ] ) ;
} else {
2019-03-07 10:09:59 +01:00
characterFormats = [ ] . concat ( Object ( toConsumableArray [ "a" /* default */ ] ) ( lastSeparatorFormats ) , Object ( toConsumableArray [ "a" /* default */ ] ) ( characterFormats || [ ] ) ) ;
2018-12-18 04:14:52 +01:00
}
}
2018-12-14 12:02:53 +01:00
2019-03-21 13:48:00 +01:00
var pointer = getLastChild ( tree ) ;
2018-12-14 12:02:53 +01:00
2019-03-21 13:48:00 +01:00
if ( shouldInsertPadding && character === LINE _SEPARATOR ) {
2018-12-18 04:14:52 +01:00
var node = pointer ;
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
while ( ! isText ( node ) ) {
node = getLastChild ( node ) ;
}
2018-12-17 05:52:00 +01:00
2019-09-19 17:19:18 +02:00
append ( getParent ( node ) , ZWNBSP ) ;
2019-03-21 13:48:00 +01:00
} // Set selection for the start of line.
if ( lastCharacter === LINE _SEPARATOR ) {
var _node = pointer ;
while ( ! isText ( _node ) ) {
_node = getLastChild ( _node ) ;
}
2018-12-18 04:14:52 +01:00
if ( onStartIndex && start === i ) {
2019-03-21 13:48:00 +01:00
onStartIndex ( tree , _node ) ;
2018-12-18 04:14:52 +01:00
}
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( onEndIndex && end === i ) {
2019-03-21 13:48:00 +01:00
onEndIndex ( tree , _node ) ;
2018-12-18 04:14:52 +01:00
}
}
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( characterFormats ) {
characterFormats . forEach ( function ( format , formatIndex ) {
2020-01-22 23:06:21 +01:00
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
2018-12-18 04:14:52 +01:00
// line separator.
character !== LINE _SEPARATOR || characterFormats . length - 1 !== formatIndex ) ) {
pointer = getLastChild ( pointer ) ;
return ;
}
2018-12-17 05:52:00 +01:00
2019-03-07 10:09:59 +01:00
var type = format . type ,
attributes = format . attributes ,
2019-03-21 13:48:00 +01:00
unregisteredAttributes = format . unregisteredAttributes ;
var boundaryClass = isEditableTree && character !== LINE _SEPARATOR && format === deepestActiveFormat ;
2018-12-18 04:14:52 +01:00
var parent = getParent ( pointer ) ;
2019-03-07 10:09:59 +01:00
var newNode = append ( parent , fromFormat ( {
type : type ,
attributes : attributes ,
unregisteredAttributes : unregisteredAttributes ,
boundaryClass : boundaryClass
} ) ) ;
2018-12-17 05:52:00 +01:00
2018-12-18 04:14:52 +01:00
if ( isText ( pointer ) && getText ( pointer ) . length === 0 ) {
remove ( pointer ) ;
}
2019-03-21 13:48:00 +01:00
pointer = append ( newNode , '' ) ;
2018-12-18 04:14:52 +01:00
} ) ;
} // No need for further processing if the character is a line separator.
if ( character === LINE _SEPARATOR ) {
lastCharacterFormats = characterFormats ;
lastCharacter = character ;
return "continue" ;
2019-03-07 10:09:59 +01:00
} // If there is selection at 0, handle it before characters are inserted.
2018-12-18 04:14:52 +01:00
if ( i === 0 ) {
if ( onStartIndex && start === 0 ) {
onStartIndex ( tree , pointer ) ;
}
if ( onEndIndex && end === 0 ) {
onEndIndex ( tree , pointer ) ;
}
}
2019-03-21 13:48:00 +01:00
if ( character === OBJECT _REPLACEMENT _CHARACTER ) {
2020-10-13 15:10:30 +02:00
pointer = append ( getParent ( pointer ) , fromFormat ( to _tree _objectSpread ( to _tree _objectSpread ( { } , replacements [ i ] ) , { } , {
2019-03-21 13:48:00 +01:00
object : true
} ) ) ) ; // Ensure pointer is text node.
pointer = append ( getParent ( pointer ) , '' ) ;
2020-01-08 12:57:23 +01:00
} else if ( ! preserveWhiteSpace && character === '\n' ) {
2019-03-21 13:48:00 +01:00
pointer = append ( getParent ( pointer ) , {
type : 'br' ,
attributes : isEditableTree ? {
'data-rich-text-line-break' : 'true'
} : undefined ,
object : true
} ) ; // Ensure pointer is text node.
pointer = append ( getParent ( pointer ) , '' ) ;
} else if ( ! isText ( pointer ) ) {
pointer = append ( getParent ( pointer ) , character ) ;
} else {
appendText ( pointer , character ) ;
2018-12-18 04:14:52 +01:00
}
if ( onStartIndex && start === i + 1 ) {
onStartIndex ( tree , pointer ) ;
}
2018-12-17 05:52:00 +01:00
2018-12-18 04:14:52 +01:00
if ( onEndIndex && end === i + 1 ) {
onEndIndex ( tree , pointer ) ;
2018-12-17 05:52:00 +01:00
}
2019-03-21 13:48:00 +01:00
if ( shouldInsertPadding && i === text . length ) {
2019-09-19 17:19:18 +02:00
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'
}
} ) ;
}
2019-03-21 13:48:00 +01:00
}
2018-12-18 04:14:52 +01:00
lastCharacterFormats = characterFormats ;
lastCharacter = character ;
} ;
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
for ( var i = 0 ; i < formatsLength ; i ++ ) {
var _ret = _loop ( i ) ;
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
if ( _ret === "continue" ) continue ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
return tree ;
}
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/to-dom.js
2018-12-17 05:52:00 +01:00
2018-12-14 05:41:57 +01:00
2020-02-06 22:03:31 +01:00
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 ; }
2018-12-14 05:41:57 +01:00
/ * *
* Internal dependencies
* /
2018-12-19 04:16:48 +01:00
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-14 05:41:57 +01:00
/ * *
* Creates a path as an array of indices from the given root node to the given
* node .
*
* @ param { Node } node Node to find the path of .
* @ param { HTMLElement } rootNode Root node to find the path from .
* @ param { Array } path Initial path to build on .
*
* @ return { Array } The path from the root node to the node .
* /
function createPathToNode ( node , rootNode , path ) {
var parentNode = node . parentNode ;
var i = 0 ;
while ( node = node . previousSibling ) {
i ++ ;
}
2018-12-18 04:14:52 +01:00
path = [ i ] . concat ( Object ( toConsumableArray [ "a" /* default */ ] ) ( path ) ) ;
2018-12-14 05:41:57 +01:00
if ( parentNode !== rootNode ) {
path = createPathToNode ( parentNode , rootNode , path ) ;
}
return path ;
}
/ * *
* Gets a node given a path ( array of indices ) from the given node .
*
* @ param { HTMLElement } node Root node to find the wanted node in .
* @ param { Array } path Path ( indices ) to the wanted node .
*
* @ return { Object } Object with the found node and the remaining offset ( if any ) .
* /
function getNodeByPath ( node , path ) {
2018-12-18 04:14:52 +01:00
path = Object ( toConsumableArray [ "a" /* default */ ] ) ( path ) ;
2018-12-14 05:41:57 +01:00
while ( node && path . length > 1 ) {
node = node . childNodes [ path . shift ( ) ] ;
}
return {
node : node ,
offset : path [ 0 ]
} ;
}
2018-12-18 04:14:52 +01:00
function to _dom _append ( element , child ) {
2018-12-14 05:41:57 +01:00
if ( typeof child === 'string' ) {
child = element . ownerDocument . createTextNode ( child ) ;
}
var _child = child ,
type = _child . type ,
attributes = _child . attributes ;
if ( type ) {
child = element . ownerDocument . createElement ( type ) ;
for ( var key in attributes ) {
child . setAttribute ( key , attributes [ key ] ) ;
}
}
return element . appendChild ( child ) ;
}
2018-12-18 04:14:52 +01:00
function to _dom _appendText ( node , text ) {
2018-12-14 05:41:57 +01:00
node . appendData ( text ) ;
}
2018-12-18 04:14:52 +01:00
function to _dom _getLastChild ( _ref ) {
2018-12-14 05:41:57 +01:00
var lastChild = _ref . lastChild ;
return lastChild ;
}
2018-12-18 04:14:52 +01:00
function to _dom _getParent ( _ref2 ) {
2018-12-14 05:41:57 +01:00
var parentNode = _ref2 . parentNode ;
return parentNode ;
}
2020-06-26 15:33:47 +02:00
function to _dom _isText ( node ) {
return node . nodeType === node . TEXT _NODE ;
2018-12-14 05:41:57 +01:00
}
2020-06-26 15:33:47 +02:00
function to _dom _getText ( _ref3 ) {
var nodeValue = _ref3 . nodeValue ;
2018-12-14 05:41:57 +01:00
return nodeValue ;
}
2018-12-18 04:14:52 +01:00
function to _dom _remove ( node ) {
2018-12-14 05:41:57 +01:00
return node . parentNode . removeChild ( node ) ;
}
2020-06-26 15:33:47 +02:00
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 ;
2018-12-14 05:41:57 +01:00
var startPath = [ ] ;
var endPath = [ ] ;
2019-09-19 17:19:18 +02:00
if ( prepareEditableTree ) {
2020-10-13 15:10:30 +02:00
value = to _dom _objectSpread ( to _dom _objectSpread ( { } , value ) , { } , {
2019-09-19 17:19:18 +02:00
formats : prepareEditableTree ( value )
} ) ;
}
2020-06-26 15:33:47 +02:00
/ * *
* 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 , '' ) ;
} ;
2019-09-19 17:19:18 +02:00
2018-12-18 04:14:52 +01:00
var tree = toTree ( {
2019-09-19 17:19:18 +02:00
value : value ,
2018-12-15 12:00:40 +01:00
multilineTag : multilineTag ,
2020-06-26 15:33:47 +02:00
createEmpty : createEmpty ,
2018-12-18 04:14:52 +01:00
append : to _dom _append ,
getLastChild : to _dom _getLastChild ,
getParent : to _dom _getParent ,
isText : to _dom _isText ,
getText : to _dom _getText ,
remove : to _dom _remove ,
appendText : to _dom _appendText ,
2018-12-15 12:00:40 +01:00
onStartIndex : function onStartIndex ( body , pointer ) {
2018-12-14 05:41:57 +01:00
startPath = createPathToNode ( pointer , body , [ pointer . nodeValue . length ] ) ;
} ,
2018-12-15 12:00:40 +01:00
onEndIndex : function onEndIndex ( body , pointer ) {
2018-12-14 05:41:57 +01:00
endPath = createPathToNode ( pointer , body , [ pointer . nodeValue . length ] ) ;
} ,
2019-09-19 17:19:18 +02:00
isEditableTree : isEditableTree ,
placeholder : placeholder
2018-12-14 05:41:57 +01:00
} ) ;
return {
body : tree ,
selection : {
startPath : startPath ,
endPath : endPath
}
} ;
}
/ * *
* Create an ` Element ` tree from a Rich Text value and applies the difference to
* the ` Element ` tree contained by ` current ` . If a ` multilineTag ` is provided ,
* text separated by two new lines will be wrapped in an ` Element ` of that type .
*
2020-10-13 15:10:30 +02:00
* @ param { Object } $1 Named arguments .
* @ param { RichTextValue } $1 . value Value to apply .
* @ param { HTMLElement } $1 . current The live root node to apply the element tree to .
* @ param { string } [ $1 . multilineTag ] Multiline tag .
* @ param { Function } [ $1 . prepareEditableTree ] Function to filter editorable formats .
* @ param { boolean } [ $1 . _ _unstableDomOnly ] Only apply elements , no selection .
* @ param { string } [ $1 . placeholder ] Placeholder text .
2018-12-14 05:41:57 +01:00
* /
2020-06-26 15:33:47 +02:00
function apply ( _ref5 ) {
var value = _ref5 . value ,
current = _ref5 . current ,
multilineTag = _ref5 . multilineTag ,
prepareEditableTree = _ref5 . prepareEditableTree ,
_ _unstableDomOnly = _ref5 . _ _unstableDomOnly ,
placeholder = _ref5 . placeholder ;
2018-12-15 12:00:40 +01:00
2018-12-14 05:41:57 +01:00
// Construct a new element tree in memory.
2018-12-15 12:00:40 +01:00
var _toDom = toDom ( {
value : value ,
multilineTag : multilineTag ,
2019-09-19 17:19:18 +02:00
prepareEditableTree : prepareEditableTree ,
2020-06-26 15:33:47 +02:00
placeholder : placeholder ,
doc : current . ownerDocument
2018-12-15 12:00:40 +01:00
} ) ,
2018-12-14 05:41:57 +01:00
body = _toDom . body ,
selection = _toDom . selection ;
applyValue ( body , current ) ;
2019-03-07 10:09:59 +01:00
if ( value . start !== undefined && ! _ _unstableDomOnly ) {
2018-12-14 05:41:57 +01:00
applySelection ( selection , current ) ;
}
}
function applyValue ( future , current ) {
var i = 0 ;
2018-12-19 04:16:48 +01:00
var futureChild ;
2018-12-14 05:41:57 +01:00
2018-12-19 04:16:48 +01:00
while ( futureChild = future . firstChild ) {
2018-12-14 05:41:57 +01:00
var currentChild = current . childNodes [ i ] ;
if ( ! currentChild ) {
2018-12-19 04:16:48 +01:00
current . appendChild ( futureChild ) ;
} else if ( ! currentChild . isEqualNode ( futureChild ) ) {
2020-06-26 15:33:47 +02:00
if ( currentChild . nodeName !== futureChild . nodeName || currentChild . nodeType === currentChild . TEXT _NODE && currentChild . data !== futureChild . data ) {
2019-03-07 10:09:59 +01:00
current . replaceChild ( futureChild , currentChild ) ;
} else {
var currentAttributes = currentChild . attributes ;
var futureAttributes = futureChild . attributes ;
if ( currentAttributes ) {
2019-09-19 17:19:18 +02:00
var ii = currentAttributes . length ; // Reverse loop because `removeAttribute` on `currentChild`
// changes `currentAttributes`.
while ( ii -- ) {
2019-03-07 10:09:59 +01:00
var name = currentAttributes [ ii ] . name ;
if ( ! futureChild . getAttribute ( name ) ) {
currentChild . removeAttribute ( name ) ;
}
}
}
if ( futureAttributes ) {
for ( var _ii = 0 ; _ii < futureAttributes . length ; _ii ++ ) {
var _futureAttributes$ _ii = futureAttributes [ _ii ] ,
2020-02-06 22:03:31 +01:00
_name = _futureAttributes$ _ii . name ,
2019-03-07 10:09:59 +01:00
value = _futureAttributes$ _ii . value ;
2020-02-06 22:03:31 +01:00
if ( currentChild . getAttribute ( _name ) !== value ) {
currentChild . setAttribute ( _name , value ) ;
2019-03-07 10:09:59 +01:00
}
}
}
applyValue ( futureChild , currentChild ) ;
future . removeChild ( futureChild ) ;
}
2018-12-14 05:41:57 +01:00
} else {
2018-12-19 04:16:48 +01:00
future . removeChild ( futureChild ) ;
2018-12-14 05:41:57 +01:00
}
i ++ ;
}
while ( current . childNodes [ i ] ) {
current . removeChild ( current . childNodes [ i ] ) ;
}
}
2018-12-19 04:16:48 +01:00
/ * *
* Returns true if two ranges are equal , or false otherwise . Ranges are
* considered equal if their start and end occur in the same container and
* offset .
*
* @ param { Range } a First range object to test .
* @ param { Range } b First range object to test .
*
* @ return { boolean } Whether the two ranges are equal .
* /
function isRangeEqual ( a , b ) {
return a . startContainer === b . startContainer && a . startOffset === b . startOffset && a . endContainer === b . endContainer && a . endOffset === b . endOffset ;
}
2020-06-26 15:33:47 +02:00
function applySelection ( _ref6 , current ) {
var startPath = _ref6 . startPath ,
endPath = _ref6 . endPath ;
2019-03-07 10:09:59 +01:00
var _getNodeByPath = getNodeByPath ( current , startPath ) ,
2018-12-14 05:41:57 +01:00
startContainer = _getNodeByPath . node ,
startOffset = _getNodeByPath . offset ;
2019-03-07 10:09:59 +01:00
var _getNodeByPath2 = getNodeByPath ( current , endPath ) ,
2018-12-14 05:41:57 +01:00
endContainer = _getNodeByPath2 . node ,
endOffset = _getNodeByPath2 . offset ;
2019-03-07 10:09:59 +01:00
var ownerDocument = current . ownerDocument ;
2020-06-26 15:33:47 +02:00
var defaultView = ownerDocument . defaultView ;
var selection = defaultView . getSelection ( ) ;
2019-03-07 10:09:59 +01:00
var range = ownerDocument . createRange ( ) ;
range . setStart ( startContainer , startOffset ) ;
2020-02-06 22:03:31 +01:00
range . setEnd ( endContainer , endOffset ) ;
var activeElement = ownerDocument . activeElement ;
2018-12-14 05:41:57 +01:00
2019-03-07 10:09:59 +01:00
if ( selection . rangeCount > 0 ) {
2018-12-19 04:16:48 +01:00
// 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.
2019-03-07 10:09:59 +01:00
if ( isRangeEqual ( range , selection . getRangeAt ( 0 ) ) ) {
2018-12-19 04:16:48 +01:00
return ;
}
2019-03-07 10:09:59 +01:00
selection . removeAllRanges ( ) ;
2018-12-19 04:16:48 +01:00
}
2020-03-03 00:21:15 +01:00
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
2020-03-24 00:40:19 +01:00
// its previous state.
2020-03-03 00:21:15 +01:00
2020-06-26 15:33:47 +02:00
if ( activeElement !== ownerDocument . activeElement ) {
2020-03-03 00:21:15 +01:00
// 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
2020-06-26 15:33:47 +02:00
if ( activeElement instanceof defaultView . HTMLElement ) {
2020-03-24 00:40:19 +01:00
activeElement . focus ( ) ;
2020-03-03 00:21:15 +01:00
}
}
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
// EXTERNAL MODULE: external {"this":["wp","escapeHtml"]}
2020-10-13 15:10:30 +02:00
var external _this _wp _escapeHtml _ = _ _webpack _require _ _ ( 107 ) ;
2018-12-14 05:41:57 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/to-html-string.js
2018-12-14 05:41:57 +01:00
/ * *
2019-03-07 10:09:59 +01:00
* WordPress dependencies
2018-12-14 05:41:57 +01:00
* /
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-14 05:41:57 +01:00
/ * *
* Create an HTML string from a Rich Text value . If a ` multilineTag ` is
2018-12-15 12:00:40 +01:00
* provided , text separated by a line separator will be wrapped in it .
2018-12-14 05:41:57 +01:00
*
2020-10-13 15:10:30 +02:00
* @ param { Object } $1 Named argements .
* @ param { RichTextValue } $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 .
2018-12-14 05:41:57 +01:00
*
* @ return { string } HTML string .
* /
2018-12-15 12:00:40 +01:00
function toHTMLString ( _ref ) {
var value = _ref . value ,
2020-01-08 12:57:23 +01:00
multilineTag = _ref . multilineTag ,
preserveWhiteSpace = _ref . preserveWhiteSpace ;
2018-12-18 04:14:52 +01:00
var tree = toTree ( {
2018-12-15 12:00:40 +01:00
value : value ,
multilineTag : multilineTag ,
2020-01-08 12:57:23 +01:00
preserveWhiteSpace : preserveWhiteSpace ,
2018-12-18 04:14:52 +01:00
createEmpty : to _html _string _createEmpty ,
append : to _html _string _append ,
getLastChild : to _html _string _getLastChild ,
getParent : to _html _string _getParent ,
isText : to _html _string _isText ,
getText : to _html _string _getText ,
remove : to _html _string _remove ,
appendText : to _html _string _appendText
2018-12-14 05:41:57 +01:00
} ) ;
return createChildrenHTML ( tree . children ) ;
}
2018-12-18 04:14:52 +01:00
function to _html _string _createEmpty ( ) {
2018-12-15 12:00:40 +01:00
return { } ;
2018-12-14 05:41:57 +01:00
}
2018-12-18 04:14:52 +01:00
function to _html _string _getLastChild ( _ref2 ) {
2018-12-15 12:00:40 +01:00
var children = _ref2 . children ;
2018-12-14 05:41:57 +01:00
return children && children [ children . length - 1 ] ;
}
2018-12-18 04:14:52 +01:00
function to _html _string _append ( parent , object ) {
2018-12-14 05:41:57 +01:00
if ( typeof object === 'string' ) {
object = {
text : object
} ;
}
object . parent = parent ;
parent . children = parent . children || [ ] ;
parent . children . push ( object ) ;
return object ;
}
2018-12-18 04:14:52 +01:00
function to _html _string _appendText ( object , text ) {
2018-12-14 05:41:57 +01:00
object . text += text ;
}
2018-12-18 04:14:52 +01:00
function to _html _string _getParent ( _ref3 ) {
2018-12-15 12:00:40 +01:00
var parent = _ref3 . parent ;
2018-12-14 05:41:57 +01:00
return parent ;
}
2018-12-18 04:14:52 +01:00
function to _html _string _isText ( _ref4 ) {
2018-12-15 12:00:40 +01:00
var text = _ref4 . text ;
2018-12-14 05:41:57 +01:00
return typeof text === 'string' ;
}
2018-12-18 04:14:52 +01:00
function to _html _string _getText ( _ref5 ) {
2018-12-15 12:00:40 +01:00
var text = _ref5 . text ;
2018-12-14 05:41:57 +01:00
return text ;
}
2018-12-18 04:14:52 +01:00
function to _html _string _remove ( object ) {
2018-12-14 05:41:57 +01:00
var index = object . parent . children . indexOf ( object ) ;
if ( index !== - 1 ) {
object . parent . children . splice ( index , 1 ) ;
}
return object ;
}
2018-12-15 12:00:40 +01:00
function createElementHTML ( _ref6 ) {
var type = _ref6 . type ,
attributes = _ref6 . attributes ,
object = _ref6 . object ,
children = _ref6 . children ;
2018-12-14 05:41:57 +01:00
var attributeString = '' ;
for ( var key in attributes ) {
2018-12-18 04:14:52 +01:00
if ( ! Object ( external _this _wp _escapeHtml _ [ "isValidAttributeName" ] ) ( key ) ) {
2018-12-14 05:53:54 +01:00
continue ;
}
2018-12-18 04:14:52 +01:00
attributeString += " " . concat ( key , "=\"" ) . concat ( Object ( external _this _wp _escapeHtml _ [ "escapeAttribute" ] ) ( attributes [ key ] ) , "\"" ) ;
2018-12-14 05:41:57 +01:00
}
if ( object ) {
return "<" . concat ( type ) . concat ( attributeString , ">" ) ;
}
return "<" . concat ( type ) . concat ( attributeString , ">" ) . concat ( createChildrenHTML ( children ) , "</" ) . concat ( type , ">" ) ;
}
2018-12-18 04:14:52 +01:00
function createChildrenHTML ( ) {
var children = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : [ ] ;
return children . map ( function ( child ) {
2020-01-08 12:57:23 +01:00
return child . text === undefined ? createElementHTML ( child ) : Object ( external _this _wp _escapeHtml _ [ "escapeEditableHTML" ] ) ( child . text ) ;
2018-12-18 04:14:52 +01:00
} ) . join ( '' ) ;
}
2018-12-14 12:02:53 +01:00
2018-12-18 04:14:52 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/toggle-format.js
2018-12-14 12:02:53 +01:00
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
/** @typedef {import('./create').RichTextFormat} RichTextFormat */
2018-12-14 12:02:53 +01:00
/ * *
* Toggles a format object to a Rich Text value at the current selection .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to modify .
* @ param { RichTextFormat } format Format to apply or remove .
2018-12-14 12:02:53 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } A new value with the format applied or removed .
2018-12-14 12:02:53 +01:00
* /
function toggleFormat ( value , format ) {
2018-12-18 04:14:52 +01:00
if ( getActiveFormat ( value , format . type ) ) {
return removeFormat ( value , format . type ) ;
2018-12-14 12:02:53 +01:00
}
2020-01-08 12:57:23 +01:00
return applyFormat ( value , format ) ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/unregister-format-type.js
/ * *
* WordPress dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./register-format-type').RichTextFormatType} RichTextFormatType */
2020-01-08 12:57:23 +01:00
/ * *
* Unregisters a format .
*
* @ param { string } name Format name .
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextFormatType | undefined } The previous format value , if it has
* been successfully unregistered ;
* otherwise ` undefined ` .
2020-01-08 12:57:23 +01:00
* /
function unregisterFormatType ( name ) {
var oldFormat = Object ( external _this _wp _data _ [ "select" ] ) ( 'core/rich-text' ) . getFormatType ( name ) ;
if ( ! oldFormat ) {
window . console . error ( "Format " . concat ( name , " is not registered." ) ) ;
return ;
}
Object ( external _this _wp _data _ [ "dispatch" ] ) ( 'core/rich-text' ) . removeFormatTypes ( name ) ;
return oldFormat ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/can-indent-list-items.js
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2020-01-08 12:57:23 +01:00
/ * *
* Checks if the selected list item can be indented .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to check .
2020-01-08 12:57:23 +01:00
*
* @ return { boolean } Whether or not the selected list item can be indented .
* /
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 ;
2018-12-14 12:02:53 +01:00
}
2020-01-08 12:57:23 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/can-outdent-list-items.js
2018-12-14 12:02:53 +01:00
/ * *
2020-01-08 12:57:23 +01:00
* Internal dependencies
2018-12-14 12:02:53 +01:00
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2018-12-14 12:02:53 +01:00
/ * *
2020-01-08 12:57:23 +01:00
* Checks if the selected list item can be outdented .
2018-12-14 12:02:53 +01:00
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to check .
2018-12-14 12:02:53 +01:00
*
2020-01-08 12:57:23 +01:00
* @ return { boolean } Whether or not the selected list item can be outdented .
2018-12-14 12:02:53 +01:00
* /
2020-01-08 12:57:23 +01:00
function canOutdentListItems ( value ) {
var replacements = value . replacements ,
start = value . start ;
var startingLineIndex = getLineIndex ( value , start ) ;
return replacements [ startingLineIndex ] !== undefined ;
2018-12-14 12:02:53 +01:00
}
2019-01-29 19:23:55 +01:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/indent-list-items.js
2019-03-21 13:48:00 +01:00
2020-02-06 22:03:31 +01:00
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 ; }
2019-01-29 19:23:55 +01:00
/ * *
* Internal dependencies
* /
2020-01-08 12:57:23 +01:00
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
/** @typedef {import('./create').RichTextFormat} RichTextFormat */
2019-01-29 19:23:55 +01:00
/ * *
* Gets the line index of the first previous list item with higher indentation .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to search .
* @ param { number } lineIndex Line index of the list item to compare
* with .
2019-01-29 19:23:55 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { number | void } The line index .
2019-01-29 19:23:55 +01:00
* /
function getTargetLevelLineIndex ( _ref , lineIndex ) {
var text = _ref . text ,
2019-03-21 13:48:00 +01:00
replacements = _ref . replacements ;
var startFormats = replacements [ lineIndex ] || [ ] ;
2019-01-29 19:23:55 +01:00
var index = lineIndex ;
while ( index -- >= 0 ) {
if ( text [ index ] !== LINE _SEPARATOR ) {
continue ;
}
2019-03-21 13:48:00 +01:00
var formatsAtIndex = replacements [ index ] || [ ] ; // Return the first line index that is one level higher. If the level is
2019-01-29 19:23:55 +01:00
// lower or equal, there is no result.
if ( formatsAtIndex . length === startFormats . length + 1 ) {
return index ;
} else if ( formatsAtIndex . length <= startFormats . length ) {
return ;
}
}
}
/ * *
* Indents any selected list items if possible .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to change .
* @ param { RichTextFormat } rootFormat Root format .
2019-01-29 19:23:55 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } The changed value .
2019-01-29 19:23:55 +01:00
* /
function indentListItems ( value , rootFormat ) {
2020-01-08 12:57:23 +01:00
if ( ! canIndentListItems ( value ) ) {
2019-01-29 19:23:55 +01:00
return value ;
}
2020-01-08 12:57:23 +01:00
var lineIndex = getLineIndex ( value ) ;
var previousLineIndex = getLineIndex ( value , lineIndex ) ;
2019-01-29 19:23:55 +01:00
var text = value . text ,
2019-03-21 13:48:00 +01:00
replacements = value . replacements ,
2019-01-29 19:23:55 +01:00
end = value . end ;
2019-03-21 13:48:00 +01:00
var newFormats = replacements . slice ( ) ;
2019-01-29 19:23:55 +01:00
var targetLevelLineIndex = getTargetLevelLineIndex ( value , lineIndex ) ;
for ( var index = lineIndex ; index < end ; index ++ ) {
if ( text [ index ] !== LINE _SEPARATOR ) {
continue ;
} // Get the previous list, and if there's a child list, take over the
// formats. If not, duplicate the last level and create a new level.
if ( targetLevelLineIndex ) {
2019-03-21 13:48:00 +01:00
var targetFormats = replacements [ targetLevelLineIndex ] || [ ] ;
2019-01-29 19:23:55 +01:00
newFormats [ index ] = targetFormats . concat ( ( newFormats [ index ] || [ ] ) . slice ( targetFormats . length - 1 ) ) ;
} else {
2019-03-21 13:48:00 +01:00
var _targetFormats = replacements [ previousLineIndex ] || [ ] ;
2019-01-29 19:23:55 +01:00
var lastformat = _targetFormats [ _targetFormats . length - 1 ] || rootFormat ;
newFormats [ index ] = _targetFormats . concat ( [ lastformat ] , ( newFormats [ index ] || [ ] ) . slice ( _targetFormats . length ) ) ;
}
}
2020-10-13 15:10:30 +02:00
return indent _list _items _objectSpread ( indent _list _items _objectSpread ( { } , value ) , { } , {
2019-03-21 13:48:00 +01:00
replacements : newFormats
2019-01-29 19:23:55 +01:00
} ) ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-parent-line-index.js
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2019-01-29 19:23:55 +01:00
/ * *
* Gets the index of the first parent list . To get the parent list formats , we
* go through every list item until we find one with exactly one format type
* less .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to search .
* @ param { number } lineIndex Line index of a child list item .
2019-01-29 19:23:55 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { number | void } The parent list line index .
2019-01-29 19:23:55 +01:00
* /
function getParentLineIndex ( _ref , lineIndex ) {
var text = _ref . text ,
2019-03-21 13:48:00 +01:00
replacements = _ref . replacements ;
var startFormats = replacements [ lineIndex ] || [ ] ;
2019-01-29 19:23:55 +01:00
var index = lineIndex ;
while ( index -- >= 0 ) {
if ( text [ index ] !== LINE _SEPARATOR ) {
continue ;
}
2019-03-21 13:48:00 +01:00
var formatsAtIndex = replacements [ index ] || [ ] ;
2019-01-29 19:23:55 +01:00
if ( formatsAtIndex . length === startFormats . length - 1 ) {
return index ;
}
}
}
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/get-last-child-index.js
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2019-01-29 19:23:55 +01:00
/ * *
* Gets the line index of the last child in the list .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to search .
* @ param { number } lineIndex Line index of a list item in the list .
2019-01-29 19:23:55 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { number } The index of the last child .
2019-01-29 19:23:55 +01:00
* /
function getLastChildIndex ( _ref , lineIndex ) {
var text = _ref . text ,
2019-03-21 13:48:00 +01:00
replacements = _ref . replacements ;
var lineFormats = replacements [ lineIndex ] || [ ] ; // Use the given line index in case there are no next children.
2019-01-29 19:23:55 +01:00
var childIndex = lineIndex ; // `lineIndex` could be `undefined` if it's the first line.
for ( var index = lineIndex || 0 ; index < text . length ; index ++ ) {
// We're only interested in line indices.
if ( text [ index ] !== LINE _SEPARATOR ) {
continue ;
}
2019-03-21 13:48:00 +01:00
var formatsAtIndex = replacements [ index ] || [ ] ; // If the amout of formats is equal or more, store it, then return the
2019-01-29 19:23:55 +01:00
// last one if the amount of formats is less.
if ( formatsAtIndex . length >= lineFormats . length ) {
childIndex = index ;
} else {
return childIndex ;
}
} // If the end of the text is reached, return the last child index.
return childIndex ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/outdent-list-items.js
2019-03-21 13:48:00 +01:00
2020-02-06 22:03:31 +01:00
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 ; }
2019-01-29 19:23:55 +01:00
/ * *
* Internal dependencies
* /
2020-01-08 12:57:23 +01:00
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
2019-01-29 19:23:55 +01:00
/ * *
* Outdents any selected list items if possible .
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to change .
2019-01-29 19:23:55 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } The changed value .
2019-01-29 19:23:55 +01:00
* /
function outdentListItems ( value ) {
2020-01-08 12:57:23 +01:00
if ( ! canOutdentListItems ( value ) ) {
return value ;
}
2019-01-29 19:23:55 +01:00
var text = value . text ,
2019-03-21 13:48:00 +01:00
replacements = value . replacements ,
2019-01-29 19:23:55 +01:00
start = value . start ,
end = value . end ;
2020-01-08 12:57:23 +01:00
var startingLineIndex = getLineIndex ( value , start ) ;
2019-03-21 13:48:00 +01:00
var newFormats = replacements . slice ( 0 ) ;
var parentFormats = replacements [ getParentLineIndex ( value , startingLineIndex ) ] || [ ] ;
2019-01-29 19:23:55 +01:00
var endingLineIndex = getLineIndex ( value , end ) ;
var lastChildIndex = getLastChildIndex ( value , endingLineIndex ) ; // Outdent all list items from the starting line index until the last child
// index of the ending list. All children of the ending list need to be
// outdented, otherwise they'll be orphaned.
for ( var index = startingLineIndex ; index <= lastChildIndex ; index ++ ) {
// Skip indices that are not line separators.
if ( text [ index ] !== LINE _SEPARATOR ) {
continue ;
} // In the case of level 0, the formats at the index are undefined.
var currentFormats = newFormats [ index ] || [ ] ; // Omit the indentation level where the selection starts.
newFormats [ index ] = parentFormats . concat ( currentFormats . slice ( parentFormats . length + 1 ) ) ;
if ( newFormats [ index ] . length === 0 ) {
delete newFormats [ index ] ;
}
}
2020-10-13 15:10:30 +02:00
return outdent _list _items _objectSpread ( outdent _list _items _objectSpread ( { } , value ) , { } , {
2019-03-21 13:48:00 +01:00
replacements : newFormats
2019-01-29 19:23:55 +01:00
} ) ;
}
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/change-list-type.js
2019-03-21 13:48:00 +01:00
2020-02-06 22:03:31 +01:00
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 ; }
2019-01-29 19:23:55 +01:00
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
/** @typedef {import('./create').RichTextFormat} RichTextFormat */
2019-01-29 19:23:55 +01:00
/ * *
* Changes the list type of the selected indented list , if any . Looks at the
* currently selected list item and takes the parent list , then changes the list
2019-03-07 10:09:59 +01:00
* type of this list . When multiple lines are selected , the parent lists are
* takes and changed .
2018-12-14 12:02:53 +01:00
*
2020-10-13 15:10:30 +02:00
* @ param { RichTextValue } value Value to change .
* @ param { RichTextFormat } newFormat The new list format object . Choose between
* ` { type: 'ol' } ` and ` { type: 'ul' } ` .
2018-12-14 12:02:53 +01:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } The changed value .
2018-12-14 12:02:53 +01:00
* /
2019-03-07 10:09:59 +01:00
function changeListType ( value , newFormat ) {
var text = value . text ,
2019-03-21 13:48:00 +01:00
replacements = value . replacements ,
2019-03-07 10:09:59 +01:00
start = value . start ,
end = value . end ;
var startingLineIndex = getLineIndex ( value , start ) ;
2019-03-21 13:48:00 +01:00
var startLineFormats = replacements [ startingLineIndex ] || [ ] ;
var endLineFormats = replacements [ getLineIndex ( value , end ) ] || [ ] ;
2019-03-07 10:09:59 +01:00
var startIndex = getParentLineIndex ( value , startingLineIndex ) ;
2019-03-21 13:48:00 +01:00
var newReplacements = replacements . slice ( ) ;
2019-03-07 10:09:59 +01:00
var startCount = startLineFormats . length - 1 ;
var endCount = endLineFormats . length - 1 ;
var changed ;
2018-12-14 12:02:53 +01:00
2019-03-07 10:09:59 +01:00
for ( var index = startIndex + 1 || 0 ; index < text . length ; index ++ ) {
if ( text [ index ] !== LINE _SEPARATOR ) {
continue ;
}
2018-12-14 12:02:53 +01:00
2019-03-21 13:48:00 +01:00
if ( ( newReplacements [ index ] || [ ] ) . length <= startCount ) {
2019-03-07 10:09:59 +01:00
break ;
}
2019-03-21 13:48:00 +01:00
if ( ! newReplacements [ index ] ) {
2019-03-07 10:09:59 +01:00
continue ;
}
changed = true ;
2019-03-21 13:48:00 +01:00
newReplacements [ index ] = newReplacements [ index ] . map ( function ( format , i ) {
2019-03-07 10:09:59 +01:00
return i < startCount || i > endCount ? format : newFormat ;
} ) ;
}
if ( ! changed ) {
return value ;
}
2020-10-13 15:10:30 +02:00
return change _list _type _objectSpread ( change _list _type _objectSpread ( { } , value ) , { } , {
2019-03-21 13:48:00 +01:00
replacements : newReplacements
2019-03-07 10:09:59 +01:00
} ) ;
2018-12-14 12:02:53 +01:00
}
2020-06-26 15:33:47 +02:00
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js + 1 modules
2020-10-13 15:10:30 +02:00
var slicedToArray = _ _webpack _require _ _ ( 12 ) ;
2019-09-19 17:19:18 +02:00
2020-01-22 23:06:21 +01:00
// EXTERNAL MODULE: external {"this":["wp","element"]}
var external _this _wp _element _ = _ _webpack _require _ _ ( 0 ) ;
2019-09-19 17:19:18 +02:00
// EXTERNAL MODULE: external {"this":["wp","keycodes"]}
2020-10-20 15:36:16 +02:00
var external _this _wp _keycodes _ = _ _webpack _require _ _ ( 18 ) ;
2019-09-19 17:19:18 +02:00
// EXTERNAL MODULE: external {"this":["wp","deprecated"]}
2020-10-20 15:36:16 +02:00
var external _this _wp _deprecated _ = _ _webpack _require _ _ ( 36 ) ;
2019-09-19 17:19:18 +02:00
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' ] ) ;
2020-01-22 23:06:21 +01:00
function FormatEdit ( _ref ) {
2019-09-19 17:19:18 +02:00
var formatTypes = _ref . formatTypes ,
onChange = _ref . onChange ,
2020-02-06 22:03:31 +01:00
onFocus = _ref . onFocus ,
2019-09-19 17:19:18 +02:00
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 ) ;
2019-10-15 18:17:12 +02:00
var isObjectActive = activeObject !== undefined && activeObject . type === name ;
2019-09-19 17:19:18 +02:00
return Object ( external _this _wp _element _ [ "createElement" ] ) ( Edit , {
key : name ,
isActive : isActive ,
activeAttributes : isActive ? activeFormat . attributes || { } : { } ,
isObjectActive : isObjectActive ,
activeObjectAttributes : isObjectActive ? activeObject . attributes || { } : { } ,
value : value ,
2020-02-06 22:03:31 +01:00
onChange : onChange ,
onFocus : onFocus
2019-09-19 17:19:18 +02:00
} ) ;
} ) ;
2020-01-22 23:06:21 +01:00
}
2019-09-19 17:19:18 +02:00
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/update-formats.js
/ * *
* Internal dependencies
* /
2020-10-13 15:10:30 +02:00
/** @typedef {import('./create').RichTextValue} RichTextValue */
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
/ * *
* Efficiently updates all the formats from ` start ` ( including ) until ` end `
* ( excluding ) with the active formats . Mutates ` value ` .
*
2020-10-13 15:10:30 +02:00
* @ param { Object } $1 Named paramentes .
* @ param { RichTextValue } $1 . value Value te update .
* @ param { number } $1 . start Index to update from .
* @ param { number } $1 . end Index to update until .
* @ param { Array } $1 . formats Replacement formats .
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
*
2020-10-13 15:10:30 +02:00
* @ return { RichTextValue } Mutated value .
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
* /
function updateFormats ( _ref ) {
var value = _ref . value ,
start = _ref . start ,
end = _ref . end ,
formats = _ref . formats ;
var formatsBefore = value . formats [ start - 1 ] || [ ] ;
var formatsAfter = value . formats [ end ] || [ ] ; // First, fix the references. If any format right before or after are
// equal, the replacement format should use the same reference.
value . activeFormats = formats . map ( function ( format , index ) {
if ( formatsBefore [ index ] ) {
if ( isFormatEqual ( format , formatsBefore [ index ] ) ) {
return formatsBefore [ index ] ;
}
} else if ( formatsAfter [ index ] ) {
if ( isFormatEqual ( format , formatsAfter [ index ] ) ) {
return formatsAfter [ index ] ;
}
}
return format ;
} ) ;
while ( -- end >= start ) {
if ( value . activeFormats . length > 0 ) {
value . formats [ end ] = value . activeFormats ;
} else {
delete value . formats [ end ] ;
}
}
return value ;
}
2020-10-13 15:10:30 +02:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/component/use-format-types.js
2020-01-22 23:06:21 +01:00
2020-10-13 15:10:30 +02:00
function use _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 ; }
2020-01-22 23:06:21 +01:00
2020-10-13 15:10:30 +02:00
function use _format _types _objectSpread ( target ) { for ( var i = 1 ; i < arguments . length ; i ++ ) { var source = arguments [ i ] != null ? arguments [ i ] : { } ; if ( i % 2 ) { use _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 { use _format _types _ownKeys ( Object ( source ) ) . forEach ( function ( key ) { Object . defineProperty ( target , key , Object . getOwnPropertyDescriptor ( source , key ) ) ; } ) ; } } return target ; }
2020-01-22 23:06:21 +01:00
/ * *
* WordPress dependencies
* /
function formatTypesSelector ( select ) {
return select ( 'core/rich-text' ) . getFormatTypes ( ) ;
}
/ * *
2020-10-13 15:10:30 +02:00
* This hook provides RichText with the ` formatTypes ` and its derived props from
* experimental format type settings .
2020-01-22 23:06:21 +01:00
*
2020-10-13 15:10:30 +02:00
* @ param { Object } $0 Options
* @ param { string } $0 . clientId Block client ID .
* @ param { string } $0 . identifier Block attribute .
2020-01-22 23:06:21 +01:00
* /
2020-10-13 15:10:30 +02:00
function useFormatTypes ( _ref ) {
var clientId = _ref . clientId ,
identifier = _ref . identifier ;
var formatTypes = Object ( external _this _wp _data _ [ "useSelect" ] ) ( formatTypesSelector , [ ] ) ;
var keyedSelected = Object ( external _this _wp _data _ [ "useSelect" ] ) ( function ( select ) {
return formatTypes . reduce ( function ( accumulator , type ) {
if ( type . _ _experimentalGetPropsForEditableTreePreparation ) {
accumulator [ type . name ] = type . _ _experimentalGetPropsForEditableTreePreparation ( select , {
2020-01-22 23:06:21 +01:00
richTextIdentifier : identifier ,
blockClientId : clientId
2020-10-13 15:10:30 +02:00
} ) ;
}
2020-01-22 23:06:21 +01:00
2020-10-13 15:10:30 +02:00
return accumulator ;
} , { } ) ;
} , [ formatTypes , clientId , identifier ] ) ;
var dispatch = Object ( external _this _wp _data _ [ "useDispatch" ] ) ( ) ;
var prepareHandlers = [ ] ;
var valueHandlers = [ ] ;
var changeHandlers = [ ] ;
var dependencies = [ ] ;
formatTypes . forEach ( function ( type ) {
if ( type . _ _experimentalCreatePrepareEditableTree ) {
var selected = keyedSelected [ type . name ] ;
var handler = type . _ _experimentalCreatePrepareEditableTree ( selected , {
richTextIdentifier : identifier ,
blockClientId : clientId
} ) ;
2020-01-22 23:06:21 +01:00
2020-10-13 15:10:30 +02:00
if ( type . _ _experimentalCreateOnChangeEditableValue ) {
valueHandlers . push ( handler ) ;
} else {
prepareHandlers . push ( handler ) ;
}
2020-01-22 23:06:21 +01:00
2020-10-13 15:10:30 +02:00
for ( var key in selected ) {
dependencies . push ( selected [ key ] ) ;
}
}
2020-01-22 23:06:21 +01:00
2020-10-13 15:10:30 +02:00
if ( type . _ _experimentalCreateOnChangeEditableValue ) {
var dispatchers = { } ;
if ( type . _ _experimentalGetPropsForEditableTreeChangeHandler ) {
dispatchers = type . _ _experimentalGetPropsForEditableTreeChangeHandler ( dispatch , {
2020-01-22 23:06:21 +01:00
richTextIdentifier : identifier ,
blockClientId : clientId
2020-10-13 15:10:30 +02:00
} ) ;
}
2020-01-22 23:06:21 +01:00
2020-10-13 15:10:30 +02:00
changeHandlers . push ( type . _ _experimentalCreateOnChangeEditableValue ( use _format _types _objectSpread ( use _format _types _objectSpread ( { } , keyedSelected [ type . name ] || { } ) , dispatchers ) , {
richTextIdentifier : identifier ,
blockClientId : clientId
} ) ) ;
}
} ) ;
return {
formatTypes : formatTypes ,
prepareHandlers : prepareHandlers ,
valueHandlers : valueHandlers ,
changeHandlers : changeHandlers ,
dependencies : dependencies
2020-01-22 23:06:21 +01:00
} ;
}
2020-06-26 15:33:47 +02:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/component/use-boundary-style.js
2020-01-22 23:06:21 +01:00
/ * *
* WordPress dependencies
* /
2020-10-13 15:10:30 +02:00
/ *
2020-01-22 23:06:21 +01:00
* Calculates and renders the format boundary style when the active formats
* change .
* /
2020-06-26 15:33:47 +02:00
function useBoundaryStyle ( _ref ) {
2020-01-22 23:06:21 +01:00
var activeFormats = _ref . activeFormats ,
2020-06-26 15:33:47 +02:00
ref = _ref . ref ;
2020-01-22 23:06:21 +01:00
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 ;
}
2020-06-26 15:33:47 +02:00
var boundarySelector = '*[data-rich-text-format-boundary]' ;
var element = ref . current . querySelector ( boundarySelector ) ;
2020-01-22 23:06:21 +01:00
if ( ! element ) {
return ;
}
2020-06-26 15:33:47 +02:00
var ownerDocument = element . ownerDocument ;
var defaultView = ownerDocument . defaultView ;
var computedStyle = defaultView . getComputedStyle ( element ) ;
2020-01-22 23:06:21 +01:00
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 , "}" ) ;
2020-06-26 15:33:47 +02:00
var globalStyleId = 'rich-text-boundary-style' ;
var globalStyle = ownerDocument . getElementById ( globalStyleId ) ;
if ( ! globalStyle ) {
globalStyle = ownerDocument . createElement ( 'style' ) ;
globalStyle . id = globalStyleId ;
ownerDocument . head . appendChild ( globalStyle ) ;
}
2020-01-22 23:06:21 +01:00
if ( globalStyle . innerHTML !== style ) {
globalStyle . innerHTML = style ;
}
} , [ activeFormats ] ) ;
}
2020-06-26 15:33:47 +02:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/component/use-inline-warning.js
2020-02-06 22:03:31 +01:00
/ * *
* WordPress dependencies
* /
2020-06-26 15:33:47 +02:00
function useInlineWarning ( _ref ) {
var ref = _ref . ref ;
2020-02-06 22:03:31 +01:00
Object ( external _this _wp _element _ [ "useEffect" ] ) ( function ( ) {
2020-06-26 15:33:47 +02:00
if ( false ) { var computedStyle , defaultView , target ; }
2020-02-06 22:03:31 +01:00
} , [ ] ) ;
}
2019-09-19 17:19:18 +02:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/component/index.js
2018-12-14 12:02:53 +01:00
2020-02-06 22:03:31 +01:00
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 ; }
2019-09-19 17:19:18 +02:00
/ * *
* External dependencies
* /
2018-12-14 12:02:53 +01:00
2019-09-19 17:19:18 +02:00
/ * *
* WordPress dependencies
* /
2018-12-14 12:02:53 +01:00
2019-09-19 17:19:18 +02:00
/ * *
* Internal dependencies
* /
2018-12-14 12:02:53 +01:00
2019-03-07 10:09:59 +01:00
Block Editor: Update packages to bring a selection of bugfixes in.
Props iseulde, kjellr, aduth, 0mirka00, mcsf, nosolosw, gziolo, jasmussen, talldanwp, notnownikki, swissspidy, jorgefilipecosta, noisysocks.
See https://github.com/WordPress/gutenberg/pull/14796.
Fixes #46801.
Built from https://develop.svn.wordpress.org/trunk@45138
git-svn-id: http://core.svn.wordpress.org/trunk@44947 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-04-08 08:37:57 +02:00
2018-12-14 12:02:53 +01:00
2020-01-22 23:06:21 +01:00
2020-02-06 22:03:31 +01:00
2018-12-18 04:14:52 +01:00
2020-01-08 12:57:23 +01:00
/** @typedef {import('@wordpress/element').WPSyntheticEvent} WPSyntheticEvent */
2019-09-19 17:19:18 +02:00
/ * *
* 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 }
* /
2018-12-18 04:14:52 +01:00
2019-09-19 17:19:18 +02:00
var INSERTION _INPUT _TYPES _TO _IGNORE = new Set ( [ 'insertParagraph' , 'insertOrderedList' , 'insertUnorderedList' , 'insertHorizontalRule' , 'insertLink' ] ) ;
2020-01-08 12:57:23 +01:00
/ * *
* 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 < string , string > }
* /
var defaultStyle = {
whiteSpace : whiteSpace
} ;
2020-01-22 23:06:21 +01:00
var EMPTY _ACTIVE _FORMATS = [ ] ;
2018-12-18 04:14:52 +01:00
2020-10-13 15:10:30 +02:00
function createPrepareEditableTree ( fns ) {
2019-09-19 17:19:18 +02:00
return function ( value ) {
return fns . reduce ( function ( accumulator , fn ) {
return fn ( accumulator , value . text ) ;
} , value . formats ) ;
} ;
}
2019-10-15 18:17:12 +02:00
/ * *
* If the selection is set on the placeholder element , collapse the selection to
* the start ( before the placeholder ) .
2020-06-26 15:33:47 +02:00
*
* @ param { Window } defaultView
2019-10-15 18:17:12 +02:00
* /
2020-06-26 15:33:47 +02:00
function fixPlaceholderSelection ( defaultView ) {
var selection = defaultView . getSelection ( ) ;
2019-10-15 18:17:12 +02:00
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 ( ) ;
}
Block Editor: Update WordPress packages to include the latest bug fixes.
Updated packages:
@wordpress/annotations@1.7.1
@wordpress/api-fetch@3.6.1
@wordpress/babel-plugin-makepot@3.2.1
@wordpress/babel-preset-default@4.6.1
@wordpress/block-directory@1.0.1
@wordpress/block-editor@3.2.1
@wordpress/block-library@2.9.1
@wordpress/blocks@6.7.1
@wordpress/components@8.3.1
@wordpress/compose@3.7.1
@wordpress/core-data@2.7.1
@wordpress/data-controls@1.3.1
@wordpress/data@4.9.1
@wordpress/docgen@1.4.1
@wordpress/dom@2.5.1
@wordpress/e2e-test-utils@2.4.1
@wordpress/e2e-tests@1.7.1
@wordpress/edit-post@3.8.1
@wordpress/editor@9.7.1
@wordpress/element@2.8.1
@wordpress/format-library@1.9.1
@wordpress/i18n@3.6.1
@wordpress/jest-console@3.3.1
@wordpress/jest-preset-default@5.1.1
@wordpress/keycodes@2.6.1
@wordpress/library-export-default-webpack-plugin@1.4.1
@wordpress/list-reusable-blocks@1.8.1
@wordpress/media-utils@1.2.1
@wordpress/notices@1.8.1
@wordpress/nux@3.7.1
@wordpress/plugins@2.7.1
@wordpress/redux-routine@3.6.1
@wordpress/rich-text@3.7.1
@wordpress/scripts@5.0.1
@wordpress/server-side-render@1.3.1
@wordpress/shortcode@2.4.1
@wordpress/token-list@1.6.1
@wordpress/viewport@2.8.1
@wordpress/wordcount@2.6.1
Props epiqueras, youknowriad, donmhico, jorgefilipecosta, soean, mcsf, noisysocks, andraganescu, gziolo, talldanwp, iseulde, nrqsnchz, mapk, karmatosed, joen, afercia, kjellr, desrosj.
Fixes #48186.
Built from https://develop.svn.wordpress.org/trunk@46364
git-svn-id: http://core.svn.wordpress.org/trunk@46163 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-30 22:07:06 +02:00
2020-10-13 15:10:30 +02:00
function RichText ( _ref , ref ) {
2020-06-26 15:33:47 +02:00
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 ,
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 ,
2020-10-13 15:10:30 +02:00
clientId = _ref . clientId ,
identifier = _ref . identifier ,
2020-06-26 15:33:47 +02:00
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 ,
2020-10-20 15:36:16 +02:00
isSelected = _ref . _ _unstableIsSelected ;
2020-06-26 15:33:47 +02:00
var _useState = Object ( external _this _wp _element _ [ "useState" ] ) ( ) ,
_useState2 = Object ( slicedToArray [ "a" /* default */ ] ) ( _useState , 2 ) ,
_useState2$ = _useState2 [ 0 ] ,
activeFormats = _useState2$ === void 0 ? [ ] : _useState2$ ,
2020-10-13 15:10:30 +02:00
setActiveFormats = _useState2 [ 1 ] ;
var _useFormatTypes = useFormatTypes ( {
clientId : clientId ,
identifier : identifier
} ) ,
formatTypes = _useFormatTypes . formatTypes ,
prepareHandlers = _useFormatTypes . prepareHandlers ,
valueHandlers = _useFormatTypes . valueHandlers ,
changeHandlers = _useFormatTypes . changeHandlers ,
dependencies = _useFormatTypes . dependencies ; // For backward compatibility, fall back to tagName if it's a string.
2020-08-04 15:43:40 +02:00
// tagName can now be a component for light blocks.
if ( ! multilineRootTag && typeof TagName === 'string' ) {
multilineRootTag = TagName ;
}
2020-06-26 15:33:47 +02:00
function getDoc ( ) {
return ref . current . ownerDocument ;
2019-09-19 17:19:18 +02:00
}
2018-12-18 04:14:52 +01:00
2020-06-26 15:33:47 +02:00
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 )
} ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
if ( format !== 'string' ) {
return string ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
2020-10-13 15:10:30 +02:00
var prepare = createPrepareEditableTree ( valueHandlers ) ;
2020-06-26 15:33:47 +02:00
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 ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
val = removeEditorOnlyFormats ( val ) ;
if ( format !== 'string' ) {
return ;
2019-09-19 17:19:18 +02:00
}
2020-01-08 12:57:23 +01:00
2020-06-26 15:33:47 +02:00
return toHTMLString ( {
value : val ,
multilineTag : multilineTag ,
preserveWhiteSpace : preserveWhiteSpace
} ) ;
} // Internal values are updated synchronously, unlike props and state.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
var _value = Object ( external _this _wp _element _ [ "useRef" ] ) ( value ) ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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 ;
} , [ ] ) ) ;
2018-12-18 04:14:52 +01:00
2020-06-26 15:33:47 +02:00
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
} ) ;
}
2018-12-18 04:14:52 +01:00
2020-06-26 15:33:47 +02:00
function applyRecord ( newRecord ) {
var _ref2 = arguments . length > 1 && arguments [ 1 ] !== undefined ? arguments [ 1 ] : { } ,
domOnly = _ref2 . domOnly ;
2018-12-18 04:14:52 +01:00
2020-06-26 15:33:47 +02:00
apply ( {
value : newRecord ,
current : ref . current ,
multilineTag : multilineTag ,
multilineWrapperTags : multilineTag === 'li' ? [ 'ul' , 'ol' ] : undefined ,
2020-10-13 15:10:30 +02:00
prepareEditableTree : createPrepareEditableTree ( prepareHandlers ) ,
2020-06-26 15:33:47 +02:00
_ _unstableDomOnly : domOnly ,
placeholder : placeholder
} ) ;
}
/ * *
* Handles a paste event .
*
* Saves the pasted data as plain text in ` pastedPlainText ` .
*
* @ param { ClipboardEvent } event The paste event .
* /
2018-12-18 04:14:52 +01:00
2020-06-26 15:33:47 +02:00
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.
2019-09-19 17:19:18 +02:00
return ;
}
2020-06-26 15:33:47 +02:00
}
2018-12-18 04:14:52 +01:00
2020-06-26 15:33:47 +02:00
event . preventDefault ( ) ; // Allows us to ask for this information when we get a report.
2020-01-08 12:57:23 +01:00
2020-06-26 15:33:47 +02:00
window . console . log ( 'Received HTML:\n\n' , html ) ;
window . console . log ( 'Received plain text:\n\n' , plainText ) ;
2020-01-08 12:57:23 +01:00
2020-06-26 15:33:47 +02:00
if ( disableFormats ) {
handleChange ( insert ( record . current , plainText ) ) ;
return ;
}
2020-01-08 12:57:23 +01:00
2020-06-26 15:33:47 +02:00
var transformed = formatTypes . reduce ( function ( accumlator , _ref3 ) {
var _ _unstablePasteRule = _ref3 . _ _unstablePasteRule ;
2020-01-08 12:57:23 +01:00
2020-06-26 15:33:47 +02:00
// Only allow one transform.
if ( _ _unstablePasteRule && accumlator === record . current ) {
accumlator = _ _unstablePasteRule ( record . current , {
2019-09-19 17:19:18 +02:00
html : html ,
2020-06-26 15:33:47 +02:00
plainText : plainText
2019-09-19 17:19:18 +02:00
} ) ;
}
2020-06-26 15:33:47 +02:00
return accumlator ;
} , record . current ) ;
if ( transformed !== record . current ) {
handleChange ( transformed ) ;
return ;
2019-09-19 17:19:18 +02:00
}
2020-01-22 23:06:21 +01:00
2020-06-26 15:33:47 +02:00
if ( onPaste ) {
files = Array . from ( files ) ;
Array . from ( items ) . forEach ( function ( item ) {
if ( ! item . getAsFile ) {
return ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
var file = item . getAsFile ( ) ;
2020-02-06 22:03:31 +01:00
2020-06-26 15:33:47 +02:00
if ( ! file ) {
return ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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
} ) ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
}
/ * *
* 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 ;
2019-09-19 17:19:18 +02:00
}
2018-12-18 04:14:52 +01:00
2020-06-26 15:33:47 +02:00
if ( didAutomaticChange ) {
event . preventDefault ( ) ;
undo ( ) ;
return ;
}
2018-12-18 04:14:52 +01:00
2020-06-26 15:33:47 +02:00
if ( keyCode === external _this _wp _keycodes _ [ "ESCAPE" ] ) {
return ;
}
Block Editor: Update WordPress packages to include the latest bug fixes.
Updated packages:
@wordpress/annotations@1.7.1
@wordpress/api-fetch@3.6.1
@wordpress/babel-plugin-makepot@3.2.1
@wordpress/babel-preset-default@4.6.1
@wordpress/block-directory@1.0.1
@wordpress/block-editor@3.2.1
@wordpress/block-library@2.9.1
@wordpress/blocks@6.7.1
@wordpress/components@8.3.1
@wordpress/compose@3.7.1
@wordpress/core-data@2.7.1
@wordpress/data-controls@1.3.1
@wordpress/data@4.9.1
@wordpress/docgen@1.4.1
@wordpress/dom@2.5.1
@wordpress/e2e-test-utils@2.4.1
@wordpress/e2e-tests@1.7.1
@wordpress/edit-post@3.8.1
@wordpress/editor@9.7.1
@wordpress/element@2.8.1
@wordpress/format-library@1.9.1
@wordpress/i18n@3.6.1
@wordpress/jest-console@3.3.1
@wordpress/jest-preset-default@5.1.1
@wordpress/keycodes@2.6.1
@wordpress/library-export-default-webpack-plugin@1.4.1
@wordpress/list-reusable-blocks@1.8.1
@wordpress/media-utils@1.2.1
@wordpress/notices@1.8.1
@wordpress/nux@3.7.1
@wordpress/plugins@2.7.1
@wordpress/redux-routine@3.6.1
@wordpress/rich-text@3.7.1
@wordpress/scripts@5.0.1
@wordpress/server-side-render@1.3.1
@wordpress/shortcode@2.4.1
@wordpress/token-list@1.6.1
@wordpress/viewport@2.8.1
@wordpress/wordcount@2.6.1
Props epiqueras, youknowriad, donmhico, jorgefilipecosta, soean, mcsf, noisysocks, andraganescu, gziolo, talldanwp, iseulde, nrqsnchz, mapk, karmatosed, joen, afercia, kjellr, desrosj.
Fixes #48186.
Built from https://develop.svn.wordpress.org/trunk@46364
git-svn-id: http://core.svn.wordpress.org/trunk@46163 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-30 22:07:06 +02:00
2020-06-26 15:33:47 +02:00
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.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( start === 0 && end !== 0 && end === text . length ) {
handleChange ( remove _remove ( currentValue ) ) ;
event . preventDefault ( ) ;
return ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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 ) ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
if ( newValue ) {
handleChange ( newValue ) ;
event . preventDefault ( ) ;
2019-09-19 17:19:18 +02:00
return ;
}
2020-06-26 15:33:47 +02:00
} // Only process delete if the key press occurs at an uncollapsed edge.
2018-12-18 04:14:52 +01:00
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( ! onDelete || ! isCollapsed ( currentValue ) || activeFormats . length || isReverse && start !== 0 || ! isReverse && end !== text . length ) {
return ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
onDelete ( {
isReverse : isReverse ,
value : currentValue
} ) ;
event . preventDefault ( ) ;
}
/ * *
* Triggers the ` onEnter ` prop on keydown .
*
* @ param { WPSyntheticEvent } event A synthetic keyboard event .
* /
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
function handleEnter ( event ) {
if ( event . keyCode !== external _this _wp _keycodes _ [ "ENTER" ] ) {
return ;
2020-01-22 23:06:21 +01:00
}
2020-06-26 15:33:47 +02:00
event . preventDefault ( ) ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( ! onEnter ) {
return ;
2019-09-19 17:19:18 +02:00
}
2020-01-08 12:57:23 +01:00
2020-06-26 15:33:47 +02:00
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 ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
var currentValue = createRecord ( ) ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( ! isCollapsed ( currentValue ) ) {
return ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
var text = currentValue . text ,
start = currentValue . start ;
var characterBefore = text [ start - 1 ] ; // The caret must be at the start of a line.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( characterBefore && characterBefore !== LINE _SEPARATOR ) {
return ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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 ) {
2019-09-19 17:19:18 +02:00
return ;
}
2020-06-26 15:33:47 +02:00
if ( end === text . length && ! isReverse ) {
2019-09-19 17:19:18 +02:00
return ;
}
2020-06-26 15:33:47 +02:00
} // 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.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( ! collapsed ) {
return ;
} // In all other cases, prevent default behaviour.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
event . preventDefault ( ) ;
var formatsBefore = formats [ start - 1 ] || EMPTY _ACTIVE _FORMATS ;
var formatsAfter = formats [ start ] || EMPTY _ACTIVE _FORMATS ;
var newActiveFormatsLength = currentActiveFormats . length ;
var source = formatsAfter ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( formatsBefore . length < formatsAfter . length ) {
if ( ! isReverse && currentActiveFormats . length < formatsAfter . length ) {
newActiveFormatsLength ++ ;
}
2020-01-08 12:57:23 +01:00
2020-06-26 15:33:47 +02:00
if ( isReverse && currentActiveFormats . length > formatsBefore . length ) {
newActiveFormatsLength -- ;
}
} else if ( formatsBefore . length > formatsAfter . length ) {
if ( ! isReverse && currentActiveFormats . length > formatsAfter . length ) {
newActiveFormatsLength -- ;
}
2018-12-18 04:14:52 +01:00
2020-06-26 15:33:47 +02:00
if ( isReverse && currentActiveFormats . length < formatsBefore . length ) {
newActiveFormatsLength ++ ;
2019-09-19 17:19:18 +02:00
}
}
2020-06-26 15:33:47 +02:00
if ( newActiveFormatsLength !== currentActiveFormats . length ) {
var _newActiveFormats = source . slice ( 0 , newActiveFormatsLength ) ;
2019-09-19 17:19:18 +02:00
2020-10-13 15:10:30 +02:00
var _newValue = component _objectSpread ( component _objectSpread ( { } , record . current ) , { } , {
2020-06-26 15:33:47 +02:00
activeFormats : _newActiveFormats
} ) ;
record . current = _newValue ;
applyRecord ( _newValue ) ;
setActiveFormats ( _newActiveFormats ) ;
return ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
var newPos = start + ( isReverse ? - 1 : 1 ) ;
var newActiveFormats = isReverse ? formatsBefore : formatsAfter ;
2019-09-19 17:19:18 +02:00
2020-10-13 15:10:30 +02:00
var newValue = component _objectSpread ( component _objectSpread ( { } , record . current ) , { } , {
2020-06-26 15:33:47 +02:00
start : newPos ,
end : newPos ,
activeFormats : newActiveFormats
} ) ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
record . current = newValue ;
applyRecord ( newValue ) ;
onSelectionChange ( newPos , newPos ) ;
setActiveFormats ( newActiveFormats ) ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
function handleKeyDown ( event ) {
if ( event . defaultPrevented ) {
return ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
handleDelete ( event ) ;
handleEnter ( event ) ;
handleSpace ( event ) ;
handleHorizontalNavigation ( event ) ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
var lastHistoryValue = Object ( external _this _wp _element _ [ "useRef" ] ) ( value ) ;
2020-01-08 12:57:23 +01:00
2020-06-26 15:33:47 +02:00
function createUndoLevel ( ) {
// If the content is the same, no level needs to be created.
if ( lastHistoryValue . current === _value . current ) {
return ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
onCreateUndoLevel ( ) ;
lastHistoryValue . current = _value . current ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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 ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
var inputType ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( event ) {
inputType = event . inputType ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
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.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( inputType && ( inputType . indexOf ( 'format' ) === 0 || INSERTION _INPUT _TYPES _TO _IGNORE . has ( inputType ) ) ) {
applyRecord ( record . current ) ;
return ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
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.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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 ) ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
var transformed = formatTypes . reduce ( function ( accumlator , _ref4 ) {
var _ _unstableInputRule = _ref4 . _ _unstableInputRule ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( _ _unstableInputRule ) {
accumlator = _ _unstableInputRule ( accumlator ) ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
return accumlator ;
} , change ) ;
if ( transformed !== change ) {
createUndoLevel ( ) ;
2020-10-13 15:10:30 +02:00
handleChange ( component _objectSpread ( component _objectSpread ( { } , transformed ) , { } , {
2020-06-26 15:33:47 +02:00
activeFormats : oldActiveFormats
2019-09-19 17:19:18 +02:00
} ) ) ;
2020-06-26 15:33:47 +02:00
markAutomaticChange ( ) ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
getDoc ( ) . removeEventListener ( 'selectionchange' , handleSelectionChange ) ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
function handleCompositionEnd ( ) {
isComposing . current = false ; // Ensure the value is up-to-date for browsers that don't emit a final
// input event after composition.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
handleInput ( {
inputType : 'insertText'
} ) ; // Tracking selection changes can be resumed.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
getDoc ( ) . addEventListener ( 'selectionchange' , handleSelectionChange ) ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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 ;
}
2019-09-19 17:19:18 +02:00
2020-10-13 15:10:30 +02:00
if ( ref . current . ownerDocument . activeElement !== ref . current ) {
2020-06-26 15:33:47 +02:00
return ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( event . type !== 'selectionchange' && ! isSelected ) {
return ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( disabled ) {
return ;
} // In case of a keyboard event, ignore selection changes during
// composition.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( isComposing . current ) {
return ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
var _createRecord = createRecord ( ) ,
start = _createRecord . start ,
end = _createRecord . end ,
text = _createRecord . text ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
var oldRecord = record . current ; // Fallback mechanism for IE11, which doesn't support the input event.
// Any input results in a selection change.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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 ( ) ) ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
return ;
}
2020-10-13 15:10:30 +02:00
var newValue = component _objectSpread ( component _objectSpread ( { } , oldRecord ) , { } , {
2020-06-26 15:33:47 +02:00
start : start ,
end : end ,
// Allow `getActiveFormats` to get new `activeFormats`.
activeFormats : undefined
} ) ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
var newActiveFormats = getActiveFormats ( newValue , EMPTY _ACTIVE _FORMATS ) ; // Update the value with the new active formats.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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 ) ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
applyRecord ( newRecord ) ;
var start = newRecord . start ,
end = newRecord . end ,
_newRecord$activeForm = newRecord . activeFormats ,
newActiveFormats = _newRecord$activeForm === void 0 ? [ ] : _newRecord$activeForm ;
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 ( ) ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
}
/ * *
* 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 .
* /
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
function handlePointerDown ( event ) {
var target = event . target ; // If the child element has no text content, it must be an object.
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
if ( target === ref . current || target . textContent ) {
return ;
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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 ( ) ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
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 ;
2020-10-13 15:10:30 +02:00
record . current = component _objectSpread ( component _objectSpread ( { } , record . current ) , { } , {
2020-06-26 15:33:47 +02:00
start : index ,
end : index ,
activeFormats : EMPTY _ACTIVE _FORMATS
2019-09-19 17:19:18 +02:00
} ) ;
2020-06-26 15:33:47 +02:00
onSelectionChange ( index , index ) ;
setActiveFormats ( EMPTY _ACTIVE _FORMATS ) ;
} else {
onSelectionChange ( record . current . start , record . current . end ) ;
2020-10-13 15:10:30 +02:00
setActiveFormats ( getActiveFormats ( component _objectSpread ( component _objectSpread ( { } , record . current ) , { } , {
2020-06-26 15:33:47 +02:00
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.'
2019-09-19 17:19:18 +02:00
} ) ;
2020-06-26 15:33:47 +02:00
setFocusedElement ( instanceId ) ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
}
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
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 ( ) ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
} , [ value ] ) ;
Object ( external _this _wp _element _ [ "useEffect" ] ) ( function ( ) {
if ( ! didMount . current ) {
return ;
}
if ( isSelected && ( selectionStart !== record . current . start || selectionEnd !== record . current . end ) ) {
applyFromProps ( ) ;
} else {
2020-10-13 15:10:30 +02:00
record . current = component _objectSpread ( component _objectSpread ( { } , record . current ) , { } , {
2020-06-26 15:33:47 +02:00
start : selectionStart ,
end : selectionEnd
2020-01-08 12:57:23 +01:00
} ) ;
2019-09-19 17:19:18 +02:00
}
2020-06-26 15:33:47 +02:00
} , [ selectionStart , selectionEnd , isSelected ] ) ;
Object ( external _this _wp _element _ [ "useEffect" ] ) ( function ( ) {
if ( didMount . current ) {
applyFromProps ( ) ;
2019-09-19 17:19:18 +02:00
}
2020-10-13 15:10:30 +02:00
} , dependencies ) ;
2020-06-26 15:33:47 +02:00
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 ) ;
} ;
} , [ ] ) ;
2019-09-19 17:19:18 +02:00
2020-06-26 15:33:47 +02:00
function focus ( ) {
ref . current . focus ( ) ;
applyRecord ( record . current ) ;
}
2019-10-15 17:37:08 +02:00
2020-10-20 15:36:16 +02:00
var editableProps = {
2020-06-26 15:33:47 +02:00
// Overridable props.
role : 'textbox' ,
2020-07-21 14:14:37 +02:00
'aria-multiline' : true ,
2020-10-20 15:36:16 +02:00
'aria-label' : placeholder ,
2020-06-26 15:33:47 +02:00
ref : ref ,
2020-10-20 15:36:16 +02:00
style : defaultStyle ,
className : 'rich-text' ,
2020-06-26 15:33:47 +02:00
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
2020-10-20 15:36:16 +02:00
} ;
2020-06-26 15:33:47 +02:00
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 ) ) ;
}
2019-10-15 17:37:08 +02:00
/ * *
* Renders a rich content input , providing users with the option to format the
* content .
* /
2020-10-13 15:10:30 +02:00
/* harmony default export */ var component = ( Object ( external _this _wp _element _ [ "forwardRef" ] ) ( RichText ) ) ;
2019-10-15 17:37:08 +02:00
// CONCATENATED MODULE: ./node_modules/@wordpress/rich-text/build-module/index.js
/ * *
2020-01-22 23:06:21 +01:00
* Internal dependencies
2019-10-15 17:37:08 +02:00
* /
2019-09-19 17:19:18 +02:00
2019-10-15 17:37:08 +02:00
2019-09-19 17:19:18 +02:00
2019-10-15 17:37:08 +02:00
/***/ } ) ,
2019-09-19 17:19:18 +02:00
2020-02-06 22:03:31 +01:00
/***/ 5 :
2019-09-19 17:19:18 +02:00
/***/ ( function ( module , _ _webpack _exports _ _ , _ _webpack _require _ _ ) {
2018-12-17 05:52:00 +01:00
2018-12-18 04:14:52 +01:00
"use strict" ;
2020-02-06 22:03:31 +01:00
/* 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
2018-12-18 04:14:52 +01:00
} ) ;
2020-02-06 22:03:31 +01:00
} else {
obj [ key ] = value ;
2018-12-18 04:14:52 +01:00
}
2020-02-06 22:03:31 +01:00
return obj ;
2018-12-18 04:14:52 +01:00
}
2018-12-14 05:41:57 +01:00
/***/ } )
2018-12-18 04:14:52 +01:00
/******/ } ) ;