/**
* Copyright (c) Tiny Technologies, Inc. All rights reserved.
* Licensed under the LGPL or a commercial license.
* For LGPL see License.txt in the project root for license information.
* For commercial licenses see https://www.tiny.cloud/
*
* Version: 5.10.2 (2021-11-17)
*/
;(function () {
'use strict'
var typeOf$1 = function (x) {
if (x === null) {
return 'null'
}
if (x === undefined) {
return 'undefined'
}
var t = typeof x
if (
t === 'object' &&
(Array.prototype.isPrototypeOf(x) ||
(x.constructor && x.constructor.name === 'Array'))
) {
return 'array'
}
if (
t === 'object' &&
(String.prototype.isPrototypeOf(x) ||
(x.constructor && x.constructor.name === 'String'))
) {
return 'string'
}
return t
}
var isEquatableType = function (x) {
return (
[
'undefined',
'boolean',
'number',
'string',
'function',
'xml',
'null',
].indexOf(x) !== -1
)
}
var sort$1 = function (xs, compareFn) {
var clone = Array.prototype.slice.call(xs)
return clone.sort(compareFn)
}
var contramap = function (eqa, f) {
return eq$2(function (x, y) {
return eqa.eq(f(x), f(y))
})
}
var eq$2 = function (f) {
return { eq: f }
}
var tripleEq = eq$2(function (x, y) {
return x === y
})
var eqString = tripleEq
var eqArray = function (eqa) {
return eq$2(function (x, y) {
if (x.length !== y.length) {
return false
}
var len = x.length
for (var i = 0; i < len; i++) {
if (!eqa.eq(x[i], y[i])) {
return false
}
}
return true
})
}
var eqSortedArray = function (eqa, compareFn) {
return contramap(eqArray(eqa), function (xs) {
return sort$1(xs, compareFn)
})
}
var eqRecord = function (eqa) {
return eq$2(function (x, y) {
var kx = Object.keys(x)
var ky = Object.keys(y)
if (!eqSortedArray(eqString).eq(kx, ky)) {
return false
}
var len = kx.length
for (var i = 0; i < len; i++) {
var q = kx[i]
if (!eqa.eq(x[q], y[q])) {
return false
}
}
return true
})
}
var eqAny = eq$2(function (x, y) {
if (x === y) {
return true
}
var tx = typeOf$1(x)
var ty = typeOf$1(y)
if (tx !== ty) {
return false
}
if (isEquatableType(tx)) {
return x === y
} else if (tx === 'array') {
return eqArray(eqAny).eq(x, y)
} else if (tx === 'object') {
return eqRecord(eqAny).eq(x, y)
}
return false
})
var typeOf = function (x) {
var t = typeof x
if (x === null) {
return 'null'
} else if (
t === 'object' &&
(Array.prototype.isPrototypeOf(x) ||
(x.constructor && x.constructor.name === 'Array'))
) {
return 'array'
} else if (
t === 'object' &&
(String.prototype.isPrototypeOf(x) ||
(x.constructor && x.constructor.name === 'String'))
) {
return 'string'
} else {
return t
}
}
var isType$1 = function (type) {
return function (value) {
return typeOf(value) === type
}
}
var isSimpleType = function (type) {
return function (value) {
return typeof value === type
}
}
var eq$1 = function (t) {
return function (a) {
return t === a
}
}
var isString$1 = isType$1('string')
var isObject = isType$1('object')
var isArray$1 = isType$1('array')
var isNull = eq$1(null)
var isBoolean = isSimpleType('boolean')
var isUndefined = eq$1(undefined)
var isNullable = function (a) {
return a === null || a === undefined
}
var isNonNullable = function (a) {
return !isNullable(a)
}
var isFunction = isSimpleType('function')
var isNumber = isSimpleType('number')
var noop = function () {}
var compose = function (fa, fb) {
return function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
return fa(fb.apply(null, args))
}
}
var compose1 = function (fbc, fab) {
return function (a) {
return fbc(fab(a))
}
}
var constant = function (value) {
return function () {
return value
}
}
var identity = function (x) {
return x
}
var tripleEquals = function (a, b) {
return a === b
}
function curry(fn) {
var initialArgs = []
for (var _i = 1; _i < arguments.length; _i++) {
initialArgs[_i - 1] = arguments[_i]
}
return function () {
var restArgs = []
for (var _i = 0; _i < arguments.length; _i++) {
restArgs[_i] = arguments[_i]
}
var all = initialArgs.concat(restArgs)
return fn.apply(null, all)
}
}
var not = function (f) {
return function (t) {
return !f(t)
}
}
var die = function (msg) {
return function () {
throw new Error(msg)
}
}
var apply = function (f) {
return f()
}
var call = function (f) {
f()
}
var never = constant(false)
var always = constant(true)
var none = function () {
return NONE
}
var NONE = (function () {
var call = function (thunk) {
return thunk()
}
var id = identity
var me = {
fold: function (n, _s) {
return n()
},
isSome: never,
isNone: always,
getOr: id,
getOrThunk: call,
getOrDie: function (msg) {
throw new Error(msg || 'error: getOrDie called on none.')
},
getOrNull: constant(null),
getOrUndefined: constant(undefined),
or: id,
orThunk: call,
map: none,
each: noop,
bind: none,
exists: never,
forall: always,
filter: function () {
return none()
},
toArray: function () {
return []
},
toString: constant('none()'),
}
return me
})()
var some = function (a) {
var constant_a = constant(a)
var self = function () {
return me
}
var bind = function (f) {
return f(a)
}
var me = {
fold: function (n, s) {
return s(a)
},
isSome: always,
isNone: never,
getOr: constant_a,
getOrThunk: constant_a,
getOrDie: constant_a,
getOrNull: constant_a,
getOrUndefined: constant_a,
or: self,
orThunk: self,
map: function (f) {
return some(f(a))
},
each: function (f) {
f(a)
},
bind: bind,
exists: bind,
forall: bind,
filter: function (f) {
return f(a) ? me : NONE
},
toArray: function () {
return [a]
},
toString: function () {
return 'some(' + a + ')'
},
}
return me
}
var from$1 = function (value) {
return value === null || value === undefined ? NONE : some(value)
}
var Optional = {
some: some,
none: none,
from: from$1,
}
var nativeSlice = Array.prototype.slice
var nativeIndexOf = Array.prototype.indexOf
var nativePush = Array.prototype.push
var rawIndexOf = function (ts, t) {
return nativeIndexOf.call(ts, t)
}
var indexOf$2 = function (xs, x) {
var r = rawIndexOf(xs, x)
return r === -1 ? Optional.none() : Optional.some(r)
}
var contains$3 = function (xs, x) {
return rawIndexOf(xs, x) > -1
}
var exists = function (xs, pred) {
for (var i = 0, len = xs.length; i < len; i++) {
var x = xs[i]
if (pred(x, i)) {
return true
}
}
return false
}
var map$3 = function (xs, f) {
var len = xs.length
var r = new Array(len)
for (var i = 0; i < len; i++) {
var x = xs[i]
r[i] = f(x, i)
}
return r
}
var each$k = function (xs, f) {
for (var i = 0, len = xs.length; i < len; i++) {
var x = xs[i]
f(x, i)
}
}
var eachr = function (xs, f) {
for (var i = xs.length - 1; i >= 0; i--) {
var x = xs[i]
f(x, i)
}
}
var partition = function (xs, pred) {
var pass = []
var fail = []
for (var i = 0, len = xs.length; i < len; i++) {
var x = xs[i]
var arr = pred(x, i) ? pass : fail
arr.push(x)
}
return {
pass: pass,
fail: fail,
}
}
var filter$4 = function (xs, pred) {
var r = []
for (var i = 0, len = xs.length; i < len; i++) {
var x = xs[i]
if (pred(x, i)) {
r.push(x)
}
}
return r
}
var foldr = function (xs, f, acc) {
eachr(xs, function (x, i) {
acc = f(acc, x, i)
})
return acc
}
var foldl = function (xs, f, acc) {
each$k(xs, function (x, i) {
acc = f(acc, x, i)
})
return acc
}
var findUntil$1 = function (xs, pred, until) {
for (var i = 0, len = xs.length; i < len; i++) {
var x = xs[i]
if (pred(x, i)) {
return Optional.some(x)
} else if (until(x, i)) {
break
}
}
return Optional.none()
}
var find$3 = function (xs, pred) {
return findUntil$1(xs, pred, never)
}
var findIndex$2 = function (xs, pred) {
for (var i = 0, len = xs.length; i < len; i++) {
var x = xs[i]
if (pred(x, i)) {
return Optional.some(i)
}
}
return Optional.none()
}
var flatten = function (xs) {
var r = []
for (var i = 0, len = xs.length; i < len; ++i) {
if (!isArray$1(xs[i])) {
throw new Error(
'Arr.flatten item ' + i + ' was not an array, input: ' + xs
)
}
nativePush.apply(r, xs[i])
}
return r
}
var bind = function (xs, f) {
return flatten(map$3(xs, f))
}
var forall = function (xs, pred) {
for (var i = 0, len = xs.length; i < len; ++i) {
var x = xs[i]
if (pred(x, i) !== true) {
return false
}
}
return true
}
var reverse = function (xs) {
var r = nativeSlice.call(xs, 0)
r.reverse()
return r
}
var difference = function (a1, a2) {
return filter$4(a1, function (x) {
return !contains$3(a2, x)
})
}
var mapToObject = function (xs, f) {
var r = {}
for (var i = 0, len = xs.length; i < len; i++) {
var x = xs[i]
r[String(x)] = f(x, i)
}
return r
}
var sort = function (xs, comparator) {
var copy = nativeSlice.call(xs, 0)
copy.sort(comparator)
return copy
}
var get$a = function (xs, i) {
return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none()
}
var head = function (xs) {
return get$a(xs, 0)
}
var last$2 = function (xs) {
return get$a(xs, xs.length - 1)
}
var from = isFunction(Array.from)
? Array.from
: function (x) {
return nativeSlice.call(x)
}
var findMap = function (arr, f) {
for (var i = 0; i < arr.length; i++) {
var r = f(arr[i], i)
if (r.isSome()) {
return r
}
}
return Optional.none()
}
var keys = Object.keys
var hasOwnProperty$1 = Object.hasOwnProperty
var each$j = function (obj, f) {
var props = keys(obj)
for (var k = 0, len = props.length; k < len; k++) {
var i = props[k]
var x = obj[i]
f(x, i)
}
}
var map$2 = function (obj, f) {
return tupleMap(obj, function (x, i) {
return {
k: i,
v: f(x, i),
}
})
}
var tupleMap = function (obj, f) {
var r = {}
each$j(obj, function (x, i) {
var tuple = f(x, i)
r[tuple.k] = tuple.v
})
return r
}
var objAcc = function (r) {
return function (x, i) {
r[i] = x
}
}
var internalFilter = function (obj, pred, onTrue, onFalse) {
var r = {}
each$j(obj, function (x, i) {
;(pred(x, i) ? onTrue : onFalse)(x, i)
})
return r
}
var bifilter = function (obj, pred) {
var t = {}
var f = {}
internalFilter(obj, pred, objAcc(t), objAcc(f))
return {
t: t,
f: f,
}
}
var filter$3 = function (obj, pred) {
var t = {}
internalFilter(obj, pred, objAcc(t), noop)
return t
}
var mapToArray = function (obj, f) {
var r = []
each$j(obj, function (value, name) {
r.push(f(value, name))
})
return r
}
var values = function (obj) {
return mapToArray(obj, identity)
}
var get$9 = function (obj, key) {
return has$2(obj, key) ? Optional.from(obj[key]) : Optional.none()
}
var has$2 = function (obj, key) {
return hasOwnProperty$1.call(obj, key)
}
var hasNonNullableKey = function (obj, key) {
return has$2(obj, key) && obj[key] !== undefined && obj[key] !== null
}
var equal$1 = function (a1, a2, eq) {
if (eq === void 0) {
eq = eqAny
}
return eqRecord(eq).eq(a1, a2)
}
var isArray = Array.isArray
var toArray$1 = function (obj) {
if (!isArray(obj)) {
var array = []
for (var i = 0, l = obj.length; i < l; i++) {
array[i] = obj[i]
}
return array
} else {
return obj
}
}
var each$i = function (o, cb, s) {
var n, l
if (!o) {
return false
}
s = s || o
if (o.length !== undefined) {
for (n = 0, l = o.length; n < l; n++) {
if (cb.call(s, o[n], n, o) === false) {
return false
}
}
} else {
for (n in o) {
if (has$2(o, n)) {
if (cb.call(s, o[n], n, o) === false) {
return false
}
}
}
}
return true
}
var map$1 = function (array, callback) {
var out = []
each$i(array, function (item, index) {
out.push(callback(item, index, array))
})
return out
}
var filter$2 = function (a, f) {
var o = []
each$i(a, function (v, index) {
if (!f || f(v, index, a)) {
o.push(v)
}
})
return o
}
var indexOf$1 = function (a, v) {
if (a) {
for (var i = 0, l = a.length; i < l; i++) {
if (a[i] === v) {
return i
}
}
}
return -1
}
var reduce = function (collection, iteratee, accumulator, thisArg) {
var acc = isUndefined(accumulator) ? collection[0] : accumulator
for (var i = 0; i < collection.length; i++) {
acc = iteratee.call(thisArg, acc, collection[i], i)
}
return acc
}
var findIndex$1 = function (array, predicate, thisArg) {
var i, l
for (i = 0, l = array.length; i < l; i++) {
if (predicate.call(thisArg, array[i], i, array)) {
return i
}
}
return -1
}
var last$1 = function (collection) {
return collection[collection.length - 1]
}
var __assign = function () {
__assign =
Object.assign ||
function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i]
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]
}
return t
}
return __assign.apply(this, arguments)
}
function __rest(s, e) {
var t = {}
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p]
if (s != null && typeof Object.getOwnPropertySymbols === 'function')
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (
e.indexOf(p[i]) < 0 &&
Object.prototype.propertyIsEnumerable.call(s, p[i])
)
t[p[i]] = s[p[i]]
}
return t
}
function __spreadArray(to, from, pack) {
if (pack || arguments.length === 2)
for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i)
ar[i] = from[i]
}
}
return to.concat(ar || Array.prototype.slice.call(from))
}
var cached = function (f) {
var called = false
var r
return function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
if (!called) {
called = true
r = f.apply(null, args)
}
return r
}
}
var DeviceType = function (os, browser, userAgent, mediaMatch) {
var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true
var isiPhone = os.isiOS() && !isiPad
var isMobile = os.isiOS() || os.isAndroid()
var isTouch = isMobile || mediaMatch('(pointer:coarse)')
var isTablet =
isiPad ||
(!isiPhone && isMobile && mediaMatch('(min-device-width:768px)'))
var isPhone = isiPhone || (isMobile && !isTablet)
var iOSwebview =
browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false
var isDesktop = !isPhone && !isTablet && !iOSwebview
return {
isiPad: constant(isiPad),
isiPhone: constant(isiPhone),
isTablet: constant(isTablet),
isPhone: constant(isPhone),
isTouch: constant(isTouch),
isAndroid: os.isAndroid,
isiOS: os.isiOS,
isWebView: constant(iOSwebview),
isDesktop: constant(isDesktop),
}
}
var firstMatch = function (regexes, s) {
for (var i = 0; i < regexes.length; i++) {
var x = regexes[i]
if (x.test(s)) {
return x
}
}
return undefined
}
var find$2 = function (regexes, agent) {
var r = firstMatch(regexes, agent)
if (!r) {
return {
major: 0,
minor: 0,
}
}
var group = function (i) {
return Number(agent.replace(r, '$' + i))
}
return nu$4(group(1), group(2))
}
var detect$3 = function (versionRegexes, agent) {
var cleanedAgent = String(agent).toLowerCase()
if (versionRegexes.length === 0) {
return unknown$2()
}
return find$2(versionRegexes, cleanedAgent)
}
var unknown$2 = function () {
return nu$4(0, 0)
}
var nu$4 = function (major, minor) {
return {
major: major,
minor: minor,
}
}
var Version = {
nu: nu$4,
detect: detect$3,
unknown: unknown$2,
}
var detectBrowser$1 = function (browsers, userAgentData) {
return findMap(userAgentData.brands, function (uaBrand) {
var lcBrand = uaBrand.brand.toLowerCase()
return find$3(browsers, function (browser) {
var _a
return (
lcBrand ===
((_a = browser.brand) === null || _a === void 0
? void 0
: _a.toLowerCase())
)
}).map(function (info) {
return {
current: info.name,
version: Version.nu(parseInt(uaBrand.version, 10), 0),
}
})
})
}
var detect$2 = function (candidates, userAgent) {
var agent = String(userAgent).toLowerCase()
return find$3(candidates, function (candidate) {
return candidate.search(agent)
})
}
var detectBrowser = function (browsers, userAgent) {
return detect$2(browsers, userAgent).map(function (browser) {
var version = Version.detect(browser.versionRegexes, userAgent)
return {
current: browser.name,
version: version,
}
})
}
var detectOs = function (oses, userAgent) {
return detect$2(oses, userAgent).map(function (os) {
var version = Version.detect(os.versionRegexes, userAgent)
return {
current: os.name,
version: version,
}
})
}
var removeFromStart = function (str, numChars) {
return str.substring(numChars)
}
var checkRange = function (str, substr, start) {
return (
substr === '' ||
(str.length >= substr.length &&
str.substr(start, start + substr.length) === substr)
)
}
var removeLeading = function (str, prefix) {
return startsWith(str, prefix) ? removeFromStart(str, prefix.length) : str
}
var contains$2 = function (str, substr) {
return str.indexOf(substr) !== -1
}
var startsWith = function (str, prefix) {
return checkRange(str, prefix, 0)
}
var blank = function (r) {
return function (s) {
return s.replace(r, '')
}
}
var trim$4 = blank(/^\s+|\s+$/g)
var lTrim = blank(/^\s+/g)
var rTrim = blank(/\s+$/g)
var isNotEmpty = function (s) {
return s.length > 0
}
var isEmpty$3 = function (s) {
return !isNotEmpty(s)
}
var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/
var checkContains = function (target) {
return function (uastring) {
return contains$2(uastring, target)
}
}
var browsers = [
{
name: 'Edge',
versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
search: function (uastring) {
return (
contains$2(uastring, 'edge/') &&
contains$2(uastring, 'chrome') &&
contains$2(uastring, 'safari') &&
contains$2(uastring, 'applewebkit')
)
},
},
{
name: 'Chrome',
brand: 'Chromium',
versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/, normalVersionRegex],
search: function (uastring) {
return (
contains$2(uastring, 'chrome') && !contains$2(uastring, 'chromeframe')
)
},
},
{
name: 'IE',
versionRegexes: [
/.*?msie\ ?([0-9]+)\.([0-9]+).*/,
/.*?rv:([0-9]+)\.([0-9]+).*/,
],
search: function (uastring) {
return contains$2(uastring, 'msie') || contains$2(uastring, 'trident')
},
},
{
name: 'Opera',
versionRegexes: [normalVersionRegex, /.*?opera\/([0-9]+)\.([0-9]+).*/],
search: checkContains('opera'),
},
{
name: 'Firefox',
versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
search: checkContains('firefox'),
},
{
name: 'Safari',
versionRegexes: [normalVersionRegex, /.*?cpu os ([0-9]+)_([0-9]+).*/],
search: function (uastring) {
return (
(contains$2(uastring, 'safari') || contains$2(uastring, 'mobile/')) &&
contains$2(uastring, 'applewebkit')
)
},
},
]
var oses = [
{
name: 'Windows',
search: checkContains('win'),
versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/],
},
{
name: 'iOS',
search: function (uastring) {
return contains$2(uastring, 'iphone') || contains$2(uastring, 'ipad')
},
versionRegexes: [
/.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
/.*cpu os ([0-9]+)_([0-9]+).*/,
/.*cpu iphone os ([0-9]+)_([0-9]+).*/,
],
},
{
name: 'Android',
search: checkContains('android'),
versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/],
},
{
name: 'OSX',
search: checkContains('mac os x'),
versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/],
},
{
name: 'Linux',
search: checkContains('linux'),
versionRegexes: [],
},
{
name: 'Solaris',
search: checkContains('sunos'),
versionRegexes: [],
},
{
name: 'FreeBSD',
search: checkContains('freebsd'),
versionRegexes: [],
},
{
name: 'ChromeOS',
search: checkContains('cros'),
versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/],
},
]
var PlatformInfo = {
browsers: constant(browsers),
oses: constant(oses),
}
var edge = 'Edge'
var chrome = 'Chrome'
var ie$1 = 'IE'
var opera = 'Opera'
var firefox = 'Firefox'
var safari = 'Safari'
var unknown$1 = function () {
return nu$3({
current: undefined,
version: Version.unknown(),
})
}
var nu$3 = function (info) {
var current = info.current
var version = info.version
var isBrowser = function (name) {
return function () {
return current === name
}
}
return {
current: current,
version: version,
isEdge: isBrowser(edge),
isChrome: isBrowser(chrome),
isIE: isBrowser(ie$1),
isOpera: isBrowser(opera),
isFirefox: isBrowser(firefox),
isSafari: isBrowser(safari),
}
}
var Browser = {
unknown: unknown$1,
nu: nu$3,
edge: constant(edge),
chrome: constant(chrome),
ie: constant(ie$1),
opera: constant(opera),
firefox: constant(firefox),
safari: constant(safari),
}
var windows = 'Windows'
var ios = 'iOS'
var android = 'Android'
var linux = 'Linux'
var osx = 'OSX'
var solaris = 'Solaris'
var freebsd = 'FreeBSD'
var chromeos = 'ChromeOS'
var unknown = function () {
return nu$2({
current: undefined,
version: Version.unknown(),
})
}
var nu$2 = function (info) {
var current = info.current
var version = info.version
var isOS = function (name) {
return function () {
return current === name
}
}
return {
current: current,
version: version,
isWindows: isOS(windows),
isiOS: isOS(ios),
isAndroid: isOS(android),
isOSX: isOS(osx),
isLinux: isOS(linux),
isSolaris: isOS(solaris),
isFreeBSD: isOS(freebsd),
isChromeOS: isOS(chromeos),
}
}
var OperatingSystem = {
unknown: unknown,
nu: nu$2,
windows: constant(windows),
ios: constant(ios),
android: constant(android),
linux: constant(linux),
osx: constant(osx),
solaris: constant(solaris),
freebsd: constant(freebsd),
chromeos: constant(chromeos),
}
var detect$1 = function (userAgent, userAgentDataOpt, mediaMatch) {
var browsers = PlatformInfo.browsers()
var oses = PlatformInfo.oses()
var browser = userAgentDataOpt
.bind(function (userAgentData) {
return detectBrowser$1(browsers, userAgentData)
})
.orThunk(function () {
return detectBrowser(browsers, userAgent)
})
.fold(Browser.unknown, Browser.nu)
var os = detectOs(oses, userAgent).fold(
OperatingSystem.unknown,
OperatingSystem.nu
)
var deviceType = DeviceType(os, browser, userAgent, mediaMatch)
return {
browser: browser,
os: os,
deviceType: deviceType,
}
}
var PlatformDetection = { detect: detect$1 }
var mediaMatch = function (query) {
return window.matchMedia(query).matches
}
var platform$2 = cached(function () {
return PlatformDetection.detect(
navigator.userAgent,
Optional.from(navigator.userAgentData),
mediaMatch
)
})
var detect = function () {
return platform$2()
}
var userAgent = navigator.userAgent
var platform$1 = detect()
var browser$4 = platform$1.browser
var os = platform$1.os
var deviceType = platform$1.deviceType
var webkit = /WebKit/.test(userAgent) && !browser$4.isEdge()
var fileApi =
'FormData' in window &&
'FileReader' in window &&
'URL' in window &&
!!URL.createObjectURL
var windowsPhone = userAgent.indexOf('Windows Phone') !== -1
var Env = {
opera: browser$4.isOpera(),
webkit: webkit,
ie:
browser$4.isIE() || browser$4.isEdge() ? browser$4.version.major : false,
gecko: browser$4.isFirefox(),
mac: os.isOSX() || os.isiOS(),
iOS: deviceType.isiPad() || deviceType.isiPhone(),
android: os.isAndroid(),
contentEditable: true,
transparentSrc:
'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7',
caretAfter: true,
range: window.getSelection && 'Range' in window,
documentMode: browser$4.isIE() ? document.documentMode || 7 : 10,
fileApi: fileApi,
ceFalse: true,
cacheSuffix: null,
container: null,
experimentalShadowDom: false,
canHaveCSP: !browser$4.isIE(),
desktop: deviceType.isDesktop(),
windowsPhone: windowsPhone,
browser: {
current: browser$4.current,
version: browser$4.version,
isChrome: browser$4.isChrome,
isEdge: browser$4.isEdge,
isFirefox: browser$4.isFirefox,
isIE: browser$4.isIE,
isOpera: browser$4.isOpera,
isSafari: browser$4.isSafari,
},
os: {
current: os.current,
version: os.version,
isAndroid: os.isAndroid,
isChromeOS: os.isChromeOS,
isFreeBSD: os.isFreeBSD,
isiOS: os.isiOS,
isLinux: os.isLinux,
isOSX: os.isOSX,
isSolaris: os.isSolaris,
isWindows: os.isWindows,
},
deviceType: {
isDesktop: deviceType.isDesktop,
isiPad: deviceType.isiPad,
isiPhone: deviceType.isiPhone,
isPhone: deviceType.isPhone,
isTablet: deviceType.isTablet,
isTouch: deviceType.isTouch,
isWebView: deviceType.isWebView,
},
}
var whiteSpaceRegExp$2 = /^\s*|\s*$/g
var trim$3 = function (str) {
return str === null || str === undefined
? ''
: ('' + str).replace(whiteSpaceRegExp$2, '')
}
var is$3 = function (obj, type) {
if (!type) {
return obj !== undefined
}
if (type === 'array' && isArray(obj)) {
return true
}
return typeof obj === type
}
var makeMap$4 = function (items, delim, map) {
var i
items = items || []
delim = delim || ','
if (typeof items === 'string') {
items = items.split(delim)
}
map = map || {}
i = items.length
while (i--) {
map[items[i]] = {}
}
return map
}
var hasOwnProperty = has$2
var create$9 = function (s, p, root) {
var self = this
var sp,
scn,
c,
de = 0
s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s)
var cn = s[3].match(/(^|\.)(\w+)$/i)[2]
var ns = self.createNS(s[3].replace(/\.\w+$/, ''), root)
if (ns[cn]) {
return
}
if (s[2] === 'static') {
ns[cn] = p
if (this.onCreate) {
this.onCreate(s[2], s[3], ns[cn])
}
return
}
if (!p[cn]) {
p[cn] = function () {}
de = 1
}
ns[cn] = p[cn]
self.extend(ns[cn].prototype, p)
if (s[5]) {
sp = self.resolve(s[5]).prototype
scn = s[5].match(/\.(\w+)$/i)[1]
c = ns[cn]
if (de) {
ns[cn] = function () {
return sp[scn].apply(this, arguments)
}
} else {
ns[cn] = function () {
this.parent = sp[scn]
return c.apply(this, arguments)
}
}
ns[cn].prototype[cn] = ns[cn]
self.each(sp, function (f, n) {
ns[cn].prototype[n] = sp[n]
})
self.each(p, function (f, n) {
if (sp[n]) {
ns[cn].prototype[n] = function () {
this.parent = sp[n]
return f.apply(this, arguments)
}
} else {
if (n !== cn) {
ns[cn].prototype[n] = f
}
}
})
}
self.each(p.static, function (f, n) {
ns[cn][n] = f
})
}
var extend$6 = function (obj) {
var exts = []
for (var _i = 1; _i < arguments.length; _i++) {
exts[_i - 1] = arguments[_i]
}
for (var i = 0; i < exts.length; i++) {
var ext = exts[i]
for (var name_1 in ext) {
if (has$2(ext, name_1)) {
var value = ext[name_1]
if (value !== undefined) {
obj[name_1] = value
}
}
}
}
return obj
}
var walk$3 = function (o, f, n, s) {
s = s || this
if (o) {
if (n) {
o = o[n]
}
each$i(o, function (o, i) {
if (f.call(s, o, i, n) === false) {
return false
}
walk$3(o, f, n, s)
})
}
}
var createNS = function (n, o) {
var i, v
o = o || window
n = n.split('.')
for (i = 0; i < n.length; i++) {
v = n[i]
if (!o[v]) {
o[v] = {}
}
o = o[v]
}
return o
}
var resolve$3 = function (n, o) {
var i, l
o = o || window
n = n.split('.')
for (i = 0, l = n.length; i < l; i++) {
o = o[n[i]]
if (!o) {
break
}
}
return o
}
var explode$4 = function (s, d) {
if (!s || is$3(s, 'array')) {
return s
}
return map$1(s.split(d || ','), trim$3)
}
var _addCacheSuffix = function (url) {
var cacheSuffix = Env.cacheSuffix
if (cacheSuffix) {
url += (url.indexOf('?') === -1 ? '?' : '&') + cacheSuffix
}
return url
}
var Tools = {
trim: trim$3,
isArray: isArray,
is: is$3,
toArray: toArray$1,
makeMap: makeMap$4,
each: each$i,
map: map$1,
grep: filter$2,
inArray: indexOf$1,
hasOwn: hasOwnProperty,
extend: extend$6,
create: create$9,
walk: walk$3,
createNS: createNS,
resolve: resolve$3,
explode: explode$4,
_addCacheSuffix: _addCacheSuffix,
}
var fromHtml$1 = function (html, scope) {
var doc = scope || document
var div = doc.createElement('div')
div.innerHTML = html
if (!div.hasChildNodes() || div.childNodes.length > 1) {
console.error('HTML does not have a single root node', html)
throw new Error('HTML must have a single root node')
}
return fromDom$2(div.childNodes[0])
}
var fromTag = function (tag, scope) {
var doc = scope || document
var node = doc.createElement(tag)
return fromDom$2(node)
}
var fromText = function (text, scope) {
var doc = scope || document
var node = doc.createTextNode(text)
return fromDom$2(node)
}
var fromDom$2 = function (node) {
if (node === null || node === undefined) {
throw new Error('Node cannot be null or undefined')
}
return { dom: node }
}
var fromPoint$1 = function (docElm, x, y) {
return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom$2)
}
var SugarElement = {
fromHtml: fromHtml$1,
fromTag: fromTag,
fromText: fromText,
fromDom: fromDom$2,
fromPoint: fromPoint$1,
}
var toArray = function (target, f) {
var r = []
var recurse = function (e) {
r.push(e)
return f(e)
}
var cur = f(target)
do {
cur = cur.bind(recurse)
} while (cur.isSome())
return r
}
var compareDocumentPosition = function (a, b, match) {
return (a.compareDocumentPosition(b) & match) !== 0
}
var documentPositionContainedBy = function (a, b) {
return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_CONTAINED_BY)
}
var COMMENT = 8
var DOCUMENT = 9
var DOCUMENT_FRAGMENT = 11
var ELEMENT = 1
var TEXT = 3
var is$2 = function (element, selector) {
var dom = element.dom
if (dom.nodeType !== ELEMENT) {
return false
} else {
var elem = dom
if (elem.matches !== undefined) {
return elem.matches(selector)
} else if (elem.msMatchesSelector !== undefined) {
return elem.msMatchesSelector(selector)
} else if (elem.webkitMatchesSelector !== undefined) {
return elem.webkitMatchesSelector(selector)
} else if (elem.mozMatchesSelector !== undefined) {
return elem.mozMatchesSelector(selector)
} else {
throw new Error('Browser lacks native selectors')
}
}
}
var bypassSelector = function (dom) {
return (
(dom.nodeType !== ELEMENT &&
dom.nodeType !== DOCUMENT &&
dom.nodeType !== DOCUMENT_FRAGMENT) ||
dom.childElementCount === 0
)
}
var all = function (selector, scope) {
var base = scope === undefined ? document : scope.dom
return bypassSelector(base)
? []
: map$3(base.querySelectorAll(selector), SugarElement.fromDom)
}
var one = function (selector, scope) {
var base = scope === undefined ? document : scope.dom
return bypassSelector(base)
? Optional.none()
: Optional.from(base.querySelector(selector)).map(SugarElement.fromDom)
}
var eq = function (e1, e2) {
return e1.dom === e2.dom
}
var regularContains = function (e1, e2) {
var d1 = e1.dom
var d2 = e2.dom
return d1 === d2 ? false : d1.contains(d2)
}
var ieContains = function (e1, e2) {
return documentPositionContainedBy(e1.dom, e2.dom)
}
var contains$1 = function (e1, e2) {
return detect().browser.isIE()
? ieContains(e1, e2)
: regularContains(e1, e2)
}
typeof window !== 'undefined' ? window : Function('return this;')()
var name = function (element) {
var r = element.dom.nodeName
return r.toLowerCase()
}
var type = function (element) {
return element.dom.nodeType
}
var isType = function (t) {
return function (element) {
return type(element) === t
}
}
var isComment$1 = function (element) {
return type(element) === COMMENT || name(element) === '#comment'
}
var isElement$6 = isType(ELEMENT)
var isText$8 = isType(TEXT)
var isDocument$2 = isType(DOCUMENT)
var isDocumentFragment$1 = isType(DOCUMENT_FRAGMENT)
var isTag = function (tag) {
return function (e) {
return isElement$6(e) && name(e) === tag
}
}
var owner$1 = function (element) {
return SugarElement.fromDom(element.dom.ownerDocument)
}
var documentOrOwner = function (dos) {
return isDocument$2(dos) ? dos : owner$1(dos)
}
var documentElement = function (element) {
return SugarElement.fromDom(documentOrOwner(element).dom.documentElement)
}
var defaultView = function (element) {
return SugarElement.fromDom(documentOrOwner(element).dom.defaultView)
}
var parent = function (element) {
return Optional.from(element.dom.parentNode).map(SugarElement.fromDom)
}
var parents$1 = function (element, isRoot) {
var stop = isFunction(isRoot) ? isRoot : never
var dom = element.dom
var ret = []
while (dom.parentNode !== null && dom.parentNode !== undefined) {
var rawParent = dom.parentNode
var p = SugarElement.fromDom(rawParent)
ret.push(p)
if (stop(p) === true) {
break
} else {
dom = rawParent
}
}
return ret
}
var siblings = function (element) {
var filterSelf = function (elements) {
return filter$4(elements, function (x) {
return !eq(element, x)
})
}
return parent(element).map(children).map(filterSelf).getOr([])
}
var prevSibling = function (element) {
return Optional.from(element.dom.previousSibling).map(SugarElement.fromDom)
}
var nextSibling = function (element) {
return Optional.from(element.dom.nextSibling).map(SugarElement.fromDom)
}
var prevSiblings = function (element) {
return reverse(toArray(element, prevSibling))
}
var nextSiblings = function (element) {
return toArray(element, nextSibling)
}
var children = function (element) {
return map$3(element.dom.childNodes, SugarElement.fromDom)
}
var child$1 = function (element, index) {
var cs = element.dom.childNodes
return Optional.from(cs[index]).map(SugarElement.fromDom)
}
var firstChild = function (element) {
return child$1(element, 0)
}
var lastChild = function (element) {
return child$1(element, element.dom.childNodes.length - 1)
}
var childNodesCount = function (element) {
return element.dom.childNodes.length
}
var getHead = function (doc) {
var b = doc.dom.head
if (b === null || b === undefined) {
throw new Error('Head is not available yet')
}
return SugarElement.fromDom(b)
}
var isShadowRoot = function (dos) {
return isDocumentFragment$1(dos) && isNonNullable(dos.dom.host)
}
var supported =
isFunction(Element.prototype.attachShadow) &&
isFunction(Node.prototype.getRootNode)
var isSupported$1 = constant(supported)
var getRootNode = supported
? function (e) {
return SugarElement.fromDom(e.dom.getRootNode())
}
: documentOrOwner
var getStyleContainer = function (dos) {
return isShadowRoot(dos) ? dos : getHead(documentOrOwner(dos))
}
var getShadowRoot = function (e) {
var r = getRootNode(e)
return isShadowRoot(r) ? Optional.some(r) : Optional.none()
}
var getShadowHost = function (e) {
return SugarElement.fromDom(e.dom.host)
}
var getOriginalEventTarget = function (event) {
if (isSupported$1() && isNonNullable(event.target)) {
var el = SugarElement.fromDom(event.target)
if (isElement$6(el) && isOpenShadowHost(el)) {
if (event.composed && event.composedPath) {
var composedPath = event.composedPath()
if (composedPath) {
return head(composedPath)
}
}
}
}
return Optional.from(event.target)
}
var isOpenShadowHost = function (element) {
return isNonNullable(element.dom.shadowRoot)
}
var before$4 = function (marker, element) {
var parent$1 = parent(marker)
parent$1.each(function (v) {
v.dom.insertBefore(element.dom, marker.dom)
})
}
var after$3 = function (marker, element) {
var sibling = nextSibling(marker)
sibling.fold(
function () {
var parent$1 = parent(marker)
parent$1.each(function (v) {
append$1(v, element)
})
},
function (v) {
before$4(v, element)
}
)
}
var prepend = function (parent, element) {
var firstChild$1 = firstChild(parent)
firstChild$1.fold(
function () {
append$1(parent, element)
},
function (v) {
parent.dom.insertBefore(element.dom, v.dom)
}
)
}
var append$1 = function (parent, element) {
parent.dom.appendChild(element.dom)
}
var wrap$3 = function (element, wrapper) {
before$4(element, wrapper)
append$1(wrapper, element)
}
var before$3 = function (marker, elements) {
each$k(elements, function (x) {
before$4(marker, x)
})
}
var append = function (parent, elements) {
each$k(elements, function (x) {
append$1(parent, x)
})
}
var empty = function (element) {
element.dom.textContent = ''
each$k(children(element), function (rogue) {
remove$7(rogue)
})
}
var remove$7 = function (element) {
var dom = element.dom
if (dom.parentNode !== null) {
dom.parentNode.removeChild(dom)
}
}
var unwrap = function (wrapper) {
var children$1 = children(wrapper)
if (children$1.length > 0) {
before$3(wrapper, children$1)
}
remove$7(wrapper)
}
var inBody = function (element) {
var dom = isText$8(element) ? element.dom.parentNode : element.dom
if (dom === undefined || dom === null || dom.ownerDocument === null) {
return false
}
var doc = dom.ownerDocument
return getShadowRoot(SugarElement.fromDom(dom)).fold(function () {
return doc.body.contains(dom)
}, compose1(inBody, getShadowHost))
}
var r = function (left, top) {
var translate = function (x, y) {
return r(left + x, top + y)
}
return {
left: left,
top: top,
translate: translate,
}
}
var SugarPosition = r
var boxPosition = function (dom) {
var box = dom.getBoundingClientRect()
return SugarPosition(box.left, box.top)
}
var firstDefinedOrZero = function (a, b) {
if (a !== undefined) {
return a
} else {
return b !== undefined ? b : 0
}
}
var absolute = function (element) {
var doc = element.dom.ownerDocument
var body = doc.body
var win = doc.defaultView
var html = doc.documentElement
if (body === element.dom) {
return SugarPosition(body.offsetLeft, body.offsetTop)
}
var scrollTop = firstDefinedOrZero(
win === null || win === void 0 ? void 0 : win.pageYOffset,
html.scrollTop
)
var scrollLeft = firstDefinedOrZero(
win === null || win === void 0 ? void 0 : win.pageXOffset,
html.scrollLeft
)
var clientTop = firstDefinedOrZero(html.clientTop, body.clientTop)
var clientLeft = firstDefinedOrZero(html.clientLeft, body.clientLeft)
return viewport(element).translate(
scrollLeft - clientLeft,
scrollTop - clientTop
)
}
var viewport = function (element) {
var dom = element.dom
var doc = dom.ownerDocument
var body = doc.body
if (body === dom) {
return SugarPosition(body.offsetLeft, body.offsetTop)
}
if (!inBody(element)) {
return SugarPosition(0, 0)
}
return boxPosition(dom)
}
var get$8 = function (_DOC) {
var doc = _DOC !== undefined ? _DOC.dom : document
var x = doc.body.scrollLeft || doc.documentElement.scrollLeft
var y = doc.body.scrollTop || doc.documentElement.scrollTop
return SugarPosition(x, y)
}
var to = function (x, y, _DOC) {
var doc = _DOC !== undefined ? _DOC.dom : document
var win = doc.defaultView
if (win) {
win.scrollTo(x, y)
}
}
var intoView = function (element, alignToTop) {
var isSafari = detect().browser.isSafari()
if (isSafari && isFunction(element.dom.scrollIntoViewIfNeeded)) {
element.dom.scrollIntoViewIfNeeded(false)
} else {
element.dom.scrollIntoView(alignToTop)
}
}
var get$7 = function (_win) {
var win = _win === undefined ? window : _win
if (detect().browser.isFirefox()) {
return Optional.none()
} else {
return Optional.from(win['visualViewport'])
}
}
var bounds = function (x, y, width, height) {
return {
x: x,
y: y,
width: width,
height: height,
right: x + width,
bottom: y + height,
}
}
var getBounds = function (_win) {
var win = _win === undefined ? window : _win
var doc = win.document
var scroll = get$8(SugarElement.fromDom(doc))
return get$7(win).fold(
function () {
var html = win.document.documentElement
var width = html.clientWidth
var height = html.clientHeight
return bounds(scroll.left, scroll.top, width, height)
},
function (visualViewport) {
return bounds(
Math.max(visualViewport.pageLeft, scroll.left),
Math.max(visualViewport.pageTop, scroll.top),
visualViewport.width,
visualViewport.height
)
}
)
}
var isNodeType = function (type) {
return function (node) {
return !!node && node.nodeType === type
}
}
var isRestrictedNode = function (node) {
return !!node && !Object.getPrototypeOf(node)
}
var isElement$5 = isNodeType(1)
var matchNodeNames = function (names) {
var lowercasedNames = names.map(function (s) {
return s.toLowerCase()
})
return function (node) {
if (node && node.nodeName) {
var nodeName = node.nodeName.toLowerCase()
return contains$3(lowercasedNames, nodeName)
}
return false
}
}
var matchStyleValues = function (name, values) {
var items = values.toLowerCase().split(' ')
return function (node) {
if (isElement$5(node)) {
for (var i = 0; i < items.length; i++) {
var computed = node.ownerDocument.defaultView.getComputedStyle(
node,
null
)
var cssValue = computed ? computed.getPropertyValue(name) : null
if (cssValue === items[i]) {
return true
}
}
}
return false
}
}
var hasAttribute = function (attrName) {
return function (node) {
return isElement$5(node) && node.hasAttribute(attrName)
}
}
var hasAttributeValue = function (attrName, attrValue) {
return function (node) {
return isElement$5(node) && node.getAttribute(attrName) === attrValue
}
}
var isBogus$2 = function (node) {
return isElement$5(node) && node.hasAttribute('data-mce-bogus')
}
var isBogusAll$1 = function (node) {
return isElement$5(node) && node.getAttribute('data-mce-bogus') === 'all'
}
var isTable$3 = function (node) {
return isElement$5(node) && node.tagName === 'TABLE'
}
var hasContentEditableState = function (value) {
return function (node) {
if (isElement$5(node)) {
if (node.contentEditable === value) {
return true
}
if (node.getAttribute('data-mce-contenteditable') === value) {
return true
}
}
return false
}
}
var isTextareaOrInput = matchNodeNames(['textarea', 'input'])
var isText$7 = isNodeType(3)
var isComment = isNodeType(8)
var isDocument$1 = isNodeType(9)
var isDocumentFragment = isNodeType(11)
var isBr$5 = matchNodeNames(['br'])
var isImg = matchNodeNames(['img'])
var isContentEditableTrue$4 = hasContentEditableState('true')
var isContentEditableFalse$b = hasContentEditableState('false')
var isTableCell$5 = matchNodeNames(['td', 'th'])
var isMedia$2 = matchNodeNames(['video', 'audio', 'object', 'embed'])
var is$1 = function (lhs, rhs, comparator) {
if (comparator === void 0) {
comparator = tripleEquals
}
return lhs.exists(function (left) {
return comparator(left, rhs)
})
}
var cat = function (arr) {
var r = []
var push = function (x) {
r.push(x)
}
for (var i = 0; i < arr.length; i++) {
arr[i].each(push)
}
return r
}
var lift2 = function (oa, ob, f) {
return oa.isSome() && ob.isSome()
? Optional.some(f(oa.getOrDie(), ob.getOrDie()))
: Optional.none()
}
var lift3 = function (oa, ob, oc, f) {
return oa.isSome() && ob.isSome() && oc.isSome()
? Optional.some(f(oa.getOrDie(), ob.getOrDie(), oc.getOrDie()))
: Optional.none()
}
var someIf = function (b, a) {
return b ? Optional.some(a) : Optional.none()
}
var isSupported = function (dom) {
return dom.style !== undefined && isFunction(dom.style.getPropertyValue)
}
var rawSet = function (dom, key, value) {
if (isString$1(value) || isBoolean(value) || isNumber(value)) {
dom.setAttribute(key, value + '')
} else {
console.error(
'Invalid call to Attribute.set. Key ',
key,
':: Value ',
value,
':: Element ',
dom
)
throw new Error('Attribute value was not simple')
}
}
var set$1 = function (element, key, value) {
rawSet(element.dom, key, value)
}
var setAll$1 = function (element, attrs) {
var dom = element.dom
each$j(attrs, function (v, k) {
rawSet(dom, k, v)
})
}
var get$6 = function (element, key) {
var v = element.dom.getAttribute(key)
return v === null ? undefined : v
}
var getOpt = function (element, key) {
return Optional.from(get$6(element, key))
}
var has$1 = function (element, key) {
var dom = element.dom
return dom && dom.hasAttribute ? dom.hasAttribute(key) : false
}
var remove$6 = function (element, key) {
element.dom.removeAttribute(key)
}
var clone$3 = function (element) {
return foldl(
element.dom.attributes,
function (acc, attr) {
acc[attr.name] = attr.value
return acc
},
{}
)
}
var internalSet = function (dom, property, value) {
if (!isString$1(value)) {
console.error(
'Invalid call to CSS.set. Property ',
property,
':: Value ',
value,
':: Element ',
dom
)
throw new Error('CSS value must be a string: ' + value)
}
if (isSupported(dom)) {
dom.style.setProperty(property, value)
}
}
var setAll = function (element, css) {
var dom = element.dom
each$j(css, function (v, k) {
internalSet(dom, k, v)
})
}
var get$5 = function (element, property) {
var dom = element.dom
var styles = window.getComputedStyle(dom)
var r = styles.getPropertyValue(property)
return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r
}
var getUnsafeProperty = function (dom, property) {
return isSupported(dom) ? dom.style.getPropertyValue(property) : ''
}
var getRaw = function (element, property) {
var dom = element.dom
var raw = getUnsafeProperty(dom, property)
return Optional.from(raw).filter(function (r) {
return r.length > 0
})
}
var getAllRaw = function (element) {
var css = {}
var dom = element.dom
if (isSupported(dom)) {
for (var i = 0; i < dom.style.length; i++) {
var ruleName = dom.style.item(i)
css[ruleName] = dom.style[ruleName]
}
}
return css
}
var reflow = function (e) {
return e.dom.offsetWidth
}
var browser$3 = detect().browser
var firstElement = function (nodes) {
return find$3(nodes, isElement$6)
}
var getTableCaptionDeltaY = function (elm) {
if (browser$3.isFirefox() && name(elm) === 'table') {
return firstElement(children(elm))
.filter(function (elm) {
return name(elm) === 'caption'
})
.bind(function (caption) {
return firstElement(nextSiblings(caption)).map(function (body) {
var bodyTop = body.dom.offsetTop
var captionTop = caption.dom.offsetTop
var captionHeight = caption.dom.offsetHeight
return bodyTop <= captionTop ? -captionHeight : 0
})
})
.getOr(0)
} else {
return 0
}
}
var hasChild = function (elm, child) {
return elm.children && contains$3(elm.children, child)
}
var getPos = function (body, elm, rootElm) {
var x = 0,
y = 0
var doc = body.ownerDocument
rootElm = rootElm ? rootElm : body
if (elm) {
if (
rootElm === body &&
elm.getBoundingClientRect &&
get$5(SugarElement.fromDom(body), 'position') === 'static'
) {
var pos = elm.getBoundingClientRect()
x =
pos.left +
(doc.documentElement.scrollLeft || body.scrollLeft) -
doc.documentElement.clientLeft
y =
pos.top +
(doc.documentElement.scrollTop || body.scrollTop) -
doc.documentElement.clientTop
return {
x: x,
y: y,
}
}
var offsetParent = elm
while (
offsetParent &&
offsetParent !== rootElm &&
offsetParent.nodeType &&
!hasChild(offsetParent, rootElm)
) {
var castOffsetParent = offsetParent
x += castOffsetParent.offsetLeft || 0
y += castOffsetParent.offsetTop || 0
offsetParent = castOffsetParent.offsetParent
}
offsetParent = elm.parentNode
while (
offsetParent &&
offsetParent !== rootElm &&
offsetParent.nodeType &&
!hasChild(offsetParent, rootElm)
) {
x -= offsetParent.scrollLeft || 0
y -= offsetParent.scrollTop || 0
offsetParent = offsetParent.parentNode
}
y += getTableCaptionDeltaY(SugarElement.fromDom(elm))
}
return {
x: x,
y: y,
}
}
var exports$1 = {},
module$1 = { exports: exports$1 }
;(function (define, exports, module, require) {
;(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined'
? (module.exports = factory())
: typeof define === 'function' && define.amd
? define(factory)
: ((global =
typeof globalThis !== 'undefined' ? globalThis : global || self),
(global.EphoxContactWrapper = factory()))
})(this, function () {
var commonjsGlobal =
typeof globalThis !== 'undefined'
? globalThis
: typeof window !== 'undefined'
? window
: typeof global !== 'undefined'
? global
: typeof self !== 'undefined'
? self
: {}
var promise = { exports: {} }
;(function (module) {
;(function (root) {
var setTimeoutFunc = setTimeout
function noop() {}
function bind(fn, thisArg) {
return function () {
fn.apply(thisArg, arguments)
}
}
function Promise(fn) {
if (typeof this !== 'object')
throw new TypeError('Promises must be constructed via new')
if (typeof fn !== 'function') throw new TypeError('not a function')
this._state = 0
this._handled = false
this._value = undefined
this._deferreds = []
doResolve(fn, this)
}
function handle(self, deferred) {
while (self._state === 3) {
self = self._value
}
if (self._state === 0) {
self._deferreds.push(deferred)
return
}
self._handled = true
Promise._immediateFn(function () {
var cb =
self._state === 1 ? deferred.onFulfilled : deferred.onRejected
if (cb === null) {
;(self._state === 1 ? resolve : reject)(
deferred.promise,
self._value
)
return
}
var ret
try {
ret = cb(self._value)
} catch (e) {
reject(deferred.promise, e)
return
}
resolve(deferred.promise, ret)
})
}
function resolve(self, newValue) {
try {
if (newValue === self)
throw new TypeError('A promise cannot be resolved with itself.')
if (
newValue &&
(typeof newValue === 'object' || typeof newValue === 'function')
) {
var then = newValue.then
if (newValue instanceof Promise) {
self._state = 3
self._value = newValue
finale(self)
return
} else if (typeof then === 'function') {
doResolve(bind(then, newValue), self)
return
}
}
self._state = 1
self._value = newValue
finale(self)
} catch (e) {
reject(self, e)
}
}
function reject(self, newValue) {
self._state = 2
self._value = newValue
finale(self)
}
function finale(self) {
if (self._state === 2 && self._deferreds.length === 0) {
Promise._immediateFn(function () {
if (!self._handled) {
Promise._unhandledRejectionFn(self._value)
}
})
}
for (var i = 0, len = self._deferreds.length; i < len; i++) {
handle(self, self._deferreds[i])
}
self._deferreds = null
}
function Handler(onFulfilled, onRejected, promise) {
this.onFulfilled =
typeof onFulfilled === 'function' ? onFulfilled : null
this.onRejected =
typeof onRejected === 'function' ? onRejected : null
this.promise = promise
}
function doResolve(fn, self) {
var done = false
try {
fn(
function (value) {
if (done) return
done = true
resolve(self, value)
},
function (reason) {
if (done) return
done = true
reject(self, reason)
}
)
} catch (ex) {
if (done) return
done = true
reject(self, ex)
}
}
Promise.prototype['catch'] = function (onRejected) {
return this.then(null, onRejected)
}
Promise.prototype.then = function (onFulfilled, onRejected) {
var prom = new this.constructor(noop)
handle(this, new Handler(onFulfilled, onRejected, prom))
return prom
}
Promise.all = function (arr) {
var args = Array.prototype.slice.call(arr)
return new Promise(function (resolve, reject) {
if (args.length === 0) return resolve([])
var remaining = args.length
function res(i, val) {
try {
if (
val &&
(typeof val === 'object' || typeof val === 'function')
) {
var then = val.then
if (typeof then === 'function') {
then.call(
val,
function (val) {
res(i, val)
},
reject
)
return
}
}
args[i] = val
if (--remaining === 0) {
resolve(args)
}
} catch (ex) {
reject(ex)
}
}
for (var i = 0; i < args.length; i++) {
res(i, args[i])
}
})
}
Promise.resolve = function (value) {
if (
value &&
typeof value === 'object' &&
value.constructor === Promise
) {
return value
}
return new Promise(function (resolve) {
resolve(value)
})
}
Promise.reject = function (value) {
return new Promise(function (resolve, reject) {
reject(value)
})
}
Promise.race = function (values) {
return new Promise(function (resolve, reject) {
for (var i = 0, len = values.length; i < len; i++) {
values[i].then(resolve, reject)
}
})
}
Promise._immediateFn =
typeof setImmediate === 'function'
? function (fn) {
setImmediate(fn)
}
: function (fn) {
setTimeoutFunc(fn, 0)
}
Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
if (typeof console !== 'undefined' && console) {
console.warn('Possible Unhandled Promise Rejection:', err)
}
}
Promise._setImmediateFn = function _setImmediateFn(fn) {
Promise._immediateFn = fn
}
Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(
fn
) {
Promise._unhandledRejectionFn = fn
}
if (module.exports) {
module.exports = Promise
} else if (!root.Promise) {
root.Promise = Promise
}
})(commonjsGlobal)
})(promise)
var promisePolyfill = promise.exports
var Global = (function () {
if (typeof window !== 'undefined') {
return window
} else {
return Function('return this;')()
}
})()
var promisePolyfill_1 = { boltExport: Global.Promise || promisePolyfill }
return promisePolyfill_1
})
})(undefined, exports$1, module$1)
var Promise$1 = module$1.exports.boltExport
var nu$1 = function (baseFn) {
var data = Optional.none()
var callbacks = []
var map = function (f) {
return nu$1(function (nCallback) {
get(function (data) {
nCallback(f(data))
})
})
}
var get = function (nCallback) {
if (isReady()) {
call(nCallback)
} else {
callbacks.push(nCallback)
}
}
var set = function (x) {
if (!isReady()) {
data = Optional.some(x)
run(callbacks)
callbacks = []
}
}
var isReady = function () {
return data.isSome()
}
var run = function (cbs) {
each$k(cbs, call)
}
var call = function (cb) {
data.each(function (x) {
setTimeout(function () {
cb(x)
}, 0)
})
}
baseFn(set)
return {
get: get,
map: map,
isReady: isReady,
}
}
var pure$1 = function (a) {
return nu$1(function (callback) {
callback(a)
})
}
var LazyValue = {
nu: nu$1,
pure: pure$1,
}
var errorReporter = function (err) {
setTimeout(function () {
throw err
}, 0)
}
var make = function (run) {
var get = function (callback) {
run().then(callback, errorReporter)
}
var map = function (fab) {
return make(function () {
return run().then(fab)
})
}
var bind = function (aFutureB) {
return make(function () {
return run().then(function (v) {
return aFutureB(v).toPromise()
})
})
}
var anonBind = function (futureB) {
return make(function () {
return run().then(function () {
return futureB.toPromise()
})
})
}
var toLazy = function () {
return LazyValue.nu(get)
}
var toCached = function () {
var cache = null
return make(function () {
if (cache === null) {
cache = run()
}
return cache
})
}
var toPromise = run
return {
map: map,
bind: bind,
anonBind: anonBind,
toLazy: toLazy,
toCached: toCached,
toPromise: toPromise,
get: get,
}
}
var nu = function (baseFn) {
return make(function () {
return new Promise$1(baseFn)
})
}
var pure = function (a) {
return make(function () {
return Promise$1.resolve(a)
})
}
var Future = {
nu: nu,
pure: pure,
}
var par$1 = function (asyncValues, nu) {
return nu(function (callback) {
var r = []
var count = 0
var cb = function (i) {
return function (value) {
r[i] = value
count++
if (count >= asyncValues.length) {
callback(r)
}
}
}
if (asyncValues.length === 0) {
callback([])
} else {
each$k(asyncValues, function (asyncValue, i) {
asyncValue.get(cb(i))
})
}
})
}
var par = function (futures) {
return par$1(futures, Future.nu)
}
var value$1 = function (o) {
var or = function (_opt) {
return value$1(o)
}
var orThunk = function (_f) {
return value$1(o)
}
var map = function (f) {
return value$1(f(o))
}
var mapError = function (_f) {
return value$1(o)
}
var each = function (f) {
f(o)
}
var bind = function (f) {
return f(o)
}
var fold = function (_, onValue) {
return onValue(o)
}
var exists = function (f) {
return f(o)
}
var forall = function (f) {
return f(o)
}
var toOptional = function () {
return Optional.some(o)
}
return {
isValue: always,
isError: never,
getOr: constant(o),
getOrThunk: constant(o),
getOrDie: constant(o),
or: or,
orThunk: orThunk,
fold: fold,
map: map,
mapError: mapError,
each: each,
bind: bind,
exists: exists,
forall: forall,
toOptional: toOptional,
}
}
var error = function (message) {
var getOrThunk = function (f) {
return f()
}
var getOrDie = function () {
return die(String(message))()
}
var or = identity
var orThunk = function (f) {
return f()
}
var map = function (_f) {
return error(message)
}
var mapError = function (f) {
return error(f(message))
}
var bind = function (_f) {
return error(message)
}
var fold = function (onError, _) {
return onError(message)
}
return {
isValue: never,
isError: always,
getOr: identity,
getOrThunk: getOrThunk,
getOrDie: getOrDie,
or: or,
orThunk: orThunk,
fold: fold,
map: map,
mapError: mapError,
each: noop,
bind: bind,
exists: never,
forall: always,
toOptional: Optional.none,
}
}
var fromOption = function (opt, err) {
return opt.fold(function () {
return error(err)
}, value$1)
}
var Result = {
value: value$1,
error: error,
fromOption: fromOption,
}
var generate$1 = function (cases) {
if (!isArray$1(cases)) {
throw new Error('cases must be an array')
}
if (cases.length === 0) {
throw new Error('there must be at least one case')
}
var constructors = []
var adt = {}
each$k(cases, function (acase, count) {
var keys$1 = keys(acase)
if (keys$1.length !== 1) {
throw new Error('one and only one name per case')
}
var key = keys$1[0]
var value = acase[key]
if (adt[key] !== undefined) {
throw new Error('duplicate key detected:' + key)
} else if (key === 'cata') {
throw new Error('cannot have a case named cata (sorry)')
} else if (!isArray$1(value)) {
throw new Error('case arguments must be an array')
}
constructors.push(key)
adt[key] = function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
var argLength = args.length
if (argLength !== value.length) {
throw new Error(
'Wrong number of arguments to case ' +
key +
'. Expected ' +
value.length +
' (' +
value +
'), got ' +
argLength
)
}
var match = function (branches) {
var branchKeys = keys(branches)
if (constructors.length !== branchKeys.length) {
throw new Error(
'Wrong number of arguments to match. Expected: ' +
constructors.join(',') +
'\nActual: ' +
branchKeys.join(',')
)
}
var allReqd = forall(constructors, function (reqKey) {
return contains$3(branchKeys, reqKey)
})
if (!allReqd) {
throw new Error(
'Not all branches were specified when using match. Specified: ' +
branchKeys.join(', ') +
'\nRequired: ' +
constructors.join(', ')
)
}
return branches[key].apply(null, args)
}
return {
fold: function () {
var foldArgs = []
for (var _i = 0; _i < arguments.length; _i++) {
foldArgs[_i] = arguments[_i]
}
if (foldArgs.length !== cases.length) {
throw new Error(
'Wrong number of arguments to fold. Expected ' +
cases.length +
', got ' +
foldArgs.length
)
}
var target = foldArgs[count]
return target.apply(null, args)
},
match: match,
log: function (label) {
console.log(label, {
constructors: constructors,
constructor: key,
params: args,
})
},
}
}
})
return adt
}
var Adt = { generate: generate$1 }
Adt.generate([
{
bothErrors: ['error1', 'error2'],
},
{
firstError: ['error1', 'value2'],
},
{
secondError: ['value1', 'error2'],
},
{
bothValues: ['value1', 'value2'],
},
])
var unite = function (result) {
return result.fold(identity, identity)
}
function ClosestOrAncestor(is, ancestor, scope, a, isRoot) {
if (is(scope, a)) {
return Optional.some(scope)
} else if (isFunction(isRoot) && isRoot(scope)) {
return Optional.none()
} else {
return ancestor(scope, a, isRoot)
}
}
var ancestor$3 = function (scope, predicate, isRoot) {
var element = scope.dom
var stop = isFunction(isRoot) ? isRoot : never
while (element.parentNode) {
element = element.parentNode
var el = SugarElement.fromDom(element)
if (predicate(el)) {
return Optional.some(el)
} else if (stop(el)) {
break
}
}
return Optional.none()
}
var closest$3 = function (scope, predicate, isRoot) {
var is = function (s, test) {
return test(s)
}
return ClosestOrAncestor(is, ancestor$3, scope, predicate, isRoot)
}
var sibling$2 = function (scope, predicate) {
var element = scope.dom
if (!element.parentNode) {
return Optional.none()
}
return child(SugarElement.fromDom(element.parentNode), function (x) {
return !eq(scope, x) && predicate(x)
})
}
var child = function (scope, predicate) {
var pred = function (node) {
return predicate(SugarElement.fromDom(node))
}
var result = find$3(scope.dom.childNodes, pred)
return result.map(SugarElement.fromDom)
}
var ancestor$2 = function (scope, selector, isRoot) {
return ancestor$3(
scope,
function (e) {
return is$2(e, selector)
},
isRoot
)
}
var descendant = function (scope, selector) {
return one(selector, scope)
}
var closest$2 = function (scope, selector, isRoot) {
var is = function (element, selector) {
return is$2(element, selector)
}
return ClosestOrAncestor(is, ancestor$2, scope, selector, isRoot)
}
var promiseObj = window.Promise ? window.Promise : Promise$1
var requestAnimationFramePromise
var requestAnimationFrame = function (callback, element) {
var requestAnimationFrameFunc = window.requestAnimationFrame
var vendors = ['ms', 'moz', 'webkit']
var featurefill = function (cb) {
window.setTimeout(cb, 0)
}
for (var i = 0; i < vendors.length && !requestAnimationFrameFunc; i++) {
requestAnimationFrameFunc = window[vendors[i] + 'RequestAnimationFrame']
}
if (!requestAnimationFrameFunc) {
requestAnimationFrameFunc = featurefill
}
requestAnimationFrameFunc(callback, element)
}
var wrappedSetTimeout = function (callback, time) {
if (typeof time !== 'number') {
time = 0
}
return setTimeout(callback, time)
}
var wrappedSetInterval = function (callback, time) {
if (typeof time !== 'number') {
time = 1
}
return setInterval(callback, time)
}
var wrappedClearTimeout = function (id) {
return clearTimeout(id)
}
var wrappedClearInterval = function (id) {
return clearInterval(id)
}
var debounce = function (callback, time) {
var timer
var func = function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
clearTimeout(timer)
timer = wrappedSetTimeout(function () {
callback.apply(this, args)
}, time)
}
func.stop = function () {
clearTimeout(timer)
}
return func
}
var Delay = {
requestAnimationFrame: function (callback, element) {
if (requestAnimationFramePromise) {
requestAnimationFramePromise.then(callback)
return
}
requestAnimationFramePromise = new promiseObj(function (resolve) {
if (!element) {
element = document.body
}
requestAnimationFrame(resolve, element)
}).then(callback)
},
setTimeout: wrappedSetTimeout,
setInterval: wrappedSetInterval,
setEditorTimeout: function (editor, callback, time) {
return wrappedSetTimeout(function () {
if (!editor.removed) {
callback()
}
}, time)
},
setEditorInterval: function (editor, callback, time) {
var timer = wrappedSetInterval(function () {
if (!editor.removed) {
callback()
} else {
clearInterval(timer)
}
}, time)
return timer
},
debounce: debounce,
throttle: debounce,
clearInterval: wrappedClearInterval,
clearTimeout: wrappedClearTimeout,
}
var StyleSheetLoader = function (documentOrShadowRoot, settings) {
if (settings === void 0) {
settings = {}
}
var idCount = 0
var loadedStates = {}
var edos = SugarElement.fromDom(documentOrShadowRoot)
var doc = documentOrOwner(edos)
var maxLoadTime = settings.maxLoadTime || 5000
var _setReferrerPolicy = function (referrerPolicy) {
settings.referrerPolicy = referrerPolicy
}
var addStyle = function (element) {
append$1(getStyleContainer(edos), element)
}
var removeStyle = function (id) {
var styleContainer = getStyleContainer(edos)
descendant(styleContainer, '#' + id).each(remove$7)
}
var getOrCreateState = function (url) {
return get$9(loadedStates, url).getOrThunk(function () {
return {
id: 'mce-u' + idCount++,
passed: [],
failed: [],
count: 0,
}
})
}
var load = function (url, success, failure) {
var link
var urlWithSuffix = Tools._addCacheSuffix(url)
var state = getOrCreateState(urlWithSuffix)
loadedStates[urlWithSuffix] = state
state.count++
var resolve = function (callbacks, status) {
var i = callbacks.length
while (i--) {
callbacks[i]()
}
state.status = status
state.passed = []
state.failed = []
if (link) {
link.onload = null
link.onerror = null
link = null
}
}
var passed = function () {
return resolve(state.passed, 2)
}
var failed = function () {
return resolve(state.failed, 3)
}
var wait = function (testCallback, waitCallback) {
if (!testCallback()) {
if (Date.now() - startTime < maxLoadTime) {
Delay.setTimeout(waitCallback)
} else {
failed()
}
}
}
var waitForWebKitLinkLoaded = function () {
wait(function () {
var styleSheets = documentOrShadowRoot.styleSheets
var i = styleSheets.length
while (i--) {
var styleSheet = styleSheets[i]
var owner = styleSheet.ownerNode
if (owner && owner.id === link.id) {
passed()
return true
}
}
return false
}, waitForWebKitLinkLoaded)
}
if (success) {
state.passed.push(success)
}
if (failure) {
state.failed.push(failure)
}
if (state.status === 1) {
return
}
if (state.status === 2) {
passed()
return
}
if (state.status === 3) {
failed()
return
}
state.status = 1
var linkElem = SugarElement.fromTag('link', doc.dom)
setAll$1(linkElem, {
rel: 'stylesheet',
type: 'text/css',
id: state.id,
})
var startTime = Date.now()
if (settings.contentCssCors) {
set$1(linkElem, 'crossOrigin', 'anonymous')
}
if (settings.referrerPolicy) {
set$1(linkElem, 'referrerpolicy', settings.referrerPolicy)
}
link = linkElem.dom
link.onload = waitForWebKitLinkLoaded
link.onerror = failed
addStyle(linkElem)
set$1(linkElem, 'href', urlWithSuffix)
}
var loadF = function (url) {
return Future.nu(function (resolve) {
load(
url,
compose(resolve, constant(Result.value(url))),
compose(resolve, constant(Result.error(url)))
)
})
}
var loadAll = function (urls, success, failure) {
par(map$3(urls, loadF)).get(function (result) {
var parts = partition(result, function (r) {
return r.isValue()
})
if (parts.fail.length > 0) {
failure(parts.fail.map(unite))
} else {
success(parts.pass.map(unite))
}
})
}
var unload = function (url) {
var urlWithSuffix = Tools._addCacheSuffix(url)
get$9(loadedStates, urlWithSuffix).each(function (state) {
var count = --state.count
if (count === 0) {
delete loadedStates[urlWithSuffix]
removeStyle(state.id)
}
})
}
var unloadAll = function (urls) {
each$k(urls, function (url) {
unload(url)
})
}
return {
load: load,
loadAll: loadAll,
unload: unload,
unloadAll: unloadAll,
_setReferrerPolicy: _setReferrerPolicy,
}
}
var create$8 = function () {
var map = new WeakMap()
var forElement = function (referenceElement, settings) {
var root = getRootNode(referenceElement)
var rootDom = root.dom
return Optional.from(map.get(rootDom)).getOrThunk(function () {
var sl = StyleSheetLoader(rootDom, settings)
map.set(rootDom, sl)
return sl
})
}
return { forElement: forElement }
}
var instance = create$8()
var DomTreeWalker = (function () {
function DomTreeWalker(startNode, rootNode) {
this.node = startNode
this.rootNode = rootNode
this.current = this.current.bind(this)
this.next = this.next.bind(this)
this.prev = this.prev.bind(this)
this.prev2 = this.prev2.bind(this)
}
DomTreeWalker.prototype.current = function () {
return this.node
}
DomTreeWalker.prototype.next = function (shallow) {
this.node = this.findSibling(
this.node,
'firstChild',
'nextSibling',
shallow
)
return this.node
}
DomTreeWalker.prototype.prev = function (shallow) {
this.node = this.findSibling(
this.node,
'lastChild',
'previousSibling',
shallow
)
return this.node
}
DomTreeWalker.prototype.prev2 = function (shallow) {
this.node = this.findPreviousNode(
this.node,
'lastChild',
'previousSibling',
shallow
)
return this.node
}
DomTreeWalker.prototype.findSibling = function (
node,
startName,
siblingName,
shallow
) {
var sibling, parent
if (node) {
if (!shallow && node[startName]) {
return node[startName]
}
if (node !== this.rootNode) {
sibling = node[siblingName]
if (sibling) {
return sibling
}
for (
parent = node.parentNode;
parent && parent !== this.rootNode;
parent = parent.parentNode
) {
sibling = parent[siblingName]
if (sibling) {
return sibling
}
}
}
}
}
DomTreeWalker.prototype.findPreviousNode = function (
node,
startName,
siblingName,
shallow
) {
var sibling, parent, child
if (node) {
sibling = node[siblingName]
if (this.rootNode && sibling === this.rootNode) {
return
}
if (sibling) {
if (!shallow) {
for (child = sibling[startName]; child; child = child[startName]) {
if (!child[startName]) {
return child
}
}
}
return sibling
}
parent = node.parentNode
if (parent && parent !== this.rootNode) {
return parent
}
}
}
return DomTreeWalker
})()
var blocks = [
'article',
'aside',
'details',
'div',
'dt',
'figcaption',
'footer',
'form',
'fieldset',
'header',
'hgroup',
'html',
'main',
'nav',
'section',
'summary',
'body',
'p',
'dl',
'multicol',
'dd',
'figure',
'address',
'center',
'blockquote',
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'listing',
'xmp',
'pre',
'plaintext',
'menu',
'dir',
'ul',
'ol',
'li',
'hr',
'table',
'tbody',
'thead',
'tfoot',
'th',
'tr',
'td',
'caption',
]
var tableCells = ['td', 'th']
var tableSections = ['thead', 'tbody', 'tfoot']
var textBlocks = [
'h1',
'h2',
'h3',
'h4',
'h5',
'h6',
'p',
'div',
'address',
'pre',
'form',
'blockquote',
'center',
'dir',
'fieldset',
'header',
'footer',
'article',
'section',
'hgroup',
'aside',
'nav',
'figure',
]
var headings = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']
var listItems$1 = ['li', 'dd', 'dt']
var lists = ['ul', 'ol', 'dl']
var wsElements = ['pre', 'script', 'textarea', 'style']
var lazyLookup = function (items) {
var lookup
return function (node) {
lookup = lookup ? lookup : mapToObject(items, always)
return has$2(lookup, name(node))
}
}
var isHeading = lazyLookup(headings)
var isBlock$2 = lazyLookup(blocks)
var isTable$2 = function (node) {
return name(node) === 'table'
}
var isInline$1 = function (node) {
return isElement$6(node) && !isBlock$2(node)
}
var isBr$4 = function (node) {
return isElement$6(node) && name(node) === 'br'
}
var isTextBlock$2 = lazyLookup(textBlocks)
var isList = lazyLookup(lists)
var isListItem = lazyLookup(listItems$1)
var isTableSection = lazyLookup(tableSections)
var isTableCell$4 = lazyLookup(tableCells)
var isWsPreserveElement = lazyLookup(wsElements)
var ancestor$1 = function (scope, selector, isRoot) {
return ancestor$2(scope, selector, isRoot).isSome()
}
var zeroWidth = '\uFEFF'
var nbsp = '\xA0'
var isZwsp$1 = function (char) {
return char === zeroWidth
}
var removeZwsp = function (s) {
return s.replace(/\uFEFF/g, '')
}
var ZWSP$1 = zeroWidth
var isZwsp = isZwsp$1
var trim$2 = removeZwsp
var isElement$4 = isElement$5
var isText$6 = isText$7
var isCaretContainerBlock$1 = function (node) {
if (isText$6(node)) {
node = node.parentNode
}
return isElement$4(node) && node.hasAttribute('data-mce-caret')
}
var isCaretContainerInline = function (node) {
return isText$6(node) && isZwsp(node.data)
}
var isCaretContainer$2 = function (node) {
return isCaretContainerBlock$1(node) || isCaretContainerInline(node)
}
var hasContent = function (node) {
return node.firstChild !== node.lastChild || !isBr$5(node.firstChild)
}
var insertInline$1 = function (node, before) {
var doc = node.ownerDocument
var textNode = doc.createTextNode(ZWSP$1)
var parentNode = node.parentNode
if (!before) {
var sibling = node.nextSibling
if (isText$6(sibling)) {
if (isCaretContainer$2(sibling)) {
return sibling
}
if (startsWithCaretContainer$1(sibling)) {
sibling.splitText(1)
return sibling
}
}
if (node.nextSibling) {
parentNode.insertBefore(textNode, node.nextSibling)
} else {
parentNode.appendChild(textNode)
}
} else {
var sibling = node.previousSibling
if (isText$6(sibling)) {
if (isCaretContainer$2(sibling)) {
return sibling
}
if (endsWithCaretContainer$1(sibling)) {
return sibling.splitText(sibling.data.length - 1)
}
}
parentNode.insertBefore(textNode, node)
}
return textNode
}
var isBeforeInline = function (pos) {
var container = pos.container()
if (!isText$7(container)) {
return false
}
return (
container.data.charAt(pos.offset()) === ZWSP$1 ||
(pos.isAtStart() && isCaretContainerInline(container.previousSibling))
)
}
var isAfterInline = function (pos) {
var container = pos.container()
if (!isText$7(container)) {
return false
}
return (
container.data.charAt(pos.offset() - 1) === ZWSP$1 ||
(pos.isAtEnd() && isCaretContainerInline(container.nextSibling))
)
}
var createBogusBr = function () {
var br = document.createElement('br')
br.setAttribute('data-mce-bogus', '1')
return br
}
var insertBlock$1 = function (blockName, node, before) {
var doc = node.ownerDocument
var blockNode = doc.createElement(blockName)
blockNode.setAttribute('data-mce-caret', before ? 'before' : 'after')
blockNode.setAttribute('data-mce-bogus', 'all')
blockNode.appendChild(createBogusBr())
var parentNode = node.parentNode
if (!before) {
if (node.nextSibling) {
parentNode.insertBefore(blockNode, node.nextSibling)
} else {
parentNode.appendChild(blockNode)
}
} else {
parentNode.insertBefore(blockNode, node)
}
return blockNode
}
var startsWithCaretContainer$1 = function (node) {
return isText$6(node) && node.data[0] === ZWSP$1
}
var endsWithCaretContainer$1 = function (node) {
return isText$6(node) && node.data[node.data.length - 1] === ZWSP$1
}
var trimBogusBr = function (elm) {
var brs = elm.getElementsByTagName('br')
var lastBr = brs[brs.length - 1]
if (isBogus$2(lastBr)) {
lastBr.parentNode.removeChild(lastBr)
}
}
var showCaretContainerBlock = function (caretContainer) {
if (caretContainer && caretContainer.hasAttribute('data-mce-caret')) {
trimBogusBr(caretContainer)
caretContainer.removeAttribute('data-mce-caret')
caretContainer.removeAttribute('data-mce-bogus')
caretContainer.removeAttribute('style')
caretContainer.removeAttribute('_moz_abspos')
return caretContainer
}
return null
}
var isRangeInCaretContainerBlock = function (range) {
return isCaretContainerBlock$1(range.startContainer)
}
var isContentEditableTrue$3 = isContentEditableTrue$4
var isContentEditableFalse$a = isContentEditableFalse$b
var isBr$3 = isBr$5
var isText$5 = isText$7
var isInvalidTextElement = matchNodeNames(['script', 'style', 'textarea'])
var isAtomicInline = matchNodeNames([
'img',
'input',
'textarea',
'hr',
'iframe',
'video',
'audio',
'object',
'embed',
])
var isTable$1 = matchNodeNames(['table'])
var isCaretContainer$1 = isCaretContainer$2
var isCaretCandidate$3 = function (node) {
if (isCaretContainer$1(node)) {
return false
}
if (isText$5(node)) {
return !isInvalidTextElement(node.parentNode)
}
return (
isAtomicInline(node) ||
isBr$3(node) ||
isTable$1(node) ||
isNonUiContentEditableFalse(node)
)
}
var isUnselectable = function (node) {
return isElement$5(node) && node.getAttribute('unselectable') === 'true'
}
var isNonUiContentEditableFalse = function (node) {
return isUnselectable(node) === false && isContentEditableFalse$a(node)
}
var isInEditable = function (node, root) {
for (
node = node.parentNode;
node && node !== root;
node = node.parentNode
) {
if (isNonUiContentEditableFalse(node)) {
return false
}
if (isContentEditableTrue$3(node)) {
return true
}
}
return true
}
var isAtomicContentEditableFalse = function (node) {
if (!isNonUiContentEditableFalse(node)) {
return false
}
return (
foldl(
from(node.getElementsByTagName('*')),
function (result, elm) {
return result || isContentEditableTrue$3(elm)
},
false
) !== true
)
}
var isAtomic$1 = function (node) {
return isAtomicInline(node) || isAtomicContentEditableFalse(node)
}
var isEditableCaretCandidate$1 = function (node, root) {
return isCaretCandidate$3(node) && isInEditable(node, root)
}
var whiteSpaceRegExp$1 = /^[ \t\r\n]*$/
var isWhitespaceText = function (text) {
return whiteSpaceRegExp$1.test(text)
}
var hasWhitespacePreserveParent = function (node, rootNode) {
var rootElement = SugarElement.fromDom(rootNode)
var startNode = SugarElement.fromDom(node)
return ancestor$1(startNode, 'pre,code', curry(eq, rootElement))
}
var isWhitespace = function (node, rootNode) {
return (
isText$7(node) &&
isWhitespaceText(node.data) &&
hasWhitespacePreserveParent(node, rootNode) === false
)
}
var isNamedAnchor = function (node) {
return (
isElement$5(node) &&
node.nodeName === 'A' &&
!node.hasAttribute('href') &&
(node.hasAttribute('name') || node.hasAttribute('id'))
)
}
var isContent$1 = function (node, rootNode) {
return (
(isCaretCandidate$3(node) && isWhitespace(node, rootNode) === false) ||
isNamedAnchor(node) ||
isBookmark(node)
)
}
var isBookmark = hasAttribute('data-mce-bookmark')
var isBogus$1 = hasAttribute('data-mce-bogus')
var isBogusAll = hasAttributeValue('data-mce-bogus', 'all')
var isEmptyNode = function (targetNode, skipBogus) {
var brCount = 0
if (isContent$1(targetNode, targetNode)) {
return false
} else {
var node = targetNode.firstChild
if (!node) {
return true
}
var walker = new DomTreeWalker(node, targetNode)
do {
if (skipBogus) {
if (isBogusAll(node)) {
node = walker.next(true)
continue
}
if (isBogus$1(node)) {
node = walker.next()
continue
}
}
if (isBr$5(node)) {
brCount++
node = walker.next()
continue
}
if (isContent$1(node, targetNode)) {
return false
}
node = walker.next()
} while (node)
return brCount <= 1
}
}
var isEmpty$2 = function (elm, skipBogus) {
if (skipBogus === void 0) {
skipBogus = true
}
return isEmptyNode(elm.dom, skipBogus)
}
var isSpan = function (node) {
return node.nodeName.toLowerCase() === 'span'
}
var isInlineContent = function (node, root) {
return (
isNonNullable(node) &&
(isContent$1(node, root) || isInline$1(SugarElement.fromDom(node)))
)
}
var surroundedByInlineContent = function (node, root) {
var prev = new DomTreeWalker(node, root).prev(false)
var next = new DomTreeWalker(node, root).next(false)
var prevIsInline = isUndefined(prev) || isInlineContent(prev, root)
var nextIsInline = isUndefined(next) || isInlineContent(next, root)
return prevIsInline && nextIsInline
}
var isBookmarkNode$2 = function (node) {
return isSpan(node) && node.getAttribute('data-mce-type') === 'bookmark'
}
var isKeepTextNode = function (node, root) {
return (
isText$7(node) &&
node.data.length > 0 &&
surroundedByInlineContent(node, root)
)
}
var isKeepElement = function (node) {
return isElement$5(node) ? node.childNodes.length > 0 : false
}
var isDocument = function (node) {
return isDocumentFragment(node) || isDocument$1(node)
}
var trimNode = function (dom, node, root) {
var rootNode = root || node
if (isElement$5(node) && isBookmarkNode$2(node)) {
return node
}
var children = node.childNodes
for (var i = children.length - 1; i >= 0; i--) {
trimNode(dom, children[i], rootNode)
}
if (isElement$5(node)) {
var currentChildren = node.childNodes
if (
currentChildren.length === 1 &&
isBookmarkNode$2(currentChildren[0])
) {
node.parentNode.insertBefore(currentChildren[0], node)
}
}
if (
!isDocument(node) &&
!isContent$1(node, rootNode) &&
!isKeepElement(node) &&
!isKeepTextNode(node, rootNode)
) {
dom.remove(node)
}
return node
}
var makeMap$3 = Tools.makeMap
var attrsCharsRegExp =
/[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g
var textCharsRegExp =
/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g
var rawCharsRegExp = /[<>&\"\']/g
var entityRegExp = /([a-z0-9]+);?|&([a-z0-9]+);/gi
var asciiMap = {
128: '\u20AC',
130: '\u201A',
131: '\u0192',
132: '\u201E',
133: '\u2026',
134: '\u2020',
135: '\u2021',
136: '\u02c6',
137: '\u2030',
138: '\u0160',
139: '\u2039',
140: '\u0152',
142: '\u017d',
145: '\u2018',
146: '\u2019',
147: '\u201C',
148: '\u201D',
149: '\u2022',
150: '\u2013',
151: '\u2014',
152: '\u02DC',
153: '\u2122',
154: '\u0161',
155: '\u203A',
156: '\u0153',
158: '\u017e',
159: '\u0178',
}
var baseEntities = {
'"': '"',
"'": ''',
'<': '<',
'>': '>',
'&': '&',
'`': '`',
}
var reverseEntities = {
'<': '<',
'>': '>',
'&': '&',
'"': '"',
''': "'",
}
var nativeDecode = function (text) {
var elm = SugarElement.fromTag('div').dom
elm.innerHTML = text
return elm.textContent || elm.innerText || text
}
var buildEntitiesLookup = function (items, radix) {
var i, chr, entity
var lookup = {}
if (items) {
items = items.split(',')
radix = radix || 10
for (i = 0; i < items.length; i += 2) {
chr = String.fromCharCode(parseInt(items[i], radix))
if (!baseEntities[chr]) {
entity = '&' + items[i + 1] + ';'
lookup[chr] = entity
lookup[entity] = chr
}
}
return lookup
}
}
var namedEntities = buildEntitiesLookup(
'50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' +
'5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' +
'5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' +
'5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' +
'68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' +
'6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' +
'6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' +
'75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' +
'7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' +
'7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' +
'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' +
'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' +
't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' +
'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' +
'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' +
'81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' +
'8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' +
'8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' +
'8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' +
'8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' +
'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' +
'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' +
'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' +
'80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' +
'811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro',
32
)
var encodeRaw = function (text, attr) {
return text.replace(
attr ? attrsCharsRegExp : textCharsRegExp,
function (chr) {
return baseEntities[chr] || chr
}
)
}
var encodeAllRaw = function (text) {
return ('' + text).replace(rawCharsRegExp, function (chr) {
return baseEntities[chr] || chr
})
}
var encodeNumeric = function (text, attr) {
return text.replace(
attr ? attrsCharsRegExp : textCharsRegExp,
function (chr) {
if (chr.length > 1) {
return (
'' +
((chr.charCodeAt(0) - 55296) * 1024 +
(chr.charCodeAt(1) - 56320) +
65536) +
';'
)
}
return baseEntities[chr] || '' + chr.charCodeAt(0) + ';'
}
)
}
var encodeNamed = function (text, attr, entities) {
entities = entities || namedEntities
return text.replace(
attr ? attrsCharsRegExp : textCharsRegExp,
function (chr) {
return baseEntities[chr] || entities[chr] || chr
}
)
}
var getEncodeFunc = function (name, entities) {
var entitiesMap = buildEntitiesLookup(entities) || namedEntities
var encodeNamedAndNumeric = function (text, attr) {
return text.replace(
attr ? attrsCharsRegExp : textCharsRegExp,
function (chr) {
if (baseEntities[chr] !== undefined) {
return baseEntities[chr]
}
if (entitiesMap[chr] !== undefined) {
return entitiesMap[chr]
}
if (chr.length > 1) {
return (
'' +
((chr.charCodeAt(0) - 55296) * 1024 +
(chr.charCodeAt(1) - 56320) +
65536) +
';'
)
}
return '' + chr.charCodeAt(0) + ';'
}
)
}
var encodeCustomNamed = function (text, attr) {
return encodeNamed(text, attr, entitiesMap)
}
var nameMap = makeMap$3(name.replace(/\+/g, ','))
if (nameMap.named && nameMap.numeric) {
return encodeNamedAndNumeric
}
if (nameMap.named) {
if (entities) {
return encodeCustomNamed
}
return encodeNamed
}
if (nameMap.numeric) {
return encodeNumeric
}
return encodeRaw
}
var decode = function (text) {
return text.replace(entityRegExp, function (all, numeric) {
if (numeric) {
if (numeric.charAt(0).toLowerCase() === 'x') {
numeric = parseInt(numeric.substr(1), 16)
} else {
numeric = parseInt(numeric, 10)
}
if (numeric > 65535) {
numeric -= 65536
return String.fromCharCode(
55296 + (numeric >> 10),
56320 + (numeric & 1023)
)
}
return asciiMap[numeric] || String.fromCharCode(numeric)
}
return reverseEntities[all] || namedEntities[all] || nativeDecode(all)
})
}
var Entities = {
encodeRaw: encodeRaw,
encodeAllRaw: encodeAllRaw,
encodeNumeric: encodeNumeric,
encodeNamed: encodeNamed,
getEncodeFunc: getEncodeFunc,
decode: decode,
}
var mapCache = {},
dummyObj = {}
var makeMap$2 = Tools.makeMap,
each$h = Tools.each,
extend$5 = Tools.extend,
explode$3 = Tools.explode,
inArray$2 = Tools.inArray
var split$1 = function (items, delim) {
items = Tools.trim(items)
return items ? items.split(delim || ' ') : []
}
var compileSchema = function (type) {
var schema = {}
var globalAttributes, blockContent
var phrasingContent, flowContent, html4BlockContent, html4PhrasingContent
var add = function (name, attributes, children) {
var ni, attributesOrder, element
var arrayToMap = function (array, obj) {
var map = {}
var i, l
for (i = 0, l = array.length; i < l; i++) {
map[array[i]] = obj || {}
}
return map
}
children = children || []
attributes = attributes || ''
if (typeof children === 'string') {
children = split$1(children)
}
var names = split$1(name)
ni = names.length
while (ni--) {
attributesOrder = split$1([globalAttributes, attributes].join(' '))
element = {
attributes: arrayToMap(attributesOrder),
attributesOrder: attributesOrder,
children: arrayToMap(children, dummyObj),
}
schema[names[ni]] = element
}
}
var addAttrs = function (name, attributes) {
var ni, schemaItem, i, l
var names = split$1(name)
ni = names.length
var attrs = split$1(attributes)
while (ni--) {
schemaItem = schema[names[ni]]
for (i = 0, l = attrs.length; i < l; i++) {
schemaItem.attributes[attrs[i]] = {}
schemaItem.attributesOrder.push(attrs[i])
}
}
}
if (mapCache[type]) {
return mapCache[type]
}
globalAttributes = 'id accesskey class dir lang style tabindex title role'
blockContent =
'address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul'
phrasingContent =
'a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd ' +
'label map noscript object q s samp script select small span strong sub sup ' +
'textarea u var #text #comment'
if (type !== 'html4') {
globalAttributes +=
' contenteditable contextmenu draggable dropzone ' +
'hidden spellcheck translate'
blockContent +=
' article aside details dialog figure main header footer hgroup section nav'
phrasingContent +=
' audio canvas command datalist mark meter output picture ' +
'progress time wbr video ruby bdi keygen'
}
if (type !== 'html5-strict') {
globalAttributes += ' xml:lang'
html4PhrasingContent = 'acronym applet basefont big font strike tt'
phrasingContent = [phrasingContent, html4PhrasingContent].join(' ')
each$h(split$1(html4PhrasingContent), function (name) {
add(name, '', phrasingContent)
})
html4BlockContent = 'center dir isindex noframes'
blockContent = [blockContent, html4BlockContent].join(' ')
flowContent = [blockContent, phrasingContent].join(' ')
each$h(split$1(html4BlockContent), function (name) {
add(name, '', flowContent)
})
}
flowContent = flowContent || [blockContent, phrasingContent].join(' ')
add('html', 'manifest', 'head body')
add('head', '', 'base command link meta noscript script style title')
add('title hr noscript br')
add('base', 'href target')
add('link', 'href rel media hreflang type sizes hreflang')
add('meta', 'name http-equiv content charset')
add('style', 'media type scoped')
add('script', 'src async defer type charset')
add(
'body',
'onafterprint onbeforeprint onbeforeunload onblur onerror onfocus ' +
'onhashchange onload onmessage onoffline ononline onpagehide onpageshow ' +
'onpopstate onresize onscroll onstorage onunload',
flowContent
)
add('address dt dd div caption', '', flowContent)
add(
'h1 h2 h3 h4 h5 h6 pre p abbr code var samp kbd sub sup i b u bdo span legend em strong small s cite dfn',
'',
phrasingContent
)
add('blockquote', 'cite', flowContent)
add('ol', 'reversed start type', 'li')
add('ul', '', 'li')
add('li', 'value', flowContent)
add('dl', '', 'dt dd')
add('a', 'href target rel media hreflang type', phrasingContent)
add('q', 'cite', phrasingContent)
add('ins del', 'cite datetime', flowContent)
add('img', 'src sizes srcset alt usemap ismap width height')
add('iframe', 'src name width height', flowContent)
add('embed', 'src type width height')
add(
'object',
'data type typemustmatch name usemap form width height',
[flowContent, 'param'].join(' ')
)
add('param', 'name value')
add('map', 'name', [flowContent, 'area'].join(' '))
add('area', 'alt coords shape href target rel media hreflang type')
add(
'table',
'border',
'caption colgroup thead tfoot tbody tr' + (type === 'html4' ? ' col' : '')
)
add('colgroup', 'span', 'col')
add('col', 'span')
add('tbody thead tfoot', '', 'tr')
add('tr', '', 'td th')
add('td', 'colspan rowspan headers', flowContent)
add('th', 'colspan rowspan headers scope abbr', flowContent)
add(
'form',
'accept-charset action autocomplete enctype method name novalidate target',
flowContent
)
add('fieldset', 'disabled form name', [flowContent, 'legend'].join(' '))
add('label', 'form for', phrasingContent)
add(
'input',
'accept alt autocomplete checked dirname disabled form formaction formenctype formmethod formnovalidate ' +
'formtarget height list max maxlength min multiple name pattern readonly required size src step type value width'
)
add(
'button',
'disabled form formaction formenctype formmethod formnovalidate formtarget name type value',
type === 'html4' ? flowContent : phrasingContent
)
add(
'select',
'disabled form multiple name required size',
'option optgroup'
)
add('optgroup', 'disabled label', 'option')
add('option', 'disabled label selected value')
add(
'textarea',
'cols dirname disabled form maxlength name readonly required rows wrap'
)
add('menu', 'type label', [flowContent, 'li'].join(' '))
add('noscript', '', flowContent)
if (type !== 'html4') {
add('wbr')
add('ruby', '', [phrasingContent, 'rt rp'].join(' '))
add('figcaption', '', flowContent)
add('mark rt rp summary bdi', '', phrasingContent)
add('canvas', 'width height', flowContent)
add(
'video',
'src crossorigin poster preload autoplay mediagroup loop ' +
'muted controls width height buffered',
[flowContent, 'track source'].join(' ')
)
add(
'audio',
'src crossorigin preload autoplay mediagroup loop muted controls ' +
'buffered volume',
[flowContent, 'track source'].join(' ')
)
add('picture', '', 'img source')
add('source', 'src srcset type media sizes')
add('track', 'kind src srclang label default')
add('datalist', '', [phrasingContent, 'option'].join(' '))
add('article section nav aside main header footer', '', flowContent)
add('hgroup', '', 'h1 h2 h3 h4 h5 h6')
add('figure', '', [flowContent, 'figcaption'].join(' '))
add('time', 'datetime', phrasingContent)
add('dialog', 'open', flowContent)
add('command', 'type label icon disabled checked radiogroup command')
add('output', 'for form name', phrasingContent)
add('progress', 'value max', phrasingContent)
add('meter', 'value min max low high optimum', phrasingContent)
add('details', 'open', [flowContent, 'summary'].join(' '))
add('keygen', 'autofocus challenge disabled form keytype name')
}
if (type !== 'html5-strict') {
addAttrs('script', 'language xml:space')
addAttrs('style', 'xml:space')
addAttrs(
'object',
'declare classid code codebase codetype archive standby align border hspace vspace'
)
addAttrs('embed', 'align name hspace vspace')
addAttrs('param', 'valuetype type')
addAttrs('a', 'charset name rev shape coords')
addAttrs('br', 'clear')
addAttrs(
'applet',
'codebase archive code object alt name width height align hspace vspace'
)
addAttrs('img', 'name longdesc align border hspace vspace')
addAttrs(
'iframe',
'longdesc frameborder marginwidth marginheight scrolling align'
)
addAttrs('font basefont', 'size color face')
addAttrs('input', 'usemap align')
addAttrs('select')
addAttrs('textarea')
addAttrs('h1 h2 h3 h4 h5 h6 div p legend caption', 'align')
addAttrs('ul', 'type compact')
addAttrs('li', 'type')
addAttrs('ol dl menu dir', 'compact')
addAttrs('pre', 'width xml:space')
addAttrs('hr', 'align noshade size width')
addAttrs('isindex', 'prompt')
addAttrs(
'table',
'summary width frame rules cellspacing cellpadding align bgcolor'
)
addAttrs('col', 'width align char charoff valign')
addAttrs('colgroup', 'width align char charoff valign')
addAttrs('thead', 'align char charoff valign')
addAttrs('tr', 'align char charoff valign bgcolor')
addAttrs(
'th',
'axis align char charoff valign nowrap bgcolor width height'
)
addAttrs('form', 'accept')
addAttrs(
'td',
'abbr axis scope align char charoff valign nowrap bgcolor width height'
)
addAttrs('tfoot', 'align char charoff valign')
addAttrs('tbody', 'align char charoff valign')
addAttrs('area', 'nohref')
addAttrs('body', 'background bgcolor text link vlink alink')
}
if (type !== 'html4') {
addAttrs('input button select textarea', 'autofocus')
addAttrs('input textarea', 'placeholder')
addAttrs('a', 'download')
addAttrs('link script img', 'crossorigin')
addAttrs('img', 'loading')
addAttrs('iframe', 'sandbox seamless allowfullscreen loading')
}
each$h(split$1('a form meter progress dfn'), function (name) {
if (schema[name]) {
delete schema[name].children[name]
}
})
delete schema.caption.children.table
delete schema.script
mapCache[type] = schema
return schema
}
var compileElementMap = function (value, mode) {
var styles
if (value) {
styles = {}
if (typeof value === 'string') {
value = { '*': value }
}
each$h(value, function (value, key) {
styles[key] = styles[key.toUpperCase()] =
mode === 'map' ? makeMap$2(value, /[, ]/) : explode$3(value, /[, ]/)
})
}
return styles
}
var Schema = function (settings) {
var elements = {}
var children = {}
var patternElements = []
var customElementsMap = {},
specialElements = {}
var createLookupTable = function (option, defaultValue, extendWith) {
var value = settings[option]
if (!value) {
value = mapCache[option]
if (!value) {
value = makeMap$2(
defaultValue,
' ',
makeMap$2(defaultValue.toUpperCase(), ' ')
)
value = extend$5(value, extendWith)
mapCache[option] = value
}
} else {
value = makeMap$2(value, /[, ]/, makeMap$2(value.toUpperCase(), /[, ]/))
}
return value
}
settings = settings || {}
var schemaItems = compileSchema(settings.schema)
if (settings.verify_html === false) {
settings.valid_elements = '*[*]'
}
var validStyles = compileElementMap(settings.valid_styles)
var invalidStyles = compileElementMap(settings.invalid_styles, 'map')
var validClasses = compileElementMap(settings.valid_classes, 'map')
var whiteSpaceElementsMap = createLookupTable(
'whitespace_elements',
'pre script noscript style textarea video audio iframe object code'
)
var selfClosingElementsMap = createLookupTable(
'self_closing_elements',
'colgroup dd dt li option p td tfoot th thead tr'
)
var shortEndedElementsMap = createLookupTable(
'short_ended_elements',
'area base basefont br col frame hr img input isindex link ' +
'meta param embed source wbr track'
)
var boolAttrMap = createLookupTable(
'boolean_attributes',
'checked compact declare defer disabled ismap multiple nohref noresize ' +
'noshade nowrap readonly selected autoplay loop controls'
)
var nonEmptyOrMoveCaretBeforeOnEnter =
'td th iframe video audio object script code'
var nonEmptyElementsMap = createLookupTable(
'non_empty_elements',
nonEmptyOrMoveCaretBeforeOnEnter + ' pre',
shortEndedElementsMap
)
var moveCaretBeforeOnEnterElementsMap = createLookupTable(
'move_caret_before_on_enter_elements',
nonEmptyOrMoveCaretBeforeOnEnter + ' table',
shortEndedElementsMap
)
var textBlockElementsMap = createLookupTable(
'text_block_elements',
'h1 h2 h3 h4 h5 h6 p div address pre form ' +
'blockquote center dir fieldset header footer article section hgroup aside main nav figure'
)
var blockElementsMap = createLookupTable(
'block_elements',
'hr table tbody thead tfoot ' +
'th tr td li ol ul caption dl dt dd noscript menu isindex option ' +
'datalist select optgroup figcaption details summary',
textBlockElementsMap
)
var textInlineElementsMap = createLookupTable(
'text_inline_elements',
'span strong b em i font strike u var cite ' +
'dfn code mark q sup sub samp'
)
each$h(
(
settings.special ||
'script noscript iframe noframes noembed title style textarea xmp'
).split(' '),
function (name) {
specialElements[name] = new RegExp('' + name + '[^>]*>', 'gi')
}
)
var patternToRegExp = function (str) {
return new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$')
}
var addValidElements = function (validElements) {
var ei,
el,
ai,
al,
matches,
element,
attr,
attrData,
elementName,
attrName,
attrType,
attributes,
attributesOrder,
prefix,
outputName,
globalAttributes,
globalAttributesOrder,
value
var elementRuleRegExp =
/^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)])?$/,
attrRuleRegExp = /^([!\-])?(\w+[\\:]:\w+|[^=:<]+)?(?:([=:<])(.*))?$/,
hasPatternsRegExp = /[*?+]/
if (validElements) {
var validElementsArr = split$1(validElements, ',')
if (elements['@']) {
globalAttributes = elements['@'].attributes
globalAttributesOrder = elements['@'].attributesOrder
}
for (ei = 0, el = validElementsArr.length; ei < el; ei++) {
matches = elementRuleRegExp.exec(validElementsArr[ei])
if (matches) {
prefix = matches[1]
elementName = matches[2]
outputName = matches[3]
attrData = matches[5]
attributes = {}
attributesOrder = []
element = {
attributes: attributes,
attributesOrder: attributesOrder,
}
if (prefix === '#') {
element.paddEmpty = true
}
if (prefix === '-') {
element.removeEmpty = true
}
if (matches[4] === '!') {
element.removeEmptyAttrs = true
}
if (globalAttributes) {
each$j(globalAttributes, function (value, key) {
attributes[key] = value
})
attributesOrder.push.apply(attributesOrder, globalAttributesOrder)
}
if (attrData) {
attrData = split$1(attrData, '|')
for (ai = 0, al = attrData.length; ai < al; ai++) {
matches = attrRuleRegExp.exec(attrData[ai])
if (matches) {
attr = {}
attrType = matches[1]
attrName = matches[2].replace(/[\\:]:/g, ':')
prefix = matches[3]
value = matches[4]
if (attrType === '!') {
element.attributesRequired =
element.attributesRequired || []
element.attributesRequired.push(attrName)
attr.required = true
}
if (attrType === '-') {
delete attributes[attrName]
attributesOrder.splice(
inArray$2(attributesOrder, attrName),
1
)
continue
}
if (prefix) {
if (prefix === '=') {
element.attributesDefault =
element.attributesDefault || []
element.attributesDefault.push({
name: attrName,
value: value,
})
attr.defaultValue = value
}
if (prefix === ':') {
element.attributesForced = element.attributesForced || []
element.attributesForced.push({
name: attrName,
value: value,
})
attr.forcedValue = value
}
if (prefix === '<') {
attr.validValues = makeMap$2(value, '?')
}
}
if (hasPatternsRegExp.test(attrName)) {
element.attributePatterns = element.attributePatterns || []
attr.pattern = patternToRegExp(attrName)
element.attributePatterns.push(attr)
} else {
if (!attributes[attrName]) {
attributesOrder.push(attrName)
}
attributes[attrName] = attr
}
}
}
}
if (!globalAttributes && elementName === '@') {
globalAttributes = attributes
globalAttributesOrder = attributesOrder
}
if (outputName) {
element.outputName = elementName
elements[outputName] = element
}
if (hasPatternsRegExp.test(elementName)) {
element.pattern = patternToRegExp(elementName)
patternElements.push(element)
} else {
elements[elementName] = element
}
}
}
}
}
var setValidElements = function (validElements) {
elements = {}
patternElements = []
addValidElements(validElements)
each$h(schemaItems, function (element, name) {
children[name] = element.children
})
}
var addCustomElements = function (customElements) {
var customElementRegExp = /^(~)?(.+)$/
if (customElements) {
mapCache.text_block_elements = mapCache.block_elements = null
each$h(split$1(customElements, ','), function (rule) {
var matches = customElementRegExp.exec(rule),
inline = matches[1] === '~',
cloneName = inline ? 'span' : 'div',
name = matches[2]
children[name] = children[cloneName]
customElementsMap[name] = cloneName
if (!inline) {
blockElementsMap[name.toUpperCase()] = {}
blockElementsMap[name] = {}
}
if (!elements[name]) {
var customRule = elements[cloneName]
customRule = extend$5({}, customRule)
delete customRule.removeEmptyAttrs
delete customRule.removeEmpty
elements[name] = customRule
}
each$h(children, function (element, elmName) {
if (element[cloneName]) {
children[elmName] = element = extend$5({}, children[elmName])
element[name] = element[cloneName]
}
})
})
}
}
var addValidChildren = function (validChildren) {
var childRuleRegExp =
/^([+\-]?)([A-Za-z0-9_\-.\u00b7\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u037d\u037f-\u1fff\u200c-\u200d\u203f-\u2040\u2070-\u218f\u2c00-\u2fef\u3001-\ud7ff\uf900-\ufdcf\ufdf0-\ufffd]+)\[([^\]]+)]$/
mapCache[settings.schema] = null
if (validChildren) {
each$h(split$1(validChildren, ','), function (rule) {
var matches = childRuleRegExp.exec(rule)
var parent, prefix
if (matches) {
prefix = matches[1]
if (prefix) {
parent = children[matches[2]]
} else {
parent = children[matches[2]] = { '#comment': {} }
}
parent = children[matches[2]]
each$h(split$1(matches[3], '|'), function (child) {
if (prefix === '-') {
delete parent[child]
} else {
parent[child] = {}
}
})
}
})
}
}
var getElementRule = function (name) {
var element = elements[name],
i
if (element) {
return element
}
i = patternElements.length
while (i--) {
element = patternElements[i]
if (element.pattern.test(name)) {
return element
}
}
}
if (!settings.valid_elements) {
each$h(schemaItems, function (element, name) {
elements[name] = {
attributes: element.attributes,
attributesOrder: element.attributesOrder,
}
children[name] = element.children
})
if (settings.schema !== 'html5') {
each$h(split$1('strong/b em/i'), function (item) {
var items = split$1(item, '/')
elements[items[1]].outputName = items[0]
})
}
each$h(
split$1(
'ol ul sub sup blockquote span font a table tbody strong em b i'
),
function (name) {
if (elements[name]) {
elements[name].removeEmpty = true
}
}
)
each$h(
split$1('p h1 h2 h3 h4 h5 h6 th td pre div address caption li'),
function (name) {
elements[name].paddEmpty = true
}
)
each$h(split$1('span'), function (name) {
elements[name].removeEmptyAttrs = true
})
} else {
setValidElements(settings.valid_elements)
}
addCustomElements(settings.custom_elements)
addValidChildren(settings.valid_children)
addValidElements(settings.extended_valid_elements)
addValidChildren('+ol[ul|ol],+ul[ul|ol]')
each$h(
{
dd: 'dl',
dt: 'dl',
li: 'ul ol',
td: 'tr',
th: 'tr',
tr: 'tbody thead tfoot',
tbody: 'table',
thead: 'table',
tfoot: 'table',
legend: 'fieldset',
area: 'map',
param: 'video audio object',
},
function (parents, item) {
if (elements[item]) {
elements[item].parentsRequired = split$1(parents)
}
}
)
if (settings.invalid_elements) {
each$h(explode$3(settings.invalid_elements), function (item) {
if (elements[item]) {
delete elements[item]
}
})
}
if (!getElementRule('span')) {
addValidElements('span[!data-mce-type|*]')
}
var getValidStyles = constant(validStyles)
var getInvalidStyles = constant(invalidStyles)
var getValidClasses = constant(validClasses)
var getBoolAttrs = constant(boolAttrMap)
var getBlockElements = constant(blockElementsMap)
var getTextBlockElements = constant(textBlockElementsMap)
var getTextInlineElements = constant(textInlineElementsMap)
var getShortEndedElements = constant(shortEndedElementsMap)
var getSelfClosingElements = constant(selfClosingElementsMap)
var getNonEmptyElements = constant(nonEmptyElementsMap)
var getMoveCaretBeforeOnEnterElements = constant(
moveCaretBeforeOnEnterElementsMap
)
var getWhiteSpaceElements = constant(whiteSpaceElementsMap)
var getSpecialElements = constant(specialElements)
var isValidChild = function (name, child) {
var parent = children[name.toLowerCase()]
return !!(parent && parent[child.toLowerCase()])
}
var isValid = function (name, attr) {
var attrPatterns, i
var rule = getElementRule(name)
if (rule) {
if (attr) {
if (rule.attributes[attr]) {
return true
}
attrPatterns = rule.attributePatterns
if (attrPatterns) {
i = attrPatterns.length
while (i--) {
if (attrPatterns[i].pattern.test(name)) {
return true
}
}
}
} else {
return true
}
}
return false
}
var getCustomElements = constant(customElementsMap)
return {
children: children,
elements: elements,
getValidStyles: getValidStyles,
getValidClasses: getValidClasses,
getBlockElements: getBlockElements,
getInvalidStyles: getInvalidStyles,
getShortEndedElements: getShortEndedElements,
getTextBlockElements: getTextBlockElements,
getTextInlineElements: getTextInlineElements,
getBoolAttrs: getBoolAttrs,
getElementRule: getElementRule,
getSelfClosingElements: getSelfClosingElements,
getNonEmptyElements: getNonEmptyElements,
getMoveCaretBeforeOnEnterElements: getMoveCaretBeforeOnEnterElements,
getWhiteSpaceElements: getWhiteSpaceElements,
getSpecialElements: getSpecialElements,
isValidChild: isValidChild,
isValid: isValid,
getCustomElements: getCustomElements,
addValidElements: addValidElements,
setValidElements: setValidElements,
addCustomElements: addCustomElements,
addValidChildren: addValidChildren,
}
}
var toHex = function (match, r, g, b) {
var hex = function (val) {
val = parseInt(val, 10).toString(16)
return val.length > 1 ? val : '0' + val
}
return '#' + hex(r) + hex(g) + hex(b)
}
var Styles = function (settings, schema) {
var _this = this
var rgbRegExp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi
var urlOrStrRegExp =
/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi
var styleRegExp = /\s*([^:]+):\s*([^;]+);?/g
var trimRightRegExp = /\s+$/
var i
var encodingLookup = {}
var validStyles
var invalidStyles
var invisibleChar = zeroWidth
settings = settings || {}
if (schema) {
validStyles = schema.getValidStyles()
invalidStyles = schema.getInvalidStyles()
}
var encodingItems = ('\\" \\\' \\; \\: ; : ' + invisibleChar).split(' ')
for (i = 0; i < encodingItems.length; i++) {
encodingLookup[encodingItems[i]] = invisibleChar + i
encodingLookup[invisibleChar + i] = encodingItems[i]
}
return {
toHex: function (color) {
return color.replace(rgbRegExp, toHex)
},
parse: function (css) {
var styles = {}
var matches, name, value, isEncoded
var urlConverter = settings.url_converter
var urlConverterScope = settings.url_converter_scope || _this
var compress = function (prefix, suffix, noJoin) {
var top = styles[prefix + '-top' + suffix]
if (!top) {
return
}
var right = styles[prefix + '-right' + suffix]
if (!right) {
return
}
var bottom = styles[prefix + '-bottom' + suffix]
if (!bottom) {
return
}
var left = styles[prefix + '-left' + suffix]
if (!left) {
return
}
var box = [top, right, bottom, left]
i = box.length - 1
while (i--) {
if (box[i] !== box[i + 1]) {
break
}
}
if (i > -1 && noJoin) {
return
}
styles[prefix + suffix] = i === -1 ? box[0] : box.join(' ')
delete styles[prefix + '-top' + suffix]
delete styles[prefix + '-right' + suffix]
delete styles[prefix + '-bottom' + suffix]
delete styles[prefix + '-left' + suffix]
}
var canCompress = function (key) {
var value = styles[key],
i
if (!value) {
return
}
value = value.split(' ')
i = value.length
while (i--) {
if (value[i] !== value[0]) {
return false
}
}
styles[key] = value[0]
return true
}
var compress2 = function (target, a, b, c) {
if (!canCompress(a)) {
return
}
if (!canCompress(b)) {
return
}
if (!canCompress(c)) {
return
}
styles[target] = styles[a] + ' ' + styles[b] + ' ' + styles[c]
delete styles[a]
delete styles[b]
delete styles[c]
}
var encode = function (str) {
isEncoded = true
return encodingLookup[str]
}
var decode = function (str, keepSlashes) {
if (isEncoded) {
str = str.replace(/\uFEFF[0-9]/g, function (str) {
return encodingLookup[str]
})
}
if (!keepSlashes) {
str = str.replace(/\\([\'\";:])/g, '$1')
}
return str
}
var decodeSingleHexSequence = function (escSeq) {
return String.fromCharCode(parseInt(escSeq.slice(1), 16))
}
var decodeHexSequences = function (value) {
return value.replace(/\\[0-9a-f]+/gi, decodeSingleHexSequence)
}
var processUrl = function (match, url, url2, url3, str, str2) {
str = str || str2
if (str) {
str = decode(str)
return "'" + str.replace(/\'/g, "\\'") + "'"
}
url = decode(url || url2 || url3)
if (!settings.allow_script_urls) {
var scriptUrl = url.replace(/[\s\r\n]+/g, '')
if (/(java|vb)script:/i.test(scriptUrl)) {
return ''
}
if (
!settings.allow_svg_data_urls &&
/^data:image\/svg/i.test(scriptUrl)
) {
return ''
}
}
if (urlConverter) {
url = urlConverter.call(urlConverterScope, url, 'style')
}
return "url('" + url.replace(/\'/g, "\\'") + "')"
}
if (css) {
css = css.replace(/[\u0000-\u001F]/g, '')
css = css
.replace(/\\[\"\';:\uFEFF]/g, encode)
.replace(/\"[^\"]+\"|\'[^\']+\'/g, function (str) {
return str.replace(/[;:]/g, encode)
})
while ((matches = styleRegExp.exec(css))) {
styleRegExp.lastIndex = matches.index + matches[0].length
name = matches[1].replace(trimRightRegExp, '').toLowerCase()
value = matches[2].replace(trimRightRegExp, '')
if (name && value) {
name = decodeHexSequences(name)
value = decodeHexSequences(value)
if (
name.indexOf(invisibleChar) !== -1 ||
name.indexOf('"') !== -1
) {
continue
}
if (
!settings.allow_script_urls &&
(name === 'behavior' || /expression\s*\(|\/\*|\*\//.test(value))
) {
continue
}
if (name === 'font-weight' && value === '700') {
value = 'bold'
} else if (name === 'color' || name === 'background-color') {
value = value.toLowerCase()
}
value = value.replace(rgbRegExp, toHex)
value = value.replace(urlOrStrRegExp, processUrl)
styles[name] = isEncoded ? decode(value, true) : value
}
}
compress('border', '', true)
compress('border', '-width')
compress('border', '-color')
compress('border', '-style')
compress('padding', '')
compress('margin', '')
compress2('border', 'border-width', 'border-style', 'border-color')
if (styles.border === 'medium none') {
delete styles.border
}
if (styles['border-image'] === 'none') {
delete styles['border-image']
}
}
return styles
},
serialize: function (styles, elementName) {
var css = ''
var serializeStyles = function (name) {
var value
var styleList = validStyles[name]
if (styleList) {
for (var i_1 = 0, l = styleList.length; i_1 < l; i_1++) {
name = styleList[i_1]
value = styles[name]
if (value) {
css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';'
}
}
}
}
var isValid = function (name, elementName) {
var styleMap = invalidStyles['*']
if (styleMap && styleMap[name]) {
return false
}
styleMap = invalidStyles[elementName]
return !(styleMap && styleMap[name])
}
if (elementName && validStyles) {
serializeStyles('*')
serializeStyles(elementName)
} else {
each$j(styles, function (value, name) {
if (value && (!invalidStyles || isValid(name, elementName))) {
css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';'
}
})
}
return css
},
}
}
var deprecated = {
keyLocation: true,
layerX: true,
layerY: true,
returnValue: true,
webkitMovementX: true,
webkitMovementY: true,
keyIdentifier: true,
mozPressure: true,
}
var isNativeEvent = function (event) {
return event instanceof Event || isFunction(event.initEvent)
}
var hasIsDefaultPrevented = function (event) {
return (
event.isDefaultPrevented === always || event.isDefaultPrevented === never
)
}
var needsNormalizing = function (event) {
return isNullable(event.preventDefault) || isNativeEvent(event)
}
var clone$2 = function (originalEvent, data) {
var event = data !== null && data !== void 0 ? data : {}
for (var name_1 in originalEvent) {
if (!has$2(deprecated, name_1)) {
event[name_1] = originalEvent[name_1]
}
}
if (isNonNullable(event.composedPath)) {
event.composedPath = function () {
return originalEvent.composedPath()
}
}
return event
}
var normalize$3 = function (type, originalEvent, fallbackTarget, data) {
var _a
var event = clone$2(originalEvent, data)
event.type = type
if (isNullable(event.target)) {
event.target =
(_a = event.srcElement) !== null && _a !== void 0 ? _a : fallbackTarget
}
if (needsNormalizing(originalEvent)) {
event.preventDefault = function () {
event.defaultPrevented = true
event.isDefaultPrevented = always
if (isFunction(originalEvent.preventDefault)) {
originalEvent.preventDefault()
} else if (isNativeEvent(originalEvent)) {
originalEvent.returnValue = false
}
}
event.stopPropagation = function () {
event.cancelBubble = true
event.isPropagationStopped = always
if (isFunction(originalEvent.stopPropagation)) {
originalEvent.stopPropagation()
} else if (isNativeEvent(originalEvent)) {
originalEvent.cancelBubble = true
}
}
event.stopImmediatePropagation = function () {
event.isImmediatePropagationStopped = always
event.stopPropagation()
}
if (!hasIsDefaultPrevented(event)) {
event.isDefaultPrevented =
event.defaultPrevented === true ? always : never
event.isPropagationStopped =
event.cancelBubble === true ? always : never
event.isImmediatePropagationStopped = never
}
}
return event
}
var eventExpandoPrefix = 'mce-data-'
var mouseEventRe = /^(?:mouse|contextmenu)|click/
var addEvent = function (target, name, callback, capture) {
if (target.addEventListener) {
target.addEventListener(name, callback, capture || false)
} else if (target.attachEvent) {
target.attachEvent('on' + name, callback)
}
}
var removeEvent = function (target, name, callback, capture) {
if (target.removeEventListener) {
target.removeEventListener(name, callback, capture || false)
} else if (target.detachEvent) {
target.detachEvent('on' + name, callback)
}
}
var isMouseEvent = function (event) {
return isNonNullable(event) && mouseEventRe.test(event.type)
}
var fix = function (originalEvent, data) {
var event = normalize$3(originalEvent.type, originalEvent, document, data)
if (
isMouseEvent(originalEvent) &&
isUndefined(originalEvent.pageX) &&
!isUndefined(originalEvent.clientX)
) {
var eventDoc = event.target.ownerDocument || document
var doc = eventDoc.documentElement
var body = eventDoc.body
var mouseEvent = event
mouseEvent.pageX =
originalEvent.clientX +
((doc && doc.scrollLeft) || (body && body.scrollLeft) || 0) -
((doc && doc.clientLeft) || (body && body.clientLeft) || 0)
mouseEvent.pageY =
originalEvent.clientY +
((doc && doc.scrollTop) || (body && body.scrollTop) || 0) -
((doc && doc.clientTop) || (body && body.clientTop) || 0)
}
if (isUndefined(event.metaKey)) {
event.metaKey = false
}
return event
}
var bindOnReady = function (win, callback, eventUtils) {
var doc = win.document,
event = { type: 'ready' }
if (eventUtils.domLoaded) {
callback(event)
return
}
var isDocReady = function () {
return (
doc.readyState === 'complete' ||
(doc.readyState === 'interactive' && doc.body)
)
}
var readyHandler = function () {
removeEvent(win, 'DOMContentLoaded', readyHandler)
removeEvent(win, 'load', readyHandler)
if (!eventUtils.domLoaded) {
eventUtils.domLoaded = true
callback(event)
}
win = null
}
if (isDocReady()) {
readyHandler()
} else {
addEvent(win, 'DOMContentLoaded', readyHandler)
}
if (!eventUtils.domLoaded) {
addEvent(win, 'load', readyHandler)
}
}
var EventUtils = (function () {
function EventUtils() {
this.domLoaded = false
this.events = {}
this.count = 1
this.expando = eventExpandoPrefix + (+new Date()).toString(32)
this.hasMouseEnterLeave = 'onmouseenter' in document.documentElement
this.hasFocusIn = 'onfocusin' in document.documentElement
this.count = 1
}
EventUtils.prototype.bind = function (target, names, callback, scope) {
var self = this
var id, callbackList, i, name, fakeName, nativeHandler, capture
var win = window
var defaultNativeHandler = function (evt) {
self.executeHandlers(fix(evt || win.event), id)
}
if (!target || target.nodeType === 3 || target.nodeType === 8) {
return
}
if (!target[self.expando]) {
id = self.count++
target[self.expando] = id
self.events[id] = {}
} else {
id = target[self.expando]
}
scope = scope || target
var namesList = names.split(' ')
i = namesList.length
while (i--) {
name = namesList[i]
nativeHandler = defaultNativeHandler
fakeName = capture = false
if (name === 'DOMContentLoaded') {
name = 'ready'
}
if (
self.domLoaded &&
name === 'ready' &&
target.readyState === 'complete'
) {
callback.call(scope, fix({ type: name }))
continue
}
if (!self.hasMouseEnterLeave) {
fakeName = self.mouseEnterLeave[name]
if (fakeName) {
nativeHandler = function (evt) {
var current = evt.currentTarget
var related = evt.relatedTarget
if (related && current.contains) {
related = current.contains(related)
} else {
while (related && related !== current) {
related = related.parentNode
}
}
if (!related) {
evt = fix(evt || win.event)
evt.type = evt.type === 'mouseout' ? 'mouseleave' : 'mouseenter'
evt.target = current
self.executeHandlers(evt, id)
}
}
}
}
if (!self.hasFocusIn && (name === 'focusin' || name === 'focusout')) {
capture = true
fakeName = name === 'focusin' ? 'focus' : 'blur'
nativeHandler = function (evt) {
evt = fix(evt || win.event)
evt.type = evt.type === 'focus' ? 'focusin' : 'focusout'
self.executeHandlers(evt, id)
}
}
callbackList = self.events[id][name]
if (!callbackList) {
self.events[id][name] = callbackList = [
{
func: callback,
scope: scope,
},
]
callbackList.fakeName = fakeName
callbackList.capture = capture
callbackList.nativeHandler = nativeHandler
if (name === 'ready') {
bindOnReady(target, nativeHandler, self)
} else {
addEvent(target, fakeName || name, nativeHandler, capture)
}
} else {
if (name === 'ready' && self.domLoaded) {
callback(fix({ type: name }))
} else {
callbackList.push({
func: callback,
scope: scope,
})
}
}
}
target = callbackList = null
return callback
}
EventUtils.prototype.unbind = function (target, names, callback) {
var callbackList, i, ci, name, eventMap
if (!target || target.nodeType === 3 || target.nodeType === 8) {
return this
}
var id = target[this.expando]
if (id) {
eventMap = this.events[id]
if (names) {
var namesList = names.split(' ')
i = namesList.length
while (i--) {
name = namesList[i]
callbackList = eventMap[name]
if (callbackList) {
if (callback) {
ci = callbackList.length
while (ci--) {
if (callbackList[ci].func === callback) {
var nativeHandler = callbackList.nativeHandler
var fakeName = callbackList.fakeName,
capture = callbackList.capture
callbackList = callbackList
.slice(0, ci)
.concat(callbackList.slice(ci + 1))
callbackList.nativeHandler = nativeHandler
callbackList.fakeName = fakeName
callbackList.capture = capture
eventMap[name] = callbackList
}
}
}
if (!callback || callbackList.length === 0) {
delete eventMap[name]
removeEvent(
target,
callbackList.fakeName || name,
callbackList.nativeHandler,
callbackList.capture
)
}
}
}
} else {
each$j(eventMap, function (callbackList, name) {
removeEvent(
target,
callbackList.fakeName || name,
callbackList.nativeHandler,
callbackList.capture
)
})
eventMap = {}
}
for (name in eventMap) {
if (has$2(eventMap, name)) {
return this
}
}
delete this.events[id]
try {
delete target[this.expando]
} catch (ex) {
target[this.expando] = null
}
}
return this
}
EventUtils.prototype.fire = function (target, name, args) {
var id
if (!target || target.nodeType === 3 || target.nodeType === 8) {
return this
}
var event = fix(
{
type: name,
target: target,
},
args
)
do {
id = target[this.expando]
if (id) {
this.executeHandlers(event, id)
}
target =
target.parentNode ||
target.ownerDocument ||
target.defaultView ||
target.parentWindow
} while (target && !event.isPropagationStopped())
return this
}
EventUtils.prototype.clean = function (target) {
var i, children
if (!target || target.nodeType === 3 || target.nodeType === 8) {
return this
}
if (target[this.expando]) {
this.unbind(target)
}
if (!target.getElementsByTagName) {
target = target.document
}
if (target && target.getElementsByTagName) {
this.unbind(target)
children = target.getElementsByTagName('*')
i = children.length
while (i--) {
target = children[i]
if (target[this.expando]) {
this.unbind(target)
}
}
}
return this
}
EventUtils.prototype.destroy = function () {
this.events = {}
}
EventUtils.prototype.cancel = function (e) {
if (e) {
e.preventDefault()
e.stopImmediatePropagation()
}
return false
}
EventUtils.prototype.executeHandlers = function (evt, id) {
var container = this.events[id]
var callbackList = container && container[evt.type]
if (callbackList) {
for (var i = 0, l = callbackList.length; i < l; i++) {
var callback = callbackList[i]
if (callback && callback.func.call(callback.scope, evt) === false) {
evt.preventDefault()
}
if (evt.isImmediatePropagationStopped()) {
return
}
}
}
}
EventUtils.Event = new EventUtils()
return EventUtils
})()
var support,
Expr,
getText,
isXML,
tokenize,
compile,
select$1,
outermostContext,
sortInput,
hasDuplicate,
setDocument,
document$1,
docElem,
documentIsHTML,
rbuggyQSA,
rbuggyMatches,
matches,
contains,
expando = 'sizzle' + -new Date(),
preferredDoc = window.document,
dirruns = 0,
done = 0,
classCache = createCache(),
tokenCache = createCache(),
compilerCache = createCache(),
sortOrder = function (a, b) {
if (a === b) {
hasDuplicate = true
}
return 0
},
strundefined = typeof undefined,
MAX_NEGATIVE = 1 << 31,
hasOwn = {}.hasOwnProperty,
arr = [],
pop = arr.pop,
push_native = arr.push,
push$1 = arr.push,
slice$1 = arr.slice,
indexOf =
arr.indexOf ||
function (elem) {
var i = 0,
len = this.length
for (; i < len; i++) {
if (this[i] === elem) {
return i
}
}
return -1
},
booleans =
'checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped',
whitespace = '[\\x20\\t\\r\\n\\f]',
identifier = '(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+',
attributes =
'\\[' +
whitespace +
'*(' +
identifier +
')(?:' +
whitespace +
'*([*^$|!~]?=)' +
whitespace +
'*(?:\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)"|(' +
identifier +
'))|)' +
whitespace +
'*\\]',
pseudos =
':(' +
identifier +
')(?:\\((' +
'(\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)")|' +
'((?:\\\\.|[^\\\\()[\\]]|' +
attributes +
')*)|' +
'.*' +
')\\)|)',
rtrim = new RegExp(
'^' + whitespace + '+|((?:^|[^\\\\])(?:\\\\.)*)' + whitespace + '+$',
'g'
),
rcomma = new RegExp('^' + whitespace + '*,' + whitespace + '*'),
rcombinators = new RegExp(
'^' + whitespace + '*([>+~]|' + whitespace + ')' + whitespace + '*'
),
rattributeQuotes = new RegExp(
'=' + whitespace + '*([^\\]\'"]*?)' + whitespace + '*\\]',
'g'
),
rpseudo = new RegExp(pseudos),
ridentifier = new RegExp('^' + identifier + '$'),
matchExpr = {
ID: new RegExp('^#(' + identifier + ')'),
CLASS: new RegExp('^\\.(' + identifier + ')'),
TAG: new RegExp('^(' + identifier + '|[*])'),
ATTR: new RegExp('^' + attributes),
PSEUDO: new RegExp('^' + pseudos),
CHILD: new RegExp(
'^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(' +
whitespace +
'*(even|odd|(([+-]|)(\\d*)n|)' +
whitespace +
'*(?:([+-]|)' +
whitespace +
'*(\\d+)|))' +
whitespace +
'*\\)|)',
'i'
),
bool: new RegExp('^(?:' + booleans + ')$', 'i'),
needsContext: new RegExp(
'^' +
whitespace +
'*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(' +
whitespace +
'*((?:-\\d)?\\d*)' +
whitespace +
'*\\)|)(?=[^-]|$)',
'i'
),
},
rinputs = /^(?:input|select|textarea|button)$/i,
rheader = /^h\d$/i,
rnative = /^[^{]+\{\s*\[native \w/,
rquickExpr$1 = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
rsibling = /[+~]/,
rescape = /'|\\/g,
runescape = new RegExp(
'\\\\([\\da-f]{1,6}' + whitespace + '?|(' + whitespace + ')|.)',
'ig'
),
funescape = function (_, escaped, escapedWhitespace) {
var high = '0x' + escaped - 65536
return high !== high || escapedWhitespace
? escaped
: high < 0
? String.fromCharCode(high + 65536)
: String.fromCharCode((high >> 10) | 55296, (high & 1023) | 56320)
}
try {
push$1.apply(
(arr = slice$1.call(preferredDoc.childNodes)),
preferredDoc.childNodes
)
arr[preferredDoc.childNodes.length].nodeType
} catch (e) {
push$1 = {
apply: arr.length
? function (target, els) {
push_native.apply(target, slice$1.call(els))
}
: function (target, els) {
var j = target.length,
i = 0
while ((target[j++] = els[i++])) {}
target.length = j - 1
},
}
}
var Sizzle = function (selector, context, results, seed) {
var match, elem, m, nodeType, i, groups, old, nid, newContext, newSelector
if (
(context ? context.ownerDocument || context : preferredDoc) !== document$1
) {
setDocument(context)
}
context = context || document$1
results = results || []
if (!selector || typeof selector !== 'string') {
return results
}
if ((nodeType = context.nodeType) !== 1 && nodeType !== 9) {
return []
}
if (documentIsHTML && !seed) {
if ((match = rquickExpr$1.exec(selector))) {
if ((m = match[1])) {
if (nodeType === 9) {
elem = context.getElementById(m)
if (elem && elem.parentNode) {
if (elem.id === m) {
results.push(elem)
return results
}
} else {
return results
}
} else {
if (
context.ownerDocument &&
(elem = context.ownerDocument.getElementById(m)) &&
contains(context, elem) &&
elem.id === m
) {
results.push(elem)
return results
}
}
} else if (match[2]) {
push$1.apply(results, context.getElementsByTagName(selector))
return results
} else if ((m = match[3]) && support.getElementsByClassName) {
push$1.apply(results, context.getElementsByClassName(m))
return results
}
}
if (support.qsa && (!rbuggyQSA || !rbuggyQSA.test(selector))) {
nid = old = expando
newContext = context
newSelector = nodeType === 9 && selector
if (nodeType === 1 && context.nodeName.toLowerCase() !== 'object') {
groups = tokenize(selector)
if ((old = context.getAttribute('id'))) {
nid = old.replace(rescape, '\\$&')
} else {
context.setAttribute('id', nid)
}
nid = "[id='" + nid + "'] "
i = groups.length
while (i--) {
groups[i] = nid + toSelector(groups[i])
}
newContext =
(rsibling.test(selector) && testContext(context.parentNode)) ||
context
newSelector = groups.join(',')
}
if (newSelector) {
try {
push$1.apply(results, newContext.querySelectorAll(newSelector))
return results
} catch (qsaError) {
} finally {
if (!old) {
context.removeAttribute('id')
}
}
}
}
}
return select$1(selector.replace(rtrim, '$1'), context, results, seed)
}
function createCache() {
var keys = []
function cache(key, value) {
if (keys.push(key + ' ') > Expr.cacheLength) {
delete cache[keys.shift()]
}
return (cache[key + ' '] = value)
}
return cache
}
function markFunction(fn) {
fn[expando] = true
return fn
}
function siblingCheck(a, b) {
var cur = b && a,
diff =
cur &&
a.nodeType === 1 &&
b.nodeType === 1 &&
(~b.sourceIndex || MAX_NEGATIVE) - (~a.sourceIndex || MAX_NEGATIVE)
if (diff) {
return diff
}
if (cur) {
while ((cur = cur.nextSibling)) {
if (cur === b) {
return -1
}
}
}
return a ? 1 : -1
}
function createInputPseudo(type) {
return function (elem) {
var name = elem.nodeName.toLowerCase()
return name === 'input' && elem.type === type
}
}
function createButtonPseudo(type) {
return function (elem) {
var name = elem.nodeName.toLowerCase()
return (name === 'input' || name === 'button') && elem.type === type
}
}
function createPositionalPseudo(fn) {
return markFunction(function (argument) {
argument = +argument
return markFunction(function (seed, matches) {
var j,
matchIndexes = fn([], seed.length, argument),
i = matchIndexes.length
while (i--) {
if (seed[(j = matchIndexes[i])]) {
seed[j] = !(matches[j] = seed[j])
}
}
})
})
}
function testContext(context) {
return (
context && typeof context.getElementsByTagName !== strundefined && context
)
}
support = Sizzle.support = {}
isXML = Sizzle.isXML = function (elem) {
var documentElement = elem && (elem.ownerDocument || elem).documentElement
return documentElement ? documentElement.nodeName !== 'HTML' : false
}
setDocument = Sizzle.setDocument = function (node) {
var hasCompare,
doc = node ? node.ownerDocument || node : preferredDoc,
parent = doc.defaultView
function getTop(win) {
try {
return win.top
} catch (ex) {}
return null
}
if (doc === document$1 || doc.nodeType !== 9 || !doc.documentElement) {
return document$1
}
document$1 = doc
docElem = doc.documentElement
documentIsHTML = !isXML(doc)
if (parent && parent !== getTop(parent)) {
if (parent.addEventListener) {
parent.addEventListener(
'unload',
function () {
setDocument()
},
false
)
} else if (parent.attachEvent) {
parent.attachEvent('onunload', function () {
setDocument()
})
}
}
support.attributes = true
support.getElementsByTagName = true
support.getElementsByClassName = rnative.test(doc.getElementsByClassName)
support.getById = true
Expr.find.ID = function (id, context) {
if (typeof context.getElementById !== strundefined && documentIsHTML) {
var m = context.getElementById(id)
return m && m.parentNode ? [m] : []
}
}
Expr.filter.ID = function (id) {
var attrId = id.replace(runescape, funescape)
return function (elem) {
return elem.getAttribute('id') === attrId
}
}
Expr.find.TAG = support.getElementsByTagName
? function (tag, context) {
if (typeof context.getElementsByTagName !== strundefined) {
return context.getElementsByTagName(tag)
}
}
: function (tag, context) {
var elem,
tmp = [],
i = 0,
results = context.getElementsByTagName(tag)
if (tag === '*') {
while ((elem = results[i++])) {
if (elem.nodeType === 1) {
tmp.push(elem)
}
}
return tmp
}
return results
}
Expr.find.CLASS =
support.getElementsByClassName &&
function (className, context) {
if (documentIsHTML) {
return context.getElementsByClassName(className)
}
}
rbuggyMatches = []
rbuggyQSA = []
support.disconnectedMatch = true
rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join('|'))
rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join('|'))
hasCompare = rnative.test(docElem.compareDocumentPosition)
contains =
hasCompare || rnative.test(docElem.contains)
? function (a, b) {
var adown = a.nodeType === 9 ? a.documentElement : a,
bup = b && b.parentNode
return (
a === bup ||
!!(
bup &&
bup.nodeType === 1 &&
(adown.contains
? adown.contains(bup)
: a.compareDocumentPosition &&
a.compareDocumentPosition(bup) & 16)
)
)
}
: function (a, b) {
if (b) {
while ((b = b.parentNode)) {
if (b === a) {
return true
}
}
}
return false
}
sortOrder = hasCompare
? function (a, b) {
if (a === b) {
hasDuplicate = true
return 0
}
var compare = !a.compareDocumentPosition - !b.compareDocumentPosition
if (compare) {
return compare
}
compare =
(a.ownerDocument || a) === (b.ownerDocument || b)
? a.compareDocumentPosition(b)
: 1
if (
compare & 1 ||
(!support.sortDetached && b.compareDocumentPosition(a) === compare)
) {
if (
a === doc ||
(a.ownerDocument === preferredDoc && contains(preferredDoc, a))
) {
return -1
}
if (
b === doc ||
(b.ownerDocument === preferredDoc && contains(preferredDoc, b))
) {
return 1
}
return sortInput
? indexOf.call(sortInput, a) - indexOf.call(sortInput, b)
: 0
}
return compare & 4 ? -1 : 1
}
: function (a, b) {
if (a === b) {
hasDuplicate = true
return 0
}
var cur,
i = 0,
aup = a.parentNode,
bup = b.parentNode,
ap = [a],
bp = [b]
if (!aup || !bup) {
return a === doc
? -1
: b === doc
? 1
: aup
? -1
: bup
? 1
: sortInput
? indexOf.call(sortInput, a) - indexOf.call(sortInput, b)
: 0
} else if (aup === bup) {
return siblingCheck(a, b)
}
cur = a
while ((cur = cur.parentNode)) {
ap.unshift(cur)
}
cur = b
while ((cur = cur.parentNode)) {
bp.unshift(cur)
}
while (ap[i] === bp[i]) {
i++
}
return i
? siblingCheck(ap[i], bp[i])
: ap[i] === preferredDoc
? -1
: bp[i] === preferredDoc
? 1
: 0
}
return doc
}
Sizzle.matches = function (expr, elements) {
return Sizzle(expr, null, null, elements)
}
Sizzle.matchesSelector = function (elem, expr) {
if ((elem.ownerDocument || elem) !== document$1) {
setDocument(elem)
}
expr = expr.replace(rattributeQuotes, "='$1']")
if (
support.matchesSelector &&
documentIsHTML &&
(!rbuggyMatches || !rbuggyMatches.test(expr)) &&
(!rbuggyQSA || !rbuggyQSA.test(expr))
) {
try {
var ret = matches.call(elem, expr)
if (
ret ||
support.disconnectedMatch ||
(elem.document && elem.document.nodeType !== 11)
) {
return ret
}
} catch (e) {}
}
return Sizzle(expr, document$1, null, [elem]).length > 0
}
Sizzle.contains = function (context, elem) {
if ((context.ownerDocument || context) !== document$1) {
setDocument(context)
}
return contains(context, elem)
}
Sizzle.attr = function (elem, name) {
if ((elem.ownerDocument || elem) !== document$1) {
setDocument(elem)
}
var fn = Expr.attrHandle[name.toLowerCase()],
val =
fn && hasOwn.call(Expr.attrHandle, name.toLowerCase())
? fn(elem, name, !documentIsHTML)
: undefined
return val !== undefined
? val
: support.attributes || !documentIsHTML
? elem.getAttribute(name)
: (val = elem.getAttributeNode(name)) && val.specified
? val.value
: null
}
Sizzle.error = function (msg) {
throw new Error('Syntax error, unrecognized expression: ' + msg)
}
Sizzle.uniqueSort = function (results) {
var elem,
duplicates = [],
j = 0,
i = 0
hasDuplicate = !support.detectDuplicates
sortInput = !support.sortStable && results.slice(0)
results.sort(sortOrder)
if (hasDuplicate) {
while ((elem = results[i++])) {
if (elem === results[i]) {
j = duplicates.push(i)
}
}
while (j--) {
results.splice(duplicates[j], 1)
}
}
sortInput = null
return results
}
getText = Sizzle.getText = function (elem) {
var node,
ret = '',
i = 0,
nodeType = elem.nodeType
if (!nodeType) {
while ((node = elem[i++])) {
ret += getText(node)
}
} else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
if (typeof elem.textContent === 'string') {
return elem.textContent
} else {
for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
ret += getText(elem)
}
}
} else if (nodeType === 3 || nodeType === 4) {
return elem.nodeValue
}
return ret
}
Expr = Sizzle.selectors = {
cacheLength: 50,
createPseudo: markFunction,
match: matchExpr,
attrHandle: {},
find: {},
relative: {
'>': {
dir: 'parentNode',
first: true,
},
' ': { dir: 'parentNode' },
'+': {
dir: 'previousSibling',
first: true,
},
'~': { dir: 'previousSibling' },
},
preFilter: {
ATTR: function (match) {
match[1] = match[1].replace(runescape, funescape)
match[3] = (match[3] || match[4] || match[5] || '').replace(
runescape,
funescape
)
if (match[2] === '~=') {
match[3] = ' ' + match[3] + ' '
}
return match.slice(0, 4)
},
CHILD: function (match) {
match[1] = match[1].toLowerCase()
if (match[1].slice(0, 3) === 'nth') {
if (!match[3]) {
Sizzle.error(match[0])
}
match[4] = +(match[4]
? match[5] + (match[6] || 1)
: 2 * (match[3] === 'even' || match[3] === 'odd'))
match[5] = +(match[7] + match[8] || match[3] === 'odd')
} else if (match[3]) {
Sizzle.error(match[0])
}
return match
},
PSEUDO: function (match) {
var excess,
unquoted = !match[6] && match[2]
if (matchExpr.CHILD.test(match[0])) {
return null
}
if (match[3]) {
match[2] = match[4] || match[5] || ''
} else if (
unquoted &&
rpseudo.test(unquoted) &&
(excess = tokenize(unquoted, true)) &&
(excess =
unquoted.indexOf(')', unquoted.length - excess) - unquoted.length)
) {
match[0] = match[0].slice(0, excess)
match[2] = unquoted.slice(0, excess)
}
return match.slice(0, 3)
},
},
filter: {
TAG: function (nodeNameSelector) {
var nodeName = nodeNameSelector
.replace(runescape, funescape)
.toLowerCase()
return nodeNameSelector === '*'
? function () {
return true
}
: function (elem) {
return elem.nodeName && elem.nodeName.toLowerCase() === nodeName
}
},
CLASS: function (className) {
var pattern = classCache[className + ' ']
return (
pattern ||
((pattern = new RegExp(
'(^|' + whitespace + ')' + className + '(' + whitespace + '|$)'
)) &&
classCache(className, function (elem) {
return pattern.test(
(typeof elem.className === 'string' && elem.className) ||
(typeof elem.getAttribute !== strundefined &&
elem.getAttribute('class')) ||
''
)
}))
)
},
ATTR: function (name, operator, check) {
return function (elem) {
var result = Sizzle.attr(elem, name)
if (result == null) {
return operator === '!='
}
if (!operator) {
return true
}
result += ''
return operator === '='
? result === check
: operator === '!='
? result !== check
: operator === '^='
? check && result.indexOf(check) === 0
: operator === '*='
? check && result.indexOf(check) > -1
: operator === '$='
? check && result.slice(-check.length) === check
: operator === '~='
? (' ' + result + ' ').indexOf(check) > -1
: operator === '|='
? result === check ||
result.slice(0, check.length + 1) === check + '-'
: false
}
},
CHILD: function (type, what, argument, first, last) {
var simple = type.slice(0, 3) !== 'nth',
forward = type.slice(-4) !== 'last',
ofType = what === 'of-type'
return first === 1 && last === 0
? function (elem) {
return !!elem.parentNode
}
: function (elem, context, xml) {
var cache,
outerCache,
node,
diff,
nodeIndex,
start,
dir = simple !== forward ? 'nextSibling' : 'previousSibling',
parent = elem.parentNode,
name = ofType && elem.nodeName.toLowerCase(),
useCache = !xml && !ofType
if (parent) {
if (simple) {
while (dir) {
node = elem
while ((node = node[dir])) {
if (
ofType
? node.nodeName.toLowerCase() === name
: node.nodeType === 1
) {
return false
}
}
start = dir = type === 'only' && !start && 'nextSibling'
}
return true
}
start = [forward ? parent.firstChild : parent.lastChild]
if (forward && useCache) {
outerCache = parent[expando] || (parent[expando] = {})
cache = outerCache[type] || []
nodeIndex = cache[0] === dirruns && cache[1]
diff = cache[0] === dirruns && cache[2]
node = nodeIndex && parent.childNodes[nodeIndex]
while (
(node =
(++nodeIndex && node && node[dir]) ||
(diff = nodeIndex = 0) ||
start.pop())
) {
if (node.nodeType === 1 && ++diff && node === elem) {
outerCache[type] = [dirruns, nodeIndex, diff]
break
}
}
} else if (
useCache &&
(cache = (elem[expando] || (elem[expando] = {}))[type]) &&
cache[0] === dirruns
) {
diff = cache[1]
} else {
while (
(node =
(++nodeIndex && node && node[dir]) ||
(diff = nodeIndex = 0) ||
start.pop())
) {
if (
(ofType
? node.nodeName.toLowerCase() === name
: node.nodeType === 1) &&
++diff
) {
if (useCache) {
;(node[expando] || (node[expando] = {}))[type] = [
dirruns,
diff,
]
}
if (node === elem) {
break
}
}
}
}
diff -= last
return (
diff === first || (diff % first === 0 && diff / first >= 0)
)
}
}
},
PSEUDO: function (pseudo, argument) {
var args,
fn =
Expr.pseudos[pseudo] ||
Expr.setFilters[pseudo.toLowerCase()] ||
Sizzle.error('unsupported pseudo: ' + pseudo)
if (fn[expando]) {
return fn(argument)
}
if (fn.length > 1) {
args = [pseudo, pseudo, '', argument]
return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase())
? markFunction(function (seed, matches) {
var idx,
matched = fn(seed, argument),
i = matched.length
while (i--) {
idx = indexOf.call(seed, matched[i])
seed[idx] = !(matches[idx] = matched[i])
}
})
: function (elem) {
return fn(elem, 0, args)
}
}
return fn
},
},
pseudos: {
not: markFunction(function (selector) {
var input = [],
results = [],
matcher = compile(selector.replace(rtrim, '$1'))
return matcher[expando]
? markFunction(function (seed, matches, context, xml) {
var elem,
unmatched = matcher(seed, null, xml, []),
i = seed.length
while (i--) {
if ((elem = unmatched[i])) {
seed[i] = !(matches[i] = elem)
}
}
})
: function (elem, context, xml) {
input[0] = elem
matcher(input, null, xml, results)
input[0] = null
return !results.pop()
}
}),
has: markFunction(function (selector) {
return function (elem) {
return Sizzle(selector, elem).length > 0
}
}),
contains: markFunction(function (text) {
text = text.replace(runescape, funescape)
return function (elem) {
return (
(elem.textContent || elem.innerText || getText(elem)).indexOf(
text
) > -1
)
}
}),
lang: markFunction(function (lang) {
if (!ridentifier.test(lang || '')) {
Sizzle.error('unsupported lang: ' + lang)
}
lang = lang.replace(runescape, funescape).toLowerCase()
return function (elem) {
var elemLang
do {
if (
(elemLang = documentIsHTML
? elem.lang
: elem.getAttribute('xml:lang') || elem.getAttribute('lang'))
) {
elemLang = elemLang.toLowerCase()
return elemLang === lang || elemLang.indexOf(lang + '-') === 0
}
} while ((elem = elem.parentNode) && elem.nodeType === 1)
return false
}
}),
target: function (elem) {
var hash = window.location && window.location.hash
return hash && hash.slice(1) === elem.id
},
root: function (elem) {
return elem === docElem
},
focus: function (elem) {
return (
elem === document$1.activeElement &&
(!document$1.hasFocus || document$1.hasFocus()) &&
!!(elem.type || elem.href || ~elem.tabIndex)
)
},
enabled: function (elem) {
return elem.disabled === false
},
disabled: function (elem) {
return elem.disabled === true
},
checked: function (elem) {
var nodeName = elem.nodeName.toLowerCase()
return (
(nodeName === 'input' && !!elem.checked) ||
(nodeName === 'option' && !!elem.selected)
)
},
selected: function (elem) {
if (elem.parentNode) {
elem.parentNode.selectedIndex
}
return elem.selected === true
},
empty: function (elem) {
for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
if (elem.nodeType < 6) {
return false
}
}
return true
},
parent: function (elem) {
return !Expr.pseudos.empty(elem)
},
header: function (elem) {
return rheader.test(elem.nodeName)
},
input: function (elem) {
return rinputs.test(elem.nodeName)
},
button: function (elem) {
var name = elem.nodeName.toLowerCase()
return (name === 'input' && elem.type === 'button') || name === 'button'
},
text: function (elem) {
var attr
return (
elem.nodeName.toLowerCase() === 'input' &&
elem.type === 'text' &&
((attr = elem.getAttribute('type')) == null ||
attr.toLowerCase() === 'text')
)
},
first: createPositionalPseudo(function () {
return [0]
}),
last: createPositionalPseudo(function (matchIndexes, length) {
return [length - 1]
}),
eq: createPositionalPseudo(function (matchIndexes, length, argument) {
return [argument < 0 ? argument + length : argument]
}),
even: createPositionalPseudo(function (matchIndexes, length) {
var i = 0
for (; i < length; i += 2) {
matchIndexes.push(i)
}
return matchIndexes
}),
odd: createPositionalPseudo(function (matchIndexes, length) {
var i = 1
for (; i < length; i += 2) {
matchIndexes.push(i)
}
return matchIndexes
}),
lt: createPositionalPseudo(function (matchIndexes, length, argument) {
var i = argument < 0 ? argument + length : argument
for (; --i >= 0; ) {
matchIndexes.push(i)
}
return matchIndexes
}),
gt: createPositionalPseudo(function (matchIndexes, length, argument) {
var i = argument < 0 ? argument + length : argument
for (; ++i < length; ) {
matchIndexes.push(i)
}
return matchIndexes
}),
},
}
Expr.pseudos.nth = Expr.pseudos.eq
each$k(['radio', 'checkbox', 'file', 'password', 'image'], function (i) {
Expr.pseudos[i] = createInputPseudo(i)
})
each$k(['submit', 'reset'], function (i) {
Expr.pseudos[i] = createButtonPseudo(i)
})
function setFilters() {}
setFilters.prototype = Expr.filters = Expr.pseudos
Expr.setFilters = new setFilters()
tokenize = Sizzle.tokenize = function (selector, parseOnly) {
var matched,
match,
tokens,
type,
soFar,
groups,
preFilters,
cached = tokenCache[selector + ' ']
if (cached) {
return parseOnly ? 0 : cached.slice(0)
}
soFar = selector
groups = []
preFilters = Expr.preFilter
while (soFar) {
if (!matched || (match = rcomma.exec(soFar))) {
if (match) {
soFar = soFar.slice(match[0].length) || soFar
}
groups.push((tokens = []))
}
matched = false
if ((match = rcombinators.exec(soFar))) {
matched = match.shift()
tokens.push({
value: matched,
type: match[0].replace(rtrim, ' '),
})
soFar = soFar.slice(matched.length)
}
for (type in Expr.filter) {
if (!Expr.filter.hasOwnProperty(type)) {
continue
}
if (
(match = matchExpr[type].exec(soFar)) &&
(!preFilters[type] || (match = preFilters[type](match)))
) {
matched = match.shift()
tokens.push({
value: matched,
type: type,
matches: match,
})
soFar = soFar.slice(matched.length)
}
}
if (!matched) {
break
}
}
return parseOnly
? soFar.length
: soFar
? Sizzle.error(selector)
: tokenCache(selector, groups).slice(0)
}
function toSelector(tokens) {
var i = 0,
len = tokens.length,
selector = ''
for (; i < len; i++) {
selector += tokens[i].value
}
return selector
}
function addCombinator(matcher, combinator, base) {
var dir = combinator.dir,
checkNonElements = base && dir === 'parentNode',
doneName = done++
return combinator.first
? function (elem, context, xml) {
while ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
return matcher(elem, context, xml)
}
}
}
: function (elem, context, xml) {
var oldCache,
outerCache,
newCache = [dirruns, doneName]
if (xml) {
while ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
if (matcher(elem, context, xml)) {
return true
}
}
}
} else {
while ((elem = elem[dir])) {
if (elem.nodeType === 1 || checkNonElements) {
outerCache = elem[expando] || (elem[expando] = {})
if (
(oldCache = outerCache[dir]) &&
oldCache[0] === dirruns &&
oldCache[1] === doneName
) {
return (newCache[2] = oldCache[2])
} else {
outerCache[dir] = newCache
if ((newCache[2] = matcher(elem, context, xml))) {
return true
}
}
}
}
}
}
}
function elementMatcher(matchers) {
return matchers.length > 1
? function (elem, context, xml) {
var i = matchers.length
while (i--) {
if (!matchers[i](elem, context, xml)) {
return false
}
}
return true
}
: matchers[0]
}
function multipleContexts(selector, contexts, results) {
var i = 0,
len = contexts.length
for (; i < len; i++) {
Sizzle(selector, contexts[i], results)
}
return results
}
function condense(unmatched, map, filter, context, xml) {
var elem,
newUnmatched = [],
i = 0,
len = unmatched.length,
mapped = map != null
for (; i < len; i++) {
if ((elem = unmatched[i])) {
if (!filter || filter(elem, context, xml)) {
newUnmatched.push(elem)
if (mapped) {
map.push(i)
}
}
}
}
return newUnmatched
}
function setMatcher(
preFilter,
selector,
matcher,
postFilter,
postFinder,
postSelector
) {
if (postFilter && !postFilter[expando]) {
postFilter = setMatcher(postFilter)
}
if (postFinder && !postFinder[expando]) {
postFinder = setMatcher(postFinder, postSelector)
}
return markFunction(function (seed, results, context, xml) {
var temp,
i,
elem,
preMap = [],
postMap = [],
preexisting = results.length,
elems =
seed ||
multipleContexts(
selector || '*',
context.nodeType ? [context] : context,
[]
),
matcherIn =
preFilter && (seed || !selector)
? condense(elems, preMap, preFilter, context, xml)
: elems,
matcherOut = matcher
? postFinder || (seed ? preFilter : preexisting || postFilter)
? []
: results
: matcherIn
if (matcher) {
matcher(matcherIn, matcherOut, context, xml)
}
if (postFilter) {
temp = condense(matcherOut, postMap)
postFilter(temp, [], context, xml)
i = temp.length
while (i--) {
if ((elem = temp[i])) {
matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem)
}
}
}
if (seed) {
if (postFinder || preFilter) {
if (postFinder) {
temp = []
i = matcherOut.length
while (i--) {
if ((elem = matcherOut[i])) {
temp.push((matcherIn[i] = elem))
}
}
postFinder(null, (matcherOut = []), temp, xml)
}
i = matcherOut.length
while (i--) {
if (
(elem = matcherOut[i]) &&
(temp = postFinder ? indexOf.call(seed, elem) : preMap[i]) > -1
) {
seed[temp] = !(results[temp] = elem)
}
}
}
} else {
matcherOut = condense(
matcherOut === results
? matcherOut.splice(preexisting, matcherOut.length)
: matcherOut
)
if (postFinder) {
postFinder(null, results, matcherOut, xml)
} else {
push$1.apply(results, matcherOut)
}
}
})
}
function matcherFromTokens(tokens) {
var checkContext,
matcher,
j,
len = tokens.length,
leadingRelative = Expr.relative[tokens[0].type],
implicitRelative = leadingRelative || Expr.relative[' '],
i = leadingRelative ? 1 : 0,
matchContext = addCombinator(
function (elem) {
return elem === checkContext
},
implicitRelative,
true
),
matchAnyContext = addCombinator(
function (elem) {
return indexOf.call(checkContext, elem) > -1
},
implicitRelative,
true
),
matchers = [
function (elem, context, xml) {
var ret =
(!leadingRelative && (xml || context !== outermostContext)) ||
((checkContext = context).nodeType
? matchContext(elem, context, xml)
: matchAnyContext(elem, context, xml))
checkContext = null
return ret
},
]
for (; i < len; i++) {
if ((matcher = Expr.relative[tokens[i].type])) {
matchers = [addCombinator(elementMatcher(matchers), matcher)]
} else {
matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches)
if (matcher[expando]) {
j = ++i
for (; j < len; j++) {
if (Expr.relative[tokens[j].type]) {
break
}
}
return setMatcher(
i > 1 && elementMatcher(matchers),
i > 1 &&
toSelector(
tokens
.slice(0, i - 1)
.concat({ value: tokens[i - 2].type === ' ' ? '*' : '' })
).replace(rtrim, '$1'),
matcher,
i < j && matcherFromTokens(tokens.slice(i, j)),
j < len && matcherFromTokens((tokens = tokens.slice(j))),
j < len && toSelector(tokens)
)
}
matchers.push(matcher)
}
}
return elementMatcher(matchers)
}
function matcherFromGroupMatchers(elementMatchers, setMatchers) {
var bySet = setMatchers.length > 0,
byElement = elementMatchers.length > 0,
superMatcher = function (seed, context, xml, results, outermost) {
var elem,
j,
matcher,
matchedCount = 0,
i = '0',
unmatched = seed && [],
setMatched = [],
contextBackup = outermostContext,
elems = seed || (byElement && Expr.find.TAG('*', outermost)),
dirrunsUnique = (dirruns +=
contextBackup == null ? 1 : Math.random() || 0.1),
len = elems.length
if (outermost) {
outermostContext = context !== document$1 && context
}
for (; i !== len && (elem = elems[i]) != null; i++) {
if (byElement && elem) {
j = 0
while ((matcher = elementMatchers[j++])) {
if (matcher(elem, context, xml)) {
results.push(elem)
break
}
}
if (outermost) {
dirruns = dirrunsUnique
}
}
if (bySet) {
if ((elem = !matcher && elem)) {
matchedCount--
}
if (seed) {
unmatched.push(elem)
}
}
}
matchedCount += i
if (bySet && i !== matchedCount) {
j = 0
while ((matcher = setMatchers[j++])) {
matcher(unmatched, setMatched, context, xml)
}
if (seed) {
if (matchedCount > 0) {
while (i--) {
if (!(unmatched[i] || setMatched[i])) {
setMatched[i] = pop.call(results)
}
}
}
setMatched = condense(setMatched)
}
push$1.apply(results, setMatched)
if (
outermost &&
!seed &&
setMatched.length > 0 &&
matchedCount + setMatchers.length > 1
) {
Sizzle.uniqueSort(results)
}
}
if (outermost) {
dirruns = dirrunsUnique
outermostContext = contextBackup
}
return unmatched
}
return bySet ? markFunction(superMatcher) : superMatcher
}
compile = Sizzle.compile = function (selector, match) {
var i,
setMatchers = [],
elementMatchers = [],
cached = compilerCache[selector + ' ']
if (!cached) {
if (!match) {
match = tokenize(selector)
}
i = match.length
while (i--) {
cached = matcherFromTokens(match[i])
if (cached[expando]) {
setMatchers.push(cached)
} else {
elementMatchers.push(cached)
}
}
cached = compilerCache(
selector,
matcherFromGroupMatchers(elementMatchers, setMatchers)
)
cached.selector = selector
}
return cached
}
select$1 = Sizzle.select = function (selector, context, results, seed) {
var i,
tokens,
token,
type,
find,
compiled = typeof selector === 'function' && selector,
match = !seed && tokenize((selector = compiled.selector || selector))
results = results || []
if (match.length === 1) {
tokens = match[0] = match[0].slice(0)
if (
tokens.length > 2 &&
(token = tokens[0]).type === 'ID' &&
support.getById &&
context.nodeType === 9 &&
documentIsHTML &&
Expr.relative[tokens[1].type]
) {
context = (Expr.find.ID(
token.matches[0].replace(runescape, funescape),
context
) || [])[0]
if (!context) {
return results
} else if (compiled) {
context = context.parentNode
}
selector = selector.slice(tokens.shift().value.length)
}
i = matchExpr.needsContext.test(selector) ? 0 : tokens.length
while (i--) {
token = tokens[i]
if (Expr.relative[(type = token.type)]) {
break
}
if ((find = Expr.find[type])) {
if (
(seed = find(
token.matches[0].replace(runescape, funescape),
(rsibling.test(tokens[0].type) &&
testContext(context.parentNode)) ||
context
))
) {
tokens.splice(i, 1)
selector = seed.length && toSelector(tokens)
if (!selector) {
push$1.apply(results, seed)
return results
}
break
}
}
}
}
;(compiled || compile(selector, match))(
seed,
context,
!documentIsHTML,
results,
(rsibling.test(selector) && testContext(context.parentNode)) || context
)
return results
}
support.sortStable = expando.split('').sort(sortOrder).join('') === expando
support.detectDuplicates = !!hasDuplicate
setDocument()
support.sortDetached = true
var doc = document
var push = Array.prototype.push
var slice = Array.prototype.slice
var rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/
var Event$1 = EventUtils.Event
var skipUniques = Tools.makeMap('children,contents,next,prev')
var isDefined = function (obj) {
return typeof obj !== 'undefined'
}
var isString = function (obj) {
return typeof obj === 'string'
}
var isWindow = function (obj) {
return obj && obj === obj.window
}
var createFragment$1 = function (html, fragDoc) {
fragDoc = fragDoc || doc
var container = fragDoc.createElement('div')
var frag = fragDoc.createDocumentFragment()
container.innerHTML = html
var node
while ((node = container.firstChild)) {
frag.appendChild(node)
}
return frag
}
var domManipulate = function (targetNodes, sourceItem, callback, reverse) {
var i
if (isString(sourceItem)) {
sourceItem = createFragment$1(
sourceItem,
getElementDocument(targetNodes[0])
)
} else if (sourceItem.length && !sourceItem.nodeType) {
sourceItem = DomQuery.makeArray(sourceItem)
if (reverse) {
for (i = sourceItem.length - 1; i >= 0; i--) {
domManipulate(targetNodes, sourceItem[i], callback, reverse)
}
} else {
for (i = 0; i < sourceItem.length; i++) {
domManipulate(targetNodes, sourceItem[i], callback, reverse)
}
}
return targetNodes
}
if (sourceItem.nodeType) {
i = targetNodes.length
while (i--) {
callback.call(targetNodes[i], sourceItem)
}
}
return targetNodes
}
var hasClass = function (node, className) {
return (
node &&
className &&
(' ' + node.className + ' ').indexOf(' ' + className + ' ') !== -1
)
}
var wrap$2 = function (elements, wrapper, all) {
var lastParent, newWrapper
wrapper = DomQuery(wrapper)[0]
elements.each(function () {
var self = this
if (!all || lastParent !== self.parentNode) {
lastParent = self.parentNode
newWrapper = wrapper.cloneNode(false)
self.parentNode.insertBefore(newWrapper, self)
newWrapper.appendChild(self)
} else {
newWrapper.appendChild(self)
}
})
return elements
}
var numericCssMap = Tools.makeMap(
'fillOpacity fontWeight lineHeight opacity orphans widows zIndex zoom',
' '
)
var booleanMap = Tools.makeMap(
'checked compact declare defer disabled ismap multiple nohref noshade nowrap readonly selected',
' '
)
var propFix = {
for: 'htmlFor',
class: 'className',
readonly: 'readOnly',
}
var cssFix = { float: 'cssFloat' }
var attrHooks = {},
cssHooks = {}
var DomQueryConstructor = function (selector, context) {
return new DomQuery.fn.init(selector, context)
}
var inArray$1 = function (item, array) {
var i
if (array.indexOf) {
return array.indexOf(item)
}
i = array.length
while (i--) {
if (array[i] === item) {
return i
}
}
return -1
}
var whiteSpaceRegExp = /^\s*|\s*$/g
var trim$1 = function (str) {
return str === null || str === undefined
? ''
: ('' + str).replace(whiteSpaceRegExp, '')
}
var each$g = function (obj, callback) {
var length, key, i, value
if (obj) {
length = obj.length
if (length === undefined) {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
value = obj[key]
if (callback.call(value, key, value) === false) {
break
}
}
}
} else {
for (i = 0; i < length; i++) {
value = obj[i]
if (callback.call(value, i, value) === false) {
break
}
}
}
}
return obj
}
var grep$2 = function (array, callback) {
var out = []
each$g(array, function (i, item) {
if (callback(item, i)) {
out.push(item)
}
})
return out
}
var getElementDocument = function (element) {
if (!element) {
return doc
}
if (element.nodeType === 9) {
return element
}
return element.ownerDocument
}
DomQueryConstructor.fn = DomQueryConstructor.prototype = {
constructor: DomQueryConstructor,
selector: '',
context: null,
length: 0,
init: function (selector, context) {
var self = this
var match, node
if (!selector) {
return self
}
if (selector.nodeType) {
self.context = self[0] = selector
self.length = 1
return self
}
if (context && context.nodeType) {
self.context = context
} else {
if (context) {
return DomQuery(selector).attr(context)
}
self.context = context = document
}
if (isString(selector)) {
self.selector = selector
if (
selector.charAt(0) === '<' &&
selector.charAt(selector.length - 1) === '>' &&
selector.length >= 3
) {
match = [null, selector, null]
} else {
match = rquickExpr.exec(selector)
}
if (match) {
if (match[1]) {
node = createFragment$1(
selector,
getElementDocument(context)
).firstChild
while (node) {
push.call(self, node)
node = node.nextSibling
}
} else {
node = getElementDocument(context).getElementById(match[2])
if (!node) {
return self
}
if (node.id !== match[2]) {
return self.find(selector)
}
self.length = 1
self[0] = node
}
} else {
return DomQuery(context).find(selector)
}
} else {
this.add(selector, false)
}
return self
},
toArray: function () {
return Tools.toArray(this)
},
add: function (items, sort) {
var self = this
var nodes, i
if (isString(items)) {
return self.add(DomQuery(items))
}
if (sort !== false) {
nodes = DomQuery.unique(
self.toArray().concat(DomQuery.makeArray(items))
)
self.length = nodes.length
for (i = 0; i < nodes.length; i++) {
self[i] = nodes[i]
}
} else {
push.apply(self, DomQuery.makeArray(items))
}
return self
},
attr: function (name, value) {
var self = this
var hook
if (typeof name === 'object') {
each$g(name, function (name, value) {
self.attr(name, value)
})
} else if (isDefined(value)) {
this.each(function () {
var hook
if (this.nodeType === 1) {
hook = attrHooks[name]
if (hook && hook.set) {
hook.set(this, value)
return
}
if (value === null) {
this.removeAttribute(name, 2)
} else {
this.setAttribute(name, value, 2)
}
}
})
} else {
if (self[0] && self[0].nodeType === 1) {
hook = attrHooks[name]
if (hook && hook.get) {
return hook.get(self[0], name)
}
if (booleanMap[name]) {
return self.prop(name) ? name : undefined
}
value = self[0].getAttribute(name, 2)
if (value === null) {
value = undefined
}
}
return value
}
return self
},
removeAttr: function (name) {
return this.attr(name, null)
},
prop: function (name, value) {
var self = this
name = propFix[name] || name
if (typeof name === 'object') {
each$g(name, function (name, value) {
self.prop(name, value)
})
} else if (isDefined(value)) {
this.each(function () {
if (this.nodeType === 1) {
this[name] = value
}
})
} else {
if (self[0] && self[0].nodeType && name in self[0]) {
return self[0][name]
}
return value
}
return self
},
css: function (name, value) {
var self = this
var elm, hook
var camel = function (name) {
return name.replace(/-(\D)/g, function (a, b) {
return b.toUpperCase()
})
}
var dashed = function (name) {
return name.replace(/[A-Z]/g, function (a) {
return '-' + a
})
}
if (typeof name === 'object') {
each$g(name, function (name, value) {
self.css(name, value)
})
} else {
if (isDefined(value)) {
name = camel(name)
if (typeof value === 'number' && !numericCssMap[name]) {
value = value.toString() + 'px'
}
self.each(function () {
var style = this.style
hook = cssHooks[name]
if (hook && hook.set) {
hook.set(this, value)
return
}
try {
this.style[cssFix[name] || name] = value
} catch (ex) {}
if (value === null || value === '') {
if (style.removeProperty) {
style.removeProperty(dashed(name))
} else {
style.removeAttribute(name)
}
}
})
} else {
elm = self[0]
hook = cssHooks[name]
if (hook && hook.get) {
return hook.get(elm)
}
if (elm.ownerDocument.defaultView) {
try {
return elm.ownerDocument.defaultView
.getComputedStyle(elm, null)
.getPropertyValue(dashed(name))
} catch (ex) {
return undefined
}
} else if (elm.currentStyle) {
return elm.currentStyle[camel(name)]
} else {
return ''
}
}
}
return self
},
remove: function () {
var self = this
var node,
i = this.length
while (i--) {
node = self[i]
Event$1.clean(node)
if (node.parentNode) {
node.parentNode.removeChild(node)
}
}
return this
},
empty: function () {
var self = this
var node,
i = this.length
while (i--) {
node = self[i]
while (node.firstChild) {
node.removeChild(node.firstChild)
}
}
return this
},
html: function (value) {
var self = this
var i
if (isDefined(value)) {
i = self.length
try {
while (i--) {
self[i].innerHTML = value
}
} catch (ex) {
DomQuery(self[i]).empty().append(value)
}
return self
}
return self[0] ? self[0].innerHTML : ''
},
text: function (value) {
var self = this
var i
if (isDefined(value)) {
i = self.length
while (i--) {
if ('innerText' in self[i]) {
self[i].innerText = value
} else {
self[0].textContent = value
}
}
return self
}
return self[0] ? self[0].innerText || self[0].textContent : ''
},
append: function () {
return domManipulate(this, arguments, function (node) {
if (this.nodeType === 1 || (this.host && this.host.nodeType === 1)) {
this.appendChild(node)
}
})
},
prepend: function () {
return domManipulate(
this,
arguments,
function (node) {
if (this.nodeType === 1 || (this.host && this.host.nodeType === 1)) {
this.insertBefore(node, this.firstChild)
}
},
true
)
},
before: function () {
var self = this
if (self[0] && self[0].parentNode) {
return domManipulate(self, arguments, function (node) {
this.parentNode.insertBefore(node, this)
})
}
return self
},
after: function () {
var self = this
if (self[0] && self[0].parentNode) {
return domManipulate(
self,
arguments,
function (node) {
this.parentNode.insertBefore(node, this.nextSibling)
},
true
)
}
return self
},
appendTo: function (val) {
DomQuery(val).append(this)
return this
},
prependTo: function (val) {
DomQuery(val).prepend(this)
return this
},
replaceWith: function (content) {
return this.before(content).remove()
},
wrap: function (content) {
return wrap$2(this, content)
},
wrapAll: function (content) {
return wrap$2(this, content, true)
},
wrapInner: function (content) {
this.each(function () {
DomQuery(this).contents().wrapAll(content)
})
return this
},
unwrap: function () {
return this.parent().each(function () {
DomQuery(this).replaceWith(this.childNodes)
})
},
clone: function () {
var result = []
this.each(function () {
result.push(this.cloneNode(true))
})
return DomQuery(result)
},
addClass: function (className) {
return this.toggleClass(className, true)
},
removeClass: function (className) {
return this.toggleClass(className, false)
},
toggleClass: function (className, state) {
var self = this
if (typeof className !== 'string') {
return self
}
if (className.indexOf(' ') !== -1) {
each$g(className.split(' '), function () {
self.toggleClass(this, state)
})
} else {
self.each(function (index, node) {
var classState = hasClass(node, className)
if (classState !== state) {
var existingClassName = node.className
if (classState) {
node.className = trim$1(
(' ' + existingClassName + ' ').replace(
' ' + className + ' ',
' '
)
)
} else {
node.className += existingClassName ? ' ' + className : className
}
}
})
}
return self
},
hasClass: function (className) {
return hasClass(this[0], className)
},
each: function (callback) {
return each$g(this, callback)
},
on: function (name, callback) {
return this.each(function () {
Event$1.bind(this, name, callback)
})
},
off: function (name, callback) {
return this.each(function () {
Event$1.unbind(this, name, callback)
})
},
trigger: function (name) {
return this.each(function () {
if (typeof name === 'object') {
Event$1.fire(this, name.type, name)
} else {
Event$1.fire(this, name)
}
})
},
show: function () {
return this.css('display', '')
},
hide: function () {
return this.css('display', 'none')
},
slice: function () {
return DomQuery(slice.apply(this, arguments))
},
eq: function (index) {
return index === -1 ? this.slice(index) : this.slice(index, +index + 1)
},
first: function () {
return this.eq(0)
},
last: function () {
return this.eq(-1)
},
find: function (selector) {
var i, l
var ret = []
for (i = 0, l = this.length; i < l; i++) {
DomQuery.find(selector, this[i], ret)
}
return DomQuery(ret)
},
filter: function (selector) {
if (typeof selector === 'function') {
return DomQuery(
grep$2(this.toArray(), function (item, i) {
return selector(i, item)
})
)
}
return DomQuery(DomQuery.filter(selector, this.toArray()))
},
closest: function (selector) {
var result = []
if (selector instanceof DomQuery) {
selector = selector[0]
}
this.each(function (i, node) {
while (node) {
if (typeof selector === 'string' && DomQuery(node).is(selector)) {
result.push(node)
break
} else if (node === selector) {
result.push(node)
break
}
node = node.parentNode
}
})
return DomQuery(result)
},
offset: function (offset) {
var elm, doc, docElm
var x = 0,
y = 0,
pos
if (!offset) {
elm = this[0]
if (elm) {
doc = elm.ownerDocument
docElm = doc.documentElement
if (elm.getBoundingClientRect) {
pos = elm.getBoundingClientRect()
x =
pos.left +
(docElm.scrollLeft || doc.body.scrollLeft) -
docElm.clientLeft
y =
pos.top +
(docElm.scrollTop || doc.body.scrollTop) -
docElm.clientTop
}
}
return {
left: x,
top: y,
}
}
return this.css(offset)
},
push: push,
sort: Array.prototype.sort,
splice: Array.prototype.splice,
}
Tools.extend(DomQueryConstructor, {
extend: Tools.extend,
makeArray: function (object) {
if (isWindow(object) || object.nodeType) {
return [object]
}
return Tools.toArray(object)
},
inArray: inArray$1,
isArray: Tools.isArray,
each: each$g,
trim: trim$1,
grep: grep$2,
find: Sizzle,
expr: Sizzle.selectors,
unique: Sizzle.uniqueSort,
text: Sizzle.getText,
contains: Sizzle.contains,
filter: function (expr, elems, not) {
var i = elems.length
if (not) {
expr = ':not(' + expr + ')'
}
while (i--) {
if (elems[i].nodeType !== 1) {
elems.splice(i, 1)
}
}
if (elems.length === 1) {
elems = DomQuery.find.matchesSelector(elems[0], expr) ? [elems[0]] : []
} else {
elems = DomQuery.find.matches(expr, elems)
}
return elems
},
})
var dir = function (el, prop, until) {
var matched = []
var cur = el[prop]
if (typeof until !== 'string' && until instanceof DomQuery) {
until = until[0]
}
while (cur && cur.nodeType !== 9) {
if (until !== undefined) {
if (cur === until) {
break
}
if (typeof until === 'string' && DomQuery(cur).is(until)) {
break
}
}
if (cur.nodeType === 1) {
matched.push(cur)
}
cur = cur[prop]
}
return matched
}
var sibling$1 = function (node, siblingName, nodeType, until) {
var result = []
if (until instanceof DomQuery) {
until = until[0]
}
for (; node; node = node[siblingName]) {
if (nodeType && node.nodeType !== nodeType) {
continue
}
if (until !== undefined) {
if (node === until) {
break
}
if (typeof until === 'string' && DomQuery(node).is(until)) {
break
}
}
result.push(node)
}
return result
}
var firstSibling = function (node, siblingName, nodeType) {
for (node = node[siblingName]; node; node = node[siblingName]) {
if (node.nodeType === nodeType) {
return node
}
}
return null
}
each$g(
{
parent: function (node) {
var parent = node.parentNode
return parent && parent.nodeType !== 11 ? parent : null
},
parents: function (node) {
return dir(node, 'parentNode')
},
next: function (node) {
return firstSibling(node, 'nextSibling', 1)
},
prev: function (node) {
return firstSibling(node, 'previousSibling', 1)
},
children: function (node) {
return sibling$1(node.firstChild, 'nextSibling', 1)
},
contents: function (node) {
return Tools.toArray(
(node.nodeName === 'iframe'
? node.contentDocument || node.contentWindow.document
: node
).childNodes
)
},
},
function (name, fn) {
DomQueryConstructor.fn[name] = function (selector) {
var self = this
var result = []
self.each(function () {
var nodes = fn.call(result, this, selector, result)
if (nodes) {
if (DomQuery.isArray(nodes)) {
result.push.apply(result, nodes)
} else {
result.push(nodes)
}
}
})
if (this.length > 1) {
if (!skipUniques[name]) {
result = DomQuery.unique(result)
}
if (name.indexOf('parents') === 0) {
result = result.reverse()
}
}
var wrappedResult = DomQuery(result)
if (selector) {
return wrappedResult.filter(selector)
}
return wrappedResult
}
}
)
each$g(
{
parentsUntil: function (node, until) {
return dir(node, 'parentNode', until)
},
nextUntil: function (node, until) {
return sibling$1(node, 'nextSibling', 1, until).slice(1)
},
prevUntil: function (node, until) {
return sibling$1(node, 'previousSibling', 1, until).slice(1)
},
},
function (name, fn) {
DomQueryConstructor.fn[name] = function (selector, filter) {
var self = this
var result = []
self.each(function () {
var nodes = fn.call(result, this, selector, result)
if (nodes) {
if (DomQuery.isArray(nodes)) {
result.push.apply(result, nodes)
} else {
result.push(nodes)
}
}
})
if (this.length > 1) {
result = DomQuery.unique(result)
if (name.indexOf('parents') === 0 || name === 'prevUntil') {
result = result.reverse()
}
}
var wrappedResult = DomQuery(result)
if (filter) {
return wrappedResult.filter(filter)
}
return wrappedResult
}
}
)
DomQueryConstructor.fn.is = function (selector) {
return !!selector && this.filter(selector).length > 0
}
DomQueryConstructor.fn.init.prototype = DomQueryConstructor.fn
DomQueryConstructor.overrideDefaults = function (callback) {
var defaults
var sub = function (selector, context) {
defaults = defaults || callback()
if (arguments.length === 0) {
selector = defaults.element
}
if (!context) {
context = defaults.context
}
return new sub.fn.init(selector, context)
}
DomQuery.extend(sub, this)
return sub
}
DomQueryConstructor.attrHooks = attrHooks
DomQueryConstructor.cssHooks = cssHooks
var DomQuery = DomQueryConstructor
var each$f = Tools.each
var grep$1 = Tools.grep
var isIE = Env.ie
var simpleSelectorRe = /^([a-z0-9],?)+$/i
var setupAttrHooks = function (styles, settings, getContext) {
var keepValues = settings.keep_values
var keepUrlHook = {
set: function ($elm, value, name) {
if (settings.url_converter && value !== null) {
value = settings.url_converter.call(
settings.url_converter_scope || getContext(),
value,
name,
$elm[0]
)
}
$elm.attr('data-mce-' + name, value).attr(name, value)
},
get: function ($elm, name) {
return $elm.attr('data-mce-' + name) || $elm.attr(name)
},
}
var attrHooks = {
style: {
set: function ($elm, value) {
if (value !== null && typeof value === 'object') {
$elm.css(value)
return
}
if (keepValues) {
$elm.attr('data-mce-style', value)
}
if (value !== null && typeof value === 'string') {
$elm.removeAttr('style')
$elm.css(styles.parse(value))
} else {
$elm.attr('style', value)
}
},
get: function ($elm) {
var value = $elm.attr('data-mce-style') || $elm.attr('style')
value = styles.serialize(styles.parse(value), $elm[0].nodeName)
return value
},
},
}
if (keepValues) {
attrHooks.href = attrHooks.src = keepUrlHook
}
return attrHooks
}
var updateInternalStyleAttr = function (styles, $elm) {
var rawValue = $elm.attr('style')
var value = styles.serialize(styles.parse(rawValue), $elm[0].nodeName)
if (!value) {
value = null
}
$elm.attr('data-mce-style', value)
}
var findNodeIndex = function (node, normalized) {
var idx = 0,
lastNodeType,
nodeType
if (node) {
for (
lastNodeType = node.nodeType, node = node.previousSibling;
node;
node = node.previousSibling
) {
nodeType = node.nodeType
if (normalized && nodeType === 3) {
if (nodeType === lastNodeType || !node.nodeValue.length) {
continue
}
}
idx++
lastNodeType = nodeType
}
}
return idx
}
var DOMUtils = function (doc, settings) {
if (settings === void 0) {
settings = {}
}
var addedStyles = {}
var win = window
var files = {}
var counter = 0
var stdMode = true
var boxModel = true
var styleSheetLoader = instance.forElement(SugarElement.fromDom(doc), {
contentCssCors: settings.contentCssCors,
referrerPolicy: settings.referrerPolicy,
})
var boundEvents = []
var schema = settings.schema ? settings.schema : Schema({})
var styles = Styles(
{
url_converter: settings.url_converter,
url_converter_scope: settings.url_converter_scope,
},
settings.schema
)
var events = settings.ownEvents ? new EventUtils() : EventUtils.Event
var blockElementsMap = schema.getBlockElements()
var $ = DomQuery.overrideDefaults(function () {
return {
context: doc,
element: self.getRoot(),
}
})
var isBlock = function (node) {
if (typeof node === 'string') {
return !!blockElementsMap[node]
} else if (node) {
var type = node.nodeType
if (type) {
return !!(type === 1 && blockElementsMap[node.nodeName])
}
}
return false
}
var get = function (elm) {
return elm && doc && isString$1(elm) ? doc.getElementById(elm) : elm
}
var $$ = function (elm) {
return $(typeof elm === 'string' ? get(elm) : elm)
}
var getAttrib = function (elm, name, defaultVal) {
var hook, value
var $elm = $$(elm)
if ($elm.length) {
hook = attrHooks[name]
if (hook && hook.get) {
value = hook.get($elm, name)
} else {
value = $elm.attr(name)
}
}
if (typeof value === 'undefined') {
value = defaultVal || ''
}
return value
}
var getAttribs = function (elm) {
var node = get(elm)
if (!node) {
return []
}
return node.attributes
}
var setAttrib = function (elm, name, value) {
if (value === '') {
value = null
}
var $elm = $$(elm)
var originalValue = $elm.attr(name)
if (!$elm.length) {
return
}
var hook = attrHooks[name]
if (hook && hook.set) {
hook.set($elm, value, name)
} else {
$elm.attr(name, value)
}
if (originalValue !== value && settings.onSetAttrib) {
settings.onSetAttrib({
attrElm: $elm,
attrName: name,
attrValue: value,
})
}
}
var clone = function (node, deep) {
if (!isIE || node.nodeType !== 1 || deep) {
return node.cloneNode(deep)
} else {
var clone_1 = doc.createElement(node.nodeName)
each$f(getAttribs(node), function (attr) {
setAttrib(clone_1, attr.nodeName, getAttrib(node, attr.nodeName))
})
return clone_1
}
}
var getRoot = function () {
return settings.root_element || doc.body
}
var getViewPort = function (argWin) {
var vp = getBounds(argWin)
return {
x: vp.x,
y: vp.y,
w: vp.width,
h: vp.height,
}
}
var getPos$1 = function (elm, rootElm) {
return getPos(doc.body, get(elm), rootElm)
}
var setStyle = function (elm, name, value) {
var $elm = isString$1(name) ? $$(elm).css(name, value) : $$(elm).css(name)
if (settings.update_styles) {
updateInternalStyleAttr(styles, $elm)
}
}
var setStyles = function (elm, stylesArg) {
var $elm = $$(elm).css(stylesArg)
if (settings.update_styles) {
updateInternalStyleAttr(styles, $elm)
}
}
var getStyle = function (elm, name, computed) {
var $elm = $$(elm)
if (computed) {
return $elm.css(name)
}
name = name.replace(/-(\D)/g, function (a, b) {
return b.toUpperCase()
})
if (name === 'float') {
name = Env.browser.isIE() ? 'styleFloat' : 'cssFloat'
}
return $elm[0] && $elm[0].style ? $elm[0].style[name] : undefined
}
var getSize = function (elm) {
var w, h
elm = get(elm)
w = getStyle(elm, 'width')
h = getStyle(elm, 'height')
if (w.indexOf('px') === -1) {
w = 0
}
if (h.indexOf('px') === -1) {
h = 0
}
return {
w: parseInt(w, 10) || elm.offsetWidth || elm.clientWidth,
h: parseInt(h, 10) || elm.offsetHeight || elm.clientHeight,
}
}
var getRect = function (elm) {
elm = get(elm)
var pos = getPos$1(elm)
var size = getSize(elm)
return {
x: pos.x,
y: pos.y,
w: size.w,
h: size.h,
}
}
var is = function (elm, selector) {
var i
if (!elm) {
return false
}
if (!Array.isArray(elm)) {
if (selector === '*') {
return elm.nodeType === 1
}
if (simpleSelectorRe.test(selector)) {
var selectors = selector.toLowerCase().split(/,/)
var elmName = elm.nodeName.toLowerCase()
for (i = selectors.length - 1; i >= 0; i--) {
if (selectors[i] === elmName) {
return true
}
}
return false
}
if (elm.nodeType && elm.nodeType !== 1) {
return false
}
}
var elms = !Array.isArray(elm) ? [elm] : elm
return (
Sizzle(selector, elms[0].ownerDocument || elms[0], null, elms).length >
0
)
}
var getParents = function (elm, selector, root, collect) {
var result = []
var selectorVal
var node = get(elm)
collect = collect === undefined
root =
root || (getRoot().nodeName !== 'BODY' ? getRoot().parentNode : null)
if (Tools.is(selector, 'string')) {
selectorVal = selector
if (selector === '*') {
selector = function (node) {
return node.nodeType === 1
}
} else {
selector = function (node) {
return is(node, selectorVal)
}
}
}
while (node) {
if (
node === root ||
isNullable(node.nodeType) ||
isDocument$1(node) ||
isDocumentFragment(node)
) {
break
}
if (!selector || (typeof selector === 'function' && selector(node))) {
if (collect) {
result.push(node)
} else {
return [node]
}
}
node = node.parentNode
}
return collect ? result : null
}
var getParent = function (node, selector, root) {
var parents = getParents(node, selector, root, false)
return parents && parents.length > 0 ? parents[0] : null
}
var _findSib = function (node, selector, name) {
var func = selector
if (node) {
if (typeof selector === 'string') {
func = function (node) {
return is(node, selector)
}
}
for (node = node[name]; node; node = node[name]) {
if (typeof func === 'function' && func(node)) {
return node
}
}
}
return null
}
var getNext = function (node, selector) {
return _findSib(node, selector, 'nextSibling')
}
var getPrev = function (node, selector) {
return _findSib(node, selector, 'previousSibling')
}
var select = function (selector, scope) {
return Sizzle(selector, get(scope) || settings.root_element || doc, [])
}
var run = function (elm, func, scope) {
var result
var node = typeof elm === 'string' ? get(elm) : elm
if (!node) {
return false
}
if (Tools.isArray(node) && (node.length || node.length === 0)) {
result = []
each$f(node, function (elm, i) {
if (elm) {
result.push(
func.call(scope, typeof elm === 'string' ? get(elm) : elm, i)
)
}
})
return result
}
var context = scope ? scope : this
return func.call(context, node)
}
var setAttribs = function (elm, attrs) {
$$(elm).each(function (i, node) {
each$f(attrs, function (value, name) {
setAttrib(node, name, value)
})
})
}
var setHTML = function (elm, html) {
var $elm = $$(elm)
if (isIE) {
$elm.each(function (i, target) {
if (target.canHaveHTML === false) {
return
}
while (target.firstChild) {
target.removeChild(target.firstChild)
}
try {
target.innerHTML = '
' + html
target.removeChild(target.firstChild)
} catch (ex) {
DomQuery('
')
.html('
' + html)
.contents()
.slice(1)
.appendTo(target)
}
return html
})
} else {
$elm.html(html)
}
}
var add = function (parentElm, name, attrs, html, create) {
return run(parentElm, function (parentElm) {
var newElm = typeof name === 'string' ? doc.createElement(name) : name
setAttribs(newElm, attrs)
if (html) {
if (typeof html !== 'string' && html.nodeType) {
newElm.appendChild(html)
} else if (typeof html === 'string') {
setHTML(newElm, html)
}
}
return !create ? parentElm.appendChild(newElm) : newElm
})
}
var create = function (name, attrs, html) {
return add(doc.createElement(name), name, attrs, html, true)
}
var decode = Entities.decode
var encode = Entities.encodeAllRaw
var createHTML = function (name, attrs, html) {
var outHtml = '',
key
outHtml += '<' + name
for (key in attrs) {
if (hasNonNullableKey(attrs, key)) {
outHtml += ' ' + key + '="' + encode(attrs[key]) + '"'
}
}
if (typeof html !== 'undefined') {
return outHtml + '>' + html + '' + name + '>'
}
return outHtml + ' />'
}
var createFragment = function (html) {
var node
var container = doc.createElement('div')
var frag = doc.createDocumentFragment()
frag.appendChild(container)
if (html) {
container.innerHTML = html
}
while ((node = container.firstChild)) {
frag.appendChild(node)
}
frag.removeChild(container)
return frag
}
var remove = function (node, keepChildren) {
var $node = $$(node)
if (keepChildren) {
$node
.each(function () {
var child
while ((child = this.firstChild)) {
if (child.nodeType === 3 && child.data.length === 0) {
this.removeChild(child)
} else {
this.parentNode.insertBefore(child, this)
}
}
})
.remove()
} else {
$node.remove()
}
return $node.length > 1 ? $node.toArray() : $node[0]
}
var removeAllAttribs = function (e) {
return run(e, function (e) {
var i
var attrs = e.attributes
for (i = attrs.length - 1; i >= 0; i--) {
e.removeAttributeNode(attrs.item(i))
}
})
}
var parseStyle = function (cssText) {
return styles.parse(cssText)
}
var serializeStyle = function (stylesArg, name) {
return styles.serialize(stylesArg, name)
}
var addStyle = function (cssText) {
var head, styleElm
if (self !== DOMUtils.DOM && doc === document) {
if (addedStyles[cssText]) {
return
}
addedStyles[cssText] = true
}
styleElm = doc.getElementById('mceDefaultStyles')
if (!styleElm) {
styleElm = doc.createElement('style')
styleElm.id = 'mceDefaultStyles'
styleElm.type = 'text/css'
head = doc.getElementsByTagName('head')[0]
if (head.firstChild) {
head.insertBefore(styleElm, head.firstChild)
} else {
head.appendChild(styleElm)
}
}
if (styleElm.styleSheet) {
styleElm.styleSheet.cssText += cssText
} else {
styleElm.appendChild(doc.createTextNode(cssText))
}
}
var loadCSS = function (urls) {
if (!urls) {
urls = ''
}
each$k(urls.split(','), function (url) {
files[url] = true
styleSheetLoader.load(url, noop)
})
}
var toggleClass = function (elm, cls, state) {
$$(elm)
.toggleClass(cls, state)
.each(function () {
if (this.className === '') {
DomQuery(this).attr('class', null)
}
})
}
var addClass = function (elm, cls) {
$$(elm).addClass(cls)
}
var removeClass = function (elm, cls) {
toggleClass(elm, cls, false)
}
var hasClass = function (elm, cls) {
return $$(elm).hasClass(cls)
}
var show = function (elm) {
$$(elm).show()
}
var hide = function (elm) {
$$(elm).hide()
}
var isHidden = function (elm) {
return $$(elm).css('display') === 'none'
}
var uniqueId = function (prefix) {
return (!prefix ? 'mce_' : prefix) + counter++
}
var getOuterHTML = function (elm) {
var node = typeof elm === 'string' ? get(elm) : elm
return isElement$5(node)
? node.outerHTML
: DomQuery('').append(DomQuery(node).clone()).html()
}
var setOuterHTML = function (elm, html) {
$$(elm).each(function () {
try {
if ('outerHTML' in this) {
this.outerHTML = html
return
}
} catch (ex) {}
remove(DomQuery(this).html(html), true)
})
}
var insertAfter = function (node, reference) {
var referenceNode = get(reference)
return run(node, function (node) {
var parent = referenceNode.parentNode
var nextSibling = referenceNode.nextSibling
if (nextSibling) {
parent.insertBefore(node, nextSibling)
} else {
parent.appendChild(node)
}
return node
})
}
var replace = function (newElm, oldElm, keepChildren) {
return run(oldElm, function (oldElm) {
if (Tools.is(oldElm, 'array')) {
newElm = newElm.cloneNode(true)
}
if (keepChildren) {
each$f(grep$1(oldElm.childNodes), function (node) {
newElm.appendChild(node)
})
}
return oldElm.parentNode.replaceChild(newElm, oldElm)
})
}
var rename = function (elm, name) {
var newElm
if (elm.nodeName !== name.toUpperCase()) {
newElm = create(name)
each$f(getAttribs(elm), function (attrNode) {
setAttrib(
newElm,
attrNode.nodeName,
getAttrib(elm, attrNode.nodeName)
)
})
replace(newElm, elm, true)
}
return newElm || elm
}
var findCommonAncestor = function (a, b) {
var ps = a,
pe
while (ps) {
pe = b
while (pe && ps !== pe) {
pe = pe.parentNode
}
if (ps === pe) {
break
}
ps = ps.parentNode
}
if (!ps && a.ownerDocument) {
return a.ownerDocument.documentElement
}
return ps
}
var toHex = function (rgbVal) {
return styles.toHex(Tools.trim(rgbVal))
}
var isNonEmptyElement = function (node) {
if (isElement$5(node)) {
var isNamedAnchor =
node.nodeName.toLowerCase() === 'a' &&
!getAttrib(node, 'href') &&
getAttrib(node, 'id')
if (
getAttrib(node, 'name') ||
getAttrib(node, 'data-mce-bookmark') ||
isNamedAnchor
) {
return true
}
}
return false
}
var isEmpty = function (node, elements) {
var type,
name,
brCount = 0
if (isNonEmptyElement(node)) {
return false
}
node = node.firstChild
if (node) {
var walker = new DomTreeWalker(node, node.parentNode)
var whitespace = schema ? schema.getWhiteSpaceElements() : {}
elements = elements || (schema ? schema.getNonEmptyElements() : null)
do {
type = node.nodeType
if (isElement$5(node)) {
var bogusVal = node.getAttribute('data-mce-bogus')
if (bogusVal) {
node = walker.next(bogusVal === 'all')
continue
}
name = node.nodeName.toLowerCase()
if (elements && elements[name]) {
if (name === 'br') {
brCount++
node = walker.next()
continue
}
return false
}
if (isNonEmptyElement(node)) {
return false
}
}
if (type === 8) {
return false
}
if (type === 3 && !isWhitespaceText(node.nodeValue)) {
return false
}
if (
type === 3 &&
node.parentNode &&
whitespace[node.parentNode.nodeName] &&
isWhitespaceText(node.nodeValue)
) {
return false
}
node = walker.next()
} while (node)
}
return brCount <= 1
}
var createRng = function () {
return doc.createRange()
}
var split = function (parentElm, splitElm, replacementElm) {
var range = createRng()
var beforeFragment
var afterFragment
var parentNode
if (parentElm && splitElm) {
range.setStart(parentElm.parentNode, findNodeIndex(parentElm))
range.setEnd(splitElm.parentNode, findNodeIndex(splitElm))
beforeFragment = range.extractContents()
range = createRng()
range.setStart(splitElm.parentNode, findNodeIndex(splitElm) + 1)
range.setEnd(parentElm.parentNode, findNodeIndex(parentElm) + 1)
afterFragment = range.extractContents()
parentNode = parentElm.parentNode
parentNode.insertBefore(trimNode(self, beforeFragment), parentElm)
if (replacementElm) {
parentNode.insertBefore(replacementElm, parentElm)
} else {
parentNode.insertBefore(splitElm, parentElm)
}
parentNode.insertBefore(trimNode(self, afterFragment), parentElm)
remove(parentElm)
return replacementElm || splitElm
}
}
var bind = function (target, name, func, scope) {
if (Tools.isArray(target)) {
var i = target.length
var rv = []
while (i--) {
rv[i] = bind(target[i], name, func, scope)
}
return rv
}
if (settings.collect && (target === doc || target === win)) {
boundEvents.push([target, name, func, scope])
}
var output = events.bind(target, name, func, scope || self)
return output
}
var unbind = function (target, name, func) {
if (Tools.isArray(target)) {
var i = target.length
var rv = []
while (i--) {
rv[i] = unbind(target[i], name, func)
}
return rv
} else {
if (boundEvents.length > 0 && (target === doc || target === win)) {
var i = boundEvents.length
while (i--) {
var item = boundEvents[i]
if (
target === item[0] &&
(!name || name === item[1]) &&
(!func || func === item[2])
) {
events.unbind(item[0], item[1], item[2])
}
}
}
return events.unbind(target, name, func)
}
}
var fire = function (target, name, evt) {
return events.fire(target, name, evt)
}
var getContentEditable = function (node) {
if (node && isElement$5(node)) {
var contentEditable = node.getAttribute('data-mce-contenteditable')
if (contentEditable && contentEditable !== 'inherit') {
return contentEditable
}
return node.contentEditable !== 'inherit' ? node.contentEditable : null
} else {
return null
}
}
var getContentEditableParent = function (node) {
var root = getRoot()
var state = null
for (; node && node !== root; node = node.parentNode) {
state = getContentEditable(node)
if (state !== null) {
break
}
}
return state
}
var destroy = function () {
if (boundEvents.length > 0) {
var i = boundEvents.length
while (i--) {
var item = boundEvents[i]
events.unbind(item[0], item[1], item[2])
}
}
each$j(files, function (_, url) {
styleSheetLoader.unload(url)
delete files[url]
})
if (Sizzle.setDocument) {
Sizzle.setDocument()
}
}
var isChildOf = function (node, parent) {
if (!isIE) {
return node === parent || parent.contains(node)
} else {
while (node) {
if (parent === node) {
return true
}
node = node.parentNode
}
return false
}
}
var dumpRng = function (r) {
return (
'startContainer: ' +
r.startContainer.nodeName +
', startOffset: ' +
r.startOffset +
', endContainer: ' +
r.endContainer.nodeName +
', endOffset: ' +
r.endOffset
)
}
var self = {
doc: doc,
settings: settings,
win: win,
files: files,
stdMode: stdMode,
boxModel: boxModel,
styleSheetLoader: styleSheetLoader,
boundEvents: boundEvents,
styles: styles,
schema: schema,
events: events,
isBlock: isBlock,
$: $,
$$: $$,
root: null,
clone: clone,
getRoot: getRoot,
getViewPort: getViewPort,
getRect: getRect,
getSize: getSize,
getParent: getParent,
getParents: getParents,
get: get,
getNext: getNext,
getPrev: getPrev,
select: select,
is: is,
add: add,
create: create,
createHTML: createHTML,
createFragment: createFragment,
remove: remove,
setStyle: setStyle,
getStyle: getStyle,
setStyles: setStyles,
removeAllAttribs: removeAllAttribs,
setAttrib: setAttrib,
setAttribs: setAttribs,
getAttrib: getAttrib,
getPos: getPos$1,
parseStyle: parseStyle,
serializeStyle: serializeStyle,
addStyle: addStyle,
loadCSS: loadCSS,
addClass: addClass,
removeClass: removeClass,
hasClass: hasClass,
toggleClass: toggleClass,
show: show,
hide: hide,
isHidden: isHidden,
uniqueId: uniqueId,
setHTML: setHTML,
getOuterHTML: getOuterHTML,
setOuterHTML: setOuterHTML,
decode: decode,
encode: encode,
insertAfter: insertAfter,
replace: replace,
rename: rename,
findCommonAncestor: findCommonAncestor,
toHex: toHex,
run: run,
getAttribs: getAttribs,
isEmpty: isEmpty,
createRng: createRng,
nodeIndex: findNodeIndex,
split: split,
bind: bind,
unbind: unbind,
fire: fire,
getContentEditable: getContentEditable,
getContentEditableParent: getContentEditableParent,
destroy: destroy,
isChildOf: isChildOf,
dumpRng: dumpRng,
}
var attrHooks = setupAttrHooks(styles, settings, constant(self))
return self
}
DOMUtils.DOM = DOMUtils(document)
DOMUtils.nodeIndex = findNodeIndex
var DOM$a = DOMUtils.DOM
var each$e = Tools.each,
grep = Tools.grep
var QUEUED = 0
var LOADING = 1
var LOADED = 2
var FAILED = 3
var ScriptLoader = (function () {
function ScriptLoader(settings) {
if (settings === void 0) {
settings = {}
}
this.states = {}
this.queue = []
this.scriptLoadedCallbacks = {}
this.queueLoadedCallbacks = []
this.loading = 0
this.settings = settings
}
ScriptLoader.prototype._setReferrerPolicy = function (referrerPolicy) {
this.settings.referrerPolicy = referrerPolicy
}
ScriptLoader.prototype.loadScript = function (url, success, failure) {
var dom = DOM$a
var elm
var cleanup = function () {
dom.remove(id)
if (elm) {
elm.onerror = elm.onload = elm = null
}
}
var done = function () {
cleanup()
success()
}
var error = function () {
cleanup()
if (isFunction(failure)) {
failure()
} else {
if (typeof console !== 'undefined' && console.log) {
console.log('Failed to load script: ' + url)
}
}
}
var id = dom.uniqueId()
elm = document.createElement('script')
elm.id = id
elm.type = 'text/javascript'
elm.src = Tools._addCacheSuffix(url)
if (this.settings.referrerPolicy) {
dom.setAttrib(elm, 'referrerpolicy', this.settings.referrerPolicy)
}
elm.onload = done
elm.onerror = error
;(document.getElementsByTagName('head')[0] || document.body).appendChild(
elm
)
}
ScriptLoader.prototype.isDone = function (url) {
return this.states[url] === LOADED
}
ScriptLoader.prototype.markDone = function (url) {
this.states[url] = LOADED
}
ScriptLoader.prototype.add = function (url, success, scope, failure) {
var state = this.states[url]
this.queue.push(url)
if (state === undefined) {
this.states[url] = QUEUED
}
if (success) {
if (!this.scriptLoadedCallbacks[url]) {
this.scriptLoadedCallbacks[url] = []
}
this.scriptLoadedCallbacks[url].push({
success: success,
failure: failure,
scope: scope || this,
})
}
}
ScriptLoader.prototype.load = function (url, success, scope, failure) {
return this.add(url, success, scope, failure)
}
ScriptLoader.prototype.remove = function (url) {
delete this.states[url]
delete this.scriptLoadedCallbacks[url]
}
ScriptLoader.prototype.loadQueue = function (success, scope, failure) {
this.loadScripts(this.queue, success, scope, failure)
}
ScriptLoader.prototype.loadScripts = function (
scripts,
success,
scope,
failure
) {
var self = this
var failures = []
var execCallbacks = function (name, url) {
each$e(self.scriptLoadedCallbacks[url], function (callback) {
if (isFunction(callback[name])) {
callback[name].call(callback.scope)
}
})
self.scriptLoadedCallbacks[url] = undefined
}
self.queueLoadedCallbacks.push({
success: success,
failure: failure,
scope: scope || this,
})
var loadScripts = function () {
var loadingScripts = grep(scripts)
scripts.length = 0
each$e(loadingScripts, function (url) {
if (self.states[url] === LOADED) {
execCallbacks('success', url)
return
}
if (self.states[url] === FAILED) {
execCallbacks('failure', url)
return
}
if (self.states[url] !== LOADING) {
self.states[url] = LOADING
self.loading++
self.loadScript(
url,
function () {
self.states[url] = LOADED
self.loading--
execCallbacks('success', url)
loadScripts()
},
function () {
self.states[url] = FAILED
self.loading--
failures.push(url)
execCallbacks('failure', url)
loadScripts()
}
)
}
})
if (!self.loading) {
var notifyCallbacks = self.queueLoadedCallbacks.slice(0)
self.queueLoadedCallbacks.length = 0
each$e(notifyCallbacks, function (callback) {
if (failures.length === 0) {
if (isFunction(callback.success)) {
callback.success.call(callback.scope)
}
} else {
if (isFunction(callback.failure)) {
callback.failure.call(callback.scope, failures)
}
}
})
}
}
loadScripts()
}
ScriptLoader.ScriptLoader = new ScriptLoader()
return ScriptLoader
})()
var Cell = function (initial) {
var value = initial
var get = function () {
return value
}
var set = function (v) {
value = v
}
return {
get: get,
set: set,
}
}
var isRaw = function (str) {
return isObject(str) && has$2(str, 'raw')
}
var isTokenised = function (str) {
return isArray$1(str) && str.length > 1
}
var data = {}
var currentCode = Cell('en')
var getLanguageData = function () {
return get$9(data, currentCode.get())
}
var getData = function () {
return map$2(data, function (value) {
return __assign({}, value)
})
}
var setCode = function (newCode) {
if (newCode) {
currentCode.set(newCode)
}
}
var getCode = function () {
return currentCode.get()
}
var add$4 = function (code, items) {
var langData = data[code]
if (!langData) {
data[code] = langData = {}
}
each$j(items, function (translation, name) {
langData[name.toLowerCase()] = translation
})
}
var translate = function (text) {
var langData = getLanguageData().getOr({})
var toString = function (obj) {
if (isFunction(obj)) {
return Object.prototype.toString.call(obj)
}
return !isEmpty(obj) ? '' + obj : ''
}
var isEmpty = function (text) {
return text === '' || text === null || text === undefined
}
var getLangData = function (text) {
var textstr = toString(text)
return get$9(langData, textstr.toLowerCase()).map(toString).getOr(textstr)
}
var removeContext = function (str) {
return str.replace(/{context:\w+}$/, '')
}
if (isEmpty(text)) {
return ''
}
if (isRaw(text)) {
return toString(text.raw)
}
if (isTokenised(text)) {
var values_1 = text.slice(1)
var substitued = getLangData(text[0]).replace(
/\{([0-9]+)\}/g,
function ($1, $2) {
return has$2(values_1, $2) ? toString(values_1[$2]) : $1
}
)
return removeContext(substitued)
}
return removeContext(getLangData(text))
}
var isRtl$1 = function () {
return getLanguageData()
.bind(function (items) {
return get$9(items, '_dir')
})
.exists(function (dir) {
return dir === 'rtl'
})
}
var hasCode = function (code) {
return has$2(data, code)
}
var I18n = {
getData: getData,
setCode: setCode,
getCode: getCode,
add: add$4,
translate: translate,
isRtl: isRtl$1,
hasCode: hasCode,
}
var AddOnManager = function () {
var items = []
var urls = {}
var lookup = {}
var _listeners = []
var runListeners = function (name, state) {
var matchedListeners = filter$4(_listeners, function (listener) {
return listener.name === name && listener.state === state
})
each$k(matchedListeners, function (listener) {
return listener.callback()
})
}
var get = function (name) {
if (lookup[name]) {
return lookup[name].instance
}
return undefined
}
var dependencies = function (name) {
var result
if (lookup[name]) {
result = lookup[name].dependencies
}
return result || []
}
var requireLangPack = function (name, languages) {
if (AddOnManager.languageLoad !== false) {
waitFor(
name,
function () {
var language = I18n.getCode()
var wrappedLanguages = ',' + (languages || '') + ','
if (
!language ||
(languages &&
wrappedLanguages.indexOf(',' + language + ',') === -1)
) {
return
}
ScriptLoader.ScriptLoader.add(
urls[name] + '/langs/' + language + '.js'
)
},
'loaded'
)
}
}
var add = function (id, addOn, dependencies) {
var addOnConstructor = addOn
items.push(addOnConstructor)
lookup[id] = {
instance: addOnConstructor,
dependencies: dependencies,
}
runListeners(id, 'added')
return addOnConstructor
}
var remove = function (name) {
delete urls[name]
delete lookup[name]
}
var createUrl = function (baseUrl, dep) {
if (typeof dep === 'object') {
return dep
}
return typeof baseUrl === 'string'
? {
prefix: '',
resource: dep,
suffix: '',
}
: {
prefix: baseUrl.prefix,
resource: dep,
suffix: baseUrl.suffix,
}
}
var addComponents = function (pluginName, scripts) {
var pluginUrl = urls[pluginName]
each$k(scripts, function (script) {
ScriptLoader.ScriptLoader.add(pluginUrl + '/' + script)
})
}
var loadDependencies = function (name, addOnUrl, success, scope) {
var deps = dependencies(name)
each$k(deps, function (dep) {
var newUrl = createUrl(addOnUrl, dep)
load(newUrl.resource, newUrl, undefined, undefined)
})
if (success) {
if (scope) {
success.call(scope)
} else {
success.call(ScriptLoader)
}
}
}
var load = function (name, addOnUrl, success, scope, failure) {
if (urls[name]) {
return
}
var urlString =
typeof addOnUrl === 'string'
? addOnUrl
: addOnUrl.prefix + addOnUrl.resource + addOnUrl.suffix
if (urlString.indexOf('/') !== 0 && urlString.indexOf('://') === -1) {
urlString = AddOnManager.baseURL + '/' + urlString
}
urls[name] = urlString.substring(0, urlString.lastIndexOf('/'))
var done = function () {
runListeners(name, 'loaded')
loadDependencies(name, addOnUrl, success, scope)
}
if (lookup[name]) {
done()
} else {
ScriptLoader.ScriptLoader.add(urlString, done, scope, failure)
}
}
var waitFor = function (name, callback, state) {
if (state === void 0) {
state = 'added'
}
if (has$2(lookup, name) && state === 'added') {
callback()
} else if (has$2(urls, name) && state === 'loaded') {
callback()
} else {
_listeners.push({
name: name,
state: state,
callback: callback,
})
}
}
return {
items: items,
urls: urls,
lookup: lookup,
_listeners: _listeners,
get: get,
dependencies: dependencies,
requireLangPack: requireLangPack,
add: add,
remove: remove,
createUrl: createUrl,
addComponents: addComponents,
load: load,
waitFor: waitFor,
}
}
AddOnManager.languageLoad = true
AddOnManager.baseURL = ''
AddOnManager.PluginManager = AddOnManager()
AddOnManager.ThemeManager = AddOnManager()
var singleton = function (doRevoke) {
var subject = Cell(Optional.none())
var revoke = function () {
return subject.get().each(doRevoke)
}
var clear = function () {
revoke()
subject.set(Optional.none())
}
var isSet = function () {
return subject.get().isSome()
}
var get = function () {
return subject.get()
}
var set = function (s) {
revoke()
subject.set(Optional.some(s))
}
return {
clear: clear,
isSet: isSet,
get: get,
set: set,
}
}
var value = function () {
var subject = singleton(noop)
var on = function (f) {
return subject.get().each(f)
}
return __assign(__assign({}, subject), { on: on })
}
var first = function (fn, rate) {
var timer = null
var cancel = function () {
if (!isNull(timer)) {
clearTimeout(timer)
timer = null
}
}
var throttle = function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
if (isNull(timer)) {
timer = setTimeout(function () {
timer = null
fn.apply(null, args)
}, rate)
}
}
return {
cancel: cancel,
throttle: throttle,
}
}
var last = function (fn, rate) {
var timer = null
var cancel = function () {
if (!isNull(timer)) {
clearTimeout(timer)
timer = null
}
}
var throttle = function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
cancel()
timer = setTimeout(function () {
timer = null
fn.apply(null, args)
}, rate)
}
return {
cancel: cancel,
throttle: throttle,
}
}
var read$4 = function (element, attr) {
var value = get$6(element, attr)
return value === undefined || value === '' ? [] : value.split(' ')
}
var add$3 = function (element, attr, id) {
var old = read$4(element, attr)
var nu = old.concat([id])
set$1(element, attr, nu.join(' '))
return true
}
var remove$5 = function (element, attr, id) {
var nu = filter$4(read$4(element, attr), function (v) {
return v !== id
})
if (nu.length > 0) {
set$1(element, attr, nu.join(' '))
} else {
remove$6(element, attr)
}
return false
}
var supports = function (element) {
return element.dom.classList !== undefined
}
var get$4 = function (element) {
return read$4(element, 'class')
}
var add$2 = function (element, clazz) {
return add$3(element, 'class', clazz)
}
var remove$4 = function (element, clazz) {
return remove$5(element, 'class', clazz)
}
var add$1 = function (element, clazz) {
if (supports(element)) {
element.dom.classList.add(clazz)
} else {
add$2(element, clazz)
}
}
var cleanClass = function (element) {
var classList = supports(element) ? element.dom.classList : get$4(element)
if (classList.length === 0) {
remove$6(element, 'class')
}
}
var remove$3 = function (element, clazz) {
if (supports(element)) {
var classList = element.dom.classList
classList.remove(clazz)
} else {
remove$4(element, clazz)
}
cleanClass(element)
}
var has = function (element, clazz) {
return supports(element) && element.dom.classList.contains(clazz)
}
var descendants$1 = function (scope, predicate) {
var result = []
each$k(children(scope), function (x) {
if (predicate(x)) {
result = result.concat([x])
}
result = result.concat(descendants$1(x, predicate))
})
return result
}
var descendants = function (scope, selector) {
return all(selector, scope)
}
var annotation = constant('mce-annotation')
var dataAnnotation = constant('data-mce-annotation')
var dataAnnotationId = constant('data-mce-annotation-uid')
var identify = function (editor, annotationName) {
var rng = editor.selection.getRng()
var start = SugarElement.fromDom(rng.startContainer)
var root = SugarElement.fromDom(editor.getBody())
var selector = annotationName.fold(
function () {
return '.' + annotation()
},
function (an) {
return '[' + dataAnnotation() + '="' + an + '"]'
}
)
var newStart = child$1(start, rng.startOffset).getOr(start)
var closest = closest$2(newStart, selector, function (n) {
return eq(n, root)
})
var getAttr = function (c, property) {
if (has$1(c, property)) {
return Optional.some(get$6(c, property))
} else {
return Optional.none()
}
}
return closest.bind(function (c) {
return getAttr(c, '' + dataAnnotationId()).bind(function (uid) {
return getAttr(c, '' + dataAnnotation()).map(function (name) {
var elements = findMarkers(editor, uid)
return {
uid: uid,
name: name,
elements: elements,
}
})
})
})
}
var isAnnotation = function (elem) {
return isElement$6(elem) && has(elem, annotation())
}
var findMarkers = function (editor, uid) {
var body = SugarElement.fromDom(editor.getBody())
return descendants(body, '[' + dataAnnotationId() + '="' + uid + '"]')
}
var findAll = function (editor, name) {
var body = SugarElement.fromDom(editor.getBody())
var markers = descendants(body, '[' + dataAnnotation() + '="' + name + '"]')
var directory = {}
each$k(markers, function (m) {
var uid = get$6(m, dataAnnotationId())
var nodesAlready = get$9(directory, uid).getOr([])
directory[uid] = nodesAlready.concat([m])
})
return directory
}
var setup$n = function (editor, _registry) {
var changeCallbacks = Cell({})
var initData = function () {
return {
listeners: [],
previous: value(),
}
}
var withCallbacks = function (name, f) {
updateCallbacks(name, function (data) {
f(data)
return data
})
}
var updateCallbacks = function (name, f) {
var callbackMap = changeCallbacks.get()
var data = get$9(callbackMap, name).getOrThunk(initData)
var outputData = f(data)
callbackMap[name] = outputData
changeCallbacks.set(callbackMap)
}
var fireCallbacks = function (name, uid, elements) {
withCallbacks(name, function (data) {
each$k(data.listeners, function (f) {
return f(true, name, {
uid: uid,
nodes: map$3(elements, function (elem) {
return elem.dom
}),
})
})
})
}
var fireNoAnnotation = function (name) {
withCallbacks(name, function (data) {
each$k(data.listeners, function (f) {
return f(false, name)
})
})
}
var onNodeChange = last(function () {
var callbackMap = changeCallbacks.get()
var annotations = sort(keys(callbackMap))
each$k(annotations, function (name) {
updateCallbacks(name, function (data) {
var prev = data.previous.get()
identify(editor, Optional.some(name)).fold(
function () {
if (prev.isSome()) {
fireNoAnnotation(name)
data.previous.clear()
}
},
function (_a) {
var uid = _a.uid,
name = _a.name,
elements = _a.elements
if (!is$1(prev, uid)) {
fireCallbacks(name, uid, elements)
data.previous.set(uid)
}
}
)
return {
previous: data.previous,
listeners: data.listeners,
}
})
})
}, 30)
editor.on('remove', function () {
onNodeChange.cancel()
})
editor.on('NodeChange', function () {
onNodeChange.throttle()
})
var addListener = function (name, f) {
updateCallbacks(name, function (data) {
return {
previous: data.previous,
listeners: data.listeners.concat([f]),
}
})
}
return { addListener: addListener }
}
var setup$m = function (editor, registry) {
var identifyParserNode = function (span) {
return Optional.from(span.attr(dataAnnotation())).bind(registry.lookup)
}
editor.on('init', function () {
editor.serializer.addNodeFilter('span', function (spans) {
each$k(spans, function (span) {
identifyParserNode(span).each(function (settings) {
if (settings.persistent === false) {
span.unwrap()
}
})
})
})
})
}
var create$7 = function () {
var annotations = {}
var register = function (name, settings) {
annotations[name] = {
name: name,
settings: settings,
}
}
var lookup = function (name) {
return get$9(annotations, name).map(function (a) {
return a.settings
})
}
return {
register: register,
lookup: lookup,
}
}
var unique = 0
var generate = function (prefix) {
var date = new Date()
var time = date.getTime()
var random = Math.floor(Math.random() * 1000000000)
unique++
return prefix + '_' + random + unique + String(time)
}
var add = function (element, classes) {
each$k(classes, function (x) {
add$1(element, x)
})
}
var fromHtml = function (html, scope) {
var doc = scope || document
var div = doc.createElement('div')
div.innerHTML = html
return children(SugarElement.fromDom(div))
}
var fromDom$1 = function (nodes) {
return map$3(nodes, SugarElement.fromDom)
}
var get$3 = function (element) {
return element.dom.innerHTML
}
var set = function (element, content) {
var owner = owner$1(element)
var docDom = owner.dom
var fragment = SugarElement.fromDom(docDom.createDocumentFragment())
var contentElements = fromHtml(content, docDom)
append(fragment, contentElements)
empty(element)
append$1(element, fragment)
}
var clone$1 = function (original, isDeep) {
return SugarElement.fromDom(original.dom.cloneNode(isDeep))
}
var shallow = function (original) {
return clone$1(original, false)
}
var deep$1 = function (original) {
return clone$1(original, true)
}
var TextWalker = function (startNode, rootNode, isBoundary) {
if (isBoundary === void 0) {
isBoundary = never
}
var walker = new DomTreeWalker(startNode, rootNode)
var walk = function (direction) {
var next
do {
next = walker[direction]()
} while (next && !isText$7(next) && !isBoundary(next))
return Optional.from(next).filter(isText$7)
}
return {
current: function () {
return Optional.from(walker.current()).filter(isText$7)
},
next: function () {
return walk('next')
},
prev: function () {
return walk('prev')
},
prev2: function () {
return walk('prev2')
},
}
}
var TextSeeker = function (dom, isBoundary) {
var isBlockBoundary = isBoundary
? isBoundary
: function (node) {
return (
dom.isBlock(node) || isBr$5(node) || isContentEditableFalse$b(node)
)
}
var walk = function (node, offset, walker, process) {
if (isText$7(node)) {
var newOffset = process(node, offset, node.data)
if (newOffset !== -1) {
return Optional.some({
container: node,
offset: newOffset,
})
}
}
return walker().bind(function (next) {
return walk(next.container, next.offset, walker, process)
})
}
var backwards = function (node, offset, process, root) {
var walker = TextWalker(node, root, isBlockBoundary)
return walk(
node,
offset,
function () {
return walker.prev().map(function (prev) {
return {
container: prev,
offset: prev.length,
}
})
},
process
).getOrNull()
}
var forwards = function (node, offset, process, root) {
var walker = TextWalker(node, root, isBlockBoundary)
return walk(
node,
offset,
function () {
return walker.next().map(function (next) {
return {
container: next,
offset: 0,
}
})
},
process
).getOrNull()
}
return {
backwards: backwards,
forwards: forwards,
}
}
var round$2 = Math.round
var clone = function (rect) {
if (!rect) {
return {
left: 0,
top: 0,
bottom: 0,
right: 0,
width: 0,
height: 0,
}
}
return {
left: round$2(rect.left),
top: round$2(rect.top),
bottom: round$2(rect.bottom),
right: round$2(rect.right),
width: round$2(rect.width),
height: round$2(rect.height),
}
}
var collapse = function (rect, toStart) {
rect = clone(rect)
if (toStart) {
rect.right = rect.left
} else {
rect.left = rect.left + rect.width
rect.right = rect.left
}
rect.width = 0
return rect
}
var isEqual = function (rect1, rect2) {
return (
rect1.left === rect2.left &&
rect1.top === rect2.top &&
rect1.bottom === rect2.bottom &&
rect1.right === rect2.right
)
}
var isValidOverflow = function (overflowY, rect1, rect2) {
return (
overflowY >= 0 && overflowY <= Math.min(rect1.height, rect2.height) / 2
)
}
var isAbove$1 = function (rect1, rect2) {
var halfHeight = Math.min(rect2.height / 2, rect1.height / 2)
if (rect1.bottom - halfHeight < rect2.top) {
return true
}
if (rect1.top > rect2.bottom) {
return false
}
return isValidOverflow(rect2.top - rect1.bottom, rect1, rect2)
}
var isBelow$1 = function (rect1, rect2) {
if (rect1.top > rect2.bottom) {
return true
}
if (rect1.bottom < rect2.top) {
return false
}
return isValidOverflow(rect2.bottom - rect1.top, rect1, rect2)
}
var containsXY = function (rect, clientX, clientY) {
return (
clientX >= rect.left &&
clientX <= rect.right &&
clientY >= rect.top &&
clientY <= rect.bottom
)
}
var clamp$2 = function (value, min, max) {
return Math.min(Math.max(value, min), max)
}
var getSelectedNode = function (range) {
var startContainer = range.startContainer,
startOffset = range.startOffset
if (startContainer.hasChildNodes() && range.endOffset === startOffset + 1) {
return startContainer.childNodes[startOffset]
}
return null
}
var getNode$1 = function (container, offset) {
if (isElement$5(container) && container.hasChildNodes()) {
var childNodes = container.childNodes
var safeOffset = clamp$2(offset, 0, childNodes.length - 1)
return childNodes[safeOffset]
} else {
return container
}
}
var getNodeUnsafe = function (container, offset) {
if (offset < 0 && isElement$5(container) && container.hasChildNodes()) {
return undefined
} else {
return getNode$1(container, offset)
}
}
var extendingChars = new RegExp(
'[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a' +
'\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0' +
'\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e3-\u0902\u093a\u093c' +
'\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3' +
'\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc' +
'\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57' +
'\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56' +
'\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44' +
'\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9' +
'\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97' +
'\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074' +
'\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5' +
'\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18' +
'\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1ABE\u1b00-\u1b03\u1b34' +
'\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9' +
'\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9' +
'\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20DD-\u20E0\u20e1\u20E2-\u20E4\u20e5-\u20f0\u2cef-\u2cf1' +
'\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\uA670-\uA672\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1' +
'\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc' +
'\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1' +
'\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\uff9e-\uff9f]'
)
var isExtendingChar = function (ch) {
return (
typeof ch === 'string' &&
ch.charCodeAt(0) >= 768 &&
extendingChars.test(ch)
)
}
var or = function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
return function (x) {
for (var i = 0; i < args.length; i++) {
if (args[i](x)) {
return true
}
}
return false
}
}
var and = function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
return function (x) {
for (var i = 0; i < args.length; i++) {
if (!args[i](x)) {
return false
}
}
return true
}
}
var isElement$3 = isElement$5
var isCaretCandidate$2 = isCaretCandidate$3
var isBlock$1 = matchStyleValues('display', 'block table')
var isFloated = matchStyleValues('float', 'left right')
var isValidElementCaretCandidate = and(
isElement$3,
isCaretCandidate$2,
not(isFloated)
)
var isNotPre = not(matchStyleValues('white-space', 'pre pre-line pre-wrap'))
var isText$4 = isText$7
var isBr$2 = isBr$5
var nodeIndex$1 = DOMUtils.nodeIndex
var resolveIndex$1 = getNodeUnsafe
var createRange$1 = function (doc) {
return 'createRange' in doc ? doc.createRange() : DOMUtils.DOM.createRng()
}
var isWhiteSpace$1 = function (chr) {
return chr && /[\r\n\t ]/.test(chr)
}
var isRange = function (rng) {
return !!rng.setStart && !!rng.setEnd
}
var isHiddenWhiteSpaceRange = function (range) {
var container = range.startContainer
var offset = range.startOffset
if (
isWhiteSpace$1(range.toString()) &&
isNotPre(container.parentNode) &&
isText$7(container)
) {
var text = container.data
if (
isWhiteSpace$1(text[offset - 1]) ||
isWhiteSpace$1(text[offset + 1])
) {
return true
}
}
return false
}
var getBrClientRect = function (brNode) {
var doc = brNode.ownerDocument
var rng = createRange$1(doc)
var nbsp$1 = doc.createTextNode(nbsp)
var parentNode = brNode.parentNode
parentNode.insertBefore(nbsp$1, brNode)
rng.setStart(nbsp$1, 0)
rng.setEnd(nbsp$1, 1)
var clientRect = clone(rng.getBoundingClientRect())
parentNode.removeChild(nbsp$1)
return clientRect
}
var getBoundingClientRectWebKitText = function (rng) {
var sc = rng.startContainer
var ec = rng.endContainer
var so = rng.startOffset
var eo = rng.endOffset
if (sc === ec && isText$7(ec) && so === 0 && eo === 1) {
var newRng = rng.cloneRange()
newRng.setEndAfter(ec)
return getBoundingClientRect$1(newRng)
} else {
return null
}
}
var isZeroRect = function (r) {
return r.left === 0 && r.right === 0 && r.top === 0 && r.bottom === 0
}
var getBoundingClientRect$1 = function (item) {
var clientRect
var clientRects = item.getClientRects()
if (clientRects.length > 0) {
clientRect = clone(clientRects[0])
} else {
clientRect = clone(item.getBoundingClientRect())
}
if (!isRange(item) && isBr$2(item) && isZeroRect(clientRect)) {
return getBrClientRect(item)
}
if (isZeroRect(clientRect) && isRange(item)) {
return getBoundingClientRectWebKitText(item)
}
return clientRect
}
var collapseAndInflateWidth = function (clientRect, toStart) {
var newClientRect = collapse(clientRect, toStart)
newClientRect.width = 1
newClientRect.right = newClientRect.left + 1
return newClientRect
}
var getCaretPositionClientRects = function (caretPosition) {
var clientRects = []
var addUniqueAndValidRect = function (clientRect) {
if (clientRect.height === 0) {
return
}
if (clientRects.length > 0) {
if (isEqual(clientRect, clientRects[clientRects.length - 1])) {
return
}
}
clientRects.push(clientRect)
}
var addCharacterOffset = function (container, offset) {
var range = createRange$1(container.ownerDocument)
if (offset < container.data.length) {
if (isExtendingChar(container.data[offset])) {
return clientRects
}
if (isExtendingChar(container.data[offset - 1])) {
range.setStart(container, offset)
range.setEnd(container, offset + 1)
if (!isHiddenWhiteSpaceRange(range)) {
addUniqueAndValidRect(
collapseAndInflateWidth(getBoundingClientRect$1(range), false)
)
return clientRects
}
}
}
if (offset > 0) {
range.setStart(container, offset - 1)
range.setEnd(container, offset)
if (!isHiddenWhiteSpaceRange(range)) {
addUniqueAndValidRect(
collapseAndInflateWidth(getBoundingClientRect$1(range), false)
)
}
}
if (offset < container.data.length) {
range.setStart(container, offset)
range.setEnd(container, offset + 1)
if (!isHiddenWhiteSpaceRange(range)) {
addUniqueAndValidRect(
collapseAndInflateWidth(getBoundingClientRect$1(range), true)
)
}
}
}
var container = caretPosition.container()
var offset = caretPosition.offset()
if (isText$4(container)) {
addCharacterOffset(container, offset)
return clientRects
}
if (isElement$3(container)) {
if (caretPosition.isAtEnd()) {
var node = resolveIndex$1(container, offset)
if (isText$4(node)) {
addCharacterOffset(node, node.data.length)
}
if (isValidElementCaretCandidate(node) && !isBr$2(node)) {
addUniqueAndValidRect(
collapseAndInflateWidth(getBoundingClientRect$1(node), false)
)
}
} else {
var node = resolveIndex$1(container, offset)
if (isText$4(node)) {
addCharacterOffset(node, 0)
}
if (isValidElementCaretCandidate(node) && caretPosition.isAtEnd()) {
addUniqueAndValidRect(
collapseAndInflateWidth(getBoundingClientRect$1(node), false)
)
return clientRects
}
var beforeNode = resolveIndex$1(
caretPosition.container(),
caretPosition.offset() - 1
)
if (isValidElementCaretCandidate(beforeNode) && !isBr$2(beforeNode)) {
if (
isBlock$1(beforeNode) ||
isBlock$1(node) ||
!isValidElementCaretCandidate(node)
) {
addUniqueAndValidRect(
collapseAndInflateWidth(
getBoundingClientRect$1(beforeNode),
false
)
)
}
}
if (isValidElementCaretCandidate(node)) {
addUniqueAndValidRect(
collapseAndInflateWidth(getBoundingClientRect$1(node), true)
)
}
}
}
return clientRects
}
var CaretPosition = function (container, offset, clientRects) {
var isAtStart = function () {
if (isText$4(container)) {
return offset === 0
}
return offset === 0
}
var isAtEnd = function () {
if (isText$4(container)) {
return offset >= container.data.length
}
return offset >= container.childNodes.length
}
var toRange = function () {
var range = createRange$1(container.ownerDocument)
range.setStart(container, offset)
range.setEnd(container, offset)
return range
}
var getClientRects = function () {
if (!clientRects) {
clientRects = getCaretPositionClientRects(
CaretPosition(container, offset)
)
}
return clientRects
}
var isVisible = function () {
return getClientRects().length > 0
}
var isEqual = function (caretPosition) {
return (
caretPosition &&
container === caretPosition.container() &&
offset === caretPosition.offset()
)
}
var getNode = function (before) {
return resolveIndex$1(container, before ? offset - 1 : offset)
}
return {
container: constant(container),
offset: constant(offset),
toRange: toRange,
getClientRects: getClientRects,
isVisible: isVisible,
isAtStart: isAtStart,
isAtEnd: isAtEnd,
isEqual: isEqual,
getNode: getNode,
}
}
CaretPosition.fromRangeStart = function (range) {
return CaretPosition(range.startContainer, range.startOffset)
}
CaretPosition.fromRangeEnd = function (range) {
return CaretPosition(range.endContainer, range.endOffset)
}
CaretPosition.after = function (node) {
return CaretPosition(node.parentNode, nodeIndex$1(node) + 1)
}
CaretPosition.before = function (node) {
return CaretPosition(node.parentNode, nodeIndex$1(node))
}
CaretPosition.isAbove = function (pos1, pos2) {
return lift2(
head(pos2.getClientRects()),
last$2(pos1.getClientRects()),
isAbove$1
).getOr(false)
}
CaretPosition.isBelow = function (pos1, pos2) {
return lift2(
last$2(pos2.getClientRects()),
head(pos1.getClientRects()),
isBelow$1
).getOr(false)
}
CaretPosition.isAtStart = function (pos) {
return pos ? pos.isAtStart() : false
}
CaretPosition.isAtEnd = function (pos) {
return pos ? pos.isAtEnd() : false
}
CaretPosition.isTextPosition = function (pos) {
return pos ? isText$7(pos.container()) : false
}
CaretPosition.isElementPosition = function (pos) {
return CaretPosition.isTextPosition(pos) === false
}
var trimEmptyTextNode$1 = function (dom, node) {
if (isText$7(node) && node.data.length === 0) {
dom.remove(node)
}
}
var insertNode = function (dom, rng, node) {
rng.insertNode(node)
trimEmptyTextNode$1(dom, node.previousSibling)
trimEmptyTextNode$1(dom, node.nextSibling)
}
var insertFragment = function (dom, rng, frag) {
var firstChild = Optional.from(frag.firstChild)
var lastChild = Optional.from(frag.lastChild)
rng.insertNode(frag)
firstChild.each(function (child) {
return trimEmptyTextNode$1(dom, child.previousSibling)
})
lastChild.each(function (child) {
return trimEmptyTextNode$1(dom, child.nextSibling)
})
}
var rangeInsertNode = function (dom, rng, node) {
if (isDocumentFragment(node)) {
insertFragment(dom, rng, node)
} else {
insertNode(dom, rng, node)
}
}
var isText$3 = isText$7
var isBogus = isBogus$2
var nodeIndex = DOMUtils.nodeIndex
var normalizedParent = function (node) {
var parentNode = node.parentNode
if (isBogus(parentNode)) {
return normalizedParent(parentNode)
}
return parentNode
}
var getChildNodes = function (node) {
if (!node) {
return []
}
return reduce(
node.childNodes,
function (result, node) {
if (isBogus(node) && node.nodeName !== 'BR') {
result = result.concat(getChildNodes(node))
} else {
result.push(node)
}
return result
},
[]
)
}
var normalizedTextOffset = function (node, offset) {
while ((node = node.previousSibling)) {
if (!isText$3(node)) {
break
}
offset += node.data.length
}
return offset
}
var equal = function (a) {
return function (b) {
return a === b
}
}
var normalizedNodeIndex = function (node) {
var nodes, index
nodes = getChildNodes(normalizedParent(node))
index = findIndex$1(nodes, equal(node), node)
nodes = nodes.slice(0, index + 1)
var numTextFragments = reduce(
nodes,
function (result, node, i) {
if (isText$3(node) && isText$3(nodes[i - 1])) {
result++
}
return result
},
0
)
nodes = filter$2(nodes, matchNodeNames([node.nodeName]))
index = findIndex$1(nodes, equal(node), node)
return index - numTextFragments
}
var createPathItem = function (node) {
var name
if (isText$3(node)) {
name = 'text()'
} else {
name = node.nodeName.toLowerCase()
}
return name + '[' + normalizedNodeIndex(node) + ']'
}
var parentsUntil$1 = function (root, node, predicate) {
var parents = []
for (node = node.parentNode; node !== root; node = node.parentNode) {
if (predicate && predicate(node)) {
break
}
parents.push(node)
}
return parents
}
var create$6 = function (root, caretPosition) {
var container,
offset,
path = [],
outputOffset,
childNodes,
parents
container = caretPosition.container()
offset = caretPosition.offset()
if (isText$3(container)) {
outputOffset = normalizedTextOffset(container, offset)
} else {
childNodes = container.childNodes
if (offset >= childNodes.length) {
outputOffset = 'after'
offset = childNodes.length - 1
} else {
outputOffset = 'before'
}
container = childNodes[offset]
}
path.push(createPathItem(container))
parents = parentsUntil$1(root, container)
parents = filter$2(parents, not(isBogus$2))
path = path.concat(
map$1(parents, function (node) {
return createPathItem(node)
})
)
return path.reverse().join('/') + ',' + outputOffset
}
var resolvePathItem = function (node, name, index) {
var nodes = getChildNodes(node)
nodes = filter$2(nodes, function (node, index) {
return !isText$3(node) || !isText$3(nodes[index - 1])
})
nodes = filter$2(nodes, matchNodeNames([name]))
return nodes[index]
}
var findTextPosition = function (container, offset) {
var node = container,
targetOffset = 0,
dataLen
while (isText$3(node)) {
dataLen = node.data.length
if (offset >= targetOffset && offset <= targetOffset + dataLen) {
container = node
offset = offset - targetOffset
break
}
if (!isText$3(node.nextSibling)) {
container = node
offset = dataLen
break
}
targetOffset += dataLen
node = node.nextSibling
}
if (isText$3(container) && offset > container.data.length) {
offset = container.data.length
}
return CaretPosition(container, offset)
}
var resolve$2 = function (root, path) {
var offset
if (!path) {
return null
}
var parts = path.split(',')
var paths = parts[0].split('/')
offset = parts.length > 1 ? parts[1] : 'before'
var container = reduce(
paths,
function (result, value) {
var match = /([\w\-\(\)]+)\[([0-9]+)\]/.exec(value)
if (!match) {
return null
}
if (match[1] === 'text()') {
match[1] = '#text'
}
return resolvePathItem(result, match[1], parseInt(match[2], 10))
},
root
)
if (!container) {
return null
}
if (!isText$3(container)) {
if (offset === 'after') {
offset = nodeIndex(container) + 1
} else {
offset = nodeIndex(container)
}
return CaretPosition(container.parentNode, offset)
}
return findTextPosition(container, parseInt(offset, 10))
}
var isContentEditableFalse$9 = isContentEditableFalse$b
var getNormalizedTextOffset = function (trim, container, offset) {
var node, trimmedOffset
trimmedOffset = trim(container.data.slice(0, offset)).length
for (
node = container.previousSibling;
node && isText$7(node);
node = node.previousSibling
) {
trimmedOffset += trim(node.data).length
}
return trimmedOffset
}
var getPoint = function (dom, trim, normalized, rng, start) {
var container = rng[start ? 'startContainer' : 'endContainer']
var offset = rng[start ? 'startOffset' : 'endOffset']
var point = []
var childNodes,
after = 0
var root = dom.getRoot()
if (isText$7(container)) {
point.push(
normalized ? getNormalizedTextOffset(trim, container, offset) : offset
)
} else {
childNodes = container.childNodes
if (offset >= childNodes.length && childNodes.length) {
after = 1
offset = Math.max(0, childNodes.length - 1)
}
point.push(dom.nodeIndex(childNodes[offset], normalized) + after)
}
for (; container && container !== root; container = container.parentNode) {
point.push(dom.nodeIndex(container, normalized))
}
return point
}
var getLocation = function (trim, selection, normalized, rng) {
var dom = selection.dom,
bookmark = {}
bookmark.start = getPoint(dom, trim, normalized, rng, true)
if (!selection.isCollapsed()) {
bookmark.end = getPoint(dom, trim, normalized, rng, false)
}
if (isRangeInCaretContainerBlock(rng)) {
bookmark.isFakeCaret = true
}
return bookmark
}
var findIndex = function (dom, name, element) {
var count = 0
Tools.each(dom.select(name), function (node) {
if (node.getAttribute('data-mce-bogus') === 'all') {
return
}
if (node === element) {
return false
}
count++
})
return count
}
var moveEndPoint$1 = function (rng, start) {
var container, offset, childNodes
var prefix = start ? 'start' : 'end'
container = rng[prefix + 'Container']
offset = rng[prefix + 'Offset']
if (isElement$5(container) && container.nodeName === 'TR') {
childNodes = container.childNodes
container =
childNodes[Math.min(start ? offset : offset - 1, childNodes.length - 1)]
if (container) {
offset = start ? 0 : container.childNodes.length
rng['set' + (start ? 'Start' : 'End')](container, offset)
}
}
}
var normalizeTableCellSelection = function (rng) {
moveEndPoint$1(rng, true)
moveEndPoint$1(rng, false)
return rng
}
var findSibling = function (node, offset) {
var sibling
if (isElement$5(node)) {
node = getNode$1(node, offset)
if (isContentEditableFalse$9(node)) {
return node
}
}
if (isCaretContainer$2(node)) {
if (isText$7(node) && isCaretContainerBlock$1(node)) {
node = node.parentNode
}
sibling = node.previousSibling
if (isContentEditableFalse$9(sibling)) {
return sibling
}
sibling = node.nextSibling
if (isContentEditableFalse$9(sibling)) {
return sibling
}
}
}
var findAdjacentContentEditableFalseElm = function (rng) {
return (
findSibling(rng.startContainer, rng.startOffset) ||
findSibling(rng.endContainer, rng.endOffset)
)
}
var getOffsetBookmark = function (trim, normalized, selection) {
var element = selection.getNode()
var name = element ? element.nodeName : null
var rng = selection.getRng()
if (isContentEditableFalse$9(element) || name === 'IMG') {
return {
name: name,
index: findIndex(selection.dom, name, element),
}
}
var sibling = findAdjacentContentEditableFalseElm(rng)
if (sibling) {
name = sibling.tagName
return {
name: name,
index: findIndex(selection.dom, name, sibling),
}
}
return getLocation(trim, selection, normalized, rng)
}
var getCaretBookmark = function (selection) {
var rng = selection.getRng()
return {
start: create$6(
selection.dom.getRoot(),
CaretPosition.fromRangeStart(rng)
),
end: create$6(selection.dom.getRoot(), CaretPosition.fromRangeEnd(rng)),
}
}
var getRangeBookmark = function (selection) {
return { rng: selection.getRng() }
}
var createBookmarkSpan = function (dom, id, filled) {
var args = {
'data-mce-type': 'bookmark',
id: id,
style: 'overflow:hidden;line-height:0px',
}
return filled
? dom.create('span', args, '')
: dom.create('span', args)
}
var getPersistentBookmark = function (selection, filled) {
var dom = selection.dom
var rng = selection.getRng()
var id = dom.uniqueId()
var collapsed = selection.isCollapsed()
var element = selection.getNode()
var name = element.nodeName
if (name === 'IMG') {
return {
name: name,
index: findIndex(dom, name, element),
}
}
var rng2 = normalizeTableCellSelection(rng.cloneRange())
if (!collapsed) {
rng2.collapse(false)
var endBookmarkNode = createBookmarkSpan(dom, id + '_end', filled)
rangeInsertNode(dom, rng2, endBookmarkNode)
}
rng = normalizeTableCellSelection(rng)
rng.collapse(true)
var startBookmarkNode = createBookmarkSpan(dom, id + '_start', filled)
rangeInsertNode(dom, rng, startBookmarkNode)
selection.moveToBookmark({
id: id,
keep: true,
})
return { id: id }
}
var getBookmark$2 = function (selection, type, normalized) {
if (type === 2) {
return getOffsetBookmark(trim$2, normalized, selection)
} else if (type === 3) {
return getCaretBookmark(selection)
} else if (type) {
return getRangeBookmark(selection)
} else {
return getPersistentBookmark(selection, false)
}
}
var getUndoBookmark = curry(getOffsetBookmark, identity, true)
var DOM$9 = DOMUtils.DOM
var defaultPreviewStyles =
'font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow'
var getBodySetting = function (editor, name, defaultValue) {
var value = editor.getParam(name, defaultValue)
if (value.indexOf('=') !== -1) {
var bodyObj = editor.getParam(name, '', 'hash')
return get$9(bodyObj, editor.id).getOr(defaultValue)
} else {
return value
}
}
var getIframeAttrs = function (editor) {
return editor.getParam('iframe_attrs', {})
}
var getDocType = function (editor) {
return editor.getParam('doctype', '')
}
var getDocumentBaseUrl = function (editor) {
return editor.getParam('document_base_url', '')
}
var getBodyId = function (editor) {
return getBodySetting(editor, 'body_id', 'tinymce')
}
var getBodyClass = function (editor) {
return getBodySetting(editor, 'body_class', '')
}
var getContentSecurityPolicy = function (editor) {
return editor.getParam('content_security_policy', '')
}
var shouldPutBrInPre$1 = function (editor) {
return editor.getParam('br_in_pre', true)
}
var getForcedRootBlock = function (editor) {
if (editor.getParam('force_p_newlines', false)) {
return 'p'
}
var block = editor.getParam('forced_root_block', 'p')
if (block === false) {
return ''
} else if (block === true) {
return 'p'
} else {
return block
}
}
var getForcedRootBlockAttrs = function (editor) {
return editor.getParam('forced_root_block_attrs', {})
}
var getBrNewLineSelector = function (editor) {
return editor.getParam(
'br_newline_selector',
'.mce-toc h2,figcaption,caption'
)
}
var getNoNewLineSelector = function (editor) {
return editor.getParam('no_newline_selector', '')
}
var shouldKeepStyles = function (editor) {
return editor.getParam('keep_styles', true)
}
var shouldEndContainerOnEmptyBlock = function (editor) {
return editor.getParam('end_container_on_empty_block', false)
}
var getFontStyleValues = function (editor) {
return Tools.explode(
editor.getParam(
'font_size_style_values',
'xx-small,x-small,small,medium,large,x-large,xx-large'
)
)
}
var getFontSizeClasses = function (editor) {
return Tools.explode(editor.getParam('font_size_classes', ''))
}
var getImagesDataImgFilter = function (editor) {
return editor.getParam('images_dataimg_filter', always, 'function')
}
var isAutomaticUploadsEnabled = function (editor) {
return editor.getParam('automatic_uploads', true, 'boolean')
}
var shouldReuseFileName = function (editor) {
return editor.getParam('images_reuse_filename', false, 'boolean')
}
var shouldReplaceBlobUris = function (editor) {
return editor.getParam('images_replace_blob_uris', true, 'boolean')
}
var getIconPackName = function (editor) {
return editor.getParam('icons', '', 'string')
}
var getIconsUrl = function (editor) {
return editor.getParam('icons_url', '', 'string')
}
var getImageUploadUrl = function (editor) {
return editor.getParam('images_upload_url', '', 'string')
}
var getImageUploadBasePath = function (editor) {
return editor.getParam('images_upload_base_path', '', 'string')
}
var getImagesUploadCredentials = function (editor) {
return editor.getParam('images_upload_credentials', false, 'boolean')
}
var getImagesUploadHandler = function (editor) {
return editor.getParam('images_upload_handler', null, 'function')
}
var shouldUseContentCssCors = function (editor) {
return editor.getParam('content_css_cors', false, 'boolean')
}
var getReferrerPolicy = function (editor) {
return editor.getParam('referrer_policy', '', 'string')
}
var getLanguageCode = function (editor) {
return editor.getParam('language', 'en', 'string')
}
var getLanguageUrl = function (editor) {
return editor.getParam('language_url', '', 'string')
}
var shouldIndentUseMargin = function (editor) {
return editor.getParam('indent_use_margin', false)
}
var getIndentation = function (editor) {
return editor.getParam('indentation', '40px', 'string')
}
var getContentCss = function (editor) {
var contentCss = editor.getParam('content_css')
if (isString$1(contentCss)) {
return map$3(contentCss.split(','), trim$4)
} else if (isArray$1(contentCss)) {
return contentCss
} else if (contentCss === false || editor.inline) {
return []
} else {
return ['default']
}
}
var getFontCss = function (editor) {
var fontCss = editor.getParam('font_css', [])
return isArray$1(fontCss) ? fontCss : map$3(fontCss.split(','), trim$4)
}
var getDirectionality = function (editor) {
return editor.getParam('directionality', I18n.isRtl() ? 'rtl' : undefined)
}
var getInlineBoundarySelector = function (editor) {
return editor.getParam(
'inline_boundaries_selector',
'a[href],code,.mce-annotation',
'string'
)
}
var getObjectResizing = function (editor) {
var selector = editor.getParam('object_resizing')
if (selector === false || Env.iOS) {
return false
} else {
return isString$1(selector)
? selector
: 'table,img,figure.image,div,video,iframe'
}
}
var getResizeImgProportional = function (editor) {
return editor.getParam('resize_img_proportional', true, 'boolean')
}
var getPlaceholder = function (editor) {
return editor.getParam(
'placeholder',
DOM$9.getAttrib(editor.getElement(), 'placeholder'),
'string'
)
}
var getEventRoot = function (editor) {
return editor.getParam('event_root')
}
var getServiceMessage = function (editor) {
return editor.getParam('service_message')
}
var getTheme = function (editor) {
return editor.getParam('theme')
}
var shouldValidate = function (editor) {
return editor.getParam('validate')
}
var isInlineBoundariesEnabled = function (editor) {
return editor.getParam('inline_boundaries') !== false
}
var getFormats = function (editor) {
return editor.getParam('formats')
}
var getPreviewStyles = function (editor) {
var style = editor.getParam('preview_styles', defaultPreviewStyles)
if (isString$1(style)) {
return style
} else {
return ''
}
}
var canFormatEmptyLines = function (editor) {
return editor.getParam('format_empty_lines', false, 'boolean')
}
var getCustomUiSelector = function (editor) {
return editor.getParam('custom_ui_selector', '', 'string')
}
var getThemeUrl = function (editor) {
return editor.getParam('theme_url')
}
var isInline = function (editor) {
return editor.getParam('inline')
}
var hasHiddenInput = function (editor) {
return editor.getParam('hidden_input')
}
var shouldPatchSubmit = function (editor) {
return editor.getParam('submit_patch')
}
var isEncodingXml = function (editor) {
return editor.getParam('encoding') === 'xml'
}
var shouldAddFormSubmitTrigger = function (editor) {
return editor.getParam('add_form_submit_trigger')
}
var shouldAddUnloadTrigger = function (editor) {
return editor.getParam('add_unload_trigger')
}
var hasForcedRootBlock = function (editor) {
return getForcedRootBlock(editor) !== ''
}
var getCustomUndoRedoLevels = function (editor) {
return editor.getParam('custom_undo_redo_levels', 0, 'number')
}
var shouldDisableNodeChange = function (editor) {
return editor.getParam('disable_nodechange')
}
var isReadOnly$1 = function (editor) {
return editor.getParam('readonly')
}
var hasContentCssCors = function (editor) {
return editor.getParam('content_css_cors')
}
var getPlugins = function (editor) {
return editor.getParam('plugins', '', 'string')
}
var getExternalPlugins$1 = function (editor) {
return editor.getParam('external_plugins')
}
var shouldBlockUnsupportedDrop = function (editor) {
return editor.getParam('block_unsupported_drop', true, 'boolean')
}
var isVisualAidsEnabled = function (editor) {
return editor.getParam('visual', true, 'boolean')
}
var getVisualAidsTableClass = function (editor) {
return editor.getParam('visual_table_class', 'mce-item-table', 'string')
}
var getVisualAidsAnchorClass = function (editor) {
return editor.getParam('visual_anchor_class', 'mce-item-anchor', 'string')
}
var getIframeAriaText = function (editor) {
return editor.getParam(
'iframe_aria_text',
'Rich Text Area. Press ALT-0 for help.',
'string'
)
}
var isElement$2 = isElement$5
var isText$2 = isText$7
var removeNode$1 = function (node) {
var parentNode = node.parentNode
if (parentNode) {
parentNode.removeChild(node)
}
}
var trimCount = function (text) {
var trimmedText = trim$2(text)
return {
count: text.length - trimmedText.length,
text: trimmedText,
}
}
var deleteZwspChars = function (caretContainer) {
var idx
while ((idx = caretContainer.data.lastIndexOf(ZWSP$1)) !== -1) {
caretContainer.deleteData(idx, 1)
}
}
var removeUnchanged = function (caretContainer, pos) {
remove$2(caretContainer)
return pos
}
var removeTextAndReposition = function (caretContainer, pos) {
var before = trimCount(caretContainer.data.substr(0, pos.offset()))
var after = trimCount(caretContainer.data.substr(pos.offset()))
var text = before.text + after.text
if (text.length > 0) {
deleteZwspChars(caretContainer)
return CaretPosition(caretContainer, pos.offset() - before.count)
} else {
return pos
}
}
var removeElementAndReposition = function (caretContainer, pos) {
var parentNode = pos.container()
var newPosition = indexOf$2(from(parentNode.childNodes), caretContainer)
.map(function (index) {
return index < pos.offset()
? CaretPosition(parentNode, pos.offset() - 1)
: pos
})
.getOr(pos)
remove$2(caretContainer)
return newPosition
}
var removeTextCaretContainer = function (caretContainer, pos) {
return isText$2(caretContainer) && pos.container() === caretContainer
? removeTextAndReposition(caretContainer, pos)
: removeUnchanged(caretContainer, pos)
}
var removeElementCaretContainer = function (caretContainer, pos) {
return pos.container() === caretContainer.parentNode
? removeElementAndReposition(caretContainer, pos)
: removeUnchanged(caretContainer, pos)
}
var removeAndReposition = function (container, pos) {
return CaretPosition.isTextPosition(pos)
? removeTextCaretContainer(container, pos)
: removeElementCaretContainer(container, pos)
}
var remove$2 = function (caretContainerNode) {
if (
isElement$2(caretContainerNode) &&
isCaretContainer$2(caretContainerNode)
) {
if (hasContent(caretContainerNode)) {
caretContainerNode.removeAttribute('data-mce-caret')
} else {
removeNode$1(caretContainerNode)
}
}
if (isText$2(caretContainerNode)) {
deleteZwspChars(caretContainerNode)
if (caretContainerNode.data.length === 0) {
removeNode$1(caretContainerNode)
}
}
}
var browser$2 = detect().browser
var isContentEditableFalse$8 = isContentEditableFalse$b
var isMedia$1 = isMedia$2
var isTableCell$3 = isTableCell$5
var inlineFakeCaretSelector =
'*[contentEditable=false],video,audio,embed,object'
var getAbsoluteClientRect = function (root, element, before) {
var clientRect = collapse(element.getBoundingClientRect(), before)
var scrollX
var scrollY
if (root.tagName === 'BODY') {
var docElm = root.ownerDocument.documentElement
scrollX = root.scrollLeft || docElm.scrollLeft
scrollY = root.scrollTop || docElm.scrollTop
} else {
var rootRect = root.getBoundingClientRect()
scrollX = root.scrollLeft - rootRect.left
scrollY = root.scrollTop - rootRect.top
}
clientRect.left += scrollX
clientRect.right += scrollX
clientRect.top += scrollY
clientRect.bottom += scrollY
clientRect.width = 1
var margin = element.offsetWidth - element.clientWidth
if (margin > 0) {
if (before) {
margin *= -1
}
clientRect.left += margin
clientRect.right += margin
}
return clientRect
}
var trimInlineCaretContainers = function (root) {
var fakeCaretTargetNodes = descendants(
SugarElement.fromDom(root),
inlineFakeCaretSelector
)
for (var i = 0; i < fakeCaretTargetNodes.length; i++) {
var node = fakeCaretTargetNodes[i].dom
var sibling = node.previousSibling
if (endsWithCaretContainer$1(sibling)) {
var data = sibling.data
if (data.length === 1) {
sibling.parentNode.removeChild(sibling)
} else {
sibling.deleteData(data.length - 1, 1)
}
}
sibling = node.nextSibling
if (startsWithCaretContainer$1(sibling)) {
var data = sibling.data
if (data.length === 1) {
sibling.parentNode.removeChild(sibling)
} else {
sibling.deleteData(0, 1)
}
}
}
}
var FakeCaret = function (editor, root, isBlock, hasFocus) {
var lastVisualCaret = value()
var cursorInterval
var caretContainerNode
var rootBlock = getForcedRootBlock(editor)
var caretBlock = rootBlock.length > 0 ? rootBlock : 'p'
var show = function (before, element) {
var rng
hide()
if (isTableCell$3(element)) {
return null
}
if (isBlock(element)) {
caretContainerNode = insertBlock$1(caretBlock, element, before)
var clientRect = getAbsoluteClientRect(root, element, before)
DomQuery(caretContainerNode).css('top', clientRect.top)
var caret = DomQuery(
''
)
.css(__assign({}, clientRect))
.appendTo(root)[0]
lastVisualCaret.set({
caret: caret,
element: element,
before: before,
})
if (before) {
DomQuery(caret).addClass('mce-visual-caret-before')
}
startBlink()
rng = element.ownerDocument.createRange()
rng.setStart(caretContainerNode, 0)
rng.setEnd(caretContainerNode, 0)
} else {
caretContainerNode = insertInline$1(element, before)
rng = element.ownerDocument.createRange()
if (isInlineFakeCaretTarget(caretContainerNode.nextSibling)) {
rng.setStart(caretContainerNode, 0)
rng.setEnd(caretContainerNode, 0)
} else {
rng.setStart(caretContainerNode, 1)
rng.setEnd(caretContainerNode, 1)
}
return rng
}
return rng
}
var hide = function () {
trimInlineCaretContainers(root)
if (caretContainerNode) {
remove$2(caretContainerNode)
caretContainerNode = null
}
lastVisualCaret.on(function (caretState) {
DomQuery(caretState.caret).remove()
lastVisualCaret.clear()
})
if (cursorInterval) {
Delay.clearInterval(cursorInterval)
cursorInterval = undefined
}
}
var startBlink = function () {
cursorInterval = Delay.setInterval(function () {
if (hasFocus()) {
DomQuery('div.mce-visual-caret', root).toggleClass(
'mce-visual-caret-hidden'
)
} else {
DomQuery('div.mce-visual-caret', root).addClass(
'mce-visual-caret-hidden'
)
}
}, 500)
}
var reposition = function () {
lastVisualCaret.on(function (caretState) {
var clientRect = getAbsoluteClientRect(
root,
caretState.element,
caretState.before
)
DomQuery(caretState.caret).css(__assign({}, clientRect))
})
}
var destroy = function () {
return Delay.clearInterval(cursorInterval)
}
var getCss = function () {
return (
'.mce-visual-caret {' +
'position: absolute;' +
'background-color: black;' +
'background-color: currentcolor;' +
'}' +
'.mce-visual-caret-hidden {' +
'display: none;' +
'}' +
'*[data-mce-caret] {' +
'position: absolute;' +
'left: -1000px;' +
'right: auto;' +
'top: 0;' +
'margin: 0;' +
'padding: 0;' +
'}'
)
}
return {
show: show,
hide: hide,
getCss: getCss,
reposition: reposition,
destroy: destroy,
}
}
var isFakeCaretTableBrowser = function () {
return browser$2.isIE() || browser$2.isEdge() || browser$2.isFirefox()
}
var isInlineFakeCaretTarget = function (node) {
return isContentEditableFalse$8(node) || isMedia$1(node)
}
var isFakeCaretTarget = function (node) {
return (
isInlineFakeCaretTarget(node) ||
(isTable$3(node) && isFakeCaretTableBrowser())
)
}
var isContentEditableFalse$7 = isContentEditableFalse$b
var isMedia = isMedia$2
var isBlockLike = matchStyleValues(
'display',
'block table table-cell table-caption list-item'
)
var isCaretContainer = isCaretContainer$2
var isCaretContainerBlock = isCaretContainerBlock$1
var isElement$1 = isElement$5
var isCaretCandidate$1 = isCaretCandidate$3
var isForwards = function (direction) {
return direction > 0
}
var isBackwards = function (direction) {
return direction < 0
}
var skipCaretContainers = function (walk, shallow) {
var node
while ((node = walk(shallow))) {
if (!isCaretContainerBlock(node)) {
return node
}
}
return null
}
var findNode$1 = function (node, direction, predicateFn, rootNode, shallow) {
var walker = new DomTreeWalker(node, rootNode)
var isCefOrCaretContainer =
isContentEditableFalse$7(node) || isCaretContainerBlock(node)
if (isBackwards(direction)) {
if (isCefOrCaretContainer) {
node = skipCaretContainers(walker.prev.bind(walker), true)
if (predicateFn(node)) {
return node
}
}
while ((node = skipCaretContainers(walker.prev.bind(walker), shallow))) {
if (predicateFn(node)) {
return node
}
}
}
if (isForwards(direction)) {
if (isCefOrCaretContainer) {
node = skipCaretContainers(walker.next.bind(walker), true)
if (predicateFn(node)) {
return node
}
}
while ((node = skipCaretContainers(walker.next.bind(walker), shallow))) {
if (predicateFn(node)) {
return node
}
}
}
return null
}
var getParentBlock$2 = function (node, rootNode) {
while (node && node !== rootNode) {
if (isBlockLike(node)) {
return node
}
node = node.parentNode
}
return null
}
var isInSameBlock = function (caretPosition1, caretPosition2, rootNode) {
return (
getParentBlock$2(caretPosition1.container(), rootNode) ===
getParentBlock$2(caretPosition2.container(), rootNode)
)
}
var getChildNodeAtRelativeOffset = function (relativeOffset, caretPosition) {
if (!caretPosition) {
return null
}
var container = caretPosition.container()
var offset = caretPosition.offset()
if (!isElement$1(container)) {
return null
}
return container.childNodes[offset + relativeOffset]
}
var beforeAfter = function (before, node) {
var range = node.ownerDocument.createRange()
if (before) {
range.setStartBefore(node)
range.setEndBefore(node)
} else {
range.setStartAfter(node)
range.setEndAfter(node)
}
return range
}
var isNodesInSameBlock = function (root, node1, node2) {
return getParentBlock$2(node1, root) === getParentBlock$2(node2, root)
}
var lean = function (left, root, node) {
var siblingName = left ? 'previousSibling' : 'nextSibling'
while (node && node !== root) {
var sibling = node[siblingName]
if (isCaretContainer(sibling)) {
sibling = sibling[siblingName]
}
if (isContentEditableFalse$7(sibling) || isMedia(sibling)) {
if (isNodesInSameBlock(root, sibling, node)) {
return sibling
}
break
}
if (isCaretCandidate$1(sibling)) {
break
}
node = node.parentNode
}
return null
}
var before$2 = curry(beforeAfter, true)
var after$2 = curry(beforeAfter, false)
var normalizeRange = function (direction, root, range) {
var node
var leanLeft = curry(lean, true, root)
var leanRight = curry(lean, false, root)
var container = range.startContainer
var offset = range.startOffset
if (isCaretContainerBlock$1(container)) {
if (!isElement$1(container)) {
container = container.parentNode
}
var location_1 = container.getAttribute('data-mce-caret')
if (location_1 === 'before') {
node = container.nextSibling
if (isFakeCaretTarget(node)) {
return before$2(node)
}
}
if (location_1 === 'after') {
node = container.previousSibling
if (isFakeCaretTarget(node)) {
return after$2(node)
}
}
}
if (!range.collapsed) {
return range
}
if (isText$7(container)) {
if (isCaretContainer(container)) {
if (direction === 1) {
node = leanRight(container)
if (node) {
return before$2(node)
}
node = leanLeft(container)
if (node) {
return after$2(node)
}
}
if (direction === -1) {
node = leanLeft(container)
if (node) {
return after$2(node)
}
node = leanRight(container)
if (node) {
return before$2(node)
}
}
return range
}
if (
endsWithCaretContainer$1(container) &&
offset >= container.data.length - 1
) {
if (direction === 1) {
node = leanRight(container)
if (node) {
return before$2(node)
}
}
return range
}
if (startsWithCaretContainer$1(container) && offset <= 1) {
if (direction === -1) {
node = leanLeft(container)
if (node) {
return after$2(node)
}
}
return range
}
if (offset === container.data.length) {
node = leanRight(container)
if (node) {
return before$2(node)
}
return range
}
if (offset === 0) {
node = leanLeft(container)
if (node) {
return after$2(node)
}
return range
}
}
return range
}
var getRelativeCefElm = function (forward, caretPosition) {
return Optional.from(
getChildNodeAtRelativeOffset(forward ? 0 : -1, caretPosition)
).filter(isContentEditableFalse$7)
}
var getNormalizedRangeEndPoint = function (direction, root, range) {
var normalizedRange = normalizeRange(direction, root, range)
if (direction === -1) {
return CaretPosition.fromRangeStart(normalizedRange)
}
return CaretPosition.fromRangeEnd(normalizedRange)
}
var getElementFromPosition = function (pos) {
return Optional.from(pos.getNode()).map(SugarElement.fromDom)
}
var getElementFromPrevPosition = function (pos) {
return Optional.from(pos.getNode(true)).map(SugarElement.fromDom)
}
var getVisualCaretPosition = function (walkFn, caretPosition) {
while ((caretPosition = walkFn(caretPosition))) {
if (caretPosition.isVisible()) {
return caretPosition
}
}
return caretPosition
}
var isMoveInsideSameBlock = function (from, to) {
var inSameBlock = isInSameBlock(from, to)
if (!inSameBlock && isBr$5(from.getNode())) {
return true
}
return inSameBlock
}
var HDirection
;(function (HDirection) {
HDirection[(HDirection['Backwards'] = -1)] = 'Backwards'
HDirection[(HDirection['Forwards'] = 1)] = 'Forwards'
})(HDirection || (HDirection = {}))
var isContentEditableFalse$6 = isContentEditableFalse$b
var isText$1 = isText$7
var isElement = isElement$5
var isBr$1 = isBr$5
var isCaretCandidate = isCaretCandidate$3
var isAtomic = isAtomic$1
var isEditableCaretCandidate = isEditableCaretCandidate$1
var getParents$3 = function (node, root) {
var parents = []
while (node && node !== root) {
parents.push(node)
node = node.parentNode
}
return parents
}
var nodeAtIndex = function (container, offset) {
if (container.hasChildNodes() && offset < container.childNodes.length) {
return container.childNodes[offset]
}
return null
}
var getCaretCandidatePosition = function (direction, node) {
if (isForwards(direction)) {
if (
isCaretCandidate(node.previousSibling) &&
!isText$1(node.previousSibling)
) {
return CaretPosition.before(node)
}
if (isText$1(node)) {
return CaretPosition(node, 0)
}
}
if (isBackwards(direction)) {
if (isCaretCandidate(node.nextSibling) && !isText$1(node.nextSibling)) {
return CaretPosition.after(node)
}
if (isText$1(node)) {
return CaretPosition(node, node.data.length)
}
}
if (isBackwards(direction)) {
if (isBr$1(node)) {
return CaretPosition.before(node)
}
return CaretPosition.after(node)
}
return CaretPosition.before(node)
}
var moveForwardFromBr = function (root, nextNode) {
var nextSibling = nextNode.nextSibling
if (nextSibling && isCaretCandidate(nextSibling)) {
if (isText$1(nextSibling)) {
return CaretPosition(nextSibling, 0)
} else {
return CaretPosition.before(nextSibling)
}
} else {
return findCaretPosition$1(
HDirection.Forwards,
CaretPosition.after(nextNode),
root
)
}
}
var findCaretPosition$1 = function (direction, startPos, root) {
var node
var nextNode
var innerNode
var caretPosition
if (!isElement(root) || !startPos) {
return null
}
if (startPos.isEqual(CaretPosition.after(root)) && root.lastChild) {
caretPosition = CaretPosition.after(root.lastChild)
if (
isBackwards(direction) &&
isCaretCandidate(root.lastChild) &&
isElement(root.lastChild)
) {
return isBr$1(root.lastChild)
? CaretPosition.before(root.lastChild)
: caretPosition
}
} else {
caretPosition = startPos
}
var container = caretPosition.container()
var offset = caretPosition.offset()
if (isText$1(container)) {
if (isBackwards(direction) && offset > 0) {
return CaretPosition(container, --offset)
}
if (isForwards(direction) && offset < container.length) {
return CaretPosition(container, ++offset)
}
node = container
} else {
if (isBackwards(direction) && offset > 0) {
nextNode = nodeAtIndex(container, offset - 1)
if (isCaretCandidate(nextNode)) {
if (!isAtomic(nextNode)) {
innerNode = findNode$1(
nextNode,
direction,
isEditableCaretCandidate,
nextNode
)
if (innerNode) {
if (isText$1(innerNode)) {
return CaretPosition(innerNode, innerNode.data.length)
}
return CaretPosition.after(innerNode)
}
}
if (isText$1(nextNode)) {
return CaretPosition(nextNode, nextNode.data.length)
}
return CaretPosition.before(nextNode)
}
}
if (isForwards(direction) && offset < container.childNodes.length) {
nextNode = nodeAtIndex(container, offset)
if (isCaretCandidate(nextNode)) {
if (isBr$1(nextNode)) {
return moveForwardFromBr(root, nextNode)
}
if (!isAtomic(nextNode)) {
innerNode = findNode$1(
nextNode,
direction,
isEditableCaretCandidate,
nextNode
)
if (innerNode) {
if (isText$1(innerNode)) {
return CaretPosition(innerNode, 0)
}
return CaretPosition.before(innerNode)
}
}
if (isText$1(nextNode)) {
return CaretPosition(nextNode, 0)
}
return CaretPosition.after(nextNode)
}
}
node = nextNode ? nextNode : caretPosition.getNode()
}
if (
(isForwards(direction) && caretPosition.isAtEnd()) ||
(isBackwards(direction) && caretPosition.isAtStart())
) {
node = findNode$1(node, direction, always, root, true)
if (isEditableCaretCandidate(node, root)) {
return getCaretCandidatePosition(direction, node)
}
}
nextNode = findNode$1(node, direction, isEditableCaretCandidate, root)
var rootContentEditableFalseElm = last$1(
filter$4(getParents$3(container, root), isContentEditableFalse$6)
)
if (
rootContentEditableFalseElm &&
(!nextNode || !rootContentEditableFalseElm.contains(nextNode))
) {
if (isForwards(direction)) {
caretPosition = CaretPosition.after(rootContentEditableFalseElm)
} else {
caretPosition = CaretPosition.before(rootContentEditableFalseElm)
}
return caretPosition
}
if (nextNode) {
return getCaretCandidatePosition(direction, nextNode)
}
return null
}
var CaretWalker = function (root) {
return {
next: function (caretPosition) {
return findCaretPosition$1(HDirection.Forwards, caretPosition, root)
},
prev: function (caretPosition) {
return findCaretPosition$1(HDirection.Backwards, caretPosition, root)
},
}
}
var walkToPositionIn = function (forward, root, start) {
var position = forward
? CaretPosition.before(start)
: CaretPosition.after(start)
return fromPosition(forward, root, position)
}
var afterElement = function (node) {
return isBr$5(node) ? CaretPosition.before(node) : CaretPosition.after(node)
}
var isBeforeOrStart = function (position) {
if (CaretPosition.isTextPosition(position)) {
return position.offset() === 0
} else {
return isCaretCandidate$3(position.getNode())
}
}
var isAfterOrEnd = function (position) {
if (CaretPosition.isTextPosition(position)) {
var container = position.container()
return position.offset() === container.data.length
} else {
return isCaretCandidate$3(position.getNode(true))
}
}
var isBeforeAfterSameElement = function (from, to) {
return (
!CaretPosition.isTextPosition(from) &&
!CaretPosition.isTextPosition(to) &&
from.getNode() === to.getNode(true)
)
}
var isAtBr = function (position) {
return !CaretPosition.isTextPosition(position) && isBr$5(position.getNode())
}
var shouldSkipPosition = function (forward, from, to) {
if (forward) {
return (
!isBeforeAfterSameElement(from, to) &&
!isAtBr(from) &&
isAfterOrEnd(from) &&
isBeforeOrStart(to)
)
} else {
return (
!isBeforeAfterSameElement(to, from) &&
isBeforeOrStart(from) &&
isAfterOrEnd(to)
)
}
}
var fromPosition = function (forward, root, pos) {
var walker = CaretWalker(root)
return Optional.from(forward ? walker.next(pos) : walker.prev(pos))
}
var navigate = function (forward, root, from) {
return fromPosition(forward, root, from).bind(function (to) {
if (
isInSameBlock(from, to, root) &&
shouldSkipPosition(forward, from, to)
) {
return fromPosition(forward, root, to)
} else {
return Optional.some(to)
}
})
}
var navigateIgnore = function (forward, root, from, ignoreFilter) {
return navigate(forward, root, from).bind(function (pos) {
return ignoreFilter(pos)
? navigateIgnore(forward, root, pos, ignoreFilter)
: Optional.some(pos)
})
}
var positionIn = function (forward, element) {
var startNode = forward ? element.firstChild : element.lastChild
if (isText$7(startNode)) {
return Optional.some(
CaretPosition(startNode, forward ? 0 : startNode.data.length)
)
} else if (startNode) {
if (isCaretCandidate$3(startNode)) {
return Optional.some(
forward ? CaretPosition.before(startNode) : afterElement(startNode)
)
} else {
return walkToPositionIn(forward, element, startNode)
}
} else {
return Optional.none()
}
}
var nextPosition = curry(fromPosition, true)
var prevPosition = curry(fromPosition, false)
var firstPositionIn = curry(positionIn, true)
var lastPositionIn = curry(positionIn, false)
var CARET_ID$1 = '_mce_caret'
var isCaretNode = function (node) {
return isElement$5(node) && node.id === CARET_ID$1
}
var getParentCaretContainer = function (body, node) {
while (node && node !== body) {
if (node.id === CARET_ID$1) {
return node
}
node = node.parentNode
}
return null
}
var isStringPathBookmark = function (bookmark) {
return isString$1(bookmark.start)
}
var isRangeBookmark = function (bookmark) {
return has$2(bookmark, 'rng')
}
var isIdBookmark = function (bookmark) {
return has$2(bookmark, 'id')
}
var isIndexBookmark = function (bookmark) {
return has$2(bookmark, 'name')
}
var isPathBookmark = function (bookmark) {
return Tools.isArray(bookmark.start)
}
var addBogus = function (dom, node) {
if (isElement$5(node) && dom.isBlock(node) && !node.innerHTML && !Env.ie) {
node.innerHTML = '
'
}
return node
}
var resolveCaretPositionBookmark = function (dom, bookmark) {
var pos
var rng = dom.createRng()
pos = resolve$2(dom.getRoot(), bookmark.start)
rng.setStart(pos.container(), pos.offset())
pos = resolve$2(dom.getRoot(), bookmark.end)
rng.setEnd(pos.container(), pos.offset())
return rng
}
var insertZwsp = function (node, rng) {
var textNode = node.ownerDocument.createTextNode(ZWSP$1)
node.appendChild(textNode)
rng.setStart(textNode, 0)
rng.setEnd(textNode, 0)
}
var isEmpty$1 = function (node) {
return node.hasChildNodes() === false
}
var tryFindRangePosition = function (node, rng) {
return lastPositionIn(node).fold(never, function (pos) {
rng.setStart(pos.container(), pos.offset())
rng.setEnd(pos.container(), pos.offset())
return true
})
}
var padEmptyCaretContainer = function (root, node, rng) {
if (isEmpty$1(node) && getParentCaretContainer(root, node)) {
insertZwsp(node, rng)
return true
} else {
return false
}
}
var setEndPoint = function (dom, start, bookmark, rng) {
var point = bookmark[start ? 'start' : 'end']
var i, node, offset, children
var root = dom.getRoot()
if (point) {
offset = point[0]
for (node = root, i = point.length - 1; i >= 1; i--) {
children = node.childNodes
if (padEmptyCaretContainer(root, node, rng)) {
return true
}
if (point[i] > children.length - 1) {
if (padEmptyCaretContainer(root, node, rng)) {
return true
}
return tryFindRangePosition(node, rng)
}
node = children[point[i]]
}
if (node.nodeType === 3) {
offset = Math.min(point[0], node.nodeValue.length)
}
if (node.nodeType === 1) {
offset = Math.min(point[0], node.childNodes.length)
}
if (start) {
rng.setStart(node, offset)
} else {
rng.setEnd(node, offset)
}
}
return true
}
var isValidTextNode = function (node) {
return isText$7(node) && node.data.length > 0
}
var restoreEndPoint = function (dom, suffix, bookmark) {
var marker = dom.get(bookmark.id + '_' + suffix),
node,
idx,
next,
prev
var keep = bookmark.keep
var container, offset
if (marker) {
node = marker.parentNode
if (suffix === 'start') {
if (!keep) {
idx = dom.nodeIndex(marker)
} else {
if (marker.hasChildNodes()) {
node = marker.firstChild
idx = 1
} else if (isValidTextNode(marker.nextSibling)) {
node = marker.nextSibling
idx = 0
} else if (isValidTextNode(marker.previousSibling)) {
node = marker.previousSibling
idx = marker.previousSibling.data.length
} else {
node = marker.parentNode
idx = dom.nodeIndex(marker) + 1
}
}
container = node
offset = idx
} else {
if (!keep) {
idx = dom.nodeIndex(marker)
} else {
if (marker.hasChildNodes()) {
node = marker.firstChild
idx = 1
} else if (isValidTextNode(marker.previousSibling)) {
node = marker.previousSibling
idx = marker.previousSibling.data.length
} else {
node = marker.parentNode
idx = dom.nodeIndex(marker)
}
}
container = node
offset = idx
}
if (!keep) {
prev = marker.previousSibling
next = marker.nextSibling
Tools.each(Tools.grep(marker.childNodes), function (node) {
if (isText$7(node)) {
node.nodeValue = node.nodeValue.replace(/\uFEFF/g, '')
}
})
while ((marker = dom.get(bookmark.id + '_' + suffix))) {
dom.remove(marker, true)
}
if (
prev &&
next &&
prev.nodeType === next.nodeType &&
isText$7(prev) &&
!Env.opera
) {
idx = prev.nodeValue.length
prev.appendData(next.nodeValue)
dom.remove(next)
container = prev
offset = idx
}
}
return Optional.some(CaretPosition(container, offset))
} else {
return Optional.none()
}
}
var resolvePaths = function (dom, bookmark) {
var rng = dom.createRng()
if (
setEndPoint(dom, true, bookmark, rng) &&
setEndPoint(dom, false, bookmark, rng)
) {
return Optional.some(rng)
} else {
return Optional.none()
}
}
var resolveId = function (dom, bookmark) {
var startPos = restoreEndPoint(dom, 'start', bookmark)
var endPos = restoreEndPoint(dom, 'end', bookmark)
return lift2(startPos, endPos.or(startPos), function (spos, epos) {
var rng = dom.createRng()
rng.setStart(addBogus(dom, spos.container()), spos.offset())
rng.setEnd(addBogus(dom, epos.container()), epos.offset())
return rng
})
}
var resolveIndex = function (dom, bookmark) {
return Optional.from(dom.select(bookmark.name)[bookmark.index]).map(
function (elm) {
var rng = dom.createRng()
rng.selectNode(elm)
return rng
}
)
}
var resolve$1 = function (selection, bookmark) {
var dom = selection.dom
if (bookmark) {
if (isPathBookmark(bookmark)) {
return resolvePaths(dom, bookmark)
} else if (isStringPathBookmark(bookmark)) {
return Optional.some(resolveCaretPositionBookmark(dom, bookmark))
} else if (isIdBookmark(bookmark)) {
return resolveId(dom, bookmark)
} else if (isIndexBookmark(bookmark)) {
return resolveIndex(dom, bookmark)
} else if (isRangeBookmark(bookmark)) {
return Optional.some(bookmark.rng)
}
}
return Optional.none()
}
var getBookmark$1 = function (selection, type, normalized) {
return getBookmark$2(selection, type, normalized)
}
var moveToBookmark = function (selection, bookmark) {
resolve$1(selection, bookmark).each(function (rng) {
selection.setRng(rng)
})
}
var isBookmarkNode$1 = function (node) {
return (
isElement$5(node) &&
node.tagName === 'SPAN' &&
node.getAttribute('data-mce-type') === 'bookmark'
)
}
var is = function (expected) {
return function (actual) {
return expected === actual
}
}
var isNbsp = is(nbsp)
var isWhiteSpace = function (chr) {
return chr !== '' && ' \f\n\r\t\x0B'.indexOf(chr) !== -1
}
var isContent = function (chr) {
return !isWhiteSpace(chr) && !isNbsp(chr)
}
var isNode = function (node) {
return !!node.nodeType
}
var isInlineBlock = function (node) {
return node && /^(IMG)$/.test(node.nodeName)
}
var moveStart = function (dom, selection, rng) {
var offset = rng.startOffset
var container = rng.startContainer
if (container === rng.endContainer) {
if (isInlineBlock(container.childNodes[offset])) {
return
}
}
if (isElement$5(container)) {
var nodes = container.childNodes
var walker = void 0
if (offset < nodes.length) {
container = nodes[offset]
walker = new DomTreeWalker(
container,
dom.getParent(container, dom.isBlock)
)
} else {
container = nodes[nodes.length - 1]
walker = new DomTreeWalker(
container,
dom.getParent(container, dom.isBlock)
)
walker.next(true)
}
for (var node = walker.current(); node; node = walker.next()) {
if (isText$7(node) && !isWhiteSpaceNode$1(node)) {
rng.setStart(node, 0)
selection.setRng(rng)
return
}
}
}
}
var getNonWhiteSpaceSibling = function (node, next, inc) {
if (node) {
var nextName = next ? 'nextSibling' : 'previousSibling'
for (node = inc ? node : node[nextName]; node; node = node[nextName]) {
if (isElement$5(node) || !isWhiteSpaceNode$1(node)) {
return node
}
}
}
}
var isTextBlock$1 = function (editor, name) {
if (isNode(name)) {
name = name.nodeName
}
return !!editor.schema.getTextBlockElements()[name.toLowerCase()]
}
var isValid = function (ed, parent, child) {
return ed.schema.isValidChild(parent, child)
}
var isWhiteSpaceNode$1 = function (node, allowSpaces) {
if (allowSpaces === void 0) {
allowSpaces = false
}
if (isNonNullable(node) && isText$7(node)) {
var data = allowSpaces ? node.data.replace(/ /g, '\xA0') : node.data
return isWhitespaceText(data)
} else {
return false
}
}
var isEmptyTextNode$1 = function (node) {
return isNonNullable(node) && isText$7(node) && node.length === 0
}
var replaceVars = function (value, vars) {
if (isFunction(value)) {
value = value(vars)
} else if (isNonNullable(vars)) {
value = value.replace(/%(\w+)/g, function (str, name) {
return vars[name] || str
})
}
return value
}
var isEq$5 = function (str1, str2) {
str1 = str1 || ''
str2 = str2 || ''
str1 = '' + (str1.nodeName || str1)
str2 = '' + (str2.nodeName || str2)
return str1.toLowerCase() === str2.toLowerCase()
}
var normalizeStyleValue = function (dom, value, name) {
if (name === 'color' || name === 'backgroundColor') {
value = dom.toHex(value)
}
if (name === 'fontWeight' && value === 700) {
value = 'bold'
}
if (name === 'fontFamily') {
value = value.replace(/[\'\"]/g, '').replace(/,\s+/g, ',')
}
return '' + value
}
var getStyle = function (dom, node, name) {
return normalizeStyleValue(dom, dom.getStyle(node, name), name)
}
var getTextDecoration = function (dom, node) {
var decoration
dom.getParent(node, function (n) {
decoration = dom.getStyle(n, 'text-decoration')
return decoration && decoration !== 'none'
})
return decoration
}
var getParents$2 = function (dom, node, selector) {
return dom.getParents(node, selector, dom.getRoot())
}
var isVariableFormatName = function (editor, formatName) {
var hasVariableValues = function (format) {
var isVariableValue = function (val) {
return val.length > 1 && val.charAt(0) === '%'
}
return exists(['styles', 'attributes'], function (key) {
return get$9(format, key).exists(function (field) {
var fieldValues = isArray$1(field) ? field : values(field)
return exists(fieldValues, isVariableValue)
})
})
}
return exists(editor.formatter.get(formatName), hasVariableValues)
}
var areSimilarFormats = function (editor, formatName, otherFormatName) {
var validKeys = [
'inline',
'block',
'selector',
'attributes',
'styles',
'classes',
]
var filterObj = function (format) {
return filter$3(format, function (_, key) {
return exists(validKeys, function (validKey) {
return validKey === key
})
})
}
return exists(editor.formatter.get(formatName), function (fmt1) {
var filteredFmt1 = filterObj(fmt1)
return exists(editor.formatter.get(otherFormatName), function (fmt2) {
var filteredFmt2 = filterObj(fmt2)
return equal$1(filteredFmt1, filteredFmt2)
})
})
}
var isBlockFormat = function (format) {
return hasNonNullableKey(format, 'block')
}
var isSelectorFormat = function (format) {
return hasNonNullableKey(format, 'selector')
}
var isInlineFormat = function (format) {
return hasNonNullableKey(format, 'inline')
}
var isMixedFormat = function (format) {
return (
isSelectorFormat(format) &&
isInlineFormat(format) &&
is$1(get$9(format, 'mixed'), true)
)
}
var shouldExpandToSelector = function (format) {
return (
isSelectorFormat(format) &&
format.expand !== false &&
!isInlineFormat(format)
)
}
var isBookmarkNode = isBookmarkNode$1
var getParents$1 = getParents$2
var isWhiteSpaceNode = isWhiteSpaceNode$1
var isTextBlock = isTextBlock$1
var isBogusBr = function (node) {
return (
isBr$5(node) && node.getAttribute('data-mce-bogus') && !node.nextSibling
)
}
var findParentContentEditable = function (dom, node) {
var parent = node
while (parent) {
if (isElement$5(parent) && dom.getContentEditable(parent)) {
return dom.getContentEditable(parent) === 'false' ? parent : node
}
parent = parent.parentNode
}
return node
}
var walkText = function (start, node, offset, predicate) {
var str = node.data
for (var i = offset; start ? i >= 0 : i < str.length; start ? i-- : i++) {
if (predicate(str.charAt(i))) {
return start ? i + 1 : i
}
}
return -1
}
var findSpace = function (start, node, offset) {
return walkText(start, node, offset, function (c) {
return isNbsp(c) || isWhiteSpace(c)
})
}
var findContent = function (start, node, offset) {
return walkText(start, node, offset, isContent)
}
var findWordEndPoint = function (
dom,
body,
container,
offset,
start,
includeTrailingSpaces
) {
var lastTextNode
var rootNode = dom.getParent(container, dom.isBlock) || body
var walk = function (container, offset, pred) {
var textSeeker = TextSeeker(dom)
var walker = start ? textSeeker.backwards : textSeeker.forwards
return Optional.from(
walker(
container,
offset,
function (text, textOffset) {
if (isBookmarkNode(text.parentNode)) {
return -1
} else {
lastTextNode = text
return pred(start, text, textOffset)
}
},
rootNode
)
)
}
var spaceResult = walk(container, offset, findSpace)
return spaceResult
.bind(function (result) {
return includeTrailingSpaces
? walk(
result.container,
result.offset + (start ? -1 : 0),
findContent
)
: Optional.some(result)
})
.orThunk(function () {
return lastTextNode
? Optional.some({
container: lastTextNode,
offset: start ? 0 : lastTextNode.length,
})
: Optional.none()
})
}
var findSelectorEndPoint = function (
dom,
formatList,
rng,
container,
siblingName
) {
if (
isText$7(container) &&
isEmpty$3(container.data) &&
container[siblingName]
) {
container = container[siblingName]
}
var parents = getParents$1(dom, container)
for (var i = 0; i < parents.length; i++) {
for (var y = 0; y < formatList.length; y++) {
var curFormat = formatList[y]
if (
isNonNullable(curFormat.collapsed) &&
curFormat.collapsed !== rng.collapsed
) {
continue
}
if (
isSelectorFormat(curFormat) &&
dom.is(parents[i], curFormat.selector)
) {
return parents[i]
}
}
}
return container
}
var findBlockEndPoint = function (
editor,
formatList,
container,
siblingName
) {
var node = container
var dom = editor.dom
var root = dom.getRoot()
var format = formatList[0]
if (isBlockFormat(format)) {
node = format.wrapper
? null
: dom.getParent(container, format.block, root)
}
if (!node) {
var scopeRoot = dom.getParent(container, 'LI,TD,TH')
node = dom.getParent(
isText$7(container) ? container.parentNode : container,
function (node) {
return node !== root && isTextBlock(editor, node)
},
scopeRoot
)
}
if (node && isBlockFormat(format) && format.wrapper) {
node = getParents$1(dom, node, 'ul,ol').reverse()[0] || node
}
if (!node) {
node = container
while (node[siblingName] && !dom.isBlock(node[siblingName])) {
node = node[siblingName]
if (isEq$5(node, 'br')) {
break
}
}
}
return node || container
}
var isAtBlockBoundary$1 = function (dom, root, container, siblingName) {
var parent = container.parentNode
if (isNonNullable(container[siblingName])) {
return false
} else if (parent === root || isNullable(parent) || dom.isBlock(parent)) {
return true
} else {
return isAtBlockBoundary$1(dom, root, parent, siblingName)
}
}
var findParentContainer = function (
dom,
formatList,
container,
offset,
start
) {
var parent = container
var siblingName = start ? 'previousSibling' : 'nextSibling'
var root = dom.getRoot()
if (isText$7(container) && !isWhiteSpaceNode(container)) {
if (start ? offset > 0 : offset < container.data.length) {
return container
}
}
while (true) {
if (!formatList[0].block_expand && dom.isBlock(parent)) {
return parent
}
for (
var sibling = parent[siblingName];
sibling;
sibling = sibling[siblingName]
) {
var allowSpaces =
isText$7(sibling) &&
!isAtBlockBoundary$1(dom, root, sibling, siblingName)
if (
!isBookmarkNode(sibling) &&
!isBogusBr(sibling) &&
!isWhiteSpaceNode(sibling, allowSpaces)
) {
return parent
}
}
if (parent === root || parent.parentNode === root) {
container = parent
break
}
parent = parent.parentNode
}
return container
}
var isSelfOrParentBookmark = function (container) {
return isBookmarkNode(container.parentNode) || isBookmarkNode(container)
}
var expandRng = function (editor, rng, formatList, includeTrailingSpace) {
if (includeTrailingSpace === void 0) {
includeTrailingSpace = false
}
var startContainer = rng.startContainer,
startOffset = rng.startOffset,
endContainer = rng.endContainer,
endOffset = rng.endOffset
var dom = editor.dom
var format = formatList[0]
if (isElement$5(startContainer) && startContainer.hasChildNodes()) {
startContainer = getNode$1(startContainer, startOffset)
if (isText$7(startContainer)) {
startOffset = 0
}
}
if (isElement$5(endContainer) && endContainer.hasChildNodes()) {
endContainer = getNode$1(
endContainer,
rng.collapsed ? endOffset : endOffset - 1
)
if (isText$7(endContainer)) {
endOffset = endContainer.nodeValue.length
}
}
startContainer = findParentContentEditable(dom, startContainer)
endContainer = findParentContentEditable(dom, endContainer)
if (isSelfOrParentBookmark(startContainer)) {
startContainer = isBookmarkNode(startContainer)
? startContainer
: startContainer.parentNode
if (rng.collapsed) {
startContainer = startContainer.previousSibling || startContainer
} else {
startContainer = startContainer.nextSibling || startContainer
}
if (isText$7(startContainer)) {
startOffset = rng.collapsed ? startContainer.length : 0
}
}
if (isSelfOrParentBookmark(endContainer)) {
endContainer = isBookmarkNode(endContainer)
? endContainer
: endContainer.parentNode
if (rng.collapsed) {
endContainer = endContainer.nextSibling || endContainer
} else {
endContainer = endContainer.previousSibling || endContainer
}
if (isText$7(endContainer)) {
endOffset = rng.collapsed ? 0 : endContainer.length
}
}
if (rng.collapsed) {
var startPoint = findWordEndPoint(
dom,
editor.getBody(),
startContainer,
startOffset,
true,
includeTrailingSpace
)
startPoint.each(function (_a) {
var container = _a.container,
offset = _a.offset
startContainer = container
startOffset = offset
})
var endPoint = findWordEndPoint(
dom,
editor.getBody(),
endContainer,
endOffset,
false,
includeTrailingSpace
)
endPoint.each(function (_a) {
var container = _a.container,
offset = _a.offset
endContainer = container
endOffset = offset
})
}
if (isInlineFormat(format) || format.block_expand) {
if (
!isInlineFormat(format) ||
!isText$7(startContainer) ||
startOffset === 0
) {
startContainer = findParentContainer(
dom,
formatList,
startContainer,
startOffset,
true
)
}
if (
!isInlineFormat(format) ||
!isText$7(endContainer) ||
endOffset === endContainer.nodeValue.length
) {
endContainer = findParentContainer(
dom,
formatList,
endContainer,
endOffset,
false
)
}
}
if (shouldExpandToSelector(format)) {
startContainer = findSelectorEndPoint(
dom,
formatList,
rng,
startContainer,
'previousSibling'
)
endContainer = findSelectorEndPoint(
dom,
formatList,
rng,
endContainer,
'nextSibling'
)
}
if (isBlockFormat(format) || isSelectorFormat(format)) {
startContainer = findBlockEndPoint(
editor,
formatList,
startContainer,
'previousSibling'
)
endContainer = findBlockEndPoint(
editor,
formatList,
endContainer,
'nextSibling'
)
if (isBlockFormat(format)) {
if (!dom.isBlock(startContainer)) {
startContainer = findParentContainer(
dom,
formatList,
startContainer,
startOffset,
true
)
}
if (!dom.isBlock(endContainer)) {
endContainer = findParentContainer(
dom,
formatList,
endContainer,
endOffset,
false
)
}
}
}
if (isElement$5(startContainer)) {
startOffset = dom.nodeIndex(startContainer)
startContainer = startContainer.parentNode
}
if (isElement$5(endContainer)) {
endOffset = dom.nodeIndex(endContainer) + 1
endContainer = endContainer.parentNode
}
return {
startContainer: startContainer,
startOffset: startOffset,
endContainer: endContainer,
endOffset: endOffset,
}
}
var walk$2 = function (dom, rng, callback) {
var startOffset = rng.startOffset
var startContainer = getNode$1(rng.startContainer, startOffset)
var endOffset = rng.endOffset
var endContainer = getNode$1(rng.endContainer, endOffset - 1)
var exclude = function (nodes) {
var firstNode = nodes[0]
if (
isText$7(firstNode) &&
firstNode === startContainer &&
startOffset >= firstNode.data.length
) {
nodes.splice(0, 1)
}
var lastNode = nodes[nodes.length - 1]
if (
endOffset === 0 &&
nodes.length > 0 &&
lastNode === endContainer &&
isText$7(lastNode)
) {
nodes.splice(nodes.length - 1, 1)
}
return nodes
}
var collectSiblings = function (node, name, endNode) {
var siblings = []
for (; node && node !== endNode; node = node[name]) {
siblings.push(node)
}
return siblings
}
var findEndPoint = function (node, root) {
return dom.getParent(
node,
function (node) {
return node.parentNode === root
},
root
)
}
var walkBoundary = function (startNode, endNode, next) {
var siblingName = next ? 'nextSibling' : 'previousSibling'
for (
var node = startNode, parent_1 = node.parentNode;
node && node !== endNode;
node = parent_1
) {
parent_1 = node.parentNode
var siblings_1 = collectSiblings(
node === startNode ? node : node[siblingName],
siblingName
)
if (siblings_1.length) {
if (!next) {
siblings_1.reverse()
}
callback(exclude(siblings_1))
}
}
}
if (startContainer === endContainer) {
return callback(exclude([startContainer]))
}
var ancestor = dom.findCommonAncestor(startContainer, endContainer)
if (dom.isChildOf(startContainer, endContainer)) {
return walkBoundary(startContainer, ancestor, true)
}
if (dom.isChildOf(endContainer, startContainer)) {
return walkBoundary(endContainer, ancestor)
}
var startPoint = findEndPoint(startContainer, ancestor) || startContainer
var endPoint = findEndPoint(endContainer, ancestor) || endContainer
walkBoundary(startContainer, startPoint, true)
var siblings = collectSiblings(
startPoint === startContainer ? startPoint : startPoint.nextSibling,
'nextSibling',
endPoint === endContainer ? endPoint.nextSibling : endPoint
)
if (siblings.length) {
callback(exclude(siblings))
}
walkBoundary(endContainer, endPoint)
}
var getRanges = function (selection) {
var ranges = []
if (selection) {
for (var i = 0; i < selection.rangeCount; i++) {
ranges.push(selection.getRangeAt(i))
}
}
return ranges
}
var getSelectedNodes = function (ranges) {
return bind(ranges, function (range) {
var node = getSelectedNode(range)
return node ? [SugarElement.fromDom(node)] : []
})
}
var hasMultipleRanges = function (selection) {
return getRanges(selection).length > 1
}
var getCellsFromRanges = function (ranges) {
return filter$4(getSelectedNodes(ranges), isTableCell$4)
}
var getCellsFromElement = function (elm) {
return descendants(elm, 'td[data-mce-selected],th[data-mce-selected]')
}
var getCellsFromElementOrRanges = function (ranges, element) {
var selectedCells = getCellsFromElement(element)
return selectedCells.length > 0 ? selectedCells : getCellsFromRanges(ranges)
}
var getCellsFromEditor = function (editor) {
return getCellsFromElementOrRanges(
getRanges(editor.selection.getSel()),
SugarElement.fromDom(editor.getBody())
)
}
var getClosestTable = function (cell, isRoot) {
return ancestor$2(cell, 'table', isRoot)
}
var getStartNode = function (rng) {
var sc = rng.startContainer,
so = rng.startOffset
if (isText$7(sc)) {
return so === 0
? Optional.some(SugarElement.fromDom(sc))
: Optional.none()
} else {
return Optional.from(sc.childNodes[so]).map(SugarElement.fromDom)
}
}
var getEndNode = function (rng) {
var ec = rng.endContainer,
eo = rng.endOffset
if (isText$7(ec)) {
return eo === ec.data.length
? Optional.some(SugarElement.fromDom(ec))
: Optional.none()
} else {
return Optional.from(ec.childNodes[eo - 1]).map(SugarElement.fromDom)
}
}
var getFirstChildren = function (node) {
return firstChild(node).fold(constant([node]), function (child) {
return [node].concat(getFirstChildren(child))
})
}
var getLastChildren$1 = function (node) {
return lastChild(node).fold(constant([node]), function (child) {
if (name(child) === 'br') {
return prevSibling(child)
.map(function (sibling) {
return [node].concat(getLastChildren$1(sibling))
})
.getOr([])
} else {
return [node].concat(getLastChildren$1(child))
}
})
}
var hasAllContentsSelected = function (elm, rng) {
return lift2(
getStartNode(rng),
getEndNode(rng),
function (startNode, endNode) {
var start = find$3(getFirstChildren(elm), curry(eq, startNode))
var end = find$3(getLastChildren$1(elm), curry(eq, endNode))
return start.isSome() && end.isSome()
}
).getOr(false)
}
var moveEndPoint = function (dom, rng, node, start) {
var root = node,
walker = new DomTreeWalker(node, root)
var moveCaretBeforeOnEnterElementsMap = filter$3(
dom.schema.getMoveCaretBeforeOnEnterElements(),
function (_, name) {
return !contains$3(['td', 'th', 'table'], name.toLowerCase())
}
)
do {
if (isText$7(node) && Tools.trim(node.nodeValue).length !== 0) {
if (start) {
rng.setStart(node, 0)
} else {
rng.setEnd(node, node.nodeValue.length)
}
return
}
if (moveCaretBeforeOnEnterElementsMap[node.nodeName]) {
if (start) {
rng.setStartBefore(node)
} else {
if (node.nodeName === 'BR') {
rng.setEndBefore(node)
} else {
rng.setEndAfter(node)
}
}
return
}
} while ((node = start ? walker.next() : walker.prev()))
if (root.nodeName === 'BODY') {
if (start) {
rng.setStart(root, 0)
} else {
rng.setEnd(root, root.childNodes.length)
}
}
}
var hasAnyRanges = function (editor) {
var sel = editor.selection.getSel()
return sel && sel.rangeCount > 0
}
var runOnRanges = function (editor, executor) {
var fakeSelectionNodes = getCellsFromEditor(editor)
if (fakeSelectionNodes.length > 0) {
each$k(fakeSelectionNodes, function (elem) {
var node = elem.dom
var fakeNodeRng = editor.dom.createRng()
fakeNodeRng.setStartBefore(node)
fakeNodeRng.setEndAfter(node)
executor(fakeNodeRng, true)
})
} else {
executor(editor.selection.getRng(), false)
}
}
var preserve = function (selection, fillBookmark, executor) {
var bookmark = getPersistentBookmark(selection, fillBookmark)
executor(bookmark)
selection.moveToBookmark(bookmark)
}
var NodeValue = function (is, name) {
var get = function (element) {
if (!is(element)) {
throw new Error(
'Can only get ' + name + ' value of a ' + name + ' node'
)
}
return getOption(element).getOr('')
}
var getOption = function (element) {
return is(element)
? Optional.from(element.dom.nodeValue)
: Optional.none()
}
var set = function (element, value) {
if (!is(element)) {
throw new Error(
'Can only set raw ' + name + ' value of a ' + name + ' node'
)
}
element.dom.nodeValue = value
}
return {
get: get,
getOption: getOption,
set: set,
}
}
var api$1 = NodeValue(isText$8, 'text')
var get$2 = function (element) {
return api$1.get(element)
}
var isZeroWidth = function (elem) {
return isText$8(elem) && get$2(elem) === ZWSP$1
}
var context = function (editor, elem, wrapName, nodeName) {
return parent(elem).fold(
function () {
return 'skipping'
},
function (parent) {
if (nodeName === 'br' || isZeroWidth(elem)) {
return 'valid'
} else if (isAnnotation(elem)) {
return 'existing'
} else if (isCaretNode(elem.dom)) {
return 'caret'
} else if (
!isValid(editor, wrapName, nodeName) ||
!isValid(editor, name(parent), wrapName)
) {
return 'invalid-child'
} else {
return 'valid'
}
}
)
}
var applyWordGrab = function (editor, rng) {
var r = expandRng(editor, rng, [{ inline: 'span' }])
rng.setStart(r.startContainer, r.startOffset)
rng.setEnd(r.endContainer, r.endOffset)
editor.selection.setRng(rng)
}
var makeAnnotation = function (eDoc, _a, annotationName, decorate) {
var _b = _a.uid,
uid = _b === void 0 ? generate('mce-annotation') : _b,
data = __rest(_a, ['uid'])
var master = SugarElement.fromTag('span', eDoc)
add$1(master, annotation())
set$1(master, '' + dataAnnotationId(), uid)
set$1(master, '' + dataAnnotation(), annotationName)
var _c = decorate(uid, data),
_d = _c.attributes,
attributes = _d === void 0 ? {} : _d,
_e = _c.classes,
classes = _e === void 0 ? [] : _e
setAll$1(master, attributes)
add(master, classes)
return master
}
var annotate = function (editor, rng, annotationName, decorate, data) {
var newWrappers = []
var master = makeAnnotation(editor.getDoc(), data, annotationName, decorate)
var wrapper = value()
var finishWrapper = function () {
wrapper.clear()
}
var getOrOpenWrapper = function () {
return wrapper.get().getOrThunk(function () {
var nu = shallow(master)
newWrappers.push(nu)
wrapper.set(nu)
return nu
})
}
var processElements = function (elems) {
each$k(elems, processElement)
}
var processElement = function (elem) {
var ctx = context(editor, elem, 'span', name(elem))
switch (ctx) {
case 'invalid-child': {
finishWrapper()
var children$1 = children(elem)
processElements(children$1)
finishWrapper()
break
}
case 'valid': {
var w = getOrOpenWrapper()
wrap$3(elem, w)
break
}
}
}
var processNodes = function (nodes) {
var elems = map$3(nodes, SugarElement.fromDom)
processElements(elems)
}
walk$2(editor.dom, rng, function (nodes) {
finishWrapper()
processNodes(nodes)
})
return newWrappers
}
var annotateWithBookmark = function (editor, name, settings, data) {
editor.undoManager.transact(function () {
var selection = editor.selection
var initialRng = selection.getRng()
var hasFakeSelection = getCellsFromEditor(editor).length > 0
if (initialRng.collapsed && !hasFakeSelection) {
applyWordGrab(editor, initialRng)
}
if (selection.getRng().collapsed && !hasFakeSelection) {
var wrapper = makeAnnotation(
editor.getDoc(),
data,
name,
settings.decorate
)
set(wrapper, nbsp)
selection.getRng().insertNode(wrapper.dom)
selection.select(wrapper.dom)
} else {
preserve(selection, false, function () {
runOnRanges(editor, function (selectionRng) {
annotate(editor, selectionRng, name, settings.decorate, data)
})
})
}
})
}
var Annotator = function (editor) {
var registry = create$7()
setup$m(editor, registry)
var changes = setup$n(editor)
return {
register: function (name, settings) {
registry.register(name, settings)
},
annotate: function (name, data) {
registry.lookup(name).each(function (settings) {
annotateWithBookmark(editor, name, settings, data)
})
},
annotationChanged: function (name, callback) {
changes.addListener(name, callback)
},
remove: function (name) {
identify(editor, Optional.some(name)).each(function (_a) {
var elements = _a.elements
each$k(elements, unwrap)
})
},
getAll: function (name) {
var directory = findAll(editor, name)
return map$2(directory, function (elems) {
return map$3(elems, function (elem) {
return elem.dom
})
})
},
}
}
var BookmarkManager = function (selection) {
return {
getBookmark: curry(getBookmark$1, selection),
moveToBookmark: curry(moveToBookmark, selection),
}
}
BookmarkManager.isBookmarkNode = isBookmarkNode$1
var getContentEditableRoot$1 = function (root, node) {
while (node && node !== root) {
if (isContentEditableTrue$4(node) || isContentEditableFalse$b(node)) {
return node
}
node = node.parentNode
}
return null
}
var isXYWithinRange = function (clientX, clientY, range) {
if (range.collapsed) {
return false
}
if (
Env.browser.isIE() &&
range.startOffset === range.endOffset - 1 &&
range.startContainer === range.endContainer
) {
var elm = range.startContainer.childNodes[range.startOffset]
if (isElement$5(elm)) {
return exists(elm.getClientRects(), function (rect) {
return containsXY(rect, clientX, clientY)
})
}
}
return exists(range.getClientRects(), function (rect) {
return containsXY(rect, clientX, clientY)
})
}
var firePreProcess = function (editor, args) {
return editor.fire('PreProcess', args)
}
var firePostProcess = function (editor, args) {
return editor.fire('PostProcess', args)
}
var fireRemove = function (editor) {
return editor.fire('remove')
}
var fireDetach = function (editor) {
return editor.fire('detach')
}
var fireSwitchMode = function (editor, mode) {
return editor.fire('SwitchMode', { mode: mode })
}
var fireObjectResizeStart = function (editor, target, width, height, origin) {
editor.fire('ObjectResizeStart', {
target: target,
width: width,
height: height,
origin: origin,
})
}
var fireObjectResized = function (editor, target, width, height, origin) {
editor.fire('ObjectResized', {
target: target,
width: width,
height: height,
origin: origin,
})
}
var firePreInit = function (editor) {
return editor.fire('PreInit')
}
var firePostRender = function (editor) {
return editor.fire('PostRender')
}
var fireInit = function (editor) {
return editor.fire('Init')
}
var firePlaceholderToggle = function (editor, state) {
return editor.fire('PlaceholderToggle', { state: state })
}
var fireError = function (editor, errorType, error) {
return editor.fire(errorType, error)
}
var fireFormatApply = function (editor, format, node, vars) {
return editor.fire('FormatApply', {
format: format,
node: node,
vars: vars,
})
}
var fireFormatRemove = function (editor, format, node, vars) {
return editor.fire('FormatRemove', {
format: format,
node: node,
vars: vars,
})
}
var VK = {
BACKSPACE: 8,
DELETE: 46,
DOWN: 40,
ENTER: 13,
ESC: 27,
LEFT: 37,
RIGHT: 39,
SPACEBAR: 32,
TAB: 9,
UP: 38,
PAGE_UP: 33,
PAGE_DOWN: 34,
END: 35,
HOME: 36,
modifierPressed: function (e) {
return e.shiftKey || e.ctrlKey || e.altKey || VK.metaKeyPressed(e)
},
metaKeyPressed: function (e) {
return Env.mac ? e.metaKey : e.ctrlKey && !e.altKey
},
}
var isContentEditableFalse$5 = isContentEditableFalse$b
var ControlSelection = function (selection, editor) {
var elementSelectionAttr = 'data-mce-selected'
var dom = editor.dom,
each = Tools.each
var selectedElm,
selectedElmGhost,
resizeHelper,
selectedHandle,
resizeBackdrop
var startX,
startY,
selectedElmX,
selectedElmY,
startW,
startH,
ratio,
resizeStarted
var width, height
var editableDoc = editor.getDoc(),
rootDocument = document
var abs = Math.abs,
round = Math.round,
rootElement = editor.getBody()
var startScrollWidth, startScrollHeight
var resizeHandles = {
nw: [0, 0, -1, -1],
ne: [1, 0, 1, -1],
se: [1, 1, 1, 1],
sw: [0, 1, -1, 1],
}
var isImage = function (elm) {
return (
elm && (elm.nodeName === 'IMG' || editor.dom.is(elm, 'figure.image'))
)
}
var isMedia = function (elm) {
return isMedia$2(elm) || dom.hasClass(elm, 'mce-preview-object')
}
var isEventOnImageOutsideRange = function (evt, range) {
if (evt.type === 'longpress' || evt.type.indexOf('touch') === 0) {
var touch = evt.touches[0]
return (
isImage(evt.target) &&
!isXYWithinRange(touch.clientX, touch.clientY, range)
)
} else {
return (
isImage(evt.target) &&
!isXYWithinRange(evt.clientX, evt.clientY, range)
)
}
}
var contextMenuSelectImage = function (evt) {
var target = evt.target
if (
isEventOnImageOutsideRange(evt, editor.selection.getRng()) &&
!evt.isDefaultPrevented()
) {
editor.selection.select(target)
}
}
var getResizeTargets = function (elm) {
if (dom.is(elm, 'figure.image')) {
return [elm.querySelector('img')]
} else if (
dom.hasClass(elm, 'mce-preview-object') &&
isNonNullable(elm.firstElementChild)
) {
return [elm, elm.firstElementChild]
} else {
return [elm]
}
}
var isResizable = function (elm) {
var selector = getObjectResizing(editor)
if (!selector) {
return false
}
if (elm.getAttribute('data-mce-resize') === 'false') {
return false
}
if (elm === editor.getBody()) {
return false
}
if (dom.hasClass(elm, 'mce-preview-object')) {
return is$2(SugarElement.fromDom(elm.firstElementChild), selector)
} else {
return is$2(SugarElement.fromDom(elm), selector)
}
}
var createGhostElement = function (elm) {
if (isMedia(elm)) {
return dom.create('img', { src: Env.transparentSrc })
} else {
return elm.cloneNode(true)
}
}
var setSizeProp = function (element, name, value) {
if (isNonNullable(value)) {
var targets = getResizeTargets(element)
each$k(targets, function (target) {
if (
target.style[name] ||
!editor.schema.isValid(target.nodeName.toLowerCase(), name)
) {
dom.setStyle(target, name, value)
} else {
dom.setAttrib(target, name, '' + value)
}
})
}
}
var setGhostElmSize = function (ghostElm, width, height) {
setSizeProp(ghostElm, 'width', width)
setSizeProp(ghostElm, 'height', height)
}
var resizeGhostElement = function (e) {
var deltaX, deltaY, proportional
var resizeHelperX, resizeHelperY
deltaX = e.screenX - startX
deltaY = e.screenY - startY
width = deltaX * selectedHandle[2] + startW
height = deltaY * selectedHandle[3] + startH
width = width < 5 ? 5 : width
height = height < 5 ? 5 : height
if (
(isImage(selectedElm) || isMedia(selectedElm)) &&
getResizeImgProportional(editor) !== false
) {
proportional = !VK.modifierPressed(e)
} else {
proportional = VK.modifierPressed(e)
}
if (proportional) {
if (abs(deltaX) > abs(deltaY)) {
height = round(width * ratio)
width = round(height / ratio)
} else {
width = round(height / ratio)
height = round(width * ratio)
}
}
setGhostElmSize(selectedElmGhost, width, height)
resizeHelperX = selectedHandle.startPos.x + deltaX
resizeHelperY = selectedHandle.startPos.y + deltaY
resizeHelperX = resizeHelperX > 0 ? resizeHelperX : 0
resizeHelperY = resizeHelperY > 0 ? resizeHelperY : 0
dom.setStyles(resizeHelper, {
left: resizeHelperX,
top: resizeHelperY,
display: 'block',
})
resizeHelper.innerHTML = width + ' × ' + height
if (selectedHandle[2] < 0 && selectedElmGhost.clientWidth <= width) {
dom.setStyle(selectedElmGhost, 'left', selectedElmX + (startW - width))
}
if (selectedHandle[3] < 0 && selectedElmGhost.clientHeight <= height) {
dom.setStyle(selectedElmGhost, 'top', selectedElmY + (startH - height))
}
deltaX = rootElement.scrollWidth - startScrollWidth
deltaY = rootElement.scrollHeight - startScrollHeight
if (deltaX + deltaY !== 0) {
dom.setStyles(resizeHelper, {
left: resizeHelperX - deltaX,
top: resizeHelperY - deltaY,
})
}
if (!resizeStarted) {
fireObjectResizeStart(
editor,
selectedElm,
startW,
startH,
'corner-' + selectedHandle.name
)
resizeStarted = true
}
}
var endGhostResize = function () {
var wasResizeStarted = resizeStarted
resizeStarted = false
if (wasResizeStarted) {
setSizeProp(selectedElm, 'width', width)
setSizeProp(selectedElm, 'height', height)
}
dom.unbind(editableDoc, 'mousemove', resizeGhostElement)
dom.unbind(editableDoc, 'mouseup', endGhostResize)
if (rootDocument !== editableDoc) {
dom.unbind(rootDocument, 'mousemove', resizeGhostElement)
dom.unbind(rootDocument, 'mouseup', endGhostResize)
}
dom.remove(selectedElmGhost)
dom.remove(resizeHelper)
dom.remove(resizeBackdrop)
showResizeRect(selectedElm)
if (wasResizeStarted) {
fireObjectResized(
editor,
selectedElm,
width,
height,
'corner-' + selectedHandle.name
)
dom.setAttrib(selectedElm, 'style', dom.getAttrib(selectedElm, 'style'))
}
editor.nodeChanged()
}
var showResizeRect = function (targetElm) {
unbindResizeHandleEvents()
var position = dom.getPos(targetElm, rootElement)
var selectedElmX = position.x
var selectedElmY = position.y
var rect = targetElm.getBoundingClientRect()
var targetWidth = rect.width || rect.right - rect.left
var targetHeight = rect.height || rect.bottom - rect.top
if (selectedElm !== targetElm) {
hideResizeRect()
selectedElm = targetElm
width = height = 0
}
var e = editor.fire('ObjectSelected', { target: targetElm })
var selectedValue = dom.getAttrib(selectedElm, elementSelectionAttr, '1')
if (isResizable(targetElm) && !e.isDefaultPrevented()) {
each(resizeHandles, function (handle, name) {
var handleElm
var startDrag = function (e) {
var target = getResizeTargets(selectedElm)[0]
startX = e.screenX
startY = e.screenY
startW = target.clientWidth
startH = target.clientHeight
ratio = startH / startW
selectedHandle = handle
selectedHandle.name = name
selectedHandle.startPos = {
x: targetWidth * handle[0] + selectedElmX,
y: targetHeight * handle[1] + selectedElmY,
}
startScrollWidth = rootElement.scrollWidth
startScrollHeight = rootElement.scrollHeight
resizeBackdrop = dom.add(rootElement, 'div', {
class: 'mce-resize-backdrop',
'data-mce-bogus': 'all',
})
dom.setStyles(resizeBackdrop, {
position: 'fixed',
left: '0',
top: '0',
width: '100%',
height: '100%',
})
selectedElmGhost = createGhostElement(selectedElm)
dom.addClass(selectedElmGhost, 'mce-clonedresizable')
dom.setAttrib(selectedElmGhost, 'data-mce-bogus', 'all')
selectedElmGhost.contentEditable = 'false'
dom.setStyles(selectedElmGhost, {
left: selectedElmX,
top: selectedElmY,
margin: 0,
})
setGhostElmSize(selectedElmGhost, targetWidth, targetHeight)
selectedElmGhost.removeAttribute(elementSelectionAttr)
rootElement.appendChild(selectedElmGhost)
dom.bind(editableDoc, 'mousemove', resizeGhostElement)
dom.bind(editableDoc, 'mouseup', endGhostResize)
if (rootDocument !== editableDoc) {
dom.bind(rootDocument, 'mousemove', resizeGhostElement)
dom.bind(rootDocument, 'mouseup', endGhostResize)
}
resizeHelper = dom.add(
rootElement,
'div',
{
class: 'mce-resize-helper',
'data-mce-bogus': 'all',
},
startW + ' × ' + startH
)
}
handleElm = dom.get('mceResizeHandle' + name)
if (handleElm) {
dom.remove(handleElm)
}
handleElm = dom.add(rootElement, 'div', {
id: 'mceResizeHandle' + name,
'data-mce-bogus': 'all',
class: 'mce-resizehandle',
unselectable: true,
style: 'cursor:' + name + '-resize; margin:0; padding:0',
})
if (Env.ie === 11) {
handleElm.contentEditable = false
}
dom.bind(handleElm, 'mousedown', function (e) {
e.stopImmediatePropagation()
e.preventDefault()
startDrag(e)
})
handle.elm = handleElm
dom.setStyles(handleElm, {
left:
targetWidth * handle[0] +
selectedElmX -
handleElm.offsetWidth / 2,
top:
targetHeight * handle[1] +
selectedElmY -
handleElm.offsetHeight / 2,
})
})
} else {
hideResizeRect()
}
if (!dom.getAttrib(selectedElm, elementSelectionAttr)) {
selectedElm.setAttribute(elementSelectionAttr, selectedValue)
}
}
var hideResizeRect = function () {
unbindResizeHandleEvents()
if (selectedElm) {
selectedElm.removeAttribute(elementSelectionAttr)
}
each$j(resizeHandles, function (value, name) {
var handleElm = dom.get('mceResizeHandle' + name)
if (handleElm) {
dom.unbind(handleElm)
dom.remove(handleElm)
}
})
}
var updateResizeRect = function (e) {
var startElm, controlElm
var isChildOrEqual = function (node, parent) {
if (node) {
do {
if (node === parent) {
return true
}
} while ((node = node.parentNode))
}
}
if (resizeStarted || editor.removed) {
return
}
each(
dom.select('img[data-mce-selected],hr[data-mce-selected]'),
function (img) {
img.removeAttribute(elementSelectionAttr)
}
)
controlElm = e.type === 'mousedown' ? e.target : selection.getNode()
controlElm = dom
.$(controlElm)
.closest('table,img,figure.image,hr,video,span.mce-preview-object')[0]
if (isChildOrEqual(controlElm, rootElement)) {
disableGeckoResize()
startElm = selection.getStart(true)
if (
isChildOrEqual(startElm, controlElm) &&
isChildOrEqual(selection.getEnd(true), controlElm)
) {
showResizeRect(controlElm)
return
}
}
hideResizeRect()
}
var isWithinContentEditableFalse = function (elm) {
return isContentEditableFalse$5(
getContentEditableRoot$1(editor.getBody(), elm)
)
}
var unbindResizeHandleEvents = function () {
each$j(resizeHandles, function (handle) {
if (handle.elm) {
dom.unbind(handle.elm)
delete handle.elm
}
})
}
var disableGeckoResize = function () {
try {
editor.getDoc().execCommand('enableObjectResizing', false, 'false')
} catch (ex) {}
}
editor.on('init', function () {
disableGeckoResize()
if (Env.browser.isIE() || Env.browser.isEdge()) {
editor.on('mousedown click', function (e) {
var target = e.target,
nodeName = target.nodeName
if (
!resizeStarted &&
/^(TABLE|IMG|HR)$/.test(nodeName) &&
!isWithinContentEditableFalse(target)
) {
if (e.button !== 2) {
editor.selection.select(target, nodeName === 'TABLE')
}
if (e.type === 'mousedown') {
editor.nodeChanged()
}
}
})
var handleMSControlSelect_1 = function (e) {
var delayedSelect = function (node) {
Delay.setEditorTimeout(editor, function () {
return editor.selection.select(node)
})
}
if (isWithinContentEditableFalse(e.target) || isMedia$2(e.target)) {
e.preventDefault()
delayedSelect(e.target)
return
}
if (/^(TABLE|IMG|HR)$/.test(e.target.nodeName)) {
e.preventDefault()
if (e.target.tagName === 'IMG') {
delayedSelect(e.target)
}
}
}
dom.bind(rootElement, 'mscontrolselect', handleMSControlSelect_1)
editor.on('remove', function () {
return dom.unbind(
rootElement,
'mscontrolselect',
handleMSControlSelect_1
)
})
}
var throttledUpdateResizeRect = Delay.throttle(function (e) {
if (!editor.composing) {
updateResizeRect(e)
}
})
editor.on(
'nodechange ResizeEditor ResizeWindow ResizeContent drop FullscreenStateChanged',
throttledUpdateResizeRect
)
editor.on('keyup compositionend', function (e) {
if (selectedElm && selectedElm.nodeName === 'TABLE') {
throttledUpdateResizeRect(e)
}
})
editor.on('hide blur', hideResizeRect)
editor.on('contextmenu longpress', contextMenuSelectImage, true)
})
editor.on('remove', unbindResizeHandleEvents)
var destroy = function () {
selectedElm = selectedElmGhost = resizeBackdrop = null
}
return {
isResizable: isResizable,
showResizeRect: showResizeRect,
hideResizeRect: hideResizeRect,
updateResizeRect: updateResizeRect,
destroy: destroy,
}
}
var hasCeProperty = function (node) {
return isContentEditableTrue$4(node) || isContentEditableFalse$b(node)
}
var findParent$1 = function (node, rootNode, predicate) {
while (node && node !== rootNode) {
if (predicate(node)) {
return node
}
node = node.parentNode
}
return null
}
var findClosestIeRange = function (clientX, clientY, doc) {
var rects
var element = doc.elementFromPoint(clientX, clientY)
var rng = doc.body.createTextRange()
if (!element || element.tagName === 'HTML') {
element = doc.body
}
rng.moveToElementText(element)
rects = Tools.toArray(rng.getClientRects())
rects = rects.sort(function (a, b) {
a = Math.abs(Math.max(a.top - clientY, a.bottom - clientY))
b = Math.abs(Math.max(b.top - clientY, b.bottom - clientY))
return a - b
})
if (rects.length > 0) {
clientY = (rects[0].bottom + rects[0].top) / 2
try {
rng.moveToPoint(clientX, clientY)
rng.collapse(true)
return rng
} catch (ex) {}
}
return null
}
var moveOutOfContentEditableFalse = function (rng, rootNode) {
var parentElement = rng && rng.parentElement ? rng.parentElement() : null
return isContentEditableFalse$b(
findParent$1(parentElement, rootNode, hasCeProperty)
)
? null
: rng
}
var fromPoint = function (clientX, clientY, doc) {
var rng, point
var pointDoc = doc
if (pointDoc.caretPositionFromPoint) {
point = pointDoc.caretPositionFromPoint(clientX, clientY)
if (point) {
rng = doc.createRange()
rng.setStart(point.offsetNode, point.offset)
rng.collapse(true)
}
} else if (pointDoc.caretRangeFromPoint) {
rng = pointDoc.caretRangeFromPoint(clientX, clientY)
} else if (pointDoc.body.createTextRange) {
rng = pointDoc.body.createTextRange()
try {
rng.moveToPoint(clientX, clientY)
rng.collapse(true)
} catch (ex) {
rng = findClosestIeRange(clientX, clientY, doc)
}
return moveOutOfContentEditableFalse(rng, doc.body)
}
return rng
}
var isEq$4 = function (rng1, rng2) {
return (
rng1 &&
rng2 &&
rng1.startContainer === rng2.startContainer &&
rng1.startOffset === rng2.startOffset &&
rng1.endContainer === rng2.endContainer &&
rng1.endOffset === rng2.endOffset
)
}
var findParent = function (node, rootNode, predicate) {
while (node && node !== rootNode) {
if (predicate(node)) {
return node
}
node = node.parentNode
}
return null
}
var hasParent$1 = function (node, rootNode, predicate) {
return findParent(node, rootNode, predicate) !== null
}
var hasParentWithName = function (node, rootNode, name) {
return hasParent$1(node, rootNode, function (node) {
return node.nodeName === name
})
}
var isTable = function (node) {
return node && node.nodeName === 'TABLE'
}
var isTableCell$2 = function (node) {
return node && /^(TD|TH|CAPTION)$/.test(node.nodeName)
}
var isCeFalseCaretContainer = function (node, rootNode) {
return (
isCaretContainer$2(node) &&
hasParent$1(node, rootNode, isCaretNode) === false
)
}
var hasBrBeforeAfter = function (dom, node, left) {
var walker = new DomTreeWalker(
node,
dom.getParent(node.parentNode, dom.isBlock) || dom.getRoot()
)
while ((node = walker[left ? 'prev' : 'next']())) {
if (isBr$5(node)) {
return true
}
}
}
var isPrevNode = function (node, name) {
return node.previousSibling && node.previousSibling.nodeName === name
}
var hasContentEditableFalseParent = function (body, node) {
while (node && node !== body) {
if (isContentEditableFalse$b(node)) {
return true
}
node = node.parentNode
}
return false
}
var findTextNodeRelative = function (
dom,
isAfterNode,
collapsed,
left,
startNode
) {
var lastInlineElement
var body = dom.getRoot()
var node
var nonEmptyElementsMap = dom.schema.getNonEmptyElements()
var parentBlockContainer =
dom.getParent(startNode.parentNode, dom.isBlock) || body
if (
left &&
isBr$5(startNode) &&
isAfterNode &&
dom.isEmpty(parentBlockContainer)
) {
return Optional.some(
CaretPosition(startNode.parentNode, dom.nodeIndex(startNode))
)
}
var walker = new DomTreeWalker(startNode, parentBlockContainer)
while ((node = walker[left ? 'prev' : 'next']())) {
if (
dom.getContentEditableParent(node) === 'false' ||
isCeFalseCaretContainer(node, body)
) {
return Optional.none()
}
if (isText$7(node) && node.nodeValue.length > 0) {
if (hasParentWithName(node, body, 'A') === false) {
return Optional.some(
CaretPosition(node, left ? node.nodeValue.length : 0)
)
}
return Optional.none()
}
if (
dom.isBlock(node) ||
nonEmptyElementsMap[node.nodeName.toLowerCase()]
) {
return Optional.none()
}
lastInlineElement = node
}
if (collapsed && lastInlineElement) {
return Optional.some(CaretPosition(lastInlineElement, 0))
}
return Optional.none()
}
var normalizeEndPoint = function (dom, collapsed, start, rng) {
var container, offset
var body = dom.getRoot()
var node
var directionLeft,
normalized = false
container = rng[(start ? 'start' : 'end') + 'Container']
offset = rng[(start ? 'start' : 'end') + 'Offset']
var isAfterNode =
isElement$5(container) && offset === container.childNodes.length
var nonEmptyElementsMap = dom.schema.getNonEmptyElements()
directionLeft = start
if (isCaretContainer$2(container)) {
return Optional.none()
}
if (isElement$5(container) && offset > container.childNodes.length - 1) {
directionLeft = false
}
if (isDocument$1(container)) {
container = body
offset = 0
}
if (container === body) {
if (directionLeft) {
node = container.childNodes[offset > 0 ? offset - 1 : 0]
if (node) {
if (isCaretContainer$2(node)) {
return Optional.none()
}
if (nonEmptyElementsMap[node.nodeName] || isTable(node)) {
return Optional.none()
}
}
}
if (container.hasChildNodes()) {
offset = Math.min(
!directionLeft && offset > 0 ? offset - 1 : offset,
container.childNodes.length - 1
)
container = container.childNodes[offset]
offset = isText$7(container) && isAfterNode ? container.data.length : 0
if (!collapsed && container === body.lastChild && isTable(container)) {
return Optional.none()
}
if (
hasContentEditableFalseParent(body, container) ||
isCaretContainer$2(container)
) {
return Optional.none()
}
if (container.hasChildNodes() && isTable(container) === false) {
node = container
var walker = new DomTreeWalker(container, body)
do {
if (isContentEditableFalse$b(node) || isCaretContainer$2(node)) {
normalized = false
break
}
if (isText$7(node) && node.nodeValue.length > 0) {
offset = directionLeft ? 0 : node.nodeValue.length
container = node
normalized = true
break
}
if (
nonEmptyElementsMap[node.nodeName.toLowerCase()] &&
!isTableCell$2(node)
) {
offset = dom.nodeIndex(node)
container = node.parentNode
if (!directionLeft) {
offset++
}
normalized = true
break
}
} while ((node = directionLeft ? walker.next() : walker.prev()))
}
}
}
if (collapsed) {
if (isText$7(container) && offset === 0) {
findTextNodeRelative(dom, isAfterNode, collapsed, true, container).each(
function (pos) {
container = pos.container()
offset = pos.offset()
normalized = true
}
)
}
if (isElement$5(container)) {
node = container.childNodes[offset]
if (!node) {
node = container.childNodes[offset - 1]
}
if (
node &&
isBr$5(node) &&
!isPrevNode(node, 'A') &&
!hasBrBeforeAfter(dom, node, false) &&
!hasBrBeforeAfter(dom, node, true)
) {
findTextNodeRelative(dom, isAfterNode, collapsed, true, node).each(
function (pos) {
container = pos.container()
offset = pos.offset()
normalized = true
}
)
}
}
}
if (
directionLeft &&
!collapsed &&
isText$7(container) &&
offset === container.nodeValue.length
) {
findTextNodeRelative(dom, isAfterNode, collapsed, false, container).each(
function (pos) {
container = pos.container()
offset = pos.offset()
normalized = true
}
)
}
return normalized
? Optional.some(CaretPosition(container, offset))
: Optional.none()
}
var normalize$2 = function (dom, rng) {
var collapsed = rng.collapsed,
normRng = rng.cloneRange()
var startPos = CaretPosition.fromRangeStart(rng)
normalizeEndPoint(dom, collapsed, true, normRng).each(function (pos) {
if (!collapsed || !CaretPosition.isAbove(startPos, pos)) {
normRng.setStart(pos.container(), pos.offset())
}
})
if (!collapsed) {
normalizeEndPoint(dom, collapsed, false, normRng).each(function (pos) {
normRng.setEnd(pos.container(), pos.offset())
})
}
if (collapsed) {
normRng.collapse(true)
}
return isEq$4(rng, normRng) ? Optional.none() : Optional.some(normRng)
}
var splitText = function (node, offset) {
return node.splitText(offset)
}
var split = function (rng) {
var startContainer = rng.startContainer,
startOffset = rng.startOffset,
endContainer = rng.endContainer,
endOffset = rng.endOffset
if (startContainer === endContainer && isText$7(startContainer)) {
if (startOffset > 0 && startOffset < startContainer.nodeValue.length) {
endContainer = splitText(startContainer, startOffset)
startContainer = endContainer.previousSibling
if (endOffset > startOffset) {
endOffset = endOffset - startOffset
startContainer = endContainer = splitText(
endContainer,
endOffset
).previousSibling
endOffset = endContainer.nodeValue.length
startOffset = 0
} else {
endOffset = 0
}
}
} else {
if (
isText$7(startContainer) &&
startOffset > 0 &&
startOffset < startContainer.nodeValue.length
) {
startContainer = splitText(startContainer, startOffset)
startOffset = 0
}
if (
isText$7(endContainer) &&
endOffset > 0 &&
endOffset < endContainer.nodeValue.length
) {
endContainer = splitText(endContainer, endOffset).previousSibling
endOffset = endContainer.nodeValue.length
}
}
return {
startContainer: startContainer,
startOffset: startOffset,
endContainer: endContainer,
endOffset: endOffset,
}
}
var RangeUtils = function (dom) {
var walk = function (rng, callback) {
return walk$2(dom, rng, callback)
}
var split$1 = split
var normalize = function (rng) {
return normalize$2(dom, rng).fold(never, function (normalizedRng) {
rng.setStart(normalizedRng.startContainer, normalizedRng.startOffset)
rng.setEnd(normalizedRng.endContainer, normalizedRng.endOffset)
return true
})
}
return {
walk: walk,
split: split$1,
normalize: normalize,
}
}
RangeUtils.compareRanges = isEq$4
RangeUtils.getCaretRangeFromPoint = fromPoint
RangeUtils.getSelectedNode = getSelectedNode
RangeUtils.getNode = getNode$1
var Dimension = function (name, getOffset) {
var set = function (element, h) {
if (!isNumber(h) && !h.match(/^[0-9]+$/)) {
throw new Error(
name + '.set accepts only positive integer values. Value was ' + h
)
}
var dom = element.dom
if (isSupported(dom)) {
dom.style[name] = h + 'px'
}
}
var get = function (element) {
var r = getOffset(element)
if (r <= 0 || r === null) {
var css = get$5(element, name)
return parseFloat(css) || 0
}
return r
}
var getOuter = get
var aggregate = function (element, properties) {
return foldl(
properties,
function (acc, property) {
var val = get$5(element, property)
var value = val === undefined ? 0 : parseInt(val, 10)
return isNaN(value) ? acc : acc + value
},
0
)
}
var max = function (element, value, properties) {
var cumulativeInclusions = aggregate(element, properties)
var absoluteMax =
value > cumulativeInclusions ? value - cumulativeInclusions : 0
return absoluteMax
}
return {
set: set,
get: get,
getOuter: getOuter,
aggregate: aggregate,
max: max,
}
}
var api = Dimension('height', function (element) {
var dom = element.dom
return inBody(element)
? dom.getBoundingClientRect().height
: dom.offsetHeight
})
var get$1 = function (element) {
return api.get(element)
}
var walkUp = function (navigation, doc) {
var frame = navigation.view(doc)
return frame.fold(constant([]), function (f) {
var parent = navigation.owner(f)
var rest = walkUp(navigation, parent)
return [f].concat(rest)
})
}
var pathTo = function (element, navigation) {
var d = navigation.owner(element)
return walkUp(navigation, d)
}
var view = function (doc) {
var _a
var element =
doc.dom === document
? Optional.none()
: Optional.from(
(_a = doc.dom.defaultView) === null || _a === void 0
? void 0
: _a.frameElement
)
return element.map(SugarElement.fromDom)
}
var owner = function (element) {
return documentOrOwner(element)
}
var Navigation = /*#__PURE__*/ Object.freeze({
__proto__: null,
view: view,
owner: owner,
})
var find$1 = function (element) {
var doc = SugarElement.fromDom(document)
var scroll = get$8(doc)
var frames = pathTo(element, Navigation)
var offset = viewport(element)
var r = foldr(
frames,
function (b, a) {
var loc = viewport(a)
return {
left: b.left + loc.left,
top: b.top + loc.top,
}
},
{
left: 0,
top: 0,
}
)
return SugarPosition(
r.left + offset.left + scroll.left,
r.top + offset.top + scroll.top
)
}
var excludeFromDescend = function (element) {
return name(element) === 'textarea'
}
var fireScrollIntoViewEvent = function (editor, data) {
var scrollEvent = editor.fire('ScrollIntoView', data)
return scrollEvent.isDefaultPrevented()
}
var fireAfterScrollIntoViewEvent = function (editor, data) {
editor.fire('AfterScrollIntoView', data)
}
var descend = function (element, offset) {
var children$1 = children(element)
if (children$1.length === 0 || excludeFromDescend(element)) {
return {
element: element,
offset: offset,
}
} else if (
offset < children$1.length &&
!excludeFromDescend(children$1[offset])
) {
return {
element: children$1[offset],
offset: 0,
}
} else {
var last = children$1[children$1.length - 1]
if (excludeFromDescend(last)) {
return {
element: element,
offset: offset,
}
} else {
if (name(last) === 'img') {
return {
element: last,
offset: 1,
}
} else if (isText$8(last)) {
return {
element: last,
offset: get$2(last).length,
}
} else {
return {
element: last,
offset: children(last).length,
}
}
}
}
}
var markerInfo = function (element, cleanupFun) {
var pos = absolute(element)
var height = get$1(element)
return {
element: element,
bottom: pos.top + height,
height: height,
pos: pos,
cleanup: cleanupFun,
}
}
var createMarker = function (element, offset) {
var startPoint = descend(element, offset)
var span = SugarElement.fromHtml(
'' +
ZWSP$1 +
''
)
before$4(startPoint.element, span)
return markerInfo(span, function () {
return remove$7(span)
})
}
var elementMarker = function (element) {
return markerInfo(SugarElement.fromDom(element), noop)
}
var withMarker = function (editor, f, rng, alignToTop) {
preserveWith(
editor,
function (_s, _e) {
return applyWithMarker(editor, f, rng, alignToTop)
},
rng
)
}
var withScrollEvents = function (editor, doc, f, marker, alignToTop) {
var data = {
elm: marker.element.dom,
alignToTop: alignToTop,
}
if (fireScrollIntoViewEvent(editor, data)) {
return
}
var scrollTop = get$8(doc).top
f(doc, scrollTop, marker, alignToTop)
fireAfterScrollIntoViewEvent(editor, data)
}
var applyWithMarker = function (editor, f, rng, alignToTop) {
var body = SugarElement.fromDom(editor.getBody())
var doc = SugarElement.fromDom(editor.getDoc())
reflow(body)
var marker = createMarker(
SugarElement.fromDom(rng.startContainer),
rng.startOffset
)
withScrollEvents(editor, doc, f, marker, alignToTop)
marker.cleanup()
}
var withElement = function (editor, element, f, alignToTop) {
var doc = SugarElement.fromDom(editor.getDoc())
withScrollEvents(editor, doc, f, elementMarker(element), alignToTop)
}
var preserveWith = function (editor, f, rng) {
var startElement = rng.startContainer
var startOffset = rng.startOffset
var endElement = rng.endContainer
var endOffset = rng.endOffset
f(SugarElement.fromDom(startElement), SugarElement.fromDom(endElement))
var newRng = editor.dom.createRng()
newRng.setStart(startElement, startOffset)
newRng.setEnd(endElement, endOffset)
editor.selection.setRng(rng)
}
var scrollToMarker = function (marker, viewHeight, alignToTop, doc) {
var pos = marker.pos
if (alignToTop) {
to(pos.left, pos.top, doc)
} else {
var y = pos.top - viewHeight + marker.height
to(pos.left, y, doc)
}
}
var intoWindowIfNeeded = function (
doc,
scrollTop,
viewHeight,
marker,
alignToTop
) {
var viewportBottom = viewHeight + scrollTop
var markerTop = marker.pos.top
var markerBottom = marker.bottom
var largerThanViewport = markerBottom - markerTop >= viewHeight
if (markerTop < scrollTop) {
scrollToMarker(marker, viewHeight, alignToTop !== false, doc)
} else if (markerTop > viewportBottom) {
var align = largerThanViewport
? alignToTop !== false
: alignToTop === true
scrollToMarker(marker, viewHeight, align, doc)
} else if (markerBottom > viewportBottom && !largerThanViewport) {
scrollToMarker(marker, viewHeight, alignToTop === true, doc)
}
}
var intoWindow = function (doc, scrollTop, marker, alignToTop) {
var viewHeight = doc.dom.defaultView.innerHeight
intoWindowIfNeeded(doc, scrollTop, viewHeight, marker, alignToTop)
}
var intoFrame = function (doc, scrollTop, marker, alignToTop) {
var frameViewHeight = doc.dom.defaultView.innerHeight
intoWindowIfNeeded(doc, scrollTop, frameViewHeight, marker, alignToTop)
var op = find$1(marker.element)
var viewportBounds = getBounds(window)
if (op.top < viewportBounds.y) {
intoView(marker.element, alignToTop !== false)
} else if (op.top > viewportBounds.bottom) {
intoView(marker.element, alignToTop === true)
}
}
var rangeIntoWindow = function (editor, rng, alignToTop) {
return withMarker(editor, intoWindow, rng, alignToTop)
}
var elementIntoWindow = function (editor, element, alignToTop) {
return withElement(editor, element, intoWindow, alignToTop)
}
var rangeIntoFrame = function (editor, rng, alignToTop) {
return withMarker(editor, intoFrame, rng, alignToTop)
}
var elementIntoFrame = function (editor, element, alignToTop) {
return withElement(editor, element, intoFrame, alignToTop)
}
var scrollElementIntoView = function (editor, element, alignToTop) {
var scroller = editor.inline ? elementIntoWindow : elementIntoFrame
scroller(editor, element, alignToTop)
}
var scrollRangeIntoView = function (editor, rng, alignToTop) {
var scroller = editor.inline ? rangeIntoWindow : rangeIntoFrame
scroller(editor, rng, alignToTop)
}
var getDocument = function () {
return SugarElement.fromDom(document)
}
var focus$1 = function (element) {
return element.dom.focus()
}
var hasFocus$1 = function (element) {
var root = getRootNode(element).dom
return element.dom === root.activeElement
}
var active = function (root) {
if (root === void 0) {
root = getDocument()
}
return Optional.from(root.dom.activeElement).map(SugarElement.fromDom)
}
var search = function (element) {
return active(getRootNode(element)).filter(function (e) {
return element.dom.contains(e.dom)
})
}
var create$5 = function (start, soffset, finish, foffset) {
return {
start: start,
soffset: soffset,
finish: finish,
foffset: foffset,
}
}
var SimRange = { create: create$5 }
var adt$1 = Adt.generate([
{ before: ['element'] },
{
on: ['element', 'offset'],
},
{ after: ['element'] },
])
var cata = function (subject, onBefore, onOn, onAfter) {
return subject.fold(onBefore, onOn, onAfter)
}
var getStart$2 = function (situ) {
return situ.fold(identity, identity, identity)
}
var before$1 = adt$1.before
var on = adt$1.on
var after$1 = adt$1.after
var Situ = {
before: before$1,
on: on,
after: after$1,
cata: cata,
getStart: getStart$2,
}
var adt = Adt.generate([
{ domRange: ['rng'] },
{
relative: ['startSitu', 'finishSitu'],
},
{
exact: ['start', 'soffset', 'finish', 'foffset'],
},
])
var exactFromRange = function (simRange) {
return adt.exact(
simRange.start,
simRange.soffset,
simRange.finish,
simRange.foffset
)
}
var getStart$1 = function (selection) {
return selection.match({
domRange: function (rng) {
return SugarElement.fromDom(rng.startContainer)
},
relative: function (startSitu, _finishSitu) {
return Situ.getStart(startSitu)
},
exact: function (start, _soffset, _finish, _foffset) {
return start
},
})
}
var domRange = adt.domRange
var relative = adt.relative
var exact = adt.exact
var getWin = function (selection) {
var start = getStart$1(selection)
return defaultView(start)
}
var range = SimRange.create
var SimSelection = {
domRange: domRange,
relative: relative,
exact: exact,
exactFromRange: exactFromRange,
getWin: getWin,
range: range,
}
var browser$1 = detect().browser
var clamp$1 = function (offset, element) {
var max = isText$8(element)
? get$2(element).length
: children(element).length + 1
if (offset > max) {
return max
} else if (offset < 0) {
return 0
}
return offset
}
var normalizeRng = function (rng) {
return SimSelection.range(
rng.start,
clamp$1(rng.soffset, rng.start),
rng.finish,
clamp$1(rng.foffset, rng.finish)
)
}
var isOrContains = function (root, elm) {
return (
!isRestrictedNode(elm.dom) && (contains$1(root, elm) || eq(root, elm))
)
}
var isRngInRoot = function (root) {
return function (rng) {
return isOrContains(root, rng.start) && isOrContains(root, rng.finish)
}
}
var shouldStore = function (editor) {
return editor.inline === true || browser$1.isIE()
}
var nativeRangeToSelectionRange = function (r) {
return SimSelection.range(
SugarElement.fromDom(r.startContainer),
r.startOffset,
SugarElement.fromDom(r.endContainer),
r.endOffset
)
}
var readRange = function (win) {
var selection = win.getSelection()
var rng =
!selection || selection.rangeCount === 0
? Optional.none()
: Optional.from(selection.getRangeAt(0))
return rng.map(nativeRangeToSelectionRange)
}
var getBookmark = function (root) {
var win = defaultView(root)
return readRange(win.dom).filter(isRngInRoot(root))
}
var validate = function (root, bookmark) {
return Optional.from(bookmark).filter(isRngInRoot(root)).map(normalizeRng)
}
var bookmarkToNativeRng = function (bookmark) {
var rng = document.createRange()
try {
rng.setStart(bookmark.start.dom, bookmark.soffset)
rng.setEnd(bookmark.finish.dom, bookmark.foffset)
return Optional.some(rng)
} catch (_) {
return Optional.none()
}
}
var store = function (editor) {
var newBookmark = shouldStore(editor)
? getBookmark(SugarElement.fromDom(editor.getBody()))
: Optional.none()
editor.bookmark = newBookmark.isSome() ? newBookmark : editor.bookmark
}
var storeNative = function (editor, rng) {
var root = SugarElement.fromDom(editor.getBody())
var range = shouldStore(editor) ? Optional.from(rng) : Optional.none()
var newBookmark = range
.map(nativeRangeToSelectionRange)
.filter(isRngInRoot(root))
editor.bookmark = newBookmark.isSome() ? newBookmark : editor.bookmark
}
var getRng = function (editor) {
var bookmark = editor.bookmark ? editor.bookmark : Optional.none()
return bookmark
.bind(function (x) {
return validate(SugarElement.fromDom(editor.getBody()), x)
})
.bind(bookmarkToNativeRng)
}
var restore = function (editor) {
getRng(editor).each(function (rng) {
return editor.selection.setRng(rng)
})
}
var isEditorUIElement$1 = function (elm) {
var className = elm.className.toString()
return className.indexOf('tox-') !== -1 || className.indexOf('mce-') !== -1
}
var FocusManager = { isEditorUIElement: isEditorUIElement$1 }
var isManualNodeChange = function (e) {
return e.type === 'nodechange' && e.selectionChange
}
var registerPageMouseUp = function (editor, throttledStore) {
var mouseUpPage = function () {
throttledStore.throttle()
}
DOMUtils.DOM.bind(document, 'mouseup', mouseUpPage)
editor.on('remove', function () {
DOMUtils.DOM.unbind(document, 'mouseup', mouseUpPage)
})
}
var registerFocusOut = function (editor) {
editor.on('focusout', function () {
store(editor)
})
}
var registerMouseUp = function (editor, throttledStore) {
editor.on('mouseup touchend', function (_e) {
throttledStore.throttle()
})
}
var registerEditorEvents = function (editor, throttledStore) {
var browser = detect().browser
if (browser.isIE()) {
registerFocusOut(editor)
} else {
registerMouseUp(editor, throttledStore)
}
editor.on('keyup NodeChange', function (e) {
if (!isManualNodeChange(e)) {
store(editor)
}
})
}
var register$3 = function (editor) {
var throttledStore = first(function () {
store(editor)
}, 0)
editor.on('init', function () {
if (editor.inline) {
registerPageMouseUp(editor, throttledStore)
}
registerEditorEvents(editor, throttledStore)
})
editor.on('remove', function () {
throttledStore.cancel()
})
}
var documentFocusInHandler
var DOM$8 = DOMUtils.DOM
var isEditorUIElement = function (elm) {
return FocusManager.isEditorUIElement(elm)
}
var isEditorContentAreaElement = function (elm) {
var classList = elm.classList
if (classList !== undefined) {
return (
classList.contains('tox-edit-area') ||
classList.contains('tox-edit-area__iframe') ||
classList.contains('mce-content-body')
)
} else {
return false
}
}
var isUIElement = function (editor, elm) {
var customSelector = getCustomUiSelector(editor)
var parent = DOM$8.getParent(elm, function (elm) {
return (
isEditorUIElement(elm) ||
(customSelector ? editor.dom.is(elm, customSelector) : false)
)
})
return parent !== null
}
var getActiveElement = function (editor) {
try {
var root = getRootNode(SugarElement.fromDom(editor.getElement()))
return active(root).fold(
function () {
return document.body
},
function (x) {
return x.dom
}
)
} catch (ex) {
return document.body
}
}
var registerEvents$1 = function (editorManager, e) {
var editor = e.editor
register$3(editor)
editor.on('focusin', function () {
var focusedEditor = editorManager.focusedEditor
if (focusedEditor !== editor) {
if (focusedEditor) {
focusedEditor.fire('blur', { focusedEditor: editor })
}
editorManager.setActive(editor)
editorManager.focusedEditor = editor
editor.fire('focus', { blurredEditor: focusedEditor })
editor.focus(true)
}
})
editor.on('focusout', function () {
Delay.setEditorTimeout(editor, function () {
var focusedEditor = editorManager.focusedEditor
if (
!isUIElement(editor, getActiveElement(editor)) &&
focusedEditor === editor
) {
editor.fire('blur', { focusedEditor: null })
editorManager.focusedEditor = null
}
})
})
if (!documentFocusInHandler) {
documentFocusInHandler = function (e) {
var activeEditor = editorManager.activeEditor
if (activeEditor) {
getOriginalEventTarget(e).each(function (target) {
if (target.ownerDocument === document) {
if (
target !== document.body &&
!isUIElement(activeEditor, target) &&
editorManager.focusedEditor === activeEditor
) {
activeEditor.fire('blur', { focusedEditor: null })
editorManager.focusedEditor = null
}
}
})
}
}
DOM$8.bind(document, 'focusin', documentFocusInHandler)
}
}
var unregisterDocumentEvents = function (editorManager, e) {
if (editorManager.focusedEditor === e.editor) {
editorManager.focusedEditor = null
}
if (!editorManager.activeEditor) {
DOM$8.unbind(document, 'focusin', documentFocusInHandler)
documentFocusInHandler = null
}
}
var setup$l = function (editorManager) {
editorManager.on('AddEditor', curry(registerEvents$1, editorManager))
editorManager.on(
'RemoveEditor',
curry(unregisterDocumentEvents, editorManager)
)
}
var getContentEditableHost = function (editor, node) {
return editor.dom.getParent(node, function (node) {
return editor.dom.getContentEditable(node) === 'true'
})
}
var getCollapsedNode = function (rng) {
return rng.collapsed
? Optional.from(getNode$1(rng.startContainer, rng.startOffset)).map(
SugarElement.fromDom
)
: Optional.none()
}
var getFocusInElement = function (root, rng) {
return getCollapsedNode(rng).bind(function (node) {
if (isTableSection(node)) {
return Optional.some(node)
} else if (contains$1(root, node) === false) {
return Optional.some(root)
} else {
return Optional.none()
}
})
}
var normalizeSelection$1 = function (editor, rng) {
getFocusInElement(SugarElement.fromDom(editor.getBody()), rng)
.bind(function (elm) {
return firstPositionIn(elm.dom)
})
.fold(
function () {
editor.selection.normalize()
return
},
function (caretPos) {
return editor.selection.setRng(caretPos.toRange())
}
)
}
var focusBody = function (body) {
if (body.setActive) {
try {
body.setActive()
} catch (ex) {
body.focus()
}
} else {
body.focus()
}
}
var hasElementFocus = function (elm) {
return hasFocus$1(elm) || search(elm).isSome()
}
var hasIframeFocus = function (editor) {
return (
editor.iframeElement &&
hasFocus$1(SugarElement.fromDom(editor.iframeElement))
)
}
var hasInlineFocus = function (editor) {
var rawBody = editor.getBody()
return rawBody && hasElementFocus(SugarElement.fromDom(rawBody))
}
var hasUiFocus = function (editor) {
var dos = getRootNode(SugarElement.fromDom(editor.getElement()))
return active(dos)
.filter(function (elem) {
return (
!isEditorContentAreaElement(elem.dom) && isUIElement(editor, elem.dom)
)
})
.isSome()
}
var hasFocus = function (editor) {
return editor.inline ? hasInlineFocus(editor) : hasIframeFocus(editor)
}
var hasEditorOrUiFocus = function (editor) {
return hasFocus(editor) || hasUiFocus(editor)
}
var focusEditor = function (editor) {
var selection = editor.selection
var body = editor.getBody()
var rng = selection.getRng()
editor.quirks.refreshContentEditable()
if (editor.bookmark !== undefined && hasFocus(editor) === false) {
getRng(editor).each(function (bookmarkRng) {
editor.selection.setRng(bookmarkRng)
rng = bookmarkRng
})
}
var contentEditableHost = getContentEditableHost(
editor,
selection.getNode()
)
if (editor.$.contains(body, contentEditableHost)) {
focusBody(contentEditableHost)
normalizeSelection$1(editor, rng)
activateEditor(editor)
return
}
if (!editor.inline) {
if (!Env.opera) {
focusBody(body)
}
editor.getWin().focus()
}
if (Env.gecko || editor.inline) {
focusBody(body)
normalizeSelection$1(editor, rng)
}
activateEditor(editor)
}
var activateEditor = function (editor) {
return editor.editorManager.setActive(editor)
}
var focus = function (editor, skipFocus) {
if (editor.removed) {
return
}
if (skipFocus) {
activateEditor(editor)
} else {
focusEditor(editor)
}
}
var getEndpointElement = function (root, rng, start, real, resolve) {
var container = start ? rng.startContainer : rng.endContainer
var offset = start ? rng.startOffset : rng.endOffset
return Optional.from(container)
.map(SugarElement.fromDom)
.map(function (elm) {
return !real || !rng.collapsed
? child$1(elm, resolve(elm, offset)).getOr(elm)
: elm
})
.bind(function (elm) {
return isElement$6(elm)
? Optional.some(elm)
: parent(elm).filter(isElement$6)
})
.map(function (elm) {
return elm.dom
})
.getOr(root)
}
var getStart = function (root, rng, real) {
return getEndpointElement(root, rng, true, real, function (elm, offset) {
return Math.min(childNodesCount(elm), offset)
})
}
var getEnd = function (root, rng, real) {
return getEndpointElement(root, rng, false, real, function (elm, offset) {
return offset > 0 ? offset - 1 : offset
})
}
var skipEmptyTextNodes = function (node, forwards) {
var orig = node
while (node && isText$7(node) && node.length === 0) {
node = forwards ? node.nextSibling : node.previousSibling
}
return node || orig
}
var getNode = function (root, rng) {
var elm, startContainer, endContainer
if (!rng) {
return root
}
startContainer = rng.startContainer
endContainer = rng.endContainer
var startOffset = rng.startOffset
var endOffset = rng.endOffset
elm = rng.commonAncestorContainer
if (!rng.collapsed) {
if (startContainer === endContainer) {
if (endOffset - startOffset < 2) {
if (startContainer.hasChildNodes()) {
elm = startContainer.childNodes[startOffset]
}
}
}
if (startContainer.nodeType === 3 && endContainer.nodeType === 3) {
if (startContainer.length === startOffset) {
startContainer = skipEmptyTextNodes(startContainer.nextSibling, true)
} else {
startContainer = startContainer.parentNode
}
if (endOffset === 0) {
endContainer = skipEmptyTextNodes(endContainer.previousSibling, false)
} else {
endContainer = endContainer.parentNode
}
if (startContainer && startContainer === endContainer) {
return startContainer
}
}
}
if (elm && elm.nodeType === 3) {
return elm.parentNode
}
return elm
}
var getSelectedBlocks = function (dom, rng, startElm, endElm) {
var node
var selectedBlocks = []
var root = dom.getRoot()
startElm = dom.getParent(
startElm || getStart(root, rng, rng.collapsed),
dom.isBlock
)
endElm = dom.getParent(
endElm || getEnd(root, rng, rng.collapsed),
dom.isBlock
)
if (startElm && startElm !== root) {
selectedBlocks.push(startElm)
}
if (startElm && endElm && startElm !== endElm) {
node = startElm
var walker = new DomTreeWalker(startElm, root)
while ((node = walker.next()) && node !== endElm) {
if (dom.isBlock(node)) {
selectedBlocks.push(node)
}
}
}
if (endElm && startElm !== endElm && endElm !== root) {
selectedBlocks.push(endElm)
}
return selectedBlocks
}
var select = function (dom, node, content) {
return Optional.from(node).map(function (node) {
var idx = dom.nodeIndex(node)
var rng = dom.createRng()
rng.setStart(node.parentNode, idx)
rng.setEnd(node.parentNode, idx + 1)
if (content) {
moveEndPoint(dom, rng, node, true)
moveEndPoint(dom, rng, node, false)
}
return rng
})
}
var processRanges = function (editor, ranges) {
return map$3(ranges, function (range) {
var evt = editor.fire('GetSelectionRange', { range: range })
return evt.range !== range ? evt.range : range
})
}
var typeLookup = {
'#text': 3,
'#comment': 8,
'#cdata': 4,
'#pi': 7,
'#doctype': 10,
'#document-fragment': 11,
}
var walk$1 = function (node, root, prev) {
var startName = prev ? 'lastChild' : 'firstChild'
var siblingName = prev ? 'prev' : 'next'
if (node[startName]) {
return node[startName]
}
if (node !== root) {
var sibling = node[siblingName]
if (sibling) {
return sibling
}
for (
var parent_1 = node.parent;
parent_1 && parent_1 !== root;
parent_1 = parent_1.parent
) {
sibling = parent_1[siblingName]
if (sibling) {
return sibling
}
}
}
}
var isEmptyTextNode = function (node) {
if (!isWhitespaceText(node.value)) {
return false
}
var parentNode = node.parent
if (
parentNode &&
(parentNode.name !== 'span' || parentNode.attr('style')) &&
/^[ ]+$/.test(node.value)
) {
return false
}
return true
}
var isNonEmptyElement = function (node) {
var isNamedAnchor =
node.name === 'a' && !node.attr('href') && node.attr('id')
return (
node.attr('name') ||
(node.attr('id') && !node.firstChild) ||
node.attr('data-mce-bookmark') ||
isNamedAnchor
)
}
var AstNode = (function () {
function AstNode(name, type) {
this.name = name
this.type = type
if (type === 1) {
this.attributes = []
this.attributes.map = {}
}
}
AstNode.create = function (name, attrs) {
var node = new AstNode(name, typeLookup[name] || 1)
if (attrs) {
each$j(attrs, function (value, attrName) {
node.attr(attrName, value)
})
}
return node
}
AstNode.prototype.replace = function (node) {
var self = this
if (node.parent) {
node.remove()
}
self.insert(node, self)
self.remove()
return self
}
AstNode.prototype.attr = function (name, value) {
var self = this
var attrs
if (typeof name !== 'string') {
if (name !== undefined && name !== null) {
each$j(name, function (value, key) {
self.attr(key, value)
})
}
return self
}
if ((attrs = self.attributes)) {
if (value !== undefined) {
if (value === null) {
if (name in attrs.map) {
delete attrs.map[name]
var i = attrs.length
while (i--) {
if (attrs[i].name === name) {
attrs.splice(i, 1)
return self
}
}
}
return self
}
if (name in attrs.map) {
var i = attrs.length
while (i--) {
if (attrs[i].name === name) {
attrs[i].value = value
break
}
}
} else {
attrs.push({
name: name,
value: value,
})
}
attrs.map[name] = value
return self
}
return attrs.map[name]
}
}
AstNode.prototype.clone = function () {
var self = this
var clone = new AstNode(self.name, self.type)
var selfAttrs
if ((selfAttrs = self.attributes)) {
var cloneAttrs = []
cloneAttrs.map = {}
for (var i = 0, l = selfAttrs.length; i < l; i++) {
var selfAttr = selfAttrs[i]
if (selfAttr.name !== 'id') {
cloneAttrs[cloneAttrs.length] = {
name: selfAttr.name,
value: selfAttr.value,
}
cloneAttrs.map[selfAttr.name] = selfAttr.value
}
}
clone.attributes = cloneAttrs
}
clone.value = self.value
clone.shortEnded = self.shortEnded
return clone
}
AstNode.prototype.wrap = function (wrapper) {
var self = this
self.parent.insert(wrapper, self)
wrapper.append(self)
return self
}
AstNode.prototype.unwrap = function () {
var self = this
for (var node = self.firstChild; node; ) {
var next = node.next
self.insert(node, self, true)
node = next
}
self.remove()
}
AstNode.prototype.remove = function () {
var self = this,
parent = self.parent,
next = self.next,
prev = self.prev
if (parent) {
if (parent.firstChild === self) {
parent.firstChild = next
if (next) {
next.prev = null
}
} else {
prev.next = next
}
if (parent.lastChild === self) {
parent.lastChild = prev
if (prev) {
prev.next = null
}
} else {
next.prev = prev
}
self.parent = self.next = self.prev = null
}
return self
}
AstNode.prototype.append = function (node) {
var self = this
if (node.parent) {
node.remove()
}
var last = self.lastChild
if (last) {
last.next = node
node.prev = last
self.lastChild = node
} else {
self.lastChild = self.firstChild = node
}
node.parent = self
return node
}
AstNode.prototype.insert = function (node, refNode, before) {
if (node.parent) {
node.remove()
}
var parent = refNode.parent || this
if (before) {
if (refNode === parent.firstChild) {
parent.firstChild = node
} else {
refNode.prev.next = node
}
node.prev = refNode.prev
node.next = refNode
refNode.prev = node
} else {
if (refNode === parent.lastChild) {
parent.lastChild = node
} else {
refNode.next.prev = node
}
node.next = refNode.next
node.prev = refNode
refNode.next = node
}
node.parent = parent
return node
}
AstNode.prototype.getAll = function (name) {
var self = this
var collection = []
for (var node = self.firstChild; node; node = walk$1(node, self)) {
if (node.name === name) {
collection.push(node)
}
}
return collection
}
AstNode.prototype.children = function () {
var self = this
var collection = []
for (var node = self.firstChild; node; node = node.next) {
collection.push(node)
}
return collection
}
AstNode.prototype.empty = function () {
var self = this
if (self.firstChild) {
var nodes = []
for (var node = self.firstChild; node; node = walk$1(node, self)) {
nodes.push(node)
}
var i = nodes.length
while (i--) {
var node = nodes[i]
node.parent =
node.firstChild =
node.lastChild =
node.next =
node.prev =
null
}
}
self.firstChild = self.lastChild = null
return self
}
AstNode.prototype.isEmpty = function (elements, whitespace, predicate) {
if (whitespace === void 0) {
whitespace = {}
}
var self = this
var node = self.firstChild
if (isNonEmptyElement(self)) {
return false
}
if (node) {
do {
if (node.type === 1) {
if (node.attr('data-mce-bogus')) {
continue
}
if (elements[node.name]) {
return false
}
if (isNonEmptyElement(node)) {
return false
}
}
if (node.type === 8) {
return false
}
if (node.type === 3 && !isEmptyTextNode(node)) {
return false
}
if (
node.type === 3 &&
node.parent &&
whitespace[node.parent.name] &&
isWhitespaceText(node.value)
) {
return false
}
if (predicate && predicate(node)) {
return false
}
} while ((node = walk$1(node, self)))
}
return true
}
AstNode.prototype.walk = function (prev) {
return walk$1(this, null, prev)
}
return AstNode
})()
var extractBase64DataUris = function (html) {
var dataImageUri = /data:[^;]+;base64,([a-z0-9\+\/=\s]+)/gi
var chunks = []
var uris = {}
var prefix = generate('img')
var matches
var index = 0
var count = 0
while ((matches = dataImageUri.exec(html))) {
var uri = matches[0]
var imageId = prefix + '_' + count++
uris[imageId] = uri
if (index < matches.index) {
chunks.push(html.substr(index, matches.index - index))
}
chunks.push(imageId)
index = matches.index + uri.length
}
var re = new RegExp(prefix + '_[0-9]+', 'g')
if (index === 0) {
return {
prefix: prefix,
uris: uris,
html: html,
re: re,
}
} else {
if (index < html.length) {
chunks.push(html.substr(index))
}
return {
prefix: prefix,
uris: uris,
html: chunks.join(''),
re: re,
}
}
}
var restoreDataUris = function (html, result) {
return html.replace(result.re, function (imageId) {
return get$9(result.uris, imageId).getOr(imageId)
})
}
var parseDataUri$1 = function (uri) {
var matches = /data:([^;]+);base64,([a-z0-9\+\/=\s]+)/i.exec(uri)
if (matches) {
return Optional.some({
type: matches[1],
data: decodeURIComponent(matches[2]),
})
} else {
return Optional.none()
}
}
var each$d = Tools.each,
trim = Tools.trim
var queryParts =
'source protocol authority userInfo user password host port relative path directory file query anchor'.split(
' '
)
var DEFAULT_PORTS = {
ftp: 21,
http: 80,
https: 443,
mailto: 25,
}
var safeSvgDataUrlElements = ['img', 'video']
var blockSvgDataUris = function (allowSvgDataUrls, tagName) {
if (isNonNullable(allowSvgDataUrls)) {
return !allowSvgDataUrls
} else {
return isNonNullable(tagName)
? !contains$3(safeSvgDataUrlElements, tagName)
: true
}
}
var isInvalidUri = function (settings, uri, tagName) {
if (settings.allow_html_data_urls) {
return false
} else if (/^data:image\//i.test(uri)) {
return (
blockSvgDataUris(settings.allow_svg_data_urls, tagName) &&
/^data:image\/svg\+xml/i.test(uri)
)
} else {
return /^data:/i.test(uri)
}
}
var URI = (function () {
function URI(url, settings) {
url = trim(url)
this.settings = settings || {}
var baseUri = this.settings.base_uri
var self = this
if (/^([\w\-]+):([^\/]{2})/i.test(url) || /^\s*#/.test(url)) {
self.source = url
return
}
var isProtocolRelative = url.indexOf('//') === 0
if (url.indexOf('/') === 0 && !isProtocolRelative) {
url =
(baseUri ? baseUri.protocol || 'http' : 'http') + '://mce_host' + url
}
if (!/^[\w\-]*:?\/\//.test(url)) {
var baseUrl = this.settings.base_uri
? this.settings.base_uri.path
: new URI(document.location.href).directory
if (this.settings.base_uri && this.settings.base_uri.protocol == '') {
url = '//mce_host' + self.toAbsPath(baseUrl, url)
} else {
var match = /([^#?]*)([#?]?.*)/.exec(url)
url =
((baseUri && baseUri.protocol) || 'http') +
'://mce_host' +
self.toAbsPath(baseUrl, match[1]) +
match[2]
}
}
url = url.replace(/@@/g, '(mce_at)')
var urlMatch =
/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?(\[[a-zA-Z0-9:.%]+\]|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(
url
)
each$d(queryParts, function (v, i) {
var part = urlMatch[i]
if (part) {
part = part.replace(/\(mce_at\)/g, '@@')
}
self[v] = part
})
if (baseUri) {
if (!self.protocol) {
self.protocol = baseUri.protocol
}
if (!self.userInfo) {
self.userInfo = baseUri.userInfo
}
if (!self.port && self.host === 'mce_host') {
self.port = baseUri.port
}
if (!self.host || self.host === 'mce_host') {
self.host = baseUri.host
}
self.source = ''
}
if (isProtocolRelative) {
self.protocol = ''
}
}
URI.parseDataUri = function (uri) {
var type
var uriComponents = decodeURIComponent(uri).split(',')
var matches = /data:([^;]+)/.exec(uriComponents[0])
if (matches) {
type = matches[1]
}
return {
type: type,
data: uriComponents[1],
}
}
URI.isDomSafe = function (uri, context, options) {
if (options === void 0) {
options = {}
}
if (options.allow_script_urls) {
return true
} else {
var decodedUri = Entities.decode(uri).replace(/[\s\u0000-\u001F]+/g, '')
try {
decodedUri = decodeURIComponent(decodedUri)
} catch (ex) {
decodedUri = unescape(decodedUri)
}
if (/((java|vb)script|mhtml):/i.test(decodedUri)) {
return false
}
return !isInvalidUri(options, decodedUri, context)
}
}
URI.getDocumentBaseUrl = function (loc) {
var baseUrl
if (loc.protocol.indexOf('http') !== 0 && loc.protocol !== 'file:') {
baseUrl = loc.href
} else {
baseUrl = loc.protocol + '//' + loc.host + loc.pathname
}
if (/^[^:]+:\/\/\/?[^\/]+\//.test(baseUrl)) {
baseUrl = baseUrl.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '')
if (!/[\/\\]$/.test(baseUrl)) {
baseUrl += '/'
}
}
return baseUrl
}
URI.prototype.setPath = function (path) {
var pathMatch = /^(.*?)\/?(\w+)?$/.exec(path)
this.path = pathMatch[0]
this.directory = pathMatch[1]
this.file = pathMatch[2]
this.source = ''
this.getURI()
}
URI.prototype.toRelative = function (uri) {
var output
if (uri === './') {
return uri
}
var relativeUri = new URI(uri, { base_uri: this })
if (
(relativeUri.host !== 'mce_host' &&
this.host !== relativeUri.host &&
relativeUri.host) ||
this.port !== relativeUri.port ||
(this.protocol !== relativeUri.protocol && relativeUri.protocol !== '')
) {
return relativeUri.getURI()
}
var tu = this.getURI(),
uu = relativeUri.getURI()
if (
tu === uu ||
(tu.charAt(tu.length - 1) === '/' && tu.substr(0, tu.length - 1) === uu)
) {
return tu
}
output = this.toRelPath(this.path, relativeUri.path)
if (relativeUri.query) {
output += '?' + relativeUri.query
}
if (relativeUri.anchor) {
output += '#' + relativeUri.anchor
}
return output
}
URI.prototype.toAbsolute = function (uri, noHost) {
var absoluteUri = new URI(uri, { base_uri: this })
return absoluteUri.getURI(noHost && this.isSameOrigin(absoluteUri))
}
URI.prototype.isSameOrigin = function (uri) {
if (this.host == uri.host && this.protocol == uri.protocol) {
if (this.port == uri.port) {
return true
}
var defaultPort = DEFAULT_PORTS[this.protocol]
if (
defaultPort &&
(this.port || defaultPort) == (uri.port || defaultPort)
) {
return true
}
}
return false
}
URI.prototype.toRelPath = function (base, path) {
var breakPoint = 0,
out = '',
i,
l
var normalizedBase = base.substring(0, base.lastIndexOf('/')).split('/')
var items = path.split('/')
if (normalizedBase.length >= items.length) {
for (i = 0, l = normalizedBase.length; i < l; i++) {
if (i >= items.length || normalizedBase[i] !== items[i]) {
breakPoint = i + 1
break
}
}
}
if (normalizedBase.length < items.length) {
for (i = 0, l = items.length; i < l; i++) {
if (i >= normalizedBase.length || normalizedBase[i] !== items[i]) {
breakPoint = i + 1
break
}
}
}
if (breakPoint === 1) {
return path
}
for (i = 0, l = normalizedBase.length - (breakPoint - 1); i < l; i++) {
out += '../'
}
for (i = breakPoint - 1, l = items.length; i < l; i++) {
if (i !== breakPoint - 1) {
out += '/' + items[i]
} else {
out += items[i]
}
}
return out
}
URI.prototype.toAbsPath = function (base, path) {
var i,
nb = 0,
o = [],
outPath
var tr = /\/$/.test(path) ? '/' : ''
var normalizedBase = base.split('/')
var normalizedPath = path.split('/')
each$d(normalizedBase, function (k) {
if (k) {
o.push(k)
}
})
normalizedBase = o
for (i = normalizedPath.length - 1, o = []; i >= 0; i--) {
if (normalizedPath[i].length === 0 || normalizedPath[i] === '.') {
continue
}
if (normalizedPath[i] === '..') {
nb++
continue
}
if (nb > 0) {
nb--
continue
}
o.push(normalizedPath[i])
}
i = normalizedBase.length - nb
if (i <= 0) {
outPath = reverse(o).join('/')
} else {
outPath =
normalizedBase.slice(0, i).join('/') + '/' + reverse(o).join('/')
}
if (outPath.indexOf('/') !== 0) {
outPath = '/' + outPath
}
if (tr && outPath.lastIndexOf('/') !== outPath.length - 1) {
outPath += tr
}
return outPath
}
URI.prototype.getURI = function (noProtoHost) {
if (noProtoHost === void 0) {
noProtoHost = false
}
var s
if (!this.source || noProtoHost) {
s = ''
if (!noProtoHost) {
if (this.protocol) {
s += this.protocol + '://'
} else {
s += '//'
}
if (this.userInfo) {
s += this.userInfo + '@'
}
if (this.host) {
s += this.host
}
if (this.port) {
s += ':' + this.port
}
}
if (this.path) {
s += this.path
}
if (this.query) {
s += '?' + this.query
}
if (this.anchor) {
s += '#' + this.anchor
}
this.source = s
}
return this.source
}
return URI
})()
var filteredClobberElements = Tools.makeMap(
'button,fieldset,form,iframe,img,image,input,object,output,select,textarea'
)
var isValidPrefixAttrName = function (name) {
return name.indexOf('data-') === 0 || name.indexOf('aria-') === 0
}
var findMatchingEndTagIndex = function (schema, html, startIndex) {
var startTagRegExp = /<([!?\/])?([A-Za-z0-9\-_:.]+)/g
var endTagRegExp =
/(?:\s(?:[^'">]+(?:"[^"]*"|'[^']*'))*[^"'>]*(?:"[^">]*|'[^'>]*)?|\s*|\/)>/g
var shortEndedElements = schema.getShortEndedElements()
var count = 1,
index = startIndex
while (count !== 0) {
startTagRegExp.lastIndex = index
while (true) {
var startMatch = startTagRegExp.exec(html)
if (startMatch === null) {
return index
} else if (startMatch[1] === '!') {
if (startsWith(startMatch[2], '--')) {
index = findCommentEndIndex(
html,
false,
startMatch.index + '!--'.length
)
} else {
index = findCommentEndIndex(html, true, startMatch.index + 1)
}
break
} else {
endTagRegExp.lastIndex = startTagRegExp.lastIndex
var endMatch = endTagRegExp.exec(html)
if (isNull(endMatch) || endMatch.index !== startTagRegExp.lastIndex) {
continue
}
if (startMatch[1] === '/') {
count -= 1
} else if (!has$2(shortEndedElements, startMatch[2])) {
count += 1
}
index = startTagRegExp.lastIndex + endMatch[0].length
break
}
}
}
return index
}
var isConditionalComment = function (html, startIndex) {
return /^\s*\[if [\w\W]+\]>.*/.test(
html.substr(startIndex)
)
}
var findCommentEndIndex = function (html, isBogus, startIndex) {
if (startIndex === void 0) {
startIndex = 0
}
var lcHtml = html.toLowerCase()
if (
lcHtml.indexOf('[if ', startIndex) !== -1 &&
isConditionalComment(lcHtml, startIndex)
) {
var endIfIndex = lcHtml.indexOf('[endif]', startIndex)
return lcHtml.indexOf('>', endIfIndex)
} else {
if (isBogus) {
var endIndex = lcHtml.indexOf('>', startIndex)
return endIndex !== -1 ? endIndex : lcHtml.length
} else {
var endCommentRegexp = /--!?>/g
endCommentRegexp.lastIndex = startIndex
var match = endCommentRegexp.exec(html)
return match ? match.index + match[0].length : lcHtml.length
}
}
}
var checkBogusAttribute = function (regExp, attrString) {
var matches = regExp.exec(attrString)
if (matches) {
var name_1 = matches[1]
var value = matches[2]
return typeof name_1 === 'string' &&
name_1.toLowerCase() === 'data-mce-bogus'
? value
: null
} else {
return null
}
}
var SaxParser = function (settings, schema) {
var _a
if (schema === void 0) {
schema = Schema()
}
settings = settings || {}
var doc = (_a = settings.document) !== null && _a !== void 0 ? _a : document
var form = doc.createElement('form')
if (settings.fix_self_closing !== false) {
settings.fix_self_closing = true
}
var comment = settings.comment ? settings.comment : noop
var cdata = settings.cdata ? settings.cdata : noop
var text = settings.text ? settings.text : noop
var start = settings.start ? settings.start : noop
var end = settings.end ? settings.end : noop
var pi = settings.pi ? settings.pi : noop
var doctype = settings.doctype ? settings.doctype : noop
var parseInternal = function (base64Extract, format) {
if (format === void 0) {
format = 'html'
}
var html = base64Extract.html
var matches,
index = 0,
value,
endRegExp
var stack = []
var attrList, i, textData, name
var isInternalElement, isShortEnded
var elementRule,
isValidElement,
attr,
attribsValue,
validAttributesMap,
validAttributePatterns
var attributesRequired, attributesDefault, attributesForced
var anyAttributesRequired,
attrValue,
idCount = 0
var decode = Entities.decode
var filteredUrlAttrs = Tools.makeMap(
'src,href,data,background,action,formaction,poster,xlink:href'
)
var parsingMode = format === 'html' ? 0 : 1
var processEndTag = function (name) {
var pos, i
pos = stack.length
while (pos--) {
if (stack[pos].name === name) {
break
}
}
if (pos >= 0) {
for (i = stack.length - 1; i >= pos; i--) {
name = stack[i]
if (name.valid) {
end(name.name)
}
}
stack.length = pos
}
}
var processText = function (value, raw) {
return text(restoreDataUris(value, base64Extract), raw)
}
var processComment = function (value) {
if (value === '') {
return
}
if (value.charAt(0) === '>') {
value = ' ' + value
}
if (
!settings.allow_conditional_comments &&
value.substr(0, 3).toLowerCase() === '[if'
) {
value = ' ' + value
}
comment(restoreDataUris(value, base64Extract))
}
var processAttr = function (value) {
return restoreDataUris(value, base64Extract)
}
var processMalformedComment = function (value, startIndex) {
var startTag = value || ''
var isBogus = !startsWith(startTag, '--')
var endIndex = findCommentEndIndex(html, isBogus, startIndex)
value = html.substr(startIndex, endIndex - startIndex)
processComment(isBogus ? startTag + value : value)
return endIndex + 1
}
var parseAttribute = function (tagName, name, value, val2, val3) {
name = name.toLowerCase()
value = processAttr(
name in fillAttrsMap ? name : decode(value || val2 || val3 || '')
)
if (
validate &&
!isInternalElement &&
isValidPrefixAttrName(name) === false
) {
var attrRule = validAttributesMap[name]
if (!attrRule && validAttributePatterns) {
var i_1 = validAttributePatterns.length
while (i_1--) {
attrRule = validAttributePatterns[i_1]
if (attrRule.pattern.test(name)) {
break
}
}
if (i_1 === -1) {
attrRule = null
}
}
if (!attrRule) {
return
}
if (attrRule.validValues && !(value in attrRule.validValues)) {
return
}
}
var isNameOrId = name === 'name' || name === 'id'
if (
isNameOrId &&
tagName in filteredClobberElements &&
(value in doc || value in form)
) {
return
}
if (
filteredUrlAttrs[name] &&
!URI.isDomSafe(value, tagName, settings)
) {
return
}
if (
isInternalElement &&
(name in filteredUrlAttrs || name.indexOf('on') === 0)
) {
return
}
attrList.map[name] = value
attrList.push({
name: name,
value: value,
})
}
var tokenRegExp = new RegExp(
'<(?:' +
'(?:!--([\\w\\W]*?)--!?>)|' +
'(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|' +
'(?:![Dd][Oo][Cc][Tt][Yy][Pp][Ee]([\\w\\W]*?)>)|' +
'(?:!(--)?)|' +
'(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|' +
'(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|' +
'(?:([A-Za-z][A-Za-z0-9\\-_:.]*)(\\s(?:[^\'">]+(?:"[^"]*"|\'[^\']*\'))*[^"\'>]*(?:"[^">]*|\'[^\'>]*)?|\\s*|\\/)>)' +
')',
'g'
)
var attrRegExp =
/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g
var shortEndedElements = schema.getShortEndedElements()
var selfClosing =
settings.self_closing_elements || schema.getSelfClosingElements()
var fillAttrsMap = schema.getBoolAttrs()
var validate = settings.validate
var removeInternalElements = settings.remove_internals
var fixSelfClosing = settings.fix_self_closing
var specialElements = schema.getSpecialElements()
var processHtml = html + '>'
while ((matches = tokenRegExp.exec(processHtml))) {
var matchText = matches[0]
if (index < matches.index) {
processText(decode(html.substr(index, matches.index - index)))
}
if ((value = matches[7])) {
value = value.toLowerCase()
if (value.charAt(0) === ':') {
value = value.substr(1)
}
processEndTag(value)
} else if ((value = matches[8])) {
if (matches.index + matchText.length > html.length) {
processText(decode(html.substr(matches.index)))
index = matches.index + matchText.length
continue
}
value = value.toLowerCase()
if (value.charAt(0) === ':') {
value = value.substr(1)
}
isShortEnded = value in shortEndedElements
if (
fixSelfClosing &&
selfClosing[value] &&
stack.length > 0 &&
stack[stack.length - 1].name === value
) {
processEndTag(value)
}
var bogusValue = checkBogusAttribute(attrRegExp, matches[9])
if (bogusValue !== null) {
if (bogusValue === 'all') {
index = findMatchingEndTagIndex(
schema,
html,
tokenRegExp.lastIndex
)
tokenRegExp.lastIndex = index
continue
}
isValidElement = false
}
if (!validate || (elementRule = schema.getElementRule(value))) {
isValidElement = true
if (validate) {
validAttributesMap = elementRule.attributes
validAttributePatterns = elementRule.attributePatterns
}
if ((attribsValue = matches[9])) {
isInternalElement = attribsValue.indexOf('data-mce-type') !== -1
if (isInternalElement && removeInternalElements) {
isValidElement = false
}
attrList = []
attrList.map = {}
attribsValue.replace(
attrRegExp,
function (match, name, val, val2, val3) {
parseAttribute(value, name, val, val2, val3)
return ''
}
)
} else {
attrList = []
attrList.map = {}
}
if (validate && !isInternalElement) {
attributesRequired = elementRule.attributesRequired
attributesDefault = elementRule.attributesDefault
attributesForced = elementRule.attributesForced
anyAttributesRequired = elementRule.removeEmptyAttrs
if (anyAttributesRequired && !attrList.length) {
isValidElement = false
}
if (attributesForced) {
i = attributesForced.length
while (i--) {
attr = attributesForced[i]
name = attr.name
attrValue = attr.value
if (attrValue === '{$uid}') {
attrValue = 'mce_' + idCount++
}
attrList.map[name] = attrValue
attrList.push({
name: name,
value: attrValue,
})
}
}
if (attributesDefault) {
i = attributesDefault.length
while (i--) {
attr = attributesDefault[i]
name = attr.name
if (!(name in attrList.map)) {
attrValue = attr.value
if (attrValue === '{$uid}') {
attrValue = 'mce_' + idCount++
}
attrList.map[name] = attrValue
attrList.push({
name: name,
value: attrValue,
})
}
}
}
if (attributesRequired) {
i = attributesRequired.length
while (i--) {
if (attributesRequired[i] in attrList.map) {
break
}
}
if (i === -1) {
isValidElement = false
}
}
if ((attr = attrList.map['data-mce-bogus'])) {
if (attr === 'all') {
index = findMatchingEndTagIndex(
schema,
html,
tokenRegExp.lastIndex
)
tokenRegExp.lastIndex = index
continue
}
isValidElement = false
}
}
if (isValidElement) {
start(value, attrList, isShortEnded)
}
} else {
isValidElement = false
}
if ((endRegExp = specialElements[value])) {
endRegExp.lastIndex = index = matches.index + matchText.length
if ((matches = endRegExp.exec(html))) {
if (isValidElement) {
textData = html.substr(index, matches.index - index)
}
index = matches.index + matches[0].length
} else {
textData = html.substr(index)
index = html.length
}
if (isValidElement) {
if (textData.length > 0) {
processText(textData, true)
}
end(value)
}
tokenRegExp.lastIndex = index
continue
}
if (!isShortEnded) {
if (
!attribsValue ||
attribsValue.indexOf('/') !== attribsValue.length - 1
) {
stack.push({
name: value,
valid: isValidElement,
})
} else if (isValidElement) {
end(value)
}
}
} else if ((value = matches[1])) {
processComment(value)
} else if ((value = matches[2])) {
var isValidCdataSection =
parsingMode === 1 ||
settings.preserve_cdata ||
(stack.length > 0 &&
schema.isValidChild(stack[stack.length - 1].name, '#cdata'))
if (isValidCdataSection) {
cdata(value)
} else {
index = processMalformedComment('', matches.index + 2)
tokenRegExp.lastIndex = index
continue
}
} else if ((value = matches[3])) {
doctype(value)
} else if ((value = matches[4]) || matchText === '= 0; i--) {
value = stack[i]
if (value.valid) {
end(value.name)
}
}
}
var parse = function (html, format) {
if (format === void 0) {
format = 'html'
}
parseInternal(extractBase64DataUris(html), format)
}
return { parse: parse }
}
SaxParser.findEndTag = findMatchingEndTagIndex
var trimHtml = function (tempAttrs, html) {
var trimContentRegExp = new RegExp(
['\\s?(' + tempAttrs.join('|') + ')="[^"]+"'].join('|'),
'gi'
)
return html.replace(trimContentRegExp, '')
}
var trimInternal = function (serializer, html) {
var bogusAllRegExp = /<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g
var schema = serializer.schema
var content = trimHtml(serializer.getTempAttrs(), html)
var shortEndedElements = schema.getShortEndedElements()
var matches
while ((matches = bogusAllRegExp.exec(content))) {
var index = bogusAllRegExp.lastIndex
var matchLength = matches[0].length
var endTagIndex = void 0
if (shortEndedElements[matches[1]]) {
endTagIndex = index
} else {
endTagIndex = SaxParser.findEndTag(schema, content, index)
}
content =
content.substring(0, index - matchLength) +
content.substring(endTagIndex)
bogusAllRegExp.lastIndex = index - matchLength
}
return trim$2(content)
}
var trimExternal = trimInternal
var trimEmptyContents = function (editor, html) {
var blockName = getForcedRootBlock(editor)
var emptyRegExp = new RegExp(
'^(<' +
blockName +
'[^>]*>( | |\\s|\xA0|
|)<\\/' +
blockName +
'>[\r\n]*|
[\r\n]*)$'
)
return html.replace(emptyRegExp, '')
}
var setupArgs$3 = function (args, format) {
return __assign(__assign({}, args), {
format: format,
get: true,
getInner: true,
})
}
var getContentFromBody = function (editor, args, format, body) {
var defaultedArgs = setupArgs$3(args, format)
var updatedArgs = args.no_events
? defaultedArgs
: editor.fire('BeforeGetContent', defaultedArgs)
var content
if (updatedArgs.format === 'raw') {
content = Tools.trim(trimExternal(editor.serializer, body.innerHTML))
} else if (updatedArgs.format === 'text') {
content = editor.dom.isEmpty(body)
? ''
: trim$2(body.innerText || body.textContent)
} else if (updatedArgs.format === 'tree') {
content = editor.serializer.serialize(body, updatedArgs)
} else {
content = trimEmptyContents(
editor,
editor.serializer.serialize(body, updatedArgs)
)
}
if (
!contains$3(['text', 'tree'], updatedArgs.format) &&
!isWsPreserveElement(SugarElement.fromDom(body))
) {
updatedArgs.content = Tools.trim(content)
} else {
updatedArgs.content = content
}
if (updatedArgs.no_events) {
return updatedArgs.content
} else {
return editor.fire('GetContent', updatedArgs).content
}
}
var getContentInternal = function (editor, args, format) {
return Optional.from(editor.getBody()).fold(
constant(args.format === 'tree' ? new AstNode('body', 11) : ''),
function (body) {
return getContentFromBody(editor, args, format, body)
}
)
}
var each$c = Tools.each
var ElementUtils = function (dom) {
var compare = function (node1, node2) {
if (node1.nodeName !== node2.nodeName) {
return false
}
var getAttribs = function (node) {
var attribs = {}
each$c(dom.getAttribs(node), function (attr) {
var name = attr.nodeName.toLowerCase()
if (
name.indexOf('_') !== 0 &&
name !== 'style' &&
name.indexOf('data-') !== 0
) {
attribs[name] = dom.getAttrib(node, name)
}
})
return attribs
}
var compareObjects = function (obj1, obj2) {
var value, name
for (name in obj1) {
if (has$2(obj1, name)) {
value = obj2[name]
if (typeof value === 'undefined') {
return false
}
if (obj1[name] !== value) {
return false
}
delete obj2[name]
}
}
for (name in obj2) {
if (has$2(obj2, name)) {
return false
}
}
return true
}
if (!compareObjects(getAttribs(node1), getAttribs(node2))) {
return false
}
if (
!compareObjects(
dom.parseStyle(dom.getAttrib(node1, 'style')),
dom.parseStyle(dom.getAttrib(node2, 'style'))
)
) {
return false
}
return !isBookmarkNode$1(node1) && !isBookmarkNode$1(node2)
}
return { compare: compare }
}
var makeMap$1 = Tools.makeMap
var Writer = function (settings) {
var html = []
settings = settings || {}
var indent = settings.indent
var indentBefore = makeMap$1(settings.indent_before || '')
var indentAfter = makeMap$1(settings.indent_after || '')
var encode = Entities.getEncodeFunc(
settings.entity_encoding || 'raw',
settings.entities
)
var htmlOutput = settings.element_format === 'html'
return {
start: function (name, attrs, empty) {
var i, l, attr, value
if (indent && indentBefore[name] && html.length > 0) {
value = html[html.length - 1]
if (value.length > 0 && value !== '\n') {
html.push('\n')
}
}
html.push('<', name)
if (attrs) {
for (i = 0, l = attrs.length; i < l; i++) {
attr = attrs[i]
html.push(' ', attr.name, '="', encode(attr.value, true), '"')
}
}
if (!empty || htmlOutput) {
html[html.length] = '>'
} else {
html[html.length] = ' />'
}
if (empty && indent && indentAfter[name] && html.length > 0) {
value = html[html.length - 1]
if (value.length > 0 && value !== '\n') {
html.push('\n')
}
}
},
end: function (name) {
var value
html.push('', name, '>')
if (indent && indentAfter[name] && html.length > 0) {
value = html[html.length - 1]
if (value.length > 0 && value !== '\n') {
html.push('\n')
}
}
},
text: function (text, raw) {
if (text.length > 0) {
html[html.length] = raw ? text : encode(text)
}
},
cdata: function (text) {
html.push('')
},
comment: function (text) {
html.push('')
},
pi: function (name, text) {
if (text) {
html.push('', name, ' ', encode(text), '?>')
} else {
html.push('', name, '?>')
}
if (indent) {
html.push('\n')
}
},
doctype: function (text) {
html.push('', indent ? '\n' : '')
},
reset: function () {
html.length = 0
},
getContent: function () {
return html.join('').replace(/\n$/, '')
},
}
}
var HtmlSerializer = function (settings, schema) {
if (schema === void 0) {
schema = Schema()
}
var writer = Writer(settings)
settings = settings || {}
settings.validate = 'validate' in settings ? settings.validate : true
var serialize = function (node) {
var validate = settings.validate
var handlers = {
3: function (node) {
writer.text(node.value, node.raw)
},
8: function (node) {
writer.comment(node.value)
},
7: function (node) {
writer.pi(node.name, node.value)
},
10: function (node) {
writer.doctype(node.value)
},
4: function (node) {
writer.cdata(node.value)
},
11: function (node) {
if ((node = node.firstChild)) {
do {
walk(node)
} while ((node = node.next))
}
},
}
writer.reset()
var walk = function (node) {
var handler = handlers[node.type]
if (!handler) {
var name_1 = node.name
var isEmpty = node.shortEnded
var attrs = node.attributes
if (validate && attrs && attrs.length > 1) {
var sortedAttrs = []
sortedAttrs.map = {}
var elementRule = schema.getElementRule(node.name)
if (elementRule) {
for (
var i = 0, l = elementRule.attributesOrder.length;
i < l;
i++
) {
var attrName = elementRule.attributesOrder[i]
if (attrName in attrs.map) {
var attrValue = attrs.map[attrName]
sortedAttrs.map[attrName] = attrValue
sortedAttrs.push({
name: attrName,
value: attrValue,
})
}
}
for (var i = 0, l = attrs.length; i < l; i++) {
var attrName = attrs[i].name
if (!(attrName in sortedAttrs.map)) {
var attrValue = attrs.map[attrName]
sortedAttrs.map[attrName] = attrValue
sortedAttrs.push({
name: attrName,
value: attrValue,
})
}
}
attrs = sortedAttrs
}
}
writer.start(node.name, attrs, isEmpty)
if (!isEmpty) {
if ((node = node.firstChild)) {
do {
walk(node)
} while ((node = node.next))
}
writer.end(name_1)
}
} else {
handler(node)
}
}
if (node.type === 1 && !settings.inner) {
walk(node)
} else {
handlers[11](node)
}
return writer.getContent()
}
return { serialize: serialize }
}
var nonInheritableStyles = new Set()
;(function () {
var nonInheritableStylesArr = [
'margin',
'margin-left',
'margin-right',
'margin-top',
'margin-bottom',
'padding',
'padding-left',
'padding-right',
'padding-top',
'padding-bottom',
'border',
'border-width',
'border-style',
'border-color',
'background',
'background-attachment',
'background-clip',
'background-color',
'background-image',
'background-origin',
'background-position',
'background-repeat',
'background-size',
'float',
'position',
'left',
'right',
'top',
'bottom',
'z-index',
'display',
'transform',
'width',
'max-width',
'min-width',
'height',
'max-height',
'min-height',
'overflow',
'overflow-x',
'overflow-y',
'text-overflow',
'vertical-align',
'transition',
'transition-delay',
'transition-duration',
'transition-property',
'transition-timing-function',
]
each$k(nonInheritableStylesArr, function (style) {
nonInheritableStyles.add(style)
})
})()
var shorthandStyleProps = ['font', 'text-decoration', 'text-emphasis']
var getStyleProps = function (dom, node) {
return keys(dom.parseStyle(dom.getAttrib(node, 'style')))
}
var isNonInheritableStyle = function (style) {
return nonInheritableStyles.has(style)
}
var hasInheritableStyles = function (dom, node) {
return forall(getStyleProps(dom, node), function (style) {
return !isNonInheritableStyle(style)
})
}
var getLonghandStyleProps = function (styles) {
return filter$4(styles, function (style) {
return exists(shorthandStyleProps, function (prop) {
return startsWith(style, prop)
})
})
}
var hasStyleConflict = function (dom, node, parentNode) {
var nodeStyleProps = getStyleProps(dom, node)
var parentNodeStyleProps = getStyleProps(dom, parentNode)
var valueMismatch = function (prop) {
var nodeValue = dom.getStyle(node, prop)
var parentValue = dom.getStyle(parentNode, prop)
return (
isNotEmpty(nodeValue) &&
isNotEmpty(parentValue) &&
nodeValue !== parentValue
)
}
return exists(nodeStyleProps, function (nodeStyleProp) {
var propExists = function (props) {
return exists(props, function (prop) {
return prop === nodeStyleProp
})
}
if (
!propExists(parentNodeStyleProps) &&
propExists(shorthandStyleProps)
) {
var longhandProps = getLonghandStyleProps(parentNodeStyleProps)
return exists(longhandProps, valueMismatch)
} else {
return valueMismatch(nodeStyleProp)
}
})
}
var isChar = function (forward, predicate, pos) {
return Optional.from(pos.container())
.filter(isText$7)
.exists(function (text) {
var delta = forward ? 0 : -1
return predicate(text.data.charAt(pos.offset() + delta))
})
}
var isBeforeSpace = curry(isChar, true, isWhiteSpace)
var isAfterSpace = curry(isChar, false, isWhiteSpace)
var isEmptyText = function (pos) {
var container = pos.container()
return (
isText$7(container) &&
(container.data.length === 0 ||
(isZwsp(container.data) &&
BookmarkManager.isBookmarkNode(container.parentNode)))
)
}
var matchesElementPosition = function (before, predicate) {
return function (pos) {
return Optional.from(getChildNodeAtRelativeOffset(before ? 0 : -1, pos))
.filter(predicate)
.isSome()
}
}
var isImageBlock = function (node) {
return (
isImg(node) && get$5(SugarElement.fromDom(node), 'display') === 'block'
)
}
var isCefNode = function (node) {
return isContentEditableFalse$b(node) && !isBogusAll$1(node)
}
var isBeforeImageBlock = matchesElementPosition(true, isImageBlock)
var isAfterImageBlock = matchesElementPosition(false, isImageBlock)
var isBeforeMedia = matchesElementPosition(true, isMedia$2)
var isAfterMedia = matchesElementPosition(false, isMedia$2)
var isBeforeTable = matchesElementPosition(true, isTable$3)
var isAfterTable = matchesElementPosition(false, isTable$3)
var isBeforeContentEditableFalse = matchesElementPosition(true, isCefNode)
var isAfterContentEditableFalse = matchesElementPosition(false, isCefNode)
var getLastChildren = function (elm) {
var children = []
var rawNode = elm.dom
while (rawNode) {
children.push(SugarElement.fromDom(rawNode))
rawNode = rawNode.lastChild
}
return children
}
var removeTrailingBr = function (elm) {
var allBrs = descendants(elm, 'br')
var brs = filter$4(getLastChildren(elm).slice(-1), isBr$4)
if (allBrs.length === brs.length) {
each$k(brs, remove$7)
}
}
var fillWithPaddingBr = function (elm) {
empty(elm)
append$1(elm, SugarElement.fromHtml('
'))
}
var trimBlockTrailingBr = function (elm) {
lastChild(elm).each(function (lastChild) {
prevSibling(lastChild).each(function (lastChildPrevSibling) {
if (
isBlock$2(elm) &&
isBr$4(lastChild) &&
isBlock$2(lastChildPrevSibling)
) {
remove$7(lastChild)
}
})
})
}
var dropLast = function (xs) {
return xs.slice(0, -1)
}
var parentsUntil = function (start, root, predicate) {
if (contains$1(root, start)) {
return dropLast(
parents$1(start, function (elm) {
return predicate(elm) || eq(elm, root)
})
)
} else {
return []
}
}
var parents = function (start, root) {
return parentsUntil(start, root, never)
}
var parentsAndSelf = function (start, root) {
return [start].concat(parents(start, root))
}
var navigateIgnoreEmptyTextNodes = function (forward, root, from) {
return navigateIgnore(forward, root, from, isEmptyText)
}
var getClosestBlock$1 = function (root, pos) {
return find$3(
parentsAndSelf(SugarElement.fromDom(pos.container()), root),
isBlock$2
)
}
var isAtBeforeAfterBlockBoundary = function (forward, root, pos) {
return navigateIgnoreEmptyTextNodes(forward, root.dom, pos).forall(
function (newPos) {
return getClosestBlock$1(root, pos).fold(
function () {
return isInSameBlock(newPos, pos, root.dom) === false
},
function (fromBlock) {
return (
isInSameBlock(newPos, pos, root.dom) === false &&
contains$1(fromBlock, SugarElement.fromDom(newPos.container()))
)
}
)
}
)
}
var isAtBlockBoundary = function (forward, root, pos) {
return getClosestBlock$1(root, pos).fold(
function () {
return navigateIgnoreEmptyTextNodes(forward, root.dom, pos).forall(
function (newPos) {
return isInSameBlock(newPos, pos, root.dom) === false
}
)
},
function (parent) {
return navigateIgnoreEmptyTextNodes(forward, parent.dom, pos).isNone()
}
)
}
var isAtStartOfBlock = curry(isAtBlockBoundary, false)
var isAtEndOfBlock = curry(isAtBlockBoundary, true)
var isBeforeBlock = curry(isAtBeforeAfterBlockBoundary, false)
var isAfterBlock = curry(isAtBeforeAfterBlockBoundary, true)
var isBr = function (pos) {
return getElementFromPosition(pos).exists(isBr$4)
}
var findBr = function (forward, root, pos) {
var parentBlocks = filter$4(
parentsAndSelf(SugarElement.fromDom(pos.container()), root),
isBlock$2
)
var scope = head(parentBlocks).getOr(root)
return fromPosition(forward, scope.dom, pos).filter(isBr)
}
var isBeforeBr$1 = function (root, pos) {
return (
getElementFromPosition(pos).exists(isBr$4) ||
findBr(true, root, pos).isSome()
)
}
var isAfterBr = function (root, pos) {
return (
getElementFromPrevPosition(pos).exists(isBr$4) ||
findBr(false, root, pos).isSome()
)
}
var findPreviousBr = curry(findBr, false)
var findNextBr = curry(findBr, true)
var isInMiddleOfText = function (pos) {
return (
CaretPosition.isTextPosition(pos) && !pos.isAtStart() && !pos.isAtEnd()
)
}
var getClosestBlock = function (root, pos) {
var parentBlocks = filter$4(
parentsAndSelf(SugarElement.fromDom(pos.container()), root),
isBlock$2
)
return head(parentBlocks).getOr(root)
}
var hasSpaceBefore = function (root, pos) {
if (isInMiddleOfText(pos)) {
return isAfterSpace(pos)
} else {
return (
isAfterSpace(pos) ||
prevPosition(getClosestBlock(root, pos).dom, pos).exists(isAfterSpace)
)
}
}
var hasSpaceAfter = function (root, pos) {
if (isInMiddleOfText(pos)) {
return isBeforeSpace(pos)
} else {
return (
isBeforeSpace(pos) ||
nextPosition(getClosestBlock(root, pos).dom, pos).exists(isBeforeSpace)
)
}
}
var isPreValue = function (value) {
return contains$3(['pre', 'pre-wrap'], value)
}
var isInPre = function (pos) {
return getElementFromPosition(pos)
.bind(function (elm) {
return closest$3(elm, isElement$6)
})
.exists(function (elm) {
return isPreValue(get$5(elm, 'white-space'))
})
}
var isAtBeginningOfBody = function (root, pos) {
return prevPosition(root.dom, pos).isNone()
}
var isAtEndOfBody = function (root, pos) {
return nextPosition(root.dom, pos).isNone()
}
var isAtLineBoundary = function (root, pos) {
return (
isAtBeginningOfBody(root, pos) ||
isAtEndOfBody(root, pos) ||
isAtStartOfBlock(root, pos) ||
isAtEndOfBlock(root, pos) ||
isAfterBr(root, pos) ||
isBeforeBr$1(root, pos)
)
}
var needsToHaveNbsp = function (root, pos) {
if (isInPre(pos)) {
return false
} else {
return (
isAtLineBoundary(root, pos) ||
hasSpaceBefore(root, pos) ||
hasSpaceAfter(root, pos)
)
}
}
var needsToBeNbspLeft = function (root, pos) {
if (isInPre(pos)) {
return false
} else {
return (
isAtStartOfBlock(root, pos) ||
isBeforeBlock(root, pos) ||
isAfterBr(root, pos) ||
hasSpaceBefore(root, pos)
)
}
}
var leanRight = function (pos) {
var container = pos.container()
var offset = pos.offset()
if (isText$7(container) && offset < container.data.length) {
return CaretPosition(container, offset + 1)
} else {
return pos
}
}
var needsToBeNbspRight = function (root, pos) {
if (isInPre(pos)) {
return false
} else {
return (
isAtEndOfBlock(root, pos) ||
isAfterBlock(root, pos) ||
isBeforeBr$1(root, pos) ||
hasSpaceAfter(root, pos)
)
}
}
var needsToBeNbsp = function (root, pos) {
return (
needsToBeNbspLeft(root, pos) || needsToBeNbspRight(root, leanRight(pos))
)
}
var isNbspAt = function (text, offset) {
return isNbsp(text.charAt(offset))
}
var hasNbsp = function (pos) {
var container = pos.container()
return isText$7(container) && contains$2(container.data, nbsp)
}
var normalizeNbspMiddle = function (text) {
var chars = text.split('')
return map$3(chars, function (chr, i) {
if (
isNbsp(chr) &&
i > 0 &&
i < chars.length - 1 &&
isContent(chars[i - 1]) &&
isContent(chars[i + 1])
) {
return ' '
} else {
return chr
}
}).join('')
}
var normalizeNbspAtStart = function (root, node) {
var text = node.data
var firstPos = CaretPosition(node, 0)
if (isNbspAt(text, 0) && !needsToBeNbsp(root, firstPos)) {
node.data = ' ' + text.slice(1)
return true
} else {
return false
}
}
var normalizeNbspInMiddleOfTextNode = function (node) {
var text = node.data
var newText = normalizeNbspMiddle(text)
if (newText !== text) {
node.data = newText
return true
} else {
return false
}
}
var normalizeNbspAtEnd = function (root, node) {
var text = node.data
var lastPos = CaretPosition(node, text.length - 1)
if (isNbspAt(text, text.length - 1) && !needsToBeNbsp(root, lastPos)) {
node.data = text.slice(0, -1) + ' '
return true
} else {
return false
}
}
var normalizeNbsps = function (root, pos) {
return Optional.some(pos)
.filter(hasNbsp)
.bind(function (pos) {
var container = pos.container()
var normalized =
normalizeNbspAtStart(root, container) ||
normalizeNbspInMiddleOfTextNode(container) ||
normalizeNbspAtEnd(root, container)
return normalized ? Optional.some(pos) : Optional.none()
})
}
var normalizeNbspsInEditor = function (editor) {
var root = SugarElement.fromDom(editor.getBody())
if (editor.selection.isCollapsed()) {
normalizeNbsps(
root,
CaretPosition.fromRangeStart(editor.selection.getRng())
).each(function (pos) {
editor.selection.setRng(pos.toRange())
})
}
}
var normalizeContent = function (content, isStartOfContent, isEndOfContent) {
var result = foldl(
content,
function (acc, c) {
if (isWhiteSpace(c) || isNbsp(c)) {
if (
acc.previousCharIsSpace ||
(acc.str === '' && isStartOfContent) ||
(acc.str.length === content.length - 1 && isEndOfContent)
) {
return {
previousCharIsSpace: false,
str: acc.str + nbsp,
}
} else {
return {
previousCharIsSpace: true,
str: acc.str + ' ',
}
}
} else {
return {
previousCharIsSpace: false,
str: acc.str + c,
}
}
},
{
previousCharIsSpace: false,
str: '',
}
)
return result.str
}
var normalize$1 = function (node, offset, count) {
if (count === 0) {
return
}
var elm = SugarElement.fromDom(node)
var root = ancestor$3(elm, isBlock$2).getOr(elm)
var whitespace = node.data.slice(offset, offset + count)
var isEndOfContent =
offset + count >= node.data.length &&
needsToBeNbspRight(root, CaretPosition(node, node.data.length))
var isStartOfContent =
offset === 0 && needsToBeNbspLeft(root, CaretPosition(node, 0))
node.replaceData(
offset,
count,
normalizeContent(whitespace, isStartOfContent, isEndOfContent)
)
}
var normalizeWhitespaceAfter = function (node, offset) {
var content = node.data.slice(offset)
var whitespaceCount = content.length - lTrim(content).length
normalize$1(node, offset, whitespaceCount)
}
var normalizeWhitespaceBefore = function (node, offset) {
var content = node.data.slice(0, offset)
var whitespaceCount = content.length - rTrim(content).length
normalize$1(node, offset - whitespaceCount, whitespaceCount)
}
var mergeTextNodes = function (
prevNode,
nextNode,
normalizeWhitespace,
mergeToPrev
) {
if (mergeToPrev === void 0) {
mergeToPrev = true
}
var whitespaceOffset = rTrim(prevNode.data).length
var newNode = mergeToPrev ? prevNode : nextNode
var removeNode = mergeToPrev ? nextNode : prevNode
if (mergeToPrev) {
newNode.appendData(removeNode.data)
} else {
newNode.insertData(0, removeNode.data)
}
remove$7(SugarElement.fromDom(removeNode))
if (normalizeWhitespace) {
normalizeWhitespaceAfter(newNode, whitespaceOffset)
}
return newNode
}
var needsReposition = function (pos, elm) {
var container = pos.container()
var offset = pos.offset()
return (
CaretPosition.isTextPosition(pos) === false &&
container === elm.parentNode &&
offset > CaretPosition.before(elm).offset()
)
}
var reposition = function (elm, pos) {
return needsReposition(pos, elm)
? CaretPosition(pos.container(), pos.offset() - 1)
: pos
}
var beforeOrStartOf = function (node) {
return isText$7(node) ? CaretPosition(node, 0) : CaretPosition.before(node)
}
var afterOrEndOf = function (node) {
return isText$7(node)
? CaretPosition(node, node.data.length)
: CaretPosition.after(node)
}
var getPreviousSiblingCaretPosition = function (elm) {
if (isCaretCandidate$3(elm.previousSibling)) {
return Optional.some(afterOrEndOf(elm.previousSibling))
} else {
return elm.previousSibling
? lastPositionIn(elm.previousSibling)
: Optional.none()
}
}
var getNextSiblingCaretPosition = function (elm) {
if (isCaretCandidate$3(elm.nextSibling)) {
return Optional.some(beforeOrStartOf(elm.nextSibling))
} else {
return elm.nextSibling
? firstPositionIn(elm.nextSibling)
: Optional.none()
}
}
var findCaretPositionBackwardsFromElm = function (rootElement, elm) {
var startPosition = CaretPosition.before(
elm.previousSibling ? elm.previousSibling : elm.parentNode
)
return prevPosition(rootElement, startPosition).fold(function () {
return nextPosition(rootElement, CaretPosition.after(elm))
}, Optional.some)
}
var findCaretPositionForwardsFromElm = function (rootElement, elm) {
return nextPosition(rootElement, CaretPosition.after(elm)).fold(
function () {
return prevPosition(rootElement, CaretPosition.before(elm))
},
Optional.some
)
}
var findCaretPositionBackwards = function (rootElement, elm) {
return getPreviousSiblingCaretPosition(elm)
.orThunk(function () {
return getNextSiblingCaretPosition(elm)
})
.orThunk(function () {
return findCaretPositionBackwardsFromElm(rootElement, elm)
})
}
var findCaretPositionForward = function (rootElement, elm) {
return getNextSiblingCaretPosition(elm)
.orThunk(function () {
return getPreviousSiblingCaretPosition(elm)
})
.orThunk(function () {
return findCaretPositionForwardsFromElm(rootElement, elm)
})
}
var findCaretPosition = function (forward, rootElement, elm) {
return forward
? findCaretPositionForward(rootElement, elm)
: findCaretPositionBackwards(rootElement, elm)
}
var findCaretPosOutsideElmAfterDelete = function (forward, rootElement, elm) {
return findCaretPosition(forward, rootElement, elm).map(
curry(reposition, elm)
)
}
var setSelection$1 = function (editor, forward, pos) {
pos.fold(
function () {
editor.focus()
},
function (pos) {
editor.selection.setRng(pos.toRange(), forward)
}
)
}
var eqRawNode = function (rawNode) {
return function (elm) {
return elm.dom === rawNode
}
}
var isBlock = function (editor, elm) {
return elm && has$2(editor.schema.getBlockElements(), name(elm))
}
var paddEmptyBlock = function (elm) {
if (isEmpty$2(elm)) {
var br = SugarElement.fromHtml('
')
empty(elm)
append$1(elm, br)
return Optional.some(CaretPosition.before(br.dom))
} else {
return Optional.none()
}
}
var deleteNormalized = function (
elm,
afterDeletePosOpt,
normalizeWhitespace
) {
var prevTextOpt = prevSibling(elm).filter(isText$8)
var nextTextOpt = nextSibling(elm).filter(isText$8)
remove$7(elm)
return lift3(
prevTextOpt,
nextTextOpt,
afterDeletePosOpt,
function (prev, next, pos) {
var prevNode = prev.dom,
nextNode = next.dom
var offset = prevNode.data.length
mergeTextNodes(prevNode, nextNode, normalizeWhitespace)
return pos.container() === nextNode
? CaretPosition(prevNode, offset)
: pos
}
).orThunk(function () {
if (normalizeWhitespace) {
prevTextOpt.each(function (elm) {
return normalizeWhitespaceBefore(elm.dom, elm.dom.length)
})
nextTextOpt.each(function (elm) {
return normalizeWhitespaceAfter(elm.dom, 0)
})
}
return afterDeletePosOpt
})
}
var isInlineElement = function (editor, element) {
return has$2(editor.schema.getTextInlineElements(), name(element))
}
var deleteElement$2 = function (editor, forward, elm, moveCaret) {
if (moveCaret === void 0) {
moveCaret = true
}
var afterDeletePos = findCaretPosOutsideElmAfterDelete(
forward,
editor.getBody(),
elm.dom
)
var parentBlock = ancestor$3(
elm,
curry(isBlock, editor),
eqRawNode(editor.getBody())
)
var normalizedAfterDeletePos = deleteNormalized(
elm,
afterDeletePos,
isInlineElement(editor, elm)
)
if (editor.dom.isEmpty(editor.getBody())) {
editor.setContent('')
editor.selection.setCursorLocation()
} else {
parentBlock.bind(paddEmptyBlock).fold(
function () {
if (moveCaret) {
setSelection$1(editor, forward, normalizedAfterDeletePos)
}
},
function (paddPos) {
if (moveCaret) {
setSelection$1(editor, forward, Optional.some(paddPos))
}
}
)
}
}
var isRootFromElement = function (root) {
return function (cur) {
return eq(root, cur)
}
}
var getTableCells = function (table) {
return descendants(table, 'td,th')
}
var getTableDetailsFromRange = function (rng, isRoot) {
var getTable = function (node) {
return getClosestTable(SugarElement.fromDom(node), isRoot)
}
var startTable = getTable(rng.startContainer)
var endTable = getTable(rng.endContainer)
var isStartInTable = startTable.isSome()
var isEndInTable = endTable.isSome()
var isSameTable = lift2(startTable, endTable, eq).getOr(false)
var isMultiTable = !isSameTable && isStartInTable && isEndInTable
return {
startTable: startTable,
endTable: endTable,
isStartInTable: isStartInTable,
isEndInTable: isEndInTable,
isSameTable: isSameTable,
isMultiTable: isMultiTable,
}
}
var tableCellRng = function (start, end) {
return {
start: start,
end: end,
}
}
var tableSelection = function (rng, table, cells) {
return {
rng: rng,
table: table,
cells: cells,
}
}
var deleteAction = Adt.generate([
{
singleCellTable: ['rng', 'cell'],
},
{ fullTable: ['table'] },
{
partialTable: ['cells', 'outsideDetails'],
},
{
multiTable: ['startTableCells', 'endTableCells', 'betweenRng'],
},
])
var getClosestCell$1 = function (container, isRoot) {
return closest$2(SugarElement.fromDom(container), 'td,th', isRoot)
}
var isExpandedCellRng = function (cellRng) {
return !eq(cellRng.start, cellRng.end)
}
var getTableFromCellRng = function (cellRng, isRoot) {
return getClosestTable(cellRng.start, isRoot).bind(function (
startParentTable
) {
return getClosestTable(cellRng.end, isRoot).bind(function (
endParentTable
) {
return someIf(eq(startParentTable, endParentTable), startParentTable)
})
})
}
var isSingleCellTable = function (cellRng, isRoot) {
return (
!isExpandedCellRng(cellRng) &&
getTableFromCellRng(cellRng, isRoot).exists(function (table) {
var rows = table.dom.rows
return rows.length === 1 && rows[0].cells.length === 1
})
)
}
var getCellRng = function (rng, isRoot) {
var startCell = getClosestCell$1(rng.startContainer, isRoot)
var endCell = getClosestCell$1(rng.endContainer, isRoot)
return lift2(startCell, endCell, tableCellRng)
}
var getCellRangeFromStartTable = function (isRoot) {
return function (startCell) {
return getClosestTable(startCell, isRoot).bind(function (table) {
return last$2(getTableCells(table)).map(function (endCell) {
return tableCellRng(startCell, endCell)
})
})
}
}
var getCellRangeFromEndTable = function (isRoot) {
return function (endCell) {
return getClosestTable(endCell, isRoot).bind(function (table) {
return head(getTableCells(table)).map(function (startCell) {
return tableCellRng(startCell, endCell)
})
})
}
}
var getTableSelectionFromCellRng = function (isRoot) {
return function (cellRng) {
return getTableFromCellRng(cellRng, isRoot).map(function (table) {
return tableSelection(cellRng, table, getTableCells(table))
})
}
}
var getTableSelections = function (cellRng, selectionDetails, rng, isRoot) {
if (rng.collapsed || !cellRng.forall(isExpandedCellRng)) {
return Optional.none()
} else if (selectionDetails.isSameTable) {
var sameTableSelection = cellRng.bind(
getTableSelectionFromCellRng(isRoot)
)
return Optional.some({
start: sameTableSelection,
end: sameTableSelection,
})
} else {
var startCell = getClosestCell$1(rng.startContainer, isRoot)
var endCell = getClosestCell$1(rng.endContainer, isRoot)
var startTableSelection = startCell
.bind(getCellRangeFromStartTable(isRoot))
.bind(getTableSelectionFromCellRng(isRoot))
var endTableSelection = endCell
.bind(getCellRangeFromEndTable(isRoot))
.bind(getTableSelectionFromCellRng(isRoot))
return Optional.some({
start: startTableSelection,
end: endTableSelection,
})
}
}
var getCellIndex = function (cells, cell) {
return findIndex$2(cells, function (x) {
return eq(x, cell)
})
}
var getSelectedCells = function (tableSelection) {
return lift2(
getCellIndex(tableSelection.cells, tableSelection.rng.start),
getCellIndex(tableSelection.cells, tableSelection.rng.end),
function (startIndex, endIndex) {
return tableSelection.cells.slice(startIndex, endIndex + 1)
}
)
}
var isSingleCellTableContentSelected = function (optCellRng, rng, isRoot) {
return optCellRng.exists(function (cellRng) {
return (
isSingleCellTable(cellRng, isRoot) &&
hasAllContentsSelected(cellRng.start, rng)
)
})
}
var unselectCells = function (rng, selectionDetails) {
var startTable = selectionDetails.startTable,
endTable = selectionDetails.endTable
var otherContentRng = rng.cloneRange()
startTable.each(function (table) {
return otherContentRng.setStartAfter(table.dom)
})
endTable.each(function (table) {
return otherContentRng.setEndBefore(table.dom)
})
return otherContentRng
}
var handleSingleTable = function (cellRng, selectionDetails, rng, isRoot) {
return getTableSelections(cellRng, selectionDetails, rng, isRoot)
.bind(function (_a) {
var start = _a.start,
end = _a.end
return start.or(end)
})
.bind(function (tableSelection) {
var isSameTable = selectionDetails.isSameTable
var selectedCells = getSelectedCells(tableSelection).getOr([])
if (
isSameTable &&
tableSelection.cells.length === selectedCells.length
) {
return Optional.some(deleteAction.fullTable(tableSelection.table))
} else if (selectedCells.length > 0) {
if (isSameTable) {
return Optional.some(
deleteAction.partialTable(selectedCells, Optional.none())
)
} else {
var otherContentRng = unselectCells(rng, selectionDetails)
return Optional.some(
deleteAction.partialTable(
selectedCells,
Optional.some(
__assign(__assign({}, selectionDetails), {
rng: otherContentRng,
})
)
)
)
}
} else {
return Optional.none()
}
})
}
var handleMultiTable = function (cellRng, selectionDetails, rng, isRoot) {
return getTableSelections(cellRng, selectionDetails, rng, isRoot).bind(
function (_a) {
var start = _a.start,
end = _a.end
var startTableSelectedCells = start.bind(getSelectedCells).getOr([])
var endTableSelectedCells = end.bind(getSelectedCells).getOr([])
if (
startTableSelectedCells.length > 0 &&
endTableSelectedCells.length > 0
) {
var otherContentRng = unselectCells(rng, selectionDetails)
return Optional.some(
deleteAction.multiTable(
startTableSelectedCells,
endTableSelectedCells,
otherContentRng
)
)
} else {
return Optional.none()
}
}
)
}
var getActionFromRange = function (root, rng) {
var isRoot = isRootFromElement(root)
var optCellRng = getCellRng(rng, isRoot)
var selectionDetails = getTableDetailsFromRange(rng, isRoot)
if (isSingleCellTableContentSelected(optCellRng, rng, isRoot)) {
return optCellRng.map(function (cellRng) {
return deleteAction.singleCellTable(rng, cellRng.start)
})
} else if (selectionDetails.isMultiTable) {
return handleMultiTable(optCellRng, selectionDetails, rng, isRoot)
} else {
return handleSingleTable(optCellRng, selectionDetails, rng, isRoot)
}
}
var freefallRtl = function (root) {
var child = isComment$1(root) ? prevSibling(root) : lastChild(root)
return child.bind(freefallRtl).orThunk(function () {
return Optional.some(root)
})
}
var cleanCells = function (cells) {
return each$k(cells, function (cell) {
remove$6(cell, 'contenteditable')
fillWithPaddingBr(cell)
})
}
var getOutsideBlock = function (editor, container) {
return Optional.from(
editor.dom.getParent(container, editor.dom.isBlock)
).map(SugarElement.fromDom)
}
var handleEmptyBlock = function (editor, startInTable, emptyBlock) {
emptyBlock.each(function (block) {
if (startInTable) {
remove$7(block)
} else {
fillWithPaddingBr(block)
editor.selection.setCursorLocation(block.dom, 0)
}
})
}
var deleteContentInsideCell = function (
editor,
cell,
rng,
isFirstCellInSelection
) {
var insideTableRng = rng.cloneRange()
if (isFirstCellInSelection) {
insideTableRng.setStart(rng.startContainer, rng.startOffset)
insideTableRng.setEndAfter(cell.dom.lastChild)
} else {
insideTableRng.setStartBefore(cell.dom.firstChild)
insideTableRng.setEnd(rng.endContainer, rng.endOffset)
}
deleteCellContents(editor, insideTableRng, cell, false)
}
var collapseAndRestoreCellSelection = function (editor) {
var selectedCells = getCellsFromEditor(editor)
var selectedNode = SugarElement.fromDom(editor.selection.getNode())
if (isTableCell$5(selectedNode.dom) && isEmpty$2(selectedNode)) {
editor.selection.setCursorLocation(selectedNode.dom, 0)
} else {
editor.selection.collapse(true)
}
if (
selectedCells.length > 1 &&
exists(selectedCells, function (cell) {
return eq(cell, selectedNode)
})
) {
set$1(selectedNode, 'data-mce-selected', '1')
}
}
var emptySingleTableCells = function (editor, cells, outsideDetails) {
var editorRng = editor.selection.getRng()
var cellsToClean = outsideDetails
.bind(function (_a) {
var rng = _a.rng,
isStartInTable = _a.isStartInTable
var outsideBlock = getOutsideBlock(
editor,
isStartInTable ? rng.endContainer : rng.startContainer
)
rng.deleteContents()
handleEmptyBlock(editor, isStartInTable, outsideBlock.filter(isEmpty$2))
var endPointCell = isStartInTable ? cells[0] : cells[cells.length - 1]
deleteContentInsideCell(editor, endPointCell, editorRng, isStartInTable)
if (!isEmpty$2(endPointCell)) {
return Optional.some(
isStartInTable ? cells.slice(1) : cells.slice(0, -1)
)
} else {
return Optional.none()
}
})
.getOr(cells)
cleanCells(cellsToClean)
collapseAndRestoreCellSelection(editor)
return true
}
var emptyMultiTableCells = function (
editor,
startTableCells,
endTableCells,
betweenRng
) {
var rng = editor.selection.getRng()
var startCell = startTableCells[0]
var endCell = endTableCells[endTableCells.length - 1]
deleteContentInsideCell(editor, startCell, rng, true)
deleteContentInsideCell(editor, endCell, rng, false)
var startTableCellsToClean = isEmpty$2(startCell)
? startTableCells
: startTableCells.slice(1)
var endTableCellsToClean = isEmpty$2(endCell)
? endTableCells
: endTableCells.slice(0, -1)
cleanCells(startTableCellsToClean.concat(endTableCellsToClean))
betweenRng.deleteContents()
collapseAndRestoreCellSelection(editor)
return true
}
var deleteCellContents = function (editor, rng, cell, moveSelection) {
if (moveSelection === void 0) {
moveSelection = true
}
rng.deleteContents()
var lastNode = freefallRtl(cell).getOr(cell)
var lastBlock = SugarElement.fromDom(
editor.dom.getParent(lastNode.dom, editor.dom.isBlock)
)
if (isEmpty$2(lastBlock)) {
fillWithPaddingBr(lastBlock)
if (moveSelection) {
editor.selection.setCursorLocation(lastBlock.dom, 0)
}
}
if (!eq(cell, lastBlock)) {
var additionalCleanupNodes = is$1(parent(lastBlock), cell)
? []
: siblings(lastBlock)
each$k(additionalCleanupNodes.concat(children(cell)), function (node) {
if (
!eq(node, lastBlock) &&
!contains$1(node, lastBlock) &&
isEmpty$2(node)
) {
remove$7(node)
}
})
}
return true
}
var deleteTableElement = function (editor, table) {
deleteElement$2(editor, false, table)
return true
}
var deleteCellRange = function (editor, rootElm, rng) {
return getActionFromRange(rootElm, rng).map(function (action) {
return action.fold(
curry(deleteCellContents, editor),
curry(deleteTableElement, editor),
curry(emptySingleTableCells, editor),
curry(emptyMultiTableCells, editor)
)
})
}
var deleteCaptionRange = function (editor, caption) {
return emptyElement(editor, caption)
}
var deleteTableRange = function (editor, rootElm, rng, startElm) {
return getParentCaption(rootElm, startElm)
.fold(
function () {
return deleteCellRange(editor, rootElm, rng)
},
function (caption) {
return deleteCaptionRange(editor, caption)
}
)
.getOr(false)
}
var deleteRange$2 = function (editor, startElm, selectedCells) {
var rootNode = SugarElement.fromDom(editor.getBody())
var rng = editor.selection.getRng()
return selectedCells.length !== 0
? emptySingleTableCells(editor, selectedCells, Optional.none())
: deleteTableRange(editor, rootNode, rng, startElm)
}
var getParentCell = function (rootElm, elm) {
return find$3(parentsAndSelf(elm, rootElm), isTableCell$4)
}
var getParentCaption = function (rootElm, elm) {
return find$3(parentsAndSelf(elm, rootElm), isTag('caption'))
}
var deleteBetweenCells = function (editor, rootElm, forward, fromCell, from) {
return navigate(forward, editor.getBody(), from).bind(function (to) {
return getParentCell(rootElm, SugarElement.fromDom(to.getNode())).map(
function (toCell) {
return eq(toCell, fromCell) === false
}
)
})
}
var emptyElement = function (editor, elm) {
fillWithPaddingBr(elm)
editor.selection.setCursorLocation(elm.dom, 0)
return Optional.some(true)
}
var isDeleteOfLastCharPos = function (fromCaption, forward, from, to) {
return firstPositionIn(fromCaption.dom)
.bind(function (first) {
return lastPositionIn(fromCaption.dom).map(function (last) {
return forward
? from.isEqual(first) && to.isEqual(last)
: from.isEqual(last) && to.isEqual(first)
})
})
.getOr(true)
}
var emptyCaretCaption = function (editor, elm) {
return emptyElement(editor, elm)
}
var validateCaretCaption = function (rootElm, fromCaption, to) {
return getParentCaption(rootElm, SugarElement.fromDom(to.getNode())).map(
function (toCaption) {
return eq(toCaption, fromCaption) === false
}
)
}
var deleteCaretInsideCaption = function (
editor,
rootElm,
forward,
fromCaption,
from
) {
return navigate(forward, editor.getBody(), from)
.bind(function (to) {
return isDeleteOfLastCharPos(fromCaption, forward, from, to)
? emptyCaretCaption(editor, fromCaption)
: validateCaretCaption(rootElm, fromCaption, to)
})
.or(Optional.some(true))
}
var deleteCaretCells = function (editor, forward, rootElm, startElm) {
var from = CaretPosition.fromRangeStart(editor.selection.getRng())
return getParentCell(rootElm, startElm)
.bind(function (fromCell) {
return isEmpty$2(fromCell)
? emptyElement(editor, fromCell)
: deleteBetweenCells(editor, rootElm, forward, fromCell, from)
})
.getOr(false)
}
var deleteCaretCaption = function (editor, forward, rootElm, fromCaption) {
var from = CaretPosition.fromRangeStart(editor.selection.getRng())
return isEmpty$2(fromCaption)
? emptyElement(editor, fromCaption)
: deleteCaretInsideCaption(editor, rootElm, forward, fromCaption, from)
}
var isNearTable = function (forward, pos) {
return forward ? isBeforeTable(pos) : isAfterTable(pos)
}
var isBeforeOrAfterTable = function (editor, forward) {
var fromPos = CaretPosition.fromRangeStart(editor.selection.getRng())
return (
isNearTable(forward, fromPos) ||
fromPosition(forward, editor.getBody(), fromPos).exists(function (pos) {
return isNearTable(forward, pos)
})
)
}
var deleteCaret$3 = function (editor, forward, startElm) {
var rootElm = SugarElement.fromDom(editor.getBody())
return getParentCaption(rootElm, startElm).fold(
function () {
return (
deleteCaretCells(editor, forward, rootElm, startElm) ||
isBeforeOrAfterTable(editor, forward)
)
},
function (fromCaption) {
return deleteCaretCaption(editor, forward, rootElm, fromCaption).getOr(
false
)
}
)
}
var backspaceDelete$9 = function (editor, forward) {
var startElm = SugarElement.fromDom(editor.selection.getStart(true))
var cells = getCellsFromEditor(editor)
return editor.selection.isCollapsed() && cells.length === 0
? deleteCaret$3(editor, forward, startElm)
: deleteRange$2(editor, startElm, cells)
}
var createRange = function (sc, so, ec, eo) {
var rng = document.createRange()
rng.setStart(sc, so)
rng.setEnd(ec, eo)
return rng
}
var normalizeBlockSelectionRange = function (rng) {
var startPos = CaretPosition.fromRangeStart(rng)
var endPos = CaretPosition.fromRangeEnd(rng)
var rootNode = rng.commonAncestorContainer
return fromPosition(false, rootNode, endPos)
.map(function (newEndPos) {
if (
!isInSameBlock(startPos, endPos, rootNode) &&
isInSameBlock(startPos, newEndPos, rootNode)
) {
return createRange(
startPos.container(),
startPos.offset(),
newEndPos.container(),
newEndPos.offset()
)
} else {
return rng
}
})
.getOr(rng)
}
var normalize = function (rng) {
return rng.collapsed ? rng : normalizeBlockSelectionRange(rng)
}
var hasOnlyOneChild$1 = function (node) {
return node.firstChild && node.firstChild === node.lastChild
}
var isPaddingNode = function (node) {
return node.name === 'br' || node.value === nbsp
}
var isPaddedEmptyBlock = function (schema, node) {
var blockElements = schema.getBlockElements()
return (
blockElements[node.name] &&
hasOnlyOneChild$1(node) &&
isPaddingNode(node.firstChild)
)
}
var isEmptyFragmentElement = function (schema, node) {
var nonEmptyElements = schema.getNonEmptyElements()
return (
node &&
(node.isEmpty(nonEmptyElements) || isPaddedEmptyBlock(schema, node))
)
}
var isListFragment = function (schema, fragment) {
var firstChild = fragment.firstChild
var lastChild = fragment.lastChild
if (firstChild && firstChild.name === 'meta') {
firstChild = firstChild.next
}
if (lastChild && lastChild.attr('id') === 'mce_marker') {
lastChild = lastChild.prev
}
if (isEmptyFragmentElement(schema, lastChild)) {
lastChild = lastChild.prev
}
if (!firstChild || firstChild !== lastChild) {
return false
}
return firstChild.name === 'ul' || firstChild.name === 'ol'
}
var cleanupDomFragment = function (domFragment) {
var firstChild = domFragment.firstChild
var lastChild = domFragment.lastChild
if (firstChild && firstChild.nodeName === 'META') {
firstChild.parentNode.removeChild(firstChild)
}
if (lastChild && lastChild.id === 'mce_marker') {
lastChild.parentNode.removeChild(lastChild)
}
return domFragment
}
var toDomFragment = function (dom, serializer, fragment) {
var html = serializer.serialize(fragment)
var domFragment = dom.createFragment(html)
return cleanupDomFragment(domFragment)
}
var listItems = function (elm) {
return filter$4(elm.childNodes, function (child) {
return child.nodeName === 'LI'
})
}
var isPadding = function (node) {
return node.data === nbsp || isBr$5(node)
}
var isListItemPadded = function (node) {
return (
node &&
node.firstChild &&
node.firstChild === node.lastChild &&
isPadding(node.firstChild)
)
}
var isEmptyOrPadded = function (elm) {
return !elm.firstChild || isListItemPadded(elm)
}
var trimListItems = function (elms) {
return elms.length > 0 && isEmptyOrPadded(elms[elms.length - 1])
? elms.slice(0, -1)
: elms
}
var getParentLi = function (dom, node) {
var parentBlock = dom.getParent(node, dom.isBlock)
return parentBlock && parentBlock.nodeName === 'LI' ? parentBlock : null
}
var isParentBlockLi = function (dom, node) {
return !!getParentLi(dom, node)
}
var getSplit = function (parentNode, rng) {
var beforeRng = rng.cloneRange()
var afterRng = rng.cloneRange()
beforeRng.setStartBefore(parentNode)
afterRng.setEndAfter(parentNode)
return [beforeRng.cloneContents(), afterRng.cloneContents()]
}
var findFirstIn = function (node, rootNode) {
var caretPos = CaretPosition.before(node)
var caretWalker = CaretWalker(rootNode)
var newCaretPos = caretWalker.next(caretPos)
return newCaretPos ? newCaretPos.toRange() : null
}
var findLastOf = function (node, rootNode) {
var caretPos = CaretPosition.after(node)
var caretWalker = CaretWalker(rootNode)
var newCaretPos = caretWalker.prev(caretPos)
return newCaretPos ? newCaretPos.toRange() : null
}
var insertMiddle = function (target, elms, rootNode, rng) {
var parts = getSplit(target, rng)
var parentElm = target.parentNode
parentElm.insertBefore(parts[0], target)
Tools.each(elms, function (li) {
parentElm.insertBefore(li, target)
})
parentElm.insertBefore(parts[1], target)
parentElm.removeChild(target)
return findLastOf(elms[elms.length - 1], rootNode)
}
var insertBefore$1 = function (target, elms, rootNode) {
var parentElm = target.parentNode
Tools.each(elms, function (elm) {
parentElm.insertBefore(elm, target)
})
return findFirstIn(target, rootNode)
}
var insertAfter$1 = function (target, elms, rootNode, dom) {
dom.insertAfter(elms.reverse(), target)
return findLastOf(elms[0], rootNode)
}
var insertAtCaret$1 = function (serializer, dom, rng, fragment) {
var domFragment = toDomFragment(dom, serializer, fragment)
var liTarget = getParentLi(dom, rng.startContainer)
var liElms = trimListItems(listItems(domFragment.firstChild))
var BEGINNING = 1,
END = 2
var rootNode = dom.getRoot()
var isAt = function (location) {
var caretPos = CaretPosition.fromRangeStart(rng)
var caretWalker = CaretWalker(dom.getRoot())
var newPos =
location === BEGINNING
? caretWalker.prev(caretPos)
: caretWalker.next(caretPos)
return newPos ? getParentLi(dom, newPos.getNode()) !== liTarget : true
}
if (isAt(BEGINNING)) {
return insertBefore$1(liTarget, liElms, rootNode)
} else if (isAt(END)) {
return insertAfter$1(liTarget, liElms, rootNode, dom)
}
return insertMiddle(liTarget, liElms, rootNode, rng)
}
var trimOrPadLeftRight = function (dom, rng, html) {
var root = SugarElement.fromDom(dom.getRoot())
if (needsToBeNbspLeft(root, CaretPosition.fromRangeStart(rng))) {
html = html.replace(/^ /, ' ')
} else {
html = html.replace(/^ /, ' ')
}
if (needsToBeNbspRight(root, CaretPosition.fromRangeEnd(rng))) {
html = html.replace(/( | )(
)?$/, ' ')
} else {
html = html.replace(/ (
)?$/, ' ')
}
return html
}
var isTableCell$1 = isTableCell$5
var isTableCellContentSelected = function (dom, rng, cell) {
if (cell !== null) {
var endCell = dom.getParent(rng.endContainer, isTableCell$1)
return (
cell === endCell &&
hasAllContentsSelected(SugarElement.fromDom(cell), rng)
)
} else {
return false
}
}
var validInsertion = function (editor, value, parentNode) {
if (parentNode.getAttribute('data-mce-bogus') === 'all') {
parentNode.parentNode.insertBefore(
editor.dom.createFragment(value),
parentNode
)
} else {
var node = parentNode.firstChild
var node2 = parentNode.lastChild
if (!node || (node === node2 && node.nodeName === 'BR')) {
editor.dom.setHTML(parentNode, value)
} else {
editor.selection.setContent(value)
}
}
}
var trimBrsFromTableCell = function (dom, elm) {
Optional.from(dom.getParent(elm, 'td,th'))
.map(SugarElement.fromDom)
.each(trimBlockTrailingBr)
}
var reduceInlineTextElements = function (editor, merge) {
var textInlineElements = editor.schema.getTextInlineElements()
var dom = editor.dom
if (merge) {
var root_1 = editor.getBody()
var elementUtils_1 = ElementUtils(dom)
Tools.each(dom.select('*[data-mce-fragment]'), function (node) {
var isInline = isNonNullable(
textInlineElements[node.nodeName.toLowerCase()]
)
if (isInline && hasInheritableStyles(dom, node)) {
for (
var parentNode = node.parentNode;
isNonNullable(parentNode) && parentNode !== root_1;
parentNode = parentNode.parentNode
) {
var styleConflict = hasStyleConflict(dom, node, parentNode)
if (styleConflict) {
break
}
if (elementUtils_1.compare(parentNode, node)) {
dom.remove(node, true)
break
}
}
}
})
}
}
var markFragmentElements = function (fragment) {
var node = fragment
while ((node = node.walk())) {
if (node.type === 1) {
node.attr('data-mce-fragment', '1')
}
}
}
var unmarkFragmentElements = function (elm) {
Tools.each(elm.getElementsByTagName('*'), function (elm) {
elm.removeAttribute('data-mce-fragment')
})
}
var isPartOfFragment = function (node) {
return !!node.getAttribute('data-mce-fragment')
}
var canHaveChildren = function (editor, node) {
return node && !editor.schema.getShortEndedElements()[node.nodeName]
}
var moveSelectionToMarker = function (editor, marker) {
var nextRng
var dom = editor.dom
var selection = editor.selection
if (!marker) {
return
}
selection.scrollIntoView(marker)
var parentEditableElm = getContentEditableRoot$1(editor.getBody(), marker)
if (dom.getContentEditable(parentEditableElm) === 'false') {
dom.remove(marker)
selection.select(parentEditableElm)
return
}
var rng = dom.createRng()
var node = marker.previousSibling
if (isText$7(node)) {
rng.setStart(node, node.nodeValue.length)
if (!Env.ie) {
var node2 = marker.nextSibling
if (isText$7(node2)) {
node.appendData(node2.data)
node2.parentNode.removeChild(node2)
}
}
} else {
rng.setStartBefore(marker)
rng.setEndBefore(marker)
}
var findNextCaretRng = function (rng) {
var caretPos = CaretPosition.fromRangeStart(rng)
var caretWalker = CaretWalker(editor.getBody())
caretPos = caretWalker.next(caretPos)
if (caretPos) {
return caretPos.toRange()
}
}
var parentBlock = dom.getParent(marker, dom.isBlock)
dom.remove(marker)
if (parentBlock && dom.isEmpty(parentBlock)) {
editor.$(parentBlock).empty()
rng.setStart(parentBlock, 0)
rng.setEnd(parentBlock, 0)
if (
!isTableCell$1(parentBlock) &&
!isPartOfFragment(parentBlock) &&
(nextRng = findNextCaretRng(rng))
) {
rng = nextRng
dom.remove(parentBlock)
} else {
dom.add(parentBlock, dom.create('br', { 'data-mce-bogus': '1' }))
}
}
selection.setRng(rng)
}
var deleteSelectedContent = function (editor) {
var dom = editor.dom
var rng = normalize(editor.selection.getRng())
editor.selection.setRng(rng)
var startCell = dom.getParent(rng.startContainer, isTableCell$1)
if (isTableCellContentSelected(dom, rng, startCell)) {
deleteCellContents(editor, rng, SugarElement.fromDom(startCell))
} else {
editor.getDoc().execCommand('Delete', false, null)
}
}
var insertHtmlAtCaret = function (editor, value, details) {
var parentNode
var rng, node
var selection = editor.selection
var dom = editor.dom
if (/^ | $/.test(value)) {
value = trimOrPadLeftRight(dom, selection.getRng(), value)
}
var parser = editor.parser
var merge = details.merge
var serializer = HtmlSerializer(
{ validate: shouldValidate(editor) },
editor.schema
)
var bookmarkHtml =
''
var args = editor.fire('BeforeSetContent', {
content: value,
format: 'html',
selection: true,
paste: details.paste,
})
if (args.isDefaultPrevented()) {
editor.fire('SetContent', {
content: args.content,
format: 'html',
selection: true,
paste: details.paste,
})
return
}
value = args.content
if (value.indexOf('{$caret}') === -1) {
value += '{$caret}'
}
value = value.replace(/\{\$caret\}/, bookmarkHtml)
rng = selection.getRng()
var caretElement =
rng.startContainer || (rng.parentElement ? rng.parentElement() : null)
var body = editor.getBody()
if (caretElement === body && selection.isCollapsed()) {
if (
dom.isBlock(body.firstChild) &&
canHaveChildren(editor, body.firstChild) &&
dom.isEmpty(body.firstChild)
) {
rng = dom.createRng()
rng.setStart(body.firstChild, 0)
rng.setEnd(body.firstChild, 0)
selection.setRng(rng)
}
}
if (!selection.isCollapsed()) {
deleteSelectedContent(editor)
}
parentNode = selection.getNode()
var parserArgs = {
context: parentNode.nodeName.toLowerCase(),
data: details.data,
insert: true,
}
var fragment = parser.parse(value, parserArgs)
if (
details.paste === true &&
isListFragment(editor.schema, fragment) &&
isParentBlockLi(dom, parentNode)
) {
rng = insertAtCaret$1(serializer, dom, selection.getRng(), fragment)
selection.setRng(rng)
editor.fire('SetContent', args)
return
}
markFragmentElements(fragment)
node = fragment.lastChild
if (node.attr('id') === 'mce_marker') {
var marker = node
for (node = node.prev; node; node = node.walk(true)) {
if (node.type === 3 || !dom.isBlock(node.name)) {
if (editor.schema.isValidChild(node.parent.name, 'span')) {
node.parent.insert(marker, node, node.name === 'br')
}
break
}
}
}
editor._selectionOverrides.showBlockCaretContainer(parentNode)
if (!parserArgs.invalid) {
value = serializer.serialize(fragment)
validInsertion(editor, value, parentNode)
} else {
editor.selection.setContent(bookmarkHtml)
parentNode = selection.getNode()
var rootNode = editor.getBody()
if (parentNode.nodeType === 9) {
parentNode = node = rootNode
} else {
node = parentNode
}
while (node !== rootNode) {
parentNode = node
node = node.parentNode
}
value =
parentNode === rootNode
? rootNode.innerHTML
: dom.getOuterHTML(parentNode)
value = serializer.serialize(
parser.parse(
value.replace(
//i,
function () {
return serializer.serialize(fragment)
}
)
)
)
if (parentNode === rootNode) {
dom.setHTML(rootNode, value)
} else {
dom.setOuterHTML(parentNode, value)
}
}
reduceInlineTextElements(editor, merge)
moveSelectionToMarker(editor, dom.get('mce_marker'))
unmarkFragmentElements(editor.getBody())
trimBrsFromTableCell(dom, selection.getStart())
editor.fire('SetContent', args)
editor.addVisual()
}
var traverse = function (node, fn) {
fn(node)
if (node.firstChild) {
traverse(node.firstChild, fn)
}
if (node.next) {
traverse(node.next, fn)
}
}
var findMatchingNodes = function (nodeFilters, attributeFilters, node) {
var nodeMatches = {}
var attrMatches = {}
var matches = []
if (node.firstChild) {
traverse(node.firstChild, function (node) {
each$k(nodeFilters, function (filter) {
if (filter.name === node.name) {
if (nodeMatches[filter.name]) {
nodeMatches[filter.name].nodes.push(node)
} else {
nodeMatches[filter.name] = {
filter: filter,
nodes: [node],
}
}
}
})
each$k(attributeFilters, function (filter) {
if (typeof node.attr(filter.name) === 'string') {
if (attrMatches[filter.name]) {
attrMatches[filter.name].nodes.push(node)
} else {
attrMatches[filter.name] = {
filter: filter,
nodes: [node],
}
}
}
})
})
}
for (var name_1 in nodeMatches) {
if (has$2(nodeMatches, name_1)) {
matches.push(nodeMatches[name_1])
}
}
for (var name_2 in attrMatches) {
if (has$2(attrMatches, name_2)) {
matches.push(attrMatches[name_2])
}
}
return matches
}
var filter$1 = function (nodeFilters, attributeFilters, node) {
var matches = findMatchingNodes(nodeFilters, attributeFilters, node)
each$k(matches, function (match) {
each$k(match.filter.callbacks, function (callback) {
callback(match.nodes, match.filter.name, {})
})
})
}
var defaultFormat$1 = 'html'
var isTreeNode = function (content) {
return content instanceof AstNode
}
var moveSelection = function (editor) {
if (hasFocus(editor)) {
firstPositionIn(editor.getBody()).each(function (pos) {
var node = pos.getNode()
var caretPos = isTable$3(node) ? firstPositionIn(node).getOr(pos) : pos
editor.selection.setRng(caretPos.toRange())
})
}
}
var setEditorHtml = function (editor, html, noSelection) {
editor.dom.setHTML(editor.getBody(), html)
if (noSelection !== true) {
moveSelection(editor)
}
}
var setContentString = function (editor, body, content, args) {
if (content.length === 0 || /^\s+$/.test(content)) {
var padd = '
'
if (body.nodeName === 'TABLE') {
content = '' + padd + ' |
'
} else if (/^(UL|OL)$/.test(body.nodeName)) {
content = '' + padd + ''
}
var forcedRootBlockName = getForcedRootBlock(editor)
if (
forcedRootBlockName &&
editor.schema.isValidChild(
body.nodeName.toLowerCase(),
forcedRootBlockName.toLowerCase()
)
) {
content = padd
content = editor.dom.createHTML(
forcedRootBlockName,
getForcedRootBlockAttrs(editor),
content
)
} else if (!content) {
content = '
'
}
setEditorHtml(editor, content, args.no_selection)
editor.fire('SetContent', args)
} else {
if (args.format !== 'raw') {
content = HtmlSerializer(
{ validate: editor.validate },
editor.schema
).serialize(
editor.parser.parse(content, {
isRootContent: true,
insert: true,
})
)
}
args.content = isWsPreserveElement(SugarElement.fromDom(body))
? content
: Tools.trim(content)
setEditorHtml(editor, args.content, args.no_selection)
if (!args.no_events) {
editor.fire('SetContent', args)
}
}
return args.content
}
var setContentTree = function (editor, body, content, args) {
filter$1(
editor.parser.getNodeFilters(),
editor.parser.getAttributeFilters(),
content
)
var html = HtmlSerializer(
{ validate: editor.validate },
editor.schema
).serialize(content)
args.content = isWsPreserveElement(SugarElement.fromDom(body))
? html
: Tools.trim(html)
setEditorHtml(editor, args.content, args.no_selection)
if (!args.no_events) {
editor.fire('SetContent', args)
}
return content
}
var setupArgs$2 = function (args, content) {
return __assign(__assign({ format: defaultFormat$1 }, args), {
set: true,
content: isTreeNode(content) ? '' : content,
})
}
var setContentInternal = function (editor, content, args) {
var defaultedArgs = setupArgs$2(args, content)
var updatedArgs = args.no_events
? defaultedArgs
: editor.fire('BeforeSetContent', defaultedArgs)
if (!isTreeNode(content)) {
content = updatedArgs.content
}
return Optional.from(editor.getBody()).fold(
constant(content),
function (body) {
return isTreeNode(content)
? setContentTree(editor, body, content, updatedArgs)
: setContentString(editor, body, content, updatedArgs)
}
)
}
var sibling = function (scope, predicate) {
return sibling$2(scope, predicate).isSome()
}
var ensureIsRoot = function (isRoot) {
return isFunction(isRoot) ? isRoot : never
}
var ancestor = function (scope, transform, isRoot) {
var element = scope.dom
var stop = ensureIsRoot(isRoot)
while (element.parentNode) {
element = element.parentNode
var el = SugarElement.fromDom(element)
var transformed = transform(el)
if (transformed.isSome()) {
return transformed
} else if (stop(el)) {
break
}
}
return Optional.none()
}
var closest$1 = function (scope, transform, isRoot) {
var current = transform(scope)
var stop = ensureIsRoot(isRoot)
return current.orThunk(function () {
return stop(scope) ? Optional.none() : ancestor(scope, transform, stop)
})
}
var isEq$3 = isEq$5
var matchesUnInheritedFormatSelector = function (ed, node, name) {
var formatList = ed.formatter.get(name)
if (formatList) {
for (var i = 0; i < formatList.length; i++) {
var format = formatList[i]
if (
isSelectorFormat(format) &&
format.inherit === false &&
ed.dom.is(node, format.selector)
) {
return true
}
}
}
return false
}
var matchParents = function (editor, node, name, vars, similar) {
var root = editor.dom.getRoot()
if (node === root) {
return false
}
node = editor.dom.getParent(node, function (node) {
if (matchesUnInheritedFormatSelector(editor, node, name)) {
return true
}
return (
node.parentNode === root || !!matchNode(editor, node, name, vars, true)
)
})
return !!matchNode(editor, node, name, vars, similar)
}
var matchName$1 = function (dom, node, format) {
if (isEq$3(node, format.inline)) {
return true
}
if (isEq$3(node, format.block)) {
return true
}
if (format.selector) {
return node.nodeType === 1 && dom.is(node, format.selector)
}
}
var matchItems = function (dom, node, format, itemName, similar, vars) {
var items = format[itemName]
if (isFunction(format.onmatch)) {
return format.onmatch(node, format, itemName)
}
if (items) {
if (isUndefined(items.length)) {
for (var key in items) {
if (has$2(items, key)) {
var value =
itemName === 'attributes'
? dom.getAttrib(node, key)
: getStyle(dom, node, key)
var expectedValue = replaceVars(items[key], vars)
var isEmptyValue = isNullable(value) || isEmpty$3(value)
if (isEmptyValue && isNullable(expectedValue)) {
continue
}
if (similar && isEmptyValue && !format.exact) {
return false
}
if (
(!similar || format.exact) &&
!isEq$3(value, normalizeStyleValue(dom, expectedValue, key))
) {
return false
}
}
}
} else {
for (var i = 0; i < items.length; i++) {
if (
itemName === 'attributes'
? dom.getAttrib(node, items[i])
: getStyle(dom, node, items[i])
) {
return true
}
}
}
}
return true
}
var matchNode = function (ed, node, name, vars, similar) {
var formatList = ed.formatter.get(name)
var dom = ed.dom
if (formatList && node) {
for (var i = 0; i < formatList.length; i++) {
var format = formatList[i]
if (
matchName$1(ed.dom, node, format) &&
matchItems(dom, node, format, 'attributes', similar, vars) &&
matchItems(dom, node, format, 'styles', similar, vars)
) {
var classes = format.classes
if (classes) {
for (var x = 0; x < classes.length; x++) {
if (!ed.dom.hasClass(node, replaceVars(classes[x], vars))) {
return
}
}
}
return format
}
}
}
}
var match$2 = function (editor, name, vars, node, similar) {
if (node) {
return matchParents(editor, node, name, vars, similar)
}
node = editor.selection.getNode()
if (matchParents(editor, node, name, vars, similar)) {
return true
}
var startNode = editor.selection.getStart()
if (startNode !== node) {
if (matchParents(editor, startNode, name, vars, similar)) {
return true
}
}
return false
}
var matchAll = function (editor, names, vars) {
var matchedFormatNames = []
var checkedMap = {}
var startElement = editor.selection.getStart()
editor.dom.getParent(
startElement,
function (node) {
for (var i = 0; i < names.length; i++) {
var name_1 = names[i]
if (!checkedMap[name_1] && matchNode(editor, node, name_1, vars)) {
checkedMap[name_1] = true
matchedFormatNames.push(name_1)
}
}
},
editor.dom.getRoot()
)
return matchedFormatNames
}
var closest = function (editor, names) {
var isRoot = function (elm) {
return eq(elm, SugarElement.fromDom(editor.getBody()))
}
var match = function (elm, name) {
return matchNode(editor, elm.dom, name)
? Optional.some(name)
: Optional.none()
}
return Optional.from(editor.selection.getStart(true))
.bind(function (rawElm) {
return closest$1(
SugarElement.fromDom(rawElm),
function (elm) {
return findMap(names, function (name) {
return match(elm, name)
})
},
isRoot
)
})
.getOrNull()
}
var canApply = function (editor, name) {
var formatList = editor.formatter.get(name)
var dom = editor.dom
if (formatList) {
var startNode = editor.selection.getStart()
var parents = getParents$2(dom, startNode)
for (var x = formatList.length - 1; x >= 0; x--) {
var format = formatList[x]
if (!isSelectorFormat(format) || isNonNullable(format.defaultBlock)) {
return true
}
for (var i = parents.length - 1; i >= 0; i--) {
if (dom.is(parents[i], format.selector)) {
return true
}
}
}
}
return false
}
var matchAllOnNode = function (editor, node, formatNames) {
return foldl(
formatNames,
function (acc, name) {
var matchSimilar = isVariableFormatName(editor, name)
if (editor.formatter.matchNode(node, name, {}, matchSimilar)) {
return acc.concat([name])
} else {
return acc
}
},
[]
)
}
var ZWSP = ZWSP$1,
CARET_ID = '_mce_caret'
var importNode = function (ownerDocument, node) {
return ownerDocument.importNode(node, true)
}
var getEmptyCaretContainers = function (node) {
var nodes = []
while (node) {
if (
(node.nodeType === 3 && node.nodeValue !== ZWSP) ||
node.childNodes.length > 1
) {
return []
}
if (node.nodeType === 1) {
nodes.push(node)
}
node = node.firstChild
}
return nodes
}
var isCaretContainerEmpty = function (node) {
return getEmptyCaretContainers(node).length > 0
}
var findFirstTextNode = function (node) {
if (node) {
var walker = new DomTreeWalker(node, node)
for (node = walker.current(); node; node = walker.next()) {
if (isText$7(node)) {
return node
}
}
}
return null
}
var createCaretContainer = function (fill) {
var caretContainer = SugarElement.fromTag('span')
setAll$1(caretContainer, {
id: CARET_ID,
'data-mce-bogus': '1',
'data-mce-type': 'format-caret',
})
if (fill) {
append$1(caretContainer, SugarElement.fromText(ZWSP))
}
return caretContainer
}
var trimZwspFromCaretContainer = function (caretContainerNode) {
var textNode = findFirstTextNode(caretContainerNode)
if (textNode && textNode.nodeValue.charAt(0) === ZWSP) {
textNode.deleteData(0, 1)
}
return textNode
}
var removeCaretContainerNode = function (editor, node, moveCaret) {
if (moveCaret === void 0) {
moveCaret = true
}
var dom = editor.dom,
selection = editor.selection
if (isCaretContainerEmpty(node)) {
deleteElement$2(editor, false, SugarElement.fromDom(node), moveCaret)
} else {
var rng = selection.getRng()
var block = dom.getParent(node, dom.isBlock)
var startContainer = rng.startContainer
var startOffset = rng.startOffset
var endContainer = rng.endContainer
var endOffset = rng.endOffset
var textNode = trimZwspFromCaretContainer(node)
dom.remove(node, true)
if (startContainer === textNode && startOffset > 0) {
rng.setStart(textNode, startOffset - 1)
}
if (endContainer === textNode && endOffset > 0) {
rng.setEnd(textNode, endOffset - 1)
}
if (block && dom.isEmpty(block)) {
fillWithPaddingBr(SugarElement.fromDom(block))
}
selection.setRng(rng)
}
}
var removeCaretContainer = function (editor, node, moveCaret) {
if (moveCaret === void 0) {
moveCaret = true
}
var dom = editor.dom,
selection = editor.selection
if (!node) {
node = getParentCaretContainer(editor.getBody(), selection.getStart())
if (!node) {
while ((node = dom.get(CARET_ID))) {
removeCaretContainerNode(editor, node, false)
}
}
} else {
removeCaretContainerNode(editor, node, moveCaret)
}
}
var insertCaretContainerNode = function (editor, caretContainer, formatNode) {
var dom = editor.dom,
block = dom.getParent(formatNode, curry(isTextBlock$1, editor))
if (block && dom.isEmpty(block)) {
formatNode.parentNode.replaceChild(caretContainer, formatNode)
} else {
removeTrailingBr(SugarElement.fromDom(formatNode))
if (dom.isEmpty(formatNode)) {
formatNode.parentNode.replaceChild(caretContainer, formatNode)
} else {
dom.insertAfter(caretContainer, formatNode)
}
}
}
var appendNode = function (parentNode, node) {
parentNode.appendChild(node)
return node
}
var insertFormatNodesIntoCaretContainer = function (
formatNodes,
caretContainer
) {
var innerMostFormatNode = foldr(
formatNodes,
function (parentNode, formatNode) {
return appendNode(parentNode, formatNode.cloneNode(false))
},
caretContainer
)
return appendNode(
innerMostFormatNode,
innerMostFormatNode.ownerDocument.createTextNode(ZWSP)
)
}
var cleanFormatNode = function (
editor,
caretContainer,
formatNode,
name,
vars,
similar
) {
var formatter = editor.formatter
var dom = editor.dom
var validFormats = filter$4(keys(formatter.get()), function (formatName) {
return formatName !== name && !contains$2(formatName, 'removeformat')
})
var matchedFormats = matchAllOnNode(editor, formatNode, validFormats)
var uniqueFormats = filter$4(matchedFormats, function (fmtName) {
return !areSimilarFormats(editor, fmtName, name)
})
if (uniqueFormats.length > 0) {
var clonedFormatNode = formatNode.cloneNode(false)
dom.add(caretContainer, clonedFormatNode)
formatter.remove(name, vars, clonedFormatNode, similar)
dom.remove(clonedFormatNode)
return Optional.some(clonedFormatNode)
} else {
return Optional.none()
}
}
var applyCaretFormat = function (editor, name, vars) {
var caretContainer, textNode
var selection = editor.selection
var selectionRng = selection.getRng()
var offset = selectionRng.startOffset
var container = selectionRng.startContainer
var text = container.nodeValue
caretContainer = getParentCaretContainer(
editor.getBody(),
selection.getStart()
)
if (caretContainer) {
textNode = findFirstTextNode(caretContainer)
}
var wordcharRegex = /[^\s\u00a0\u00ad\u200b\ufeff]/
if (
text &&
offset > 0 &&
offset < text.length &&
wordcharRegex.test(text.charAt(offset)) &&
wordcharRegex.test(text.charAt(offset - 1))
) {
var bookmark = selection.getBookmark()
selectionRng.collapse(true)
var rng = expandRng(editor, selectionRng, editor.formatter.get(name))
rng = split(rng)
editor.formatter.apply(name, vars, rng)
selection.moveToBookmark(bookmark)
} else {
if (!caretContainer || textNode.nodeValue !== ZWSP) {
caretContainer = importNode(
editor.getDoc(),
createCaretContainer(true).dom
)
textNode = caretContainer.firstChild
selectionRng.insertNode(caretContainer)
offset = 1
editor.formatter.apply(name, vars, caretContainer)
} else {
editor.formatter.apply(name, vars, caretContainer)
}
selection.setCursorLocation(textNode, offset)
}
}
var removeCaretFormat = function (editor, name, vars, similar) {
var dom = editor.dom
var selection = editor.selection
var hasContentAfter, node, formatNode
var parents = []
var rng = selection.getRng()
var container = rng.startContainer
var offset = rng.startOffset
node = container
if (container.nodeType === 3) {
if (offset !== container.nodeValue.length) {
hasContentAfter = true
}
node = node.parentNode
}
while (node) {
if (matchNode(editor, node, name, vars, similar)) {
formatNode = node
break
}
if (node.nextSibling) {
hasContentAfter = true
}
parents.push(node)
node = node.parentNode
}
if (!formatNode) {
return
}
if (hasContentAfter) {
var bookmark = selection.getBookmark()
rng.collapse(true)
var expandedRng = expandRng(editor, rng, editor.formatter.get(name), true)
expandedRng = split(expandedRng)
editor.formatter.remove(name, vars, expandedRng, similar)
selection.moveToBookmark(bookmark)
} else {
var caretContainer = getParentCaretContainer(editor.getBody(), formatNode)
var newCaretContainer = createCaretContainer(false).dom
insertCaretContainerNode(
editor,
newCaretContainer,
caretContainer !== null ? caretContainer : formatNode
)
var cleanedFormatNode = cleanFormatNode(
editor,
newCaretContainer,
formatNode,
name,
vars,
similar
)
var caretTextNode = insertFormatNodesIntoCaretContainer(
parents.concat(cleanedFormatNode.toArray()),
newCaretContainer
)
removeCaretContainerNode(editor, caretContainer, false)
selection.setCursorLocation(caretTextNode, 1)
if (dom.isEmpty(formatNode)) {
dom.remove(formatNode)
}
}
}
var disableCaretContainer = function (editor, keyCode) {
var selection = editor.selection,
body = editor.getBody()
removeCaretContainer(editor, null, false)
if (
(keyCode === 8 || keyCode === 46) &&
selection.isCollapsed() &&
selection.getStart().innerHTML === ZWSP
) {
removeCaretContainer(
editor,
getParentCaretContainer(body, selection.getStart())
)
}
if (keyCode === 37 || keyCode === 39) {
removeCaretContainer(
editor,
getParentCaretContainer(body, selection.getStart())
)
}
}
var setup$k = function (editor) {
editor.on('mouseup keydown', function (e) {
disableCaretContainer(editor, e.keyCode)
})
}
var replaceWithCaretFormat = function (targetNode, formatNodes) {
var caretContainer = createCaretContainer(false)
var innerMost = insertFormatNodesIntoCaretContainer(
formatNodes,
caretContainer.dom
)
before$4(SugarElement.fromDom(targetNode), caretContainer)
remove$7(SugarElement.fromDom(targetNode))
return CaretPosition(innerMost, 0)
}
var isFormatElement = function (editor, element) {
var inlineElements = editor.schema.getTextInlineElements()
return (
has$2(inlineElements, name(element)) &&
!isCaretNode(element.dom) &&
!isBogus$2(element.dom)
)
}
var isEmptyCaretFormatElement = function (element) {
return isCaretNode(element.dom) && isCaretContainerEmpty(element.dom)
}
var postProcessHooks = {}
var filter = filter$2
var each$b = each$i
var addPostProcessHook = function (name, hook) {
var hooks = postProcessHooks[name]
if (!hooks) {
postProcessHooks[name] = []
}
postProcessHooks[name].push(hook)
}
var postProcess$1 = function (name, editor) {
each$b(postProcessHooks[name], function (hook) {
hook(editor)
})
}
addPostProcessHook('pre', function (editor) {
var rng = editor.selection.getRng()
var blocks
var hasPreSibling = function (pre) {
return (
isPre(pre.previousSibling) &&
indexOf$1(blocks, pre.previousSibling) !== -1
)
}
var joinPre = function (pre1, pre2) {
DomQuery(pre2).remove()
DomQuery(pre1).append('
').append(pre2.childNodes)
}
var isPre = matchNodeNames(['pre'])
if (!rng.collapsed) {
blocks = editor.selection.getSelectedBlocks()
each$b(filter(filter(blocks, isPre), hasPreSibling), function (pre) {
joinPre(pre.previousSibling, pre)
})
}
})
var each$a = Tools.each
var isElementNode$1 = function (node) {
return (
isElement$5(node) &&
!isBookmarkNode$1(node) &&
!isCaretNode(node) &&
!isBogus$2(node)
)
}
var findElementSibling = function (node, siblingName) {
for (var sibling = node; sibling; sibling = sibling[siblingName]) {
if (isText$7(sibling) && isNotEmpty(sibling.data)) {
return node
}
if (isElement$5(sibling) && !isBookmarkNode$1(sibling)) {
return sibling
}
}
return node
}
var mergeSiblingsNodes = function (dom, prev, next) {
var elementUtils = ElementUtils(dom)
if (prev && next) {
prev = findElementSibling(prev, 'previousSibling')
next = findElementSibling(next, 'nextSibling')
if (elementUtils.compare(prev, next)) {
for (var sibling = prev.nextSibling; sibling && sibling !== next; ) {
var tmpSibling = sibling
sibling = sibling.nextSibling
prev.appendChild(tmpSibling)
}
dom.remove(next)
Tools.each(Tools.grep(next.childNodes), function (node) {
prev.appendChild(node)
})
return prev
}
}
return next
}
var mergeSiblings = function (dom, format, vars, node) {
if (node && format.merge_siblings !== false) {
var newNode = mergeSiblingsNodes(dom, getNonWhiteSpaceSibling(node), node)
mergeSiblingsNodes(dom, newNode, getNonWhiteSpaceSibling(newNode, true))
}
}
var clearChildStyles = function (dom, format, node) {
if (format.clear_child_styles) {
var selector = format.links ? '*:not(a)' : '*'
each$a(dom.select(selector, node), function (node) {
if (isElementNode$1(node)) {
each$a(format.styles, function (value, name) {
dom.setStyle(node, name, '')
})
}
})
}
}
var processChildElements = function (node, filter, process) {
each$a(node.childNodes, function (node) {
if (isElementNode$1(node)) {
if (filter(node)) {
process(node)
}
if (node.hasChildNodes()) {
processChildElements(node, filter, process)
}
}
})
}
var unwrapEmptySpan = function (dom, node) {
if (node.nodeName === 'SPAN' && dom.getAttribs(node).length === 0) {
dom.remove(node, true)
}
}
var hasStyle = function (dom, name) {
return function (node) {
return !!(node && getStyle(dom, node, name))
}
}
var applyStyle = function (dom, name, value) {
return function (node) {
dom.setStyle(node, name, value)
if (node.getAttribute('style') === '') {
node.removeAttribute('style')
}
unwrapEmptySpan(dom, node)
}
}
var removeResult = Adt.generate([
{ keep: [] },
{ rename: ['name'] },
{ removed: [] },
])
var MCE_ATTR_RE = /^(src|href|style)$/
var each$9 = Tools.each
var isEq$2 = isEq$5
var isTableCellOrRow = function (node) {
return /^(TR|TH|TD)$/.test(node.nodeName)
}
var isChildOfInlineParent = function (dom, node, parent) {
return (
dom.isChildOf(node, parent) && node !== parent && !dom.isBlock(parent)
)
}
var getContainer = function (ed, rng, start) {
var container = rng[start ? 'startContainer' : 'endContainer']
var offset = rng[start ? 'startOffset' : 'endOffset']
if (isElement$5(container)) {
var lastIdx = container.childNodes.length - 1
if (!start && offset) {
offset--
}
container = container.childNodes[offset > lastIdx ? lastIdx : offset]
}
if (isText$7(container) && start && offset >= container.nodeValue.length) {
container = new DomTreeWalker(container, ed.getBody()).next() || container
}
if (isText$7(container) && !start && offset === 0) {
container = new DomTreeWalker(container, ed.getBody()).prev() || container
}
return container
}
var normalizeTableSelection = function (node, start) {
var prop = start ? 'firstChild' : 'lastChild'
if (isTableCellOrRow(node) && node[prop]) {
var childNode = node[prop]
if (node.nodeName === 'TR') {
return childNode[prop] || childNode
} else {
return childNode
}
}
return node
}
var wrap$1 = function (dom, node, name, attrs) {
var wrapper = dom.create(name, attrs)
node.parentNode.insertBefore(wrapper, node)
wrapper.appendChild(node)
return wrapper
}
var wrapWithSiblings = function (dom, node, next, name, attrs) {
var start = SugarElement.fromDom(node)
var wrapper = SugarElement.fromDom(dom.create(name, attrs))
var siblings = next ? nextSiblings(start) : prevSiblings(start)
append(wrapper, siblings)
if (next) {
before$4(start, wrapper)
prepend(wrapper, start)
} else {
after$3(start, wrapper)
append$1(wrapper, start)
}
return wrapper.dom
}
var matchName = function (dom, node, format) {
if (isInlineFormat(format) && isEq$2(node, format.inline)) {
return true
}
if (isBlockFormat(format) && isEq$2(node, format.block)) {
return true
}
if (isSelectorFormat(format)) {
return isElement$5(node) && dom.is(node, format.selector)
}
}
var isColorFormatAndAnchor = function (node, format) {
return format.links && node.nodeName === 'A'
}
var find = function (dom, node, next, inc) {
var sibling = getNonWhiteSpaceSibling(node, next, inc)
return (
isNullable(sibling) || sibling.nodeName === 'BR' || dom.isBlock(sibling)
)
}
var removeNode = function (ed, node, format) {
var parentNode = node.parentNode
var rootBlockElm
var dom = ed.dom,
forcedRootBlock = getForcedRootBlock(ed)
if (isBlockFormat(format)) {
if (!forcedRootBlock) {
if (dom.isBlock(node) && !dom.isBlock(parentNode)) {
if (
!find(dom, node, false) &&
!find(dom, node.firstChild, true, true)
) {
node.insertBefore(dom.create('br'), node.firstChild)
}
if (
!find(dom, node, true) &&
!find(dom, node.lastChild, false, true)
) {
node.appendChild(dom.create('br'))
}
}
} else {
if (parentNode === dom.getRoot()) {
if (!format.list_block || !isEq$2(node, format.list_block)) {
each$k(from(node.childNodes), function (node) {
if (isValid(ed, forcedRootBlock, node.nodeName.toLowerCase())) {
if (!rootBlockElm) {
rootBlockElm = wrap$1(dom, node, forcedRootBlock)
dom.setAttribs(
rootBlockElm,
ed.settings.forced_root_block_attrs
)
} else {
rootBlockElm.appendChild(node)
}
} else {
rootBlockElm = null
}
})
}
}
}
}
if (isMixedFormat(format) && !isEq$2(format.inline, node)) {
return
}
dom.remove(node, true)
}
var removeFormatInternal = function (ed, format, vars, node, compareNode) {
var stylesModified
var dom = ed.dom
if (
!matchName(dom, node, format) &&
!isColorFormatAndAnchor(node, format)
) {
return removeResult.keep()
}
var elm = node
if (
isInlineFormat(format) &&
format.remove === 'all' &&
isArray$1(format.preserve_attributes)
) {
var attrsToPreserve = filter$4(dom.getAttribs(elm), function (attr) {
return contains$3(format.preserve_attributes, attr.name.toLowerCase())
})
dom.removeAllAttribs(elm)
each$k(attrsToPreserve, function (attr) {
return dom.setAttrib(elm, attr.name, attr.value)
})
if (attrsToPreserve.length > 0) {
return removeResult.rename('span')
}
}
if (format.remove !== 'all') {
each$9(format.styles, function (value, name) {
value = normalizeStyleValue(dom, replaceVars(value, vars), name + '')
if (isNumber(name)) {
name = value
compareNode = null
}
if (
format.remove_similar ||
!compareNode ||
isEq$2(getStyle(dom, compareNode, name), value)
) {
dom.setStyle(elm, name, '')
}
stylesModified = true
})
if (stylesModified && dom.getAttrib(elm, 'style') === '') {
elm.removeAttribute('style')
elm.removeAttribute('data-mce-style')
}
each$9(format.attributes, function (value, name) {
var valueOut
value = replaceVars(value, vars)
if (isNumber(name)) {
name = value
compareNode = null
}
if (
format.remove_similar ||
!compareNode ||
isEq$2(dom.getAttrib(compareNode, name), value)
) {
if (name === 'class') {
value = dom.getAttrib(elm, name)
if (value) {
valueOut = ''
each$k(value.split(/\s+/), function (cls) {
if (/mce\-\w+/.test(cls)) {
valueOut += (valueOut ? ' ' : '') + cls
}
})
if (valueOut) {
dom.setAttrib(elm, name, valueOut)
return
}
}
}
if (MCE_ATTR_RE.test(name)) {
elm.removeAttribute('data-mce-' + name)
}
if (
name === 'style' &&
matchNodeNames(['li'])(elm) &&
dom.getStyle(elm, 'list-style-type') === 'none'
) {
elm.removeAttribute(name)
dom.setStyle(elm, 'list-style-type', 'none')
return
}
if (name === 'class') {
elm.removeAttribute('className')
}
elm.removeAttribute(name)
}
})
each$9(format.classes, function (value) {
value = replaceVars(value, vars)
if (!compareNode || dom.hasClass(compareNode, value)) {
dom.removeClass(elm, value)
}
})
var attrs = dom.getAttribs(elm)
for (var i = 0; i < attrs.length; i++) {
var attrName = attrs[i].nodeName
if (attrName.indexOf('_') !== 0 && attrName.indexOf('data-') !== 0) {
return removeResult.keep()
}
}
}
if (format.remove !== 'none') {
removeNode(ed, elm, format)
return removeResult.removed()
}
return removeResult.keep()
}
var removeFormat$1 = function (ed, format, vars, node, compareNode) {
return removeFormatInternal(ed, format, vars, node, compareNode).fold(
never,
function (newName) {
ed.dom.rename(node, newName)
return true
},
always
)
}
var findFormatRoot = function (editor, container, name, vars, similar) {
var formatRoot
each$k(
getParents$2(editor.dom, container.parentNode).reverse(),
function (parent) {
if (!formatRoot && parent.id !== '_start' && parent.id !== '_end') {
var format = matchNode(editor, parent, name, vars, similar)
if (format && format.split !== false) {
formatRoot = parent
}
}
}
)
return formatRoot
}
var removeFormatFromClone = function (editor, format, vars, clone) {
return removeFormatInternal(editor, format, vars, clone, clone).fold(
constant(clone),
function (newName) {
var fragment = editor.dom.createFragment()
fragment.appendChild(clone)
return editor.dom.rename(clone, newName)
},
constant(null)
)
}
var wrapAndSplit = function (
editor,
formatList,
formatRoot,
container,
target,
split,
format,
vars
) {
var clone, lastClone, firstClone
var dom = editor.dom
if (formatRoot) {
var formatRootParent = formatRoot.parentNode
for (
var parent_1 = container.parentNode;
parent_1 && parent_1 !== formatRootParent;
parent_1 = parent_1.parentNode
) {
clone = dom.clone(parent_1, false)
for (var i = 0; i < formatList.length; i++) {
clone = removeFormatFromClone(editor, formatList[i], vars, clone)
if (clone === null) {
break
}
}
if (clone) {
if (lastClone) {
clone.appendChild(lastClone)
}
if (!firstClone) {
firstClone = clone
}
lastClone = clone
}
}
if (split && (!format.mixed || !dom.isBlock(formatRoot))) {
container = dom.split(formatRoot, container)
}
if (lastClone) {
target.parentNode.insertBefore(lastClone, target)
firstClone.appendChild(target)
if (isInlineFormat(format)) {
mergeSiblings(dom, format, vars, lastClone)
}
}
}
return container
}
var remove$1 = function (ed, name, vars, node, similar) {
var formatList = ed.formatter.get(name)
var format = formatList[0]
var contentEditable = true
var dom = ed.dom
var selection = ed.selection
var splitToFormatRoot = function (container) {
var formatRoot = findFormatRoot(ed, container, name, vars, similar)
return wrapAndSplit(
ed,
formatList,
formatRoot,
container,
container,
true,
format,
vars
)
}
var isRemoveBookmarkNode = function (node) {
return (
isBookmarkNode$1(node) &&
isElement$5(node) &&
(node.id === '_start' || node.id === '_end')
)
}
var removeNodeFormat = function (node) {
return exists(formatList, function (fmt) {
return removeFormat$1(ed, fmt, vars, node, node)
})
}
var process = function (node) {
var lastContentEditable = true
var hasContentEditableState = false
if (isElement$5(node) && dom.getContentEditable(node)) {
lastContentEditable = contentEditable
contentEditable = dom.getContentEditable(node) === 'true'
hasContentEditableState = true
}
var children = from(node.childNodes)
if (contentEditable && !hasContentEditableState) {
var removed = removeNodeFormat(node)
var parentNode = node.parentNode
if (
!removed &&
isNonNullable(parentNode) &&
shouldExpandToSelector(format)
) {
removeNodeFormat(parentNode)
}
}
if (format.deep) {
if (children.length) {
for (var i = 0; i < children.length; i++) {
process(children[i])
}
if (hasContentEditableState) {
contentEditable = lastContentEditable
}
}
}
var textDecorations = ['underline', 'line-through', 'overline']
each$k(textDecorations, function (decoration) {
if (
isElement$5(node) &&
ed.dom.getStyle(node, 'text-decoration') === decoration &&
node.parentNode &&
getTextDecoration(dom, node.parentNode) === decoration
) {
removeFormat$1(
ed,
{
deep: false,
exact: true,
inline: 'span',
styles: { textDecoration: decoration },
},
null,
node
)
}
})
}
var unwrap = function (start) {
var node = dom.get(start ? '_start' : '_end')
var out = node[start ? 'firstChild' : 'lastChild']
if (isRemoveBookmarkNode(out)) {
out = out[start ? 'firstChild' : 'lastChild']
}
if (isText$7(out) && out.data.length === 0) {
out = start
? node.previousSibling || node.nextSibling
: node.nextSibling || node.previousSibling
}
dom.remove(node, true)
return out
}
var removeRngStyle = function (rng) {
var startContainer, endContainer
var expandedRng = expandRng(ed, rng, formatList, rng.collapsed)
if (format.split) {
expandedRng = split(expandedRng)
startContainer = getContainer(ed, expandedRng, true)
endContainer = getContainer(ed, expandedRng)
if (startContainer !== endContainer) {
startContainer = normalizeTableSelection(startContainer, true)
endContainer = normalizeTableSelection(endContainer, false)
if (isChildOfInlineParent(dom, startContainer, endContainer)) {
var marker = Optional.from(startContainer.firstChild).getOr(
startContainer
)
splitToFormatRoot(
wrapWithSiblings(dom, marker, true, 'span', {
id: '_start',
'data-mce-type': 'bookmark',
})
)
unwrap(true)
return
}
if (isChildOfInlineParent(dom, endContainer, startContainer)) {
var marker = Optional.from(endContainer.lastChild).getOr(
endContainer
)
splitToFormatRoot(
wrapWithSiblings(dom, marker, false, 'span', {
id: '_end',
'data-mce-type': 'bookmark',
})
)
unwrap(false)
return
}
startContainer = wrap$1(dom, startContainer, 'span', {
id: '_start',
'data-mce-type': 'bookmark',
})
endContainer = wrap$1(dom, endContainer, 'span', {
id: '_end',
'data-mce-type': 'bookmark',
})
var newRng = dom.createRng()
newRng.setStartAfter(startContainer)
newRng.setEndBefore(endContainer)
walk$2(dom, newRng, function (nodes) {
each$k(nodes, function (n) {
if (!isBookmarkNode$1(n) && !isBookmarkNode$1(n.parentNode)) {
splitToFormatRoot(n)
}
})
})
splitToFormatRoot(startContainer)
splitToFormatRoot(endContainer)
startContainer = unwrap(true)
endContainer = unwrap()
} else {
startContainer = endContainer = splitToFormatRoot(startContainer)
}
expandedRng.startContainer = startContainer.parentNode
? startContainer.parentNode
: startContainer
expandedRng.startOffset = dom.nodeIndex(startContainer)
expandedRng.endContainer = endContainer.parentNode
? endContainer.parentNode
: endContainer
expandedRng.endOffset = dom.nodeIndex(endContainer) + 1
}
walk$2(dom, expandedRng, function (nodes) {
each$k(nodes, process)
})
}
if (node) {
if (isNode(node)) {
var rng = dom.createRng()
rng.setStartBefore(node)
rng.setEndAfter(node)
removeRngStyle(rng)
} else {
removeRngStyle(node)
}
fireFormatRemove(ed, name, node, vars)
return
}
if (dom.getContentEditable(selection.getNode()) === 'false') {
node = selection.getNode()
for (var i = 0; i < formatList.length; i++) {
if (formatList[i].ceFalseOverride) {
if (removeFormat$1(ed, formatList[i], vars, node, node)) {
break
}
}
}
fireFormatRemove(ed, name, node, vars)
return
}
if (
!selection.isCollapsed() ||
!isInlineFormat(format) ||
getCellsFromEditor(ed).length
) {
preserve(selection, true, function () {
runOnRanges(ed, removeRngStyle)
})
if (
isInlineFormat(format) &&
match$2(ed, name, vars, selection.getStart())
) {
moveStart(dom, selection, selection.getRng())
}
ed.nodeChanged()
} else {
removeCaretFormat(ed, name, vars, similar)
}
fireFormatRemove(ed, name, node, vars)
}
var each$8 = Tools.each
var mergeTextDecorationsAndColor = function (dom, format, vars, node) {
var processTextDecorationsAndColor = function (n) {
if (n.nodeType === 1 && n.parentNode && n.parentNode.nodeType === 1) {
var textDecoration = getTextDecoration(dom, n.parentNode)
if (dom.getStyle(n, 'color') && textDecoration) {
dom.setStyle(n, 'text-decoration', textDecoration)
} else if (dom.getStyle(n, 'text-decoration') === textDecoration) {
dom.setStyle(n, 'text-decoration', null)
}
}
}
if (
format.styles &&
(format.styles.color || format.styles.textDecoration)
) {
Tools.walk(node, processTextDecorationsAndColor, 'childNodes')
processTextDecorationsAndColor(node)
}
}
var mergeBackgroundColorAndFontSize = function (dom, format, vars, node) {
if (format.styles && format.styles.backgroundColor) {
processChildElements(
node,
hasStyle(dom, 'fontSize'),
applyStyle(
dom,
'backgroundColor',
replaceVars(format.styles.backgroundColor, vars)
)
)
}
}
var mergeSubSup = function (dom, format, vars, node) {
if (
isInlineFormat(format) &&
(format.inline === 'sub' || format.inline === 'sup')
) {
processChildElements(
node,
hasStyle(dom, 'fontSize'),
applyStyle(dom, 'fontSize', '')
)
dom.remove(
dom.select(format.inline === 'sup' ? 'sub' : 'sup', node),
true
)
}
}
var mergeWithChildren = function (editor, formatList, vars, node) {
each$8(formatList, function (format) {
if (isInlineFormat(format)) {
each$8(editor.dom.select(format.inline, node), function (child) {
if (!isElementNode$1(child)) {
return
}
removeFormat$1(
editor,
format,
vars,
child,
format.exact ? child : null
)
})
}
clearChildStyles(editor.dom, format, node)
})
}
var mergeWithParents = function (editor, format, name, vars, node) {
if (matchNode(editor, node.parentNode, name, vars)) {
if (removeFormat$1(editor, format, vars, node)) {
return
}
}
if (format.merge_with_parents) {
editor.dom.getParent(node.parentNode, function (parent) {
if (matchNode(editor, parent, name, vars)) {
removeFormat$1(editor, format, vars, node)
return true
}
})
}
}
var each$7 = Tools.each
var isElementNode = function (node) {
return (
isElement$5(node) &&
!isBookmarkNode$1(node) &&
!isCaretNode(node) &&
!isBogus$2(node)
)
}
var canFormatBR = function (editor, format, node, parentName) {
if (canFormatEmptyLines(editor) && isInlineFormat(format)) {
var validBRParentElements = __assign(
__assign({}, editor.schema.getTextBlockElements()),
{
td: {},
th: {},
li: {},
dt: {},
dd: {},
figcaption: {},
caption: {},
details: {},
summary: {},
}
)
var hasCaretNodeSibling = sibling(
SugarElement.fromDom(node),
function (sibling) {
return isCaretNode(sibling.dom)
}
)
return (
hasNonNullableKey(validBRParentElements, parentName) &&
isEmpty$2(SugarElement.fromDom(node.parentNode), false) &&
!hasCaretNodeSibling
)
} else {
return false
}
}
var applyFormat$1 = function (ed, name, vars, node) {
var formatList = ed.formatter.get(name)
var format = formatList[0]
var isCollapsed = !node && ed.selection.isCollapsed()
var dom = ed.dom
var selection = ed.selection
var setElementFormat = function (elm, fmt) {
if (fmt === void 0) {
fmt = format
}
if (isFunction(fmt.onformat)) {
fmt.onformat(elm, fmt, vars, node)
}
each$7(fmt.styles, function (value, name) {
dom.setStyle(elm, name, replaceVars(value, vars))
})
if (fmt.styles) {
var styleVal = dom.getAttrib(elm, 'style')
if (styleVal) {
dom.setAttrib(elm, 'data-mce-style', styleVal)
}
}
each$7(fmt.attributes, function (value, name) {
dom.setAttrib(elm, name, replaceVars(value, vars))
})
each$7(fmt.classes, function (value) {
value = replaceVars(value, vars)
if (!dom.hasClass(elm, value)) {
dom.addClass(elm, value)
}
})
}
var applyNodeStyle = function (formatList, node) {
var found = false
each$7(formatList, function (format) {
if (!isSelectorFormat(format)) {
return false
}
if (
isNonNullable(format.collapsed) &&
format.collapsed !== isCollapsed
) {
return
}
if (dom.is(node, format.selector) && !isCaretNode(node)) {
setElementFormat(node, format)
found = true
return false
}
})
return found
}
var createWrapElement = function (wrapName) {
if (isString$1(wrapName)) {
var wrapElm = dom.create(wrapName)
setElementFormat(wrapElm)
return wrapElm
} else {
return null
}
}
var applyRngStyle = function (dom, rng, nodeSpecific) {
var newWrappers = []
var contentEditable = true
var wrapName = format.inline || format.block
var wrapElm = createWrapElement(wrapName)
walk$2(dom, rng, function (nodes) {
var currentWrapElm
var process = function (node) {
var hasContentEditableState = false
var lastContentEditable = contentEditable
var nodeName = node.nodeName.toLowerCase()
var parentNode = node.parentNode
var parentName = parentNode.nodeName.toLowerCase()
if (isElement$5(node) && dom.getContentEditable(node)) {
lastContentEditable = contentEditable
contentEditable = dom.getContentEditable(node) === 'true'
hasContentEditableState = true
}
if (isBr$5(node) && !canFormatBR(ed, format, node, parentName)) {
currentWrapElm = null
if (isBlockFormat(format)) {
dom.remove(node)
}
return
}
if (
isBlockFormat(format) &&
format.wrapper &&
matchNode(ed, node, name, vars)
) {
currentWrapElm = null
return
}
if (
contentEditable &&
!hasContentEditableState &&
isBlockFormat(format) &&
!format.wrapper &&
isTextBlock$1(ed, nodeName) &&
isValid(ed, parentName, wrapName)
) {
var elm = dom.rename(node, wrapName)
setElementFormat(elm)
newWrappers.push(elm)
currentWrapElm = null
return
}
if (isSelectorFormat(format)) {
var found = applyNodeStyle(formatList, node)
if (
!found &&
isNonNullable(parentNode) &&
shouldExpandToSelector(format)
) {
found = applyNodeStyle(formatList, parentNode)
}
if (!isInlineFormat(format) || found) {
currentWrapElm = null
return
}
}
if (
contentEditable &&
!hasContentEditableState &&
isValid(ed, wrapName, nodeName) &&
isValid(ed, parentName, wrapName) &&
!(!nodeSpecific && isText$7(node) && isZwsp(node.data)) &&
!isCaretNode(node) &&
(!isInlineFormat(format) || !dom.isBlock(node))
) {
if (!currentWrapElm) {
currentWrapElm = dom.clone(wrapElm, false)
node.parentNode.insertBefore(currentWrapElm, node)
newWrappers.push(currentWrapElm)
}
currentWrapElm.appendChild(node)
} else {
currentWrapElm = null
each$k(from(node.childNodes), process)
if (hasContentEditableState) {
contentEditable = lastContentEditable
}
currentWrapElm = null
}
}
each$k(nodes, process)
})
if (format.links === true) {
each$k(newWrappers, function (node) {
var process = function (node) {
if (node.nodeName === 'A') {
setElementFormat(node, format)
}
each$k(from(node.childNodes), process)
}
process(node)
})
}
each$k(newWrappers, function (node) {
var getChildCount = function (node) {
var count = 0
each$k(node.childNodes, function (node) {
if (!isEmptyTextNode$1(node) && !isBookmarkNode$1(node)) {
count++
}
})
return count
}
var mergeStyles = function (node) {
var childElement = find$3(node.childNodes, isElementNode).filter(
function (child) {
return matchName$1(dom, child, format)
}
)
return childElement
.map(function (child) {
var clone = dom.clone(child, false)
setElementFormat(clone)
dom.replace(clone, node, true)
dom.remove(child, true)
return clone
})
.getOr(node)
}
var childCount = getChildCount(node)
if (
(newWrappers.length > 1 || !dom.isBlock(node)) &&
childCount === 0
) {
dom.remove(node, true)
return
}
if (
isInlineFormat(format) ||
(isBlockFormat(format) && format.wrapper)
) {
if (!format.exact && childCount === 1) {
node = mergeStyles(node)
}
mergeWithChildren(ed, formatList, vars, node)
mergeWithParents(ed, format, name, vars, node)
mergeBackgroundColorAndFontSize(dom, format, vars, node)
mergeTextDecorationsAndColor(dom, format, vars, node)
mergeSubSup(dom, format, vars, node)
mergeSiblings(dom, format, vars, node)
}
})
}
if (dom.getContentEditable(selection.getNode()) === 'false') {
node = selection.getNode()
for (var i = 0, l = formatList.length; i < l; i++) {
var formatItem = formatList[i]
if (
formatItem.ceFalseOverride &&
isSelectorFormat(formatItem) &&
dom.is(node, formatItem.selector)
) {
setElementFormat(node, formatItem)
break
}
}
fireFormatApply(ed, name, node, vars)
return
}
if (format) {
if (node) {
if (isNode(node)) {
if (!applyNodeStyle(formatList, node)) {
var rng = dom.createRng()
rng.setStartBefore(node)
rng.setEndAfter(node)
applyRngStyle(dom, expandRng(ed, rng, formatList), true)
}
} else {
applyRngStyle(dom, node, true)
}
} else {
if (
!isCollapsed ||
!isInlineFormat(format) ||
getCellsFromEditor(ed).length
) {
var curSelNode = selection.getNode()
var firstFormat = formatList[0]
if (
!ed.settings.forced_root_block &&
firstFormat.defaultBlock &&
!dom.getParent(curSelNode, dom.isBlock)
) {
applyFormat$1(ed, firstFormat.defaultBlock)
}
selection.setRng(normalize(selection.getRng()))
preserve(selection, true, function () {
runOnRanges(ed, function (selectionRng, fake) {
var expandedRng = fake
? selectionRng
: expandRng(ed, selectionRng, formatList)
applyRngStyle(dom, expandedRng, false)
})
})
moveStart(dom, selection, selection.getRng())
ed.nodeChanged()
} else {
applyCaretFormat(ed, name, vars)
}
}
postProcess$1(name, ed)
}
fireFormatApply(ed, name, node, vars)
}
var hasVars = function (value) {
return has$2(value, 'vars')
}
var setup$j = function (registeredFormatListeners, editor) {
registeredFormatListeners.set({})
editor.on('NodeChange', function (e) {
updateAndFireChangeCallbacks(
editor,
e.element,
registeredFormatListeners.get()
)
})
editor.on('FormatApply FormatRemove', function (e) {
var element = Optional.from(e.node)
.map(function (nodeOrRange) {
return isNode(nodeOrRange) ? nodeOrRange : nodeOrRange.startContainer
})
.bind(function (node) {
return isElement$5(node)
? Optional.some(node)
: Optional.from(node.parentElement)
})
.getOrThunk(function () {
return fallbackElement(editor)
})
updateAndFireChangeCallbacks(
editor,
element,
registeredFormatListeners.get()
)
})
}
var fallbackElement = function (editor) {
return editor.selection.getStart()
}
var matchingNode = function (editor, parents, format, similar, vars) {
var isMatchingNode = function (node) {
var matchingFormat = editor.formatter.matchNode(
node,
format,
vars !== null && vars !== void 0 ? vars : {},
similar
)
return !isUndefined(matchingFormat)
}
var isUnableToMatch = function (node) {
if (matchesUnInheritedFormatSelector(editor, node, format)) {
return true
} else {
if (!similar) {
return isNonNullable(
editor.formatter.matchNode(node, format, vars, true)
)
} else {
return false
}
}
}
return findUntil$1(parents, isMatchingNode, isUnableToMatch)
}
var getParents = function (editor, elm) {
var element = elm !== null && elm !== void 0 ? elm : fallbackElement(editor)
return filter$4(getParents$2(editor.dom, element), function (node) {
return isElement$5(node) && !isBogus$2(node)
})
}
var updateAndFireChangeCallbacks = function (
editor,
elm,
registeredCallbacks
) {
var parents = getParents(editor, elm)
each$j(registeredCallbacks, function (data, format) {
var runIfChanged = function (spec) {
var match = matchingNode(
editor,
parents,
format,
spec.similar,
hasVars(spec) ? spec.vars : undefined
)
var isSet = match.isSome()
if (spec.state.get() !== isSet) {
spec.state.set(isSet)
var node_1 = match.getOr(elm)
if (hasVars(spec)) {
spec.callback(isSet, {
node: node_1,
format: format,
parents: parents,
})
} else {
each$k(spec.callbacks, function (callback) {
return callback(isSet, {
node: node_1,
format: format,
parents: parents,
})
})
}
}
}
each$k([data.withSimilar, data.withoutSimilar], runIfChanged)
each$k(data.withVars, runIfChanged)
})
}
var addListeners = function (
editor,
registeredFormatListeners,
formats,
callback,
similar,
vars
) {
var formatChangeItems = registeredFormatListeners.get()
each$k(formats.split(','), function (format) {
var group = get$9(formatChangeItems, format).getOrThunk(function () {
var base = {
withSimilar: {
state: Cell(false),
similar: true,
callbacks: [],
},
withoutSimilar: {
state: Cell(false),
similar: false,
callbacks: [],
},
withVars: [],
}
formatChangeItems[format] = base
return base
})
var getCurrent = function () {
var parents = getParents(editor)
return matchingNode(editor, parents, format, similar, vars).isSome()
}
if (isUndefined(vars)) {
var toAppendTo = similar ? group.withSimilar : group.withoutSimilar
toAppendTo.callbacks.push(callback)
if (toAppendTo.callbacks.length === 1) {
toAppendTo.state.set(getCurrent())
}
} else {
group.withVars.push({
state: Cell(getCurrent()),
similar: similar,
vars: vars,
callback: callback,
})
}
})
registeredFormatListeners.set(formatChangeItems)
}
var removeListeners = function (
registeredFormatListeners,
formats,
callback
) {
var formatChangeItems = registeredFormatListeners.get()
each$k(formats.split(','), function (format) {
return get$9(formatChangeItems, format).each(function (group) {
formatChangeItems[format] = {
withSimilar: __assign(__assign({}, group.withSimilar), {
callbacks: filter$4(group.withSimilar.callbacks, function (cb) {
return cb !== callback
}),
}),
withoutSimilar: __assign(__assign({}, group.withoutSimilar), {
callbacks: filter$4(group.withoutSimilar.callbacks, function (cb) {
return cb !== callback
}),
}),
withVars: filter$4(group.withVars, function (item) {
return item.callback !== callback
}),
}
})
})
registeredFormatListeners.set(formatChangeItems)
}
var formatChangedInternal = function (
editor,
registeredFormatListeners,
formats,
callback,
similar,
vars
) {
if (registeredFormatListeners.get() === null) {
setup$j(registeredFormatListeners, editor)
}
addListeners(
editor,
registeredFormatListeners,
formats,
callback,
similar,
vars
)
return {
unbind: function () {
return removeListeners(registeredFormatListeners, formats, callback)
},
}
}
var toggle = function (editor, name, vars, node) {
var fmt = editor.formatter.get(name)
if (
match$2(editor, name, vars, node) &&
(!('toggle' in fmt[0]) || fmt[0].toggle)
) {
remove$1(editor, name, vars, node)
} else {
applyFormat$1(editor, name, vars, node)
}
}
var fromElements = function (elements, scope) {
var doc = scope || document
var fragment = doc.createDocumentFragment()
each$k(elements, function (element) {
fragment.appendChild(element.dom)
})
return SugarElement.fromDom(fragment)
}
var tableModel = function (element, width, rows) {
return {
element: element,
width: width,
rows: rows,
}
}
var tableRow = function (element, cells) {
return {
element: element,
cells: cells,
}
}
var cellPosition = function (x, y) {
return {
x: x,
y: y,
}
}
var getSpan = function (td, key) {
var value = parseInt(get$6(td, key), 10)
return isNaN(value) ? 1 : value
}
var fillout = function (table, x, y, tr, td) {
var rowspan = getSpan(td, 'rowspan')
var colspan = getSpan(td, 'colspan')
var rows = table.rows
for (var y2 = y; y2 < y + rowspan; y2++) {
if (!rows[y2]) {
rows[y2] = tableRow(deep$1(tr), [])
}
for (var x2 = x; x2 < x + colspan; x2++) {
var cells = rows[y2].cells
cells[x2] = y2 === y && x2 === x ? td : shallow(td)
}
}
}
var cellExists = function (table, x, y) {
var rows = table.rows
var cells = rows[y] ? rows[y].cells : []
return !!cells[x]
}
var skipCellsX = function (table, x, y) {
while (cellExists(table, x, y)) {
x++
}
return x
}
var getWidth = function (rows) {
return foldl(
rows,
function (acc, row) {
return row.cells.length > acc ? row.cells.length : acc
},
0
)
}
var findElementPos = function (table, element) {
var rows = table.rows
for (var y = 0; y < rows.length; y++) {
var cells = rows[y].cells
for (var x = 0; x < cells.length; x++) {
if (eq(cells[x], element)) {
return Optional.some(cellPosition(x, y))
}
}
}
return Optional.none()
}
var extractRows = function (table, sx, sy, ex, ey) {
var newRows = []
var rows = table.rows
for (var y = sy; y <= ey; y++) {
var cells = rows[y].cells
var slice = sx < ex ? cells.slice(sx, ex + 1) : cells.slice(ex, sx + 1)
newRows.push(tableRow(rows[y].element, slice))
}
return newRows
}
var subTable = function (table, startPos, endPos) {
var sx = startPos.x,
sy = startPos.y
var ex = endPos.x,
ey = endPos.y
var newRows =
sy < ey
? extractRows(table, sx, sy, ex, ey)
: extractRows(table, sx, ey, ex, sy)
return tableModel(table.element, getWidth(newRows), newRows)
}
var createDomTable = function (table, rows) {
var tableElement = shallow(table.element)
var tableBody = SugarElement.fromTag('tbody')
append(tableBody, rows)
append$1(tableElement, tableBody)
return tableElement
}
var modelRowsToDomRows = function (table) {
return map$3(table.rows, function (row) {
var cells = map$3(row.cells, function (cell) {
var td = deep$1(cell)
remove$6(td, 'colspan')
remove$6(td, 'rowspan')
return td
})
var tr = shallow(row.element)
append(tr, cells)
return tr
})
}
var fromDom = function (tableElm) {
var table = tableModel(shallow(tableElm), 0, [])
each$k(descendants(tableElm, 'tr'), function (tr, y) {
each$k(descendants(tr, 'td,th'), function (td, x) {
fillout(table, skipCellsX(table, x, y), y, tr, td)
})
})
return tableModel(table.element, getWidth(table.rows), table.rows)
}
var toDom = function (table) {
return createDomTable(table, modelRowsToDomRows(table))
}
var subsection = function (table, startElement, endElement) {
return findElementPos(table, startElement).bind(function (startPos) {
return findElementPos(table, endElement).map(function (endPos) {
return subTable(table, startPos, endPos)
})
})
}
var findParentListContainer = function (parents) {
return find$3(parents, function (elm) {
return name(elm) === 'ul' || name(elm) === 'ol'
})
}
var getFullySelectedListWrappers = function (parents, rng) {
return find$3(parents, function (elm) {
return name(elm) === 'li' && hasAllContentsSelected(elm, rng)
}).fold(constant([]), function (_li) {
return findParentListContainer(parents)
.map(function (listCont) {
var listElm = SugarElement.fromTag(name(listCont))
var listStyles = filter$3(
getAllRaw(listCont),
function (_style, name) {
return startsWith(name, 'list-style')
}
)
setAll(listElm, listStyles)
return [SugarElement.fromTag('li'), listElm]
})
.getOr([])
})
}
var wrap = function (innerElm, elms) {
var wrapped = foldl(
elms,
function (acc, elm) {
append$1(elm, acc)
return elm
},
innerElm
)
return elms.length > 0 ? fromElements([wrapped]) : wrapped
}
var directListWrappers = function (commonAnchorContainer) {
if (isListItem(commonAnchorContainer)) {
return parent(commonAnchorContainer)
.filter(isList)
.fold(constant([]), function (listElm) {
return [commonAnchorContainer, listElm]
})
} else {
return isList(commonAnchorContainer) ? [commonAnchorContainer] : []
}
}
var getWrapElements = function (rootNode, rng) {
var commonAnchorContainer = SugarElement.fromDom(
rng.commonAncestorContainer
)
var parents = parentsAndSelf(commonAnchorContainer, rootNode)
var wrapElements = filter$4(parents, function (elm) {
return isInline$1(elm) || isHeading(elm)
})
var listWrappers = getFullySelectedListWrappers(parents, rng)
var allWrappers = wrapElements.concat(
listWrappers.length
? listWrappers
: directListWrappers(commonAnchorContainer)
)
return map$3(allWrappers, shallow)
}
var emptyFragment = function () {
return fromElements([])
}
var getFragmentFromRange = function (rootNode, rng) {
return wrap(
SugarElement.fromDom(rng.cloneContents()),
getWrapElements(rootNode, rng)
)
}
var getParentTable = function (rootElm, cell) {
return ancestor$2(cell, 'table', curry(eq, rootElm))
}
var getTableFragment = function (rootNode, selectedTableCells) {
return getParentTable(rootNode, selectedTableCells[0])
.bind(function (tableElm) {
var firstCell = selectedTableCells[0]
var lastCell = selectedTableCells[selectedTableCells.length - 1]
var fullTableModel = fromDom(tableElm)
return subsection(fullTableModel, firstCell, lastCell).map(function (
sectionedTableModel
) {
return fromElements([toDom(sectionedTableModel)])
})
})
.getOrThunk(emptyFragment)
}
var getSelectionFragment = function (rootNode, ranges) {
return ranges.length > 0 && ranges[0].collapsed
? emptyFragment()
: getFragmentFromRange(rootNode, ranges[0])
}
var read$3 = function (rootNode, ranges) {
var selectedCells = getCellsFromElementOrRanges(ranges, rootNode)
return selectedCells.length > 0
? getTableFragment(rootNode, selectedCells)
: getSelectionFragment(rootNode, ranges)
}
var trimLeadingCollapsibleText = function (text) {
return text.replace(/^[ \f\n\r\t\v]+/, '')
}
var isCollapsibleWhitespace = function (text, index) {
return index >= 0 && index < text.length && isWhiteSpace(text.charAt(index))
}
var getInnerText = function (bin, shouldTrim) {
var text = trim$2(bin.innerText)
return shouldTrim ? trimLeadingCollapsibleText(text) : text
}
var getContextNodeName = function (parentBlockOpt) {
return parentBlockOpt
.map(function (block) {
return block.nodeName
})
.getOr('div')
.toLowerCase()
}
var getTextContent = function (editor) {
return Optional.from(editor.selection.getRng())
.map(function (rng) {
var parentBlockOpt = Optional.from(
editor.dom.getParent(rng.commonAncestorContainer, editor.dom.isBlock)
)
var body = editor.getBody()
var contextNodeName = getContextNodeName(parentBlockOpt)
var shouldTrimSpaces = Env.browser.isIE() && contextNodeName !== 'pre'
var bin = editor.dom.add(
body,
contextNodeName,
{
'data-mce-bogus': 'all',
style: 'overflow: hidden; opacity: 0;',
},
rng.cloneContents()
)
var text = getInnerText(bin, shouldTrimSpaces)
var nonRenderedText = trim$2(bin.textContent)
editor.dom.remove(bin)
if (
isCollapsibleWhitespace(nonRenderedText, 0) ||
isCollapsibleWhitespace(nonRenderedText, nonRenderedText.length - 1)
) {
var parentBlock = parentBlockOpt.getOr(body)
var parentBlockText = getInnerText(parentBlock, shouldTrimSpaces)
var textIndex = parentBlockText.indexOf(text)
if (textIndex === -1) {
return text
} else {
var hasProceedingSpace = isCollapsibleWhitespace(
parentBlockText,
textIndex - 1
)
var hasTrailingSpace = isCollapsibleWhitespace(
parentBlockText,
textIndex + text.length
)
return (
(hasProceedingSpace ? ' ' : '') +
text +
(hasTrailingSpace ? ' ' : '')
)
}
} else {
return text
}
})
.getOr('')
}
var getSerializedContent = function (editor, args) {
var rng = editor.selection.getRng(),
tmpElm = editor.dom.create('body')
var sel = editor.selection.getSel()
var ranges = processRanges(editor, getRanges(sel))
var fragment = args.contextual
? read$3(SugarElement.fromDom(editor.getBody()), ranges).dom
: rng.cloneContents()
if (fragment) {
tmpElm.appendChild(fragment)
}
return editor.selection.serializer.serialize(tmpElm, args)
}
var setupArgs$1 = function (args, format) {
return __assign(__assign({}, args), {
format: format,
get: true,
selection: true,
})
}
var getSelectedContentInternal = function (editor, format, args) {
if (args === void 0) {
args = {}
}
var defaultedArgs = setupArgs$1(args, format)
var updatedArgs = editor.fire('BeforeGetContent', defaultedArgs)
if (updatedArgs.isDefaultPrevented()) {
editor.fire('GetContent', updatedArgs)
return updatedArgs.content
}
if (updatedArgs.format === 'text') {
return getTextContent(editor)
} else {
updatedArgs.getInner = true
var content = getSerializedContent(editor, updatedArgs)
if (updatedArgs.format === 'tree') {
return content
} else {
updatedArgs.content = editor.selection.isCollapsed() ? '' : content
editor.fire('GetContent', updatedArgs)
return updatedArgs.content
}
}
}
var KEEP = 0,
INSERT = 1,
DELETE = 2
var diff = function (left, right) {
var size = left.length + right.length + 2
var vDown = new Array(size)
var vUp = new Array(size)
var snake = function (start, end, diag) {
return {
start: start,
end: end,
diag: diag,
}
}
var buildScript = function (start1, end1, start2, end2, script) {
var middle = getMiddleSnake(start1, end1, start2, end2)
if (
middle === null ||
(middle.start === end1 && middle.diag === end1 - end2) ||
(middle.end === start1 && middle.diag === start1 - start2)
) {
var i = start1
var j = start2
while (i < end1 || j < end2) {
if (i < end1 && j < end2 && left[i] === right[j]) {
script.push([KEEP, left[i]])
++i
++j
} else {
if (end1 - start1 > end2 - start2) {
script.push([DELETE, left[i]])
++i
} else {
script.push([INSERT, right[j]])
++j
}
}
}
} else {
buildScript(
start1,
middle.start,
start2,
middle.start - middle.diag,
script
)
for (var i2 = middle.start; i2 < middle.end; ++i2) {
script.push([KEEP, left[i2]])
}
buildScript(middle.end, end1, middle.end - middle.diag, end2, script)
}
}
var buildSnake = function (start, diag, end1, end2) {
var end = start
while (
end - diag < end2 &&
end < end1 &&
left[end] === right[end - diag]
) {
++end
}
return snake(start, end, diag)
}
var getMiddleSnake = function (start1, end1, start2, end2) {
var m = end1 - start1
var n = end2 - start2
if (m === 0 || n === 0) {
return null
}
var delta = m - n
var sum = n + m
var offset = (sum % 2 === 0 ? sum : sum + 1) / 2
vDown[1 + offset] = start1
vUp[1 + offset] = end1 + 1
var d, k, i, x, y
for (d = 0; d <= offset; ++d) {
for (k = -d; k <= d; k += 2) {
i = k + offset
if (k === -d || (k !== d && vDown[i - 1] < vDown[i + 1])) {
vDown[i] = vDown[i + 1]
} else {
vDown[i] = vDown[i - 1] + 1
}
x = vDown[i]
y = x - start1 + start2 - k
while (x < end1 && y < end2 && left[x] === right[y]) {
vDown[i] = ++x
++y
}
if (delta % 2 !== 0 && delta - d <= k && k <= delta + d) {
if (vUp[i - delta] <= vDown[i]) {
return buildSnake(vUp[i - delta], k + start1 - start2, end1, end2)
}
}
}
for (k = delta - d; k <= delta + d; k += 2) {
i = k + offset - delta
if (
k === delta - d ||
(k !== delta + d && vUp[i + 1] <= vUp[i - 1])
) {
vUp[i] = vUp[i + 1] - 1
} else {
vUp[i] = vUp[i - 1]
}
x = vUp[i] - 1
y = x - start1 + start2 - k
while (x >= start1 && y >= start2 && left[x] === right[y]) {
vUp[i] = x--
y--
}
if (delta % 2 === 0 && -d <= k && k <= d) {
if (vUp[i] <= vDown[i + delta]) {
return buildSnake(vUp[i], k + start1 - start2, end1, end2)
}
}
}
}
}
var script = []
buildScript(0, left.length, 0, right.length, script)
return script
}
var getOuterHtml = function (elm) {
if (isElement$5(elm)) {
return elm.outerHTML
} else if (isText$7(elm)) {
return Entities.encodeRaw(elm.data, false)
} else if (isComment(elm)) {
return ''
}
return ''
}
var createFragment = function (html) {
var node
var container = document.createElement('div')
var frag = document.createDocumentFragment()
if (html) {
container.innerHTML = html
}
while ((node = container.firstChild)) {
frag.appendChild(node)
}
return frag
}
var insertAt = function (elm, html, index) {
var fragment = createFragment(html)
if (elm.hasChildNodes() && index < elm.childNodes.length) {
var target = elm.childNodes[index]
target.parentNode.insertBefore(fragment, target)
} else {
elm.appendChild(fragment)
}
}
var removeAt = function (elm, index) {
if (elm.hasChildNodes() && index < elm.childNodes.length) {
var target = elm.childNodes[index]
target.parentNode.removeChild(target)
}
}
var applyDiff = function (diff, elm) {
var index = 0
each$k(diff, function (action) {
if (action[0] === KEEP) {
index++
} else if (action[0] === INSERT) {
insertAt(elm, action[1], index)
index++
} else if (action[0] === DELETE) {
removeAt(elm, index)
}
})
}
var read$2 = function (elm) {
return filter$4(map$3(from(elm.childNodes), getOuterHtml), function (item) {
return item.length > 0
})
}
var write = function (fragments, elm) {
var currentFragments = map$3(from(elm.childNodes), getOuterHtml)
applyDiff(diff(currentFragments, fragments), elm)
return elm
}
var lazyTempDocument = cached(function () {
return document.implementation.createHTMLDocument('undo')
})
var hasIframes = function (html) {
return html.indexOf('') !== -1
}
var createFragmentedLevel = function (fragments) {
return {
type: 'fragmented',
fragments: fragments,
content: '',
bookmark: null,
beforeBookmark: null,
}
}
var createCompleteLevel = function (content) {
return {
type: 'complete',
fragments: null,
content: content,
bookmark: null,
beforeBookmark: null,
}
}
var createFromEditor = function (editor) {
var fragments = read$2(editor.getBody())
var trimmedFragments = bind(fragments, function (html) {
var trimmed = trimInternal(editor.serializer, html)
return trimmed.length > 0 ? [trimmed] : []
})
var content = trimmedFragments.join('')
return hasIframes(content)
? createFragmentedLevel(trimmedFragments)
: createCompleteLevel(content)
}
var applyToEditor = function (editor, level, before) {
var bookmark = before ? level.beforeBookmark : level.bookmark
if (level.type === 'fragmented') {
write(level.fragments, editor.getBody())
} else {
editor.setContent(level.content, {
format: 'raw',
no_selection:
isNonNullable(bookmark) && isPathBookmark(bookmark)
? !bookmark.isFakeCaret
: true,
})
}
editor.selection.moveToBookmark(bookmark)
}
var getLevelContent = function (level) {
return level.type === 'fragmented'
? level.fragments.join('')
: level.content
}
var getCleanLevelContent = function (level) {
var elm = SugarElement.fromTag('body', lazyTempDocument())
set(elm, getLevelContent(level))
each$k(descendants(elm, '*[data-mce-bogus]'), unwrap)
return get$3(elm)
}
var hasEqualContent = function (level1, level2) {
return getLevelContent(level1) === getLevelContent(level2)
}
var hasEqualCleanedContent = function (level1, level2) {
return getCleanLevelContent(level1) === getCleanLevelContent(level2)
}
var isEq$1 = function (level1, level2) {
if (!level1 || !level2) {
return false
} else if (hasEqualContent(level1, level2)) {
return true
} else {
return hasEqualCleanedContent(level1, level2)
}
}
var isUnlocked = function (locks) {
return locks.get() === 0
}
var setTyping = function (undoManager, typing, locks) {
if (isUnlocked(locks)) {
undoManager.typing = typing
}
}
var endTyping = function (undoManager, locks) {
if (undoManager.typing) {
setTyping(undoManager, false, locks)
undoManager.add()
}
}
var endTypingLevelIgnoreLocks = function (undoManager) {
if (undoManager.typing) {
undoManager.typing = false
undoManager.add()
}
}
var beforeChange$1 = function (editor, locks, beforeBookmark) {
if (isUnlocked(locks)) {
beforeBookmark.set(getUndoBookmark(editor.selection))
}
}
var addUndoLevel$1 = function (
editor,
undoManager,
index,
locks,
beforeBookmark,
level,
event
) {
var currentLevel = createFromEditor(editor)
level = level || {}
level = Tools.extend(level, currentLevel)
if (isUnlocked(locks) === false || editor.removed) {
return null
}
var lastLevel = undoManager.data[index.get()]
if (
editor
.fire('BeforeAddUndo', {
level: level,
lastLevel: lastLevel,
originalEvent: event,
})
.isDefaultPrevented()
) {
return null
}
if (lastLevel && isEq$1(lastLevel, level)) {
return null
}
if (undoManager.data[index.get()]) {
beforeBookmark.get().each(function (bm) {
undoManager.data[index.get()].beforeBookmark = bm
})
}
var customUndoRedoLevels = getCustomUndoRedoLevels(editor)
if (customUndoRedoLevels) {
if (undoManager.data.length > customUndoRedoLevels) {
for (var i = 0; i < undoManager.data.length - 1; i++) {
undoManager.data[i] = undoManager.data[i + 1]
}
undoManager.data.length--
index.set(undoManager.data.length)
}
}
level.bookmark = getUndoBookmark(editor.selection)
if (index.get() < undoManager.data.length - 1) {
undoManager.data.length = index.get() + 1
}
undoManager.data.push(level)
index.set(undoManager.data.length - 1)
var args = {
level: level,
lastLevel: lastLevel,
originalEvent: event,
}
if (index.get() > 0) {
editor.setDirty(true)
editor.fire('AddUndo', args)
editor.fire('change', args)
} else {
editor.fire('AddUndo', args)
}
return level
}
var clear$1 = function (editor, undoManager, index) {
undoManager.data = []
index.set(0)
undoManager.typing = false
editor.fire('ClearUndos')
}
var extra$1 = function (editor, undoManager, index, callback1, callback2) {
if (undoManager.transact(callback1)) {
var bookmark = undoManager.data[index.get()].bookmark
var lastLevel = undoManager.data[index.get() - 1]
applyToEditor(editor, lastLevel, true)
if (undoManager.transact(callback2)) {
undoManager.data[index.get() - 1].beforeBookmark = bookmark
}
}
}
var redo$1 = function (editor, index, data) {
var level
if (index.get() < data.length - 1) {
index.set(index.get() + 1)
level = data[index.get()]
applyToEditor(editor, level, false)
editor.setDirty(true)
editor.fire('Redo', { level: level })
}
return level
}
var undo$1 = function (editor, undoManager, locks, index) {
var level
if (undoManager.typing) {
undoManager.add()
undoManager.typing = false
setTyping(undoManager, false, locks)
}
if (index.get() > 0) {
index.set(index.get() - 1)
level = undoManager.data[index.get()]
applyToEditor(editor, level, true)
editor.setDirty(true)
editor.fire('Undo', { level: level })
}
return level
}
var reset$1 = function (undoManager) {
undoManager.clear()
undoManager.add()
}
var hasUndo$1 = function (editor, undoManager, index) {
return (
index.get() > 0 ||
(undoManager.typing &&
undoManager.data[0] &&
!isEq$1(createFromEditor(editor), undoManager.data[0]))
)
}
var hasRedo$1 = function (undoManager, index) {
return index.get() < undoManager.data.length - 1 && !undoManager.typing
}
var transact$1 = function (undoManager, locks, callback) {
endTyping(undoManager, locks)
undoManager.beforeChange()
undoManager.ignore(callback)
return undoManager.add()
}
var ignore$1 = function (locks, callback) {
try {
locks.set(locks.get() + 1)
callback()
} finally {
locks.set(locks.get() - 1)
}
}
var addVisualInternal = function (editor, elm) {
var dom = editor.dom
var scope = isNonNullable(elm) ? elm : editor.getBody()
if (isUndefined(editor.hasVisual)) {
editor.hasVisual = isVisualAidsEnabled(editor)
}
each$k(dom.select('table,a', scope), function (matchedElm) {
switch (matchedElm.nodeName) {
case 'TABLE':
var cls = getVisualAidsTableClass(editor)
var value = dom.getAttrib(matchedElm, 'border')
if ((!value || value === '0') && editor.hasVisual) {
dom.addClass(matchedElm, cls)
} else {
dom.removeClass(matchedElm, cls)
}
break
case 'A':
if (!dom.getAttrib(matchedElm, 'href')) {
var value_1 = dom.getAttrib(matchedElm, 'name') || matchedElm.id
var cls_1 = getVisualAidsAnchorClass(editor)
if (value_1 && editor.hasVisual) {
dom.addClass(matchedElm, cls_1)
} else {
dom.removeClass(matchedElm, cls_1)
}
}
break
}
})
editor.fire('VisualAid', {
element: elm,
hasVisual: editor.hasVisual,
})
}
var makePlainAdaptor = function (editor) {
return {
undoManager: {
beforeChange: function (locks, beforeBookmark) {
return beforeChange$1(editor, locks, beforeBookmark)
},
add: function (
undoManager,
index,
locks,
beforeBookmark,
level,
event
) {
return addUndoLevel$1(
editor,
undoManager,
index,
locks,
beforeBookmark,
level,
event
)
},
undo: function (undoManager, locks, index) {
return undo$1(editor, undoManager, locks, index)
},
redo: function (index, data) {
return redo$1(editor, index, data)
},
clear: function (undoManager, index) {
return clear$1(editor, undoManager, index)
},
reset: function (undoManager) {
return reset$1(undoManager)
},
hasUndo: function (undoManager, index) {
return hasUndo$1(editor, undoManager, index)
},
hasRedo: function (undoManager, index) {
return hasRedo$1(undoManager, index)
},
transact: function (undoManager, locks, callback) {
return transact$1(undoManager, locks, callback)
},
ignore: function (locks, callback) {
return ignore$1(locks, callback)
},
extra: function (undoManager, index, callback1, callback2) {
return extra$1(editor, undoManager, index, callback1, callback2)
},
},
formatter: {
match: function (name, vars, node, similar) {
return match$2(editor, name, vars, node, similar)
},
matchAll: function (names, vars) {
return matchAll(editor, names, vars)
},
matchNode: function (node, name, vars, similar) {
return matchNode(editor, node, name, vars, similar)
},
canApply: function (name) {
return canApply(editor, name)
},
closest: function (names) {
return closest(editor, names)
},
apply: function (name, vars, node) {
return applyFormat$1(editor, name, vars, node)
},
remove: function (name, vars, node, similar) {
return remove$1(editor, name, vars, node, similar)
},
toggle: function (name, vars, node) {
return toggle(editor, name, vars, node)
},
formatChanged: function (
registeredFormatListeners,
formats,
callback,
similar,
vars
) {
return formatChangedInternal(
editor,
registeredFormatListeners,
formats,
callback,
similar,
vars
)
},
},
editor: {
getContent: function (args, format) {
return getContentInternal(editor, args, format)
},
setContent: function (content, args) {
return setContentInternal(editor, content, args)
},
insertContent: function (value, details) {
return insertHtmlAtCaret(editor, value, details)
},
addVisual: function (elm) {
return addVisualInternal(editor, elm)
},
},
selection: {
getContent: function (format, args) {
return getSelectedContentInternal(editor, format, args)
},
},
raw: {
getModel: function () {
return Optional.none()
},
},
}
}
var makeRtcAdaptor = function (rtcEditor) {
var defaultVars = function (vars) {
return isObject(vars) ? vars : {}
}
var undoManager = rtcEditor.undoManager,
formatter = rtcEditor.formatter,
editor = rtcEditor.editor,
selection = rtcEditor.selection,
raw = rtcEditor.raw
return {
undoManager: {
beforeChange: undoManager.beforeChange,
add: undoManager.add,
undo: undoManager.undo,
redo: undoManager.redo,
clear: undoManager.clear,
reset: undoManager.reset,
hasUndo: undoManager.hasUndo,
hasRedo: undoManager.hasRedo,
transact: function (_undoManager, _locks, fn) {
return undoManager.transact(fn)
},
ignore: function (_locks, callback) {
return undoManager.ignore(callback)
},
extra: function (_undoManager, _index, callback1, callback2) {
return undoManager.extra(callback1, callback2)
},
},
formatter: {
match: function (name, vars, _node, similar) {
return formatter.match(name, defaultVars(vars), similar)
},
matchAll: formatter.matchAll,
matchNode: formatter.matchNode,
canApply: function (name) {
return formatter.canApply(name)
},
closest: function (names) {
return formatter.closest(names)
},
apply: function (name, vars, _node) {
return formatter.apply(name, defaultVars(vars))
},
remove: function (name, vars, _node, _similar) {
return formatter.remove(name, defaultVars(vars))
},
toggle: function (name, vars, _node) {
return formatter.toggle(name, defaultVars(vars))
},
formatChanged: function (_rfl, formats, callback, similar, vars) {
return formatter.formatChanged(formats, callback, similar, vars)
},
},
editor: {
getContent: function (args, _format) {
return editor.getContent(args)
},
setContent: function (content, args) {
console.log(content, 'contentcontentcontentcontentcontent-----')
return editor.setContent(content, args)
},
insertContent: function (content, _details) {
return editor.insertContent(content)
},
addVisual: editor.addVisual,
},
selection: {
getContent: function (_format, args) {
return selection.getContent(args)
},
},
raw: {
getModel: function () {
return Optional.some(raw.getRawModel())
},
},
}
}
var makeNoopAdaptor = function () {
var nul = constant(null)
var empty = constant('')
return {
undoManager: {
beforeChange: noop,
add: nul,
undo: nul,
redo: nul,
clear: noop,
reset: noop,
hasUndo: never,
hasRedo: never,
transact: nul,
ignore: noop,
extra: noop,
},
formatter: {
match: never,
matchAll: constant([]),
matchNode: constant(undefined),
canApply: never,
closest: empty,
apply: noop,
remove: noop,
toggle: noop,
formatChanged: constant({ unbind: noop }),
},
editor: {
getContent: empty,
setContent: empty,
insertContent: noop,
addVisual: noop,
},
selection: { getContent: empty },
raw: { getModel: constant(Optional.none()) },
}
}
var isRtc = function (editor) {
return has$2(editor.plugins, 'rtc')
}
var getRtcSetup = function (editor) {
return get$9(editor.plugins, 'rtc').bind(function (rtcPlugin) {
return Optional.from(rtcPlugin.setup)
})
}
var setup$i = function (editor) {
var editorCast = editor
return getRtcSetup(editor).fold(
function () {
editorCast.rtcInstance = makePlainAdaptor(editor)
return Optional.none()
},
function (setup) {
editorCast.rtcInstance = makeNoopAdaptor()
return Optional.some(function () {
return setup().then(function (rtcEditor) {
editorCast.rtcInstance = makeRtcAdaptor(rtcEditor)
return rtcEditor.rtc.isRemote
})
})
}
)
}
var getRtcInstanceWithFallback = function (editor) {
return editor.rtcInstance ? editor.rtcInstance : makePlainAdaptor(editor)
}
var getRtcInstanceWithError = function (editor) {
var rtcInstance = editor.rtcInstance
if (!rtcInstance) {
throw new Error('Failed to get RTC instance not yet initialized.')
} else {
return rtcInstance
}
}
var beforeChange = function (editor, locks, beforeBookmark) {
getRtcInstanceWithError(editor).undoManager.beforeChange(
locks,
beforeBookmark
)
}
var addUndoLevel = function (
editor,
undoManager,
index,
locks,
beforeBookmark,
level,
event
) {
return getRtcInstanceWithError(editor).undoManager.add(
undoManager,
index,
locks,
beforeBookmark,
level,
event
)
}
var undo = function (editor, undoManager, locks, index) {
return getRtcInstanceWithError(editor).undoManager.undo(
undoManager,
locks,
index
)
}
var redo = function (editor, index, data) {
return getRtcInstanceWithError(editor).undoManager.redo(index, data)
}
var clear = function (editor, undoManager, index) {
getRtcInstanceWithError(editor).undoManager.clear(undoManager, index)
}
var reset = function (editor, undoManager) {
getRtcInstanceWithError(editor).undoManager.reset(undoManager)
}
var hasUndo = function (editor, undoManager, index) {
return getRtcInstanceWithError(editor).undoManager.hasUndo(
undoManager,
index
)
}
var hasRedo = function (editor, undoManager, index) {
return getRtcInstanceWithError(editor).undoManager.hasRedo(
undoManager,
index
)
}
var transact = function (editor, undoManager, locks, callback) {
return getRtcInstanceWithError(editor).undoManager.transact(
undoManager,
locks,
callback
)
}
var ignore = function (editor, locks, callback) {
getRtcInstanceWithError(editor).undoManager.ignore(locks, callback)
}
var extra = function (editor, undoManager, index, callback1, callback2) {
getRtcInstanceWithError(editor).undoManager.extra(
undoManager,
index,
callback1,
callback2
)
}
var matchFormat = function (editor, name, vars, node, similar) {
return getRtcInstanceWithError(editor).formatter.match(
name,
vars,
node,
similar
)
}
var matchAllFormats = function (editor, names, vars) {
return getRtcInstanceWithError(editor).formatter.matchAll(names, vars)
}
var matchNodeFormat = function (editor, node, name, vars, similar) {
return getRtcInstanceWithError(editor).formatter.matchNode(
node,
name,
vars,
similar
)
}
var canApplyFormat = function (editor, name) {
return getRtcInstanceWithError(editor).formatter.canApply(name)
}
var closestFormat = function (editor, names) {
return getRtcInstanceWithError(editor).formatter.closest(names)
}
var applyFormat = function (editor, name, vars, node) {
getRtcInstanceWithError(editor).formatter.apply(name, vars, node)
}
var removeFormat = function (editor, name, vars, node, similar) {
getRtcInstanceWithError(editor).formatter.remove(name, vars, node, similar)
}
var toggleFormat = function (editor, name, vars, node) {
getRtcInstanceWithError(editor).formatter.toggle(name, vars, node)
}
var formatChanged = function (
editor,
registeredFormatListeners,
formats,
callback,
similar,
vars
) {
return getRtcInstanceWithError(editor).formatter.formatChanged(
registeredFormatListeners,
formats,
callback,
similar,
vars
)
}
var getContent$2 = function (editor, args, format) {
return getRtcInstanceWithFallback(editor).editor.getContent(args, format)
}
var setContent$2 = function (editor, content, args) {
return getRtcInstanceWithFallback(editor).editor.setContent(content, args)
}
var insertContent = function (editor, value, details) {
return getRtcInstanceWithFallback(editor).editor.insertContent(
value,
details
)
}
var getSelectedContent = function (editor, format, args) {
return getRtcInstanceWithError(editor).selection.getContent(format, args)
}
var addVisual$1 = function (editor, elm) {
return getRtcInstanceWithError(editor).editor.addVisual(elm)
}
var getContent$1 = function (editor, args) {
if (args === void 0) {
args = {}
}
var format = args.format ? args.format : 'html'
return getSelectedContent(editor, format, args)
}
var removeEmpty = function (text) {
if (text.dom.length === 0) {
remove$7(text)
return Optional.none()
} else {
return Optional.some(text)
}
}
var walkPastBookmark = function (node, start) {
return node
.filter(function (elm) {
return BookmarkManager.isBookmarkNode(elm.dom)
})
.bind(start ? nextSibling : prevSibling)
}
var merge = function (outer, inner, rng, start) {
var outerElm = outer.dom
var innerElm = inner.dom
var oldLength = start ? outerElm.length : innerElm.length
if (start) {
mergeTextNodes(outerElm, innerElm, false, !start)
rng.setStart(innerElm, oldLength)
} else {
mergeTextNodes(innerElm, outerElm, false, !start)
rng.setEnd(innerElm, oldLength)
}
}
var normalizeTextIfRequired = function (inner, start) {
parent(inner).each(function (root) {
var text = inner.dom
if (start && needsToBeNbspLeft(root, CaretPosition(text, 0))) {
normalizeWhitespaceAfter(text, 0)
} else if (
!start &&
needsToBeNbspRight(root, CaretPosition(text, text.length))
) {
normalizeWhitespaceBefore(text, text.length)
}
})
}
var mergeAndNormalizeText = function (outerNode, innerNode, rng, start) {
outerNode
.bind(function (outer) {
var normalizer = start
? normalizeWhitespaceBefore
: normalizeWhitespaceAfter
normalizer(outer.dom, start ? outer.dom.length : 0)
return innerNode.filter(isText$8).map(function (inner) {
return merge(outer, inner, rng, start)
})
})
.orThunk(function () {
var innerTextNode = walkPastBookmark(innerNode, start)
.or(innerNode)
.filter(isText$8)
return innerTextNode.map(function (inner) {
return normalizeTextIfRequired(inner, start)
})
})
}
var rngSetContent = function (rng, fragment) {
var firstChild = Optional.from(fragment.firstChild).map(
SugarElement.fromDom
)
var lastChild = Optional.from(fragment.lastChild).map(SugarElement.fromDom)
rng.deleteContents()
rng.insertNode(fragment)
var prevText = firstChild
.bind(prevSibling)
.filter(isText$8)
.bind(removeEmpty)
var nextText = lastChild
.bind(nextSibling)
.filter(isText$8)
.bind(removeEmpty)
mergeAndNormalizeText(prevText, firstChild, rng, true)
mergeAndNormalizeText(nextText, lastChild, rng, false)
rng.collapse(false)
}
var setupArgs = function (args, content) {
return __assign(__assign({ format: 'html' }, args), {
set: true,
selection: true,
content: content,
})
}
var cleanContent = function (editor, args) {
if (args.format !== 'raw') {
var rng = editor.selection.getRng()
var contextBlock = editor.dom.getParent(
rng.commonAncestorContainer,
editor.dom.isBlock
)
var contextArgs = contextBlock
? { context: contextBlock.nodeName.toLowerCase() }
: {}
var node = editor.parser.parse(
args.content,
__assign(
__assign(
{
isRootContent: true,
forced_root_block: false,
},
contextArgs
),
args
)
)
return HtmlSerializer(
{ validate: editor.validate },
editor.schema
).serialize(node)
} else {
return args.content
}
}
var setContent$1 = function (editor, content, args) {
if (args === void 0) {
args = {}
}
var defaultedArgs = setupArgs(args, content)
var updatedArgs = defaultedArgs
if (!defaultedArgs.no_events) {
var eventArgs = editor.fire('BeforeSetContent', defaultedArgs)
if (eventArgs.isDefaultPrevented()) {
editor.fire('SetContent', eventArgs)
return
} else {
updatedArgs = eventArgs
}
}
updatedArgs.content = cleanContent(editor, updatedArgs)
var rng = editor.selection.getRng()
rngSetContent(rng, rng.createContextualFragment(updatedArgs.content))
editor.selection.setRng(rng)
scrollRangeIntoView(editor, rng)
if (!updatedArgs.no_events) {
editor.fire('SetContent', updatedArgs)
}
}
var deleteFromCallbackMap = function (callbackMap, selector, callback) {
if (callbackMap && has$2(callbackMap, selector)) {
var newCallbacks = filter$4(callbackMap[selector], function (cb) {
return cb !== callback
})
if (newCallbacks.length === 0) {
delete callbackMap[selector]
} else {
callbackMap[selector] = newCallbacks
}
}
}
function SelectorChanged(dom, editor) {
var selectorChangedData
var currentSelectors
var findMatchingNode = function (selector, nodes) {
return find$3(nodes, function (node) {
return dom.is(node, selector)
})
}
var getParents = function (elem) {
return dom.getParents(elem, null, dom.getRoot())
}
return {
selectorChangedWithUnbind: function (selector, callback) {
if (!selectorChangedData) {
selectorChangedData = {}
currentSelectors = {}
editor.on('NodeChange', function (e) {
var node = e.element
var parents = getParents(node)
var matchedSelectors = {}
Tools.each(selectorChangedData, function (callbacks, selector) {
findMatchingNode(selector, parents).each(function (node) {
if (!currentSelectors[selector]) {
each$k(callbacks, function (callback) {
callback(true, {
node: node,
selector: selector,
parents: parents,
})
})
currentSelectors[selector] = callbacks
}
matchedSelectors[selector] = callbacks
})
})
Tools.each(currentSelectors, function (callbacks, selector) {
if (!matchedSelectors[selector]) {
delete currentSelectors[selector]
Tools.each(callbacks, function (callback) {
callback(false, {
node: node,
selector: selector,
parents: parents,
})
})
}
})
})
}
if (!selectorChangedData[selector]) {
selectorChangedData[selector] = []
}
selectorChangedData[selector].push(callback)
findMatchingNode(
selector,
getParents(editor.selection.getStart())
).each(function () {
currentSelectors[selector] = selectorChangedData[selector]
})
return {
unbind: function () {
deleteFromCallbackMap(selectorChangedData, selector, callback)
deleteFromCallbackMap(currentSelectors, selector, callback)
},
}
},
}
}
var isNativeIeSelection = function (rng) {
return !!rng.select
}
var isAttachedToDom = function (node) {
return (
!!(node && node.ownerDocument) &&
contains$1(
SugarElement.fromDom(node.ownerDocument),
SugarElement.fromDom(node)
)
)
}
var isValidRange = function (rng) {
if (!rng) {
return false
} else if (isNativeIeSelection(rng)) {
return true
} else {
return (
isAttachedToDom(rng.startContainer) && isAttachedToDom(rng.endContainer)
)
}
}
var EditorSelection = function (dom, win, serializer, editor) {
var selectedRange
var explicitRange
var selectorChangedWithUnbind = SelectorChanged(
dom,
editor
).selectorChangedWithUnbind
var setCursorLocation = function (node, offset) {
var rng = dom.createRng()
if (isNonNullable(node) && isNonNullable(offset)) {
rng.setStart(node, offset)
rng.setEnd(node, offset)
setRng(rng)
collapse(false)
} else {
moveEndPoint(dom, rng, editor.getBody(), true)
setRng(rng)
}
}
var getContent = function (args) {
return getContent$1(editor, args)
}
var setContent = function (content, args) {
return setContent$1(editor, content, args)
}
var getStart$1 = function (real) {
return getStart(editor.getBody(), getRng$1(), real)
}
var getEnd$1 = function (real) {
return getEnd(editor.getBody(), getRng$1(), real)
}
var getBookmark = function (type, normalized) {
return bookmarkManager.getBookmark(type, normalized)
}
var moveToBookmark = function (bookmark) {
return bookmarkManager.moveToBookmark(bookmark)
}
var select$1 = function (node, content) {
select(dom, node, content).each(setRng)
return node
}
var isCollapsed = function () {
var rng = getRng$1(),
sel = getSel()
if (!rng || rng.item) {
return false
}
if (rng.compareEndPoints) {
return rng.compareEndPoints('StartToEnd', rng) === 0
}
return !sel || rng.collapsed
}
var collapse = function (toStart) {
var rng = getRng$1()
rng.collapse(!!toStart)
setRng(rng)
}
var getSel = function () {
return win.getSelection ? win.getSelection() : win.document.selection
}
var getRng$1 = function () {
var selection, rng, elm
var tryCompareBoundaryPoints = function (
how,
sourceRange,
destinationRange
) {
try {
return sourceRange.compareBoundaryPoints(how, destinationRange)
} catch (ex) {
return -1
}
}
var doc = win.document
if (editor.bookmark !== undefined && hasFocus(editor) === false) {
var bookmark = getRng(editor)
if (bookmark.isSome()) {
return bookmark
.map(function (r) {
return processRanges(editor, [r])[0]
})
.getOr(doc.createRange())
}
}
try {
if ((selection = getSel()) && !isRestrictedNode(selection.anchorNode)) {
if (selection.rangeCount > 0) {
rng = selection.getRangeAt(0)
} else {
rng = selection.createRange
? selection.createRange()
: doc.createRange()
}
rng = processRanges(editor, [rng])[0]
}
} catch (ex) {}
if (!rng) {
rng = doc.createRange ? doc.createRange() : doc.body.createTextRange()
}
if (rng.setStart && rng.startContainer.nodeType === 9 && rng.collapsed) {
elm = dom.getRoot()
rng.setStart(elm, 0)
rng.setEnd(elm, 0)
}
if (selectedRange && explicitRange) {
if (
tryCompareBoundaryPoints(rng.START_TO_START, rng, selectedRange) ===
0 &&
tryCompareBoundaryPoints(rng.END_TO_END, rng, selectedRange) === 0
) {
rng = explicitRange
} else {
selectedRange = null
explicitRange = null
}
}
return rng
}
var setRng = function (rng, forward) {
var node
if (!isValidRange(rng)) {
return
}
var ieRange = isNativeIeSelection(rng) ? rng : null
if (ieRange) {
explicitRange = null
try {
ieRange.select()
} catch (ex) {}
return
}
var sel = getSel()
var evt = editor.fire('SetSelectionRange', {
range: rng,
forward: forward,
})
rng = evt.range
if (sel) {
explicitRange = rng
try {
sel.removeAllRanges()
sel.addRange(rng)
} catch (ex) {}
if (forward === false && sel.extend) {
sel.collapse(rng.endContainer, rng.endOffset)
sel.extend(rng.startContainer, rng.startOffset)
}
selectedRange = sel.rangeCount > 0 ? sel.getRangeAt(0) : null
}
if (
!rng.collapsed &&
rng.startContainer === rng.endContainer &&
sel.setBaseAndExtent &&
!Env.ie
) {
if (rng.endOffset - rng.startOffset < 2) {
if (rng.startContainer.hasChildNodes()) {
node = rng.startContainer.childNodes[rng.startOffset]
if (node && node.tagName === 'IMG') {
sel.setBaseAndExtent(
rng.startContainer,
rng.startOffset,
rng.endContainer,
rng.endOffset
)
if (
sel.anchorNode !== rng.startContainer ||
sel.focusNode !== rng.endContainer
) {
sel.setBaseAndExtent(node, 0, node, 1)
}
}
}
}
}
editor.fire('AfterSetSelectionRange', {
range: rng,
forward: forward,
})
}
var setNode = function (elm) {
setContent(dom.getOuterHTML(elm))
return elm
}
var getNode$1 = function () {
return getNode(editor.getBody(), getRng$1())
}
var getSelectedBlocks$1 = function (startElm, endElm) {
return getSelectedBlocks(dom, getRng$1(), startElm, endElm)
}
var isForward = function () {
var sel = getSel()
var anchorNode = sel === null || sel === void 0 ? void 0 : sel.anchorNode
var focusNode = sel === null || sel === void 0 ? void 0 : sel.focusNode
if (
!sel ||
!anchorNode ||
!focusNode ||
isRestrictedNode(anchorNode) ||
isRestrictedNode(focusNode)
) {
return true
}
var anchorRange = dom.createRng()
anchorRange.setStart(anchorNode, sel.anchorOffset)
anchorRange.collapse(true)
var focusRange = dom.createRng()
focusRange.setStart(focusNode, sel.focusOffset)
focusRange.collapse(true)
return (
anchorRange.compareBoundaryPoints(
anchorRange.START_TO_START,
focusRange
) <= 0
)
}
var normalize = function () {
var rng = getRng$1()
var sel = getSel()
if (!hasMultipleRanges(sel) && hasAnyRanges(editor)) {
var normRng = normalize$2(dom, rng)
normRng.each(function (normRng) {
setRng(normRng, isForward())
})
return normRng.getOr(rng)
}
return rng
}
var selectorChanged = function (selector, callback) {
selectorChangedWithUnbind(selector, callback)
return exports
}
var getScrollContainer = function () {
var scrollContainer
var node = dom.getRoot()
while (node && node.nodeName !== 'BODY') {
if (node.scrollHeight > node.clientHeight) {
scrollContainer = node
break
}
node = node.parentNode
}
return scrollContainer
}
var scrollIntoView = function (elm, alignToTop) {
if (isNonNullable(elm)) {
scrollElementIntoView(editor, elm, alignToTop)
} else {
scrollRangeIntoView(editor, getRng$1(), alignToTop)
}
}
var placeCaretAt = function (clientX, clientY) {
return setRng(fromPoint(clientX, clientY, editor.getDoc()))
}
var getBoundingClientRect = function () {
var rng = getRng$1()
return rng.collapsed
? CaretPosition.fromRangeStart(rng).getClientRects()[0]
: rng.getBoundingClientRect()
}
var destroy = function () {
win = selectedRange = explicitRange = null
controlSelection.destroy()
}
var exports = {
bookmarkManager: null,
controlSelection: null,
dom: dom,
win: win,
serializer: serializer,
editor: editor,
collapse: collapse,
setCursorLocation: setCursorLocation,
getContent: getContent,
setContent: setContent,
getBookmark: getBookmark,
moveToBookmark: moveToBookmark,
select: select$1,
isCollapsed: isCollapsed,
isForward: isForward,
setNode: setNode,
getNode: getNode$1,
getSel: getSel,
setRng: setRng,
getRng: getRng$1,
getStart: getStart$1,
getEnd: getEnd$1,
getSelectedBlocks: getSelectedBlocks$1,
normalize: normalize,
selectorChanged: selectorChanged,
selectorChangedWithUnbind: selectorChangedWithUnbind,
getScrollContainer: getScrollContainer,
scrollIntoView: scrollIntoView,
placeCaretAt: placeCaretAt,
getBoundingClientRect: getBoundingClientRect,
destroy: destroy,
}
var bookmarkManager = BookmarkManager(exports)
var controlSelection = ControlSelection(exports, editor)
exports.bookmarkManager = bookmarkManager
exports.controlSelection = controlSelection
return exports
}
var removeAttrs = function (node, names) {
each$k(names, function (name) {
node.attr(name, null)
})
}
var addFontToSpansFilter = function (domParser, styles, fontSizes) {
domParser.addNodeFilter('font', function (nodes) {
each$k(nodes, function (node) {
var props = styles.parse(node.attr('style'))
var color = node.attr('color')
var face = node.attr('face')
var size = node.attr('size')
if (color) {
props.color = color
}
if (face) {
props['font-family'] = face
}
if (size) {
props['font-size'] = fontSizes[parseInt(node.attr('size'), 10) - 1]
}
node.name = 'span'
node.attr('style', styles.serialize(props))
removeAttrs(node, ['color', 'face', 'size'])
})
})
}
var addStrikeToSpanFilter = function (domParser, styles) {
domParser.addNodeFilter('strike', function (nodes) {
each$k(nodes, function (node) {
var props = styles.parse(node.attr('style'))
props['text-decoration'] = 'line-through'
node.name = 'span'
node.attr('style', styles.serialize(props))
})
})
}
var addFilters = function (domParser, settings) {
var styles = Styles()
if (settings.convert_fonts_to_spans) {
addFontToSpansFilter(
domParser,
styles,
Tools.explode(settings.font_size_legacy_values)
)
}
addStrikeToSpanFilter(domParser, styles)
}
var register$2 = function (domParser, settings) {
if (settings.inline_styles) {
addFilters(domParser, settings)
}
}
var blobUriToBlob = function (url) {
return new promiseObj(function (resolve, reject) {
var rejectWithError = function () {
reject(
'Cannot convert ' +
url +
' to Blob. Resource might not exist or is inaccessible.'
)
}
try {
var xhr_1 = new XMLHttpRequest()
xhr_1.open('GET', url, true)
xhr_1.responseType = 'blob'
xhr_1.onload = function () {
if (xhr_1.status === 200) {
resolve(xhr_1.response)
} else {
rejectWithError()
}
}
xhr_1.onerror = rejectWithError
xhr_1.send()
} catch (ex) {
rejectWithError()
}
})
}
var parseDataUri = function (uri) {
var type
var uriParts = decodeURIComponent(uri).split(',')
var matches = /data:([^;]+)/.exec(uriParts[0])
if (matches) {
type = matches[1]
}
return {
type: type,
data: uriParts[1],
}
}
var buildBlob = function (type, data) {
var str
try {
str = atob(data)
} catch (e) {
return Optional.none()
}
var arr = new Uint8Array(str.length)
for (var i = 0; i < arr.length; i++) {
arr[i] = str.charCodeAt(i)
}
return Optional.some(new Blob([arr], { type: type }))
}
var dataUriToBlob = function (uri) {
return new promiseObj(function (resolve) {
var _a = parseDataUri(uri),
type = _a.type,
data = _a.data
buildBlob(type, data).fold(function () {
return resolve(new Blob([]))
}, resolve)
})
}
var uriToBlob = function (url) {
if (url.indexOf('blob:') === 0) {
return blobUriToBlob(url)
}
if (url.indexOf('data:') === 0) {
return dataUriToBlob(url)
}
return null
}
var blobToDataUri = function (blob) {
return new promiseObj(function (resolve) {
var reader = new FileReader()
reader.onloadend = function () {
resolve(reader.result)
}
reader.readAsDataURL(blob)
})
}
var count$1 = 0
var uniqueId = function (prefix) {
return (prefix || 'blobid') + count$1++
}
var imageToBlobInfo = function (blobCache, img, resolve, reject) {
var base64, blobInfo
if (img.src.indexOf('blob:') === 0) {
blobInfo = blobCache.getByUri(img.src)
if (blobInfo) {
resolve({
image: img,
blobInfo: blobInfo,
})
} else {
uriToBlob(img.src).then(
function (blob) {
blobToDataUri(blob).then(function (dataUri) {
base64 = parseDataUri(dataUri).data
blobInfo = blobCache.create(uniqueId(), blob, base64)
blobCache.add(blobInfo)
resolve({
image: img,
blobInfo: blobInfo,
})
})
},
function (err) {
reject(err)
}
)
}
return
}
var _a = parseDataUri(img.src),
data = _a.data,
type = _a.type
base64 = data
blobInfo = blobCache.getByData(base64, type)
if (blobInfo) {
resolve({
image: img,
blobInfo: blobInfo,
})
} else {
uriToBlob(img.src).then(
function (blob) {
blobInfo = blobCache.create(uniqueId(), blob, base64)
blobCache.add(blobInfo)
resolve({
image: img,
blobInfo: blobInfo,
})
},
function (err) {
reject(err)
}
)
}
}
var getAllImages = function (elm) {
return elm ? from(elm.getElementsByTagName('img')) : []
}
var ImageScanner = function (uploadStatus, blobCache) {
var cachedPromises = {}
var findAll = function (elm, predicate) {
if (!predicate) {
predicate = always
}
var images = filter$4(getAllImages(elm), function (img) {
var src = img.src
if (!Env.fileApi) {
return false
}
if (img.hasAttribute('data-mce-bogus')) {
return false
}
if (img.hasAttribute('data-mce-placeholder')) {
return false
}
if (!src || src === Env.transparentSrc) {
return false
}
if (src.indexOf('blob:') === 0) {
return !uploadStatus.isUploaded(src) && predicate(img)
}
if (src.indexOf('data:') === 0) {
return predicate(img)
}
return false
})
var promises = map$3(images, function (img) {
if (cachedPromises[img.src] !== undefined) {
return new promiseObj(function (resolve) {
cachedPromises[img.src].then(function (imageInfo) {
if (typeof imageInfo === 'string') {
return imageInfo
}
resolve({
image: img,
blobInfo: imageInfo.blobInfo,
})
})
})
}
var newPromise = new promiseObj(function (resolve, reject) {
imageToBlobInfo(blobCache, img, resolve, reject)
})
.then(function (result) {
delete cachedPromises[result.image.src]
return result
})
.catch(function (error) {
delete cachedPromises[img.src]
return error
})
cachedPromises[img.src] = newPromise
return newPromise
})
return promiseObj.all(promises)
}
return { findAll: findAll }
}
var paddEmptyNode = function (settings, args, blockElements, node) {
var brPreferred = settings.padd_empty_with_br || args.insert
if (brPreferred && blockElements[node.name]) {
node.empty().append(new AstNode('br', 1)).shortEnded = true
} else {
node.empty().append(new AstNode('#text', 3)).value = nbsp
}
}
var isPaddedWithNbsp = function (node) {
return hasOnlyChild(node, '#text') && node.firstChild.value === nbsp
}
var hasOnlyChild = function (node, name) {
return (
node &&
node.firstChild &&
node.firstChild === node.lastChild &&
node.firstChild.name === name
)
}
var isPadded = function (schema, node) {
var rule = schema.getElementRule(node.name)
return rule && rule.paddEmpty
}
var isEmpty = function (schema, nonEmptyElements, whitespaceElements, node) {
return node.isEmpty(nonEmptyElements, whitespaceElements, function (node) {
return isPadded(schema, node)
})
}
var isLineBreakNode = function (node, blockElements) {
return node && (has$2(blockElements, node.name) || node.name === 'br')
}
var isBogusImage = function (img) {
return isNonNullable(img.attr('data-mce-bogus'))
}
var isInternalImageSource = function (img) {
return (
img.attr('src') === Env.transparentSrc ||
isNonNullable(img.attr('data-mce-placeholder'))
)
}
var isValidDataImg = function (img, settings) {
if (settings.images_dataimg_filter) {
var imgElem_1 = new Image()
imgElem_1.src = img.attr('src')
each$j(img.attributes.map, function (value, key) {
imgElem_1.setAttribute(key, value)
})
return settings.images_dataimg_filter(imgElem_1)
} else {
return true
}
}
var registerBase64ImageFilter = function (parser, settings) {
var blobCache = settings.blob_cache
var processImage = function (img) {
var inputSrc = img.attr('src')
if (isInternalImageSource(img) || isBogusImage(img)) {
return
}
parseDataUri$1(inputSrc)
.filter(function () {
return isValidDataImg(img, settings)
})
.bind(function (_a) {
var type = _a.type,
data = _a.data
return Optional.from(blobCache.getByData(data, type)).orThunk(
function () {
return buildBlob(type, data).map(function (blob) {
var blobInfo = blobCache.create(uniqueId(), blob, data)
blobCache.add(blobInfo)
return blobInfo
})
}
)
})
.each(function (blobInfo) {
img.attr('src', blobInfo.blobUri())
})
}
if (blobCache) {
parser.addAttributeFilter('src', function (nodes) {
return each$k(nodes, processImage)
})
}
}
var register$1 = function (parser, settings) {
var schema = parser.schema
if (settings.remove_trailing_brs) {
parser.addNodeFilter('br', function (nodes, _, args) {
var i
var l = nodes.length
var node
var blockElements = Tools.extend({}, schema.getBlockElements())
var nonEmptyElements = schema.getNonEmptyElements()
var parent, lastParent, prev, prevName
var whiteSpaceElements = schema.getWhiteSpaceElements()
var elementRule, textNode
blockElements.body = 1
for (i = 0; i < l; i++) {
node = nodes[i]
parent = node.parent
if (blockElements[node.parent.name] && node === parent.lastChild) {
prev = node.prev
while (prev) {
prevName = prev.name
if (
prevName !== 'span' ||
prev.attr('data-mce-type') !== 'bookmark'
) {
if (prevName === 'br') {
node = null
}
break
}
prev = prev.prev
}
if (node) {
node.remove()
if (
isEmpty(schema, nonEmptyElements, whiteSpaceElements, parent)
) {
elementRule = schema.getElementRule(parent.name)
if (elementRule) {
if (elementRule.removeEmpty) {
parent.remove()
} else if (elementRule.paddEmpty) {
paddEmptyNode(settings, args, blockElements, parent)
}
}
}
}
} else {
lastParent = node
while (
parent &&
parent.firstChild === lastParent &&
parent.lastChild === lastParent
) {
lastParent = parent
if (blockElements[parent.name]) {
break
}
parent = parent.parent
}
if (lastParent === parent && settings.padd_empty_with_br !== true) {
textNode = new AstNode('#text', 3)
textNode.value = nbsp
node.replace(textNode)
}
}
}
})
}
parser.addAttributeFilter('href', function (nodes) {
var i = nodes.length
var appendRel = function (rel) {
var parts = rel.split(' ').filter(function (p) {
return p.length > 0
})
return parts.concat(['noopener']).sort().join(' ')
}
var addNoOpener = function (rel) {
var newRel = rel ? Tools.trim(rel) : ''
if (!/\b(noopener)\b/g.test(newRel)) {
return appendRel(newRel)
} else {
return newRel
}
}
if (!settings.allow_unsafe_link_target) {
while (i--) {
var node = nodes[i]
if (node.name === 'a' && node.attr('target') === '_blank') {
node.attr('rel', addNoOpener(node.attr('rel')))
}
}
}
})
if (!settings.allow_html_in_named_anchor) {
parser.addAttributeFilter('id,name', function (nodes) {
var i = nodes.length,
sibling,
prevSibling,
parent,
node
while (i--) {
node = nodes[i]
if (node.name === 'a' && node.firstChild && !node.attr('href')) {
parent = node.parent
sibling = node.lastChild
do {
prevSibling = sibling.prev
parent.insert(sibling, node)
sibling = prevSibling
} while (sibling)
}
}
})
}
if (settings.fix_list_elements) {
parser.addNodeFilter('ul,ol', function (nodes) {
var i = nodes.length,
node,
parentNode
while (i--) {
node = nodes[i]
parentNode = node.parent
if (parentNode.name === 'ul' || parentNode.name === 'ol') {
if (node.prev && node.prev.name === 'li') {
node.prev.append(node)
} else {
var li = new AstNode('li', 1)
li.attr('style', 'list-style-type: none')
node.wrap(li)
}
}
}
})
}
if (settings.validate && schema.getValidClasses()) {
parser.addAttributeFilter('class', function (nodes) {
var validClasses = schema.getValidClasses()
var i = nodes.length
while (i--) {
var node = nodes[i]
var classList = node.attr('class').split(' ')
var classValue = ''
for (var ci = 0; ci < classList.length; ci++) {
var className = classList[ci]
var valid = false
var validClassesMap = validClasses['*']
if (validClassesMap && validClassesMap[className]) {
valid = true
}
validClassesMap = validClasses[node.name]
if (!valid && validClassesMap && validClassesMap[className]) {
valid = true
}
if (valid) {
if (classValue) {
classValue += ' '
}
classValue += className
}
}
if (!classValue.length) {
classValue = null
}
node.attr('class', classValue)
}
})
}
registerBase64ImageFilter(parser, settings)
}
var makeMap = Tools.makeMap,
each$6 = Tools.each,
explode$2 = Tools.explode,
extend$4 = Tools.extend
var DomParser = function (settings, schema) {
if (schema === void 0) {
schema = Schema()
}
var nodeFilters = {}
var attributeFilters = []
var matchedNodes = {}
var matchedAttributes = {}
settings = settings || {}
settings.validate = 'validate' in settings ? settings.validate : true
settings.root_name = settings.root_name || 'body'
var fixInvalidChildren = function (nodes) {
var nonSplitableElements = makeMap('tr,td,th,tbody,thead,tfoot,table')
var nonEmptyElements = schema.getNonEmptyElements()
var whitespaceElements = schema.getWhiteSpaceElements()
var textBlockElements = schema.getTextBlockElements()
var specialElements = schema.getSpecialElements()
var removeOrUnwrapInvalidNode = function (node, originalNodeParent) {
if (originalNodeParent === void 0) {
originalNodeParent = node.parent
}
if (specialElements[node.name]) {
node.empty().remove()
} else {
var children = node.children()
for (
var _i = 0, children_1 = children;
_i < children_1.length;
_i++
) {
var childNode = children_1[_i]
if (!schema.isValidChild(originalNodeParent.name, childNode.name)) {
removeOrUnwrapInvalidNode(childNode, originalNodeParent)
}
}
node.unwrap()
}
}
for (var ni = 0; ni < nodes.length; ni++) {
var node = nodes[ni]
var parent_1 = void 0,
newParent = void 0,
tempNode = void 0
if (!node.parent || node.fixed) {
continue
}
if (textBlockElements[node.name] && node.parent.name === 'li') {
var sibling = node.next
while (sibling) {
if (textBlockElements[sibling.name]) {
sibling.name = 'li'
sibling.fixed = true
node.parent.insert(sibling, node.parent)
} else {
break
}
sibling = sibling.next
}
node.unwrap()
continue
}
var parents = [node]
for (
parent_1 = node.parent;
parent_1 &&
!schema.isValidChild(parent_1.name, node.name) &&
!nonSplitableElements[parent_1.name];
parent_1 = parent_1.parent
) {
parents.push(parent_1)
}
if (parent_1 && parents.length > 1) {
if (schema.isValidChild(parent_1.name, node.name)) {
parents.reverse()
newParent = filterNode(parents[0].clone())
var currentNode = newParent
for (var i = 0; i < parents.length - 1; i++) {
if (schema.isValidChild(currentNode.name, parents[i].name)) {
tempNode = filterNode(parents[i].clone())
currentNode.append(tempNode)
} else {
tempNode = currentNode
}
for (
var childNode = parents[i].firstChild;
childNode && childNode !== parents[i + 1];
) {
var nextNode = childNode.next
tempNode.append(childNode)
childNode = nextNode
}
currentNode = tempNode
}
if (
!isEmpty(schema, nonEmptyElements, whitespaceElements, newParent)
) {
parent_1.insert(newParent, parents[0], true)
parent_1.insert(node, newParent)
} else {
parent_1.insert(node, parents[0], true)
}
parent_1 = parents[0]
if (
isEmpty(schema, nonEmptyElements, whitespaceElements, parent_1) ||
hasOnlyChild(parent_1, 'br')
) {
parent_1.empty().remove()
}
} else {
removeOrUnwrapInvalidNode(node)
}
} else if (node.parent) {
if (node.name === 'li') {
var sibling = node.prev
if (sibling && (sibling.name === 'ul' || sibling.name === 'ol')) {
sibling.append(node)
continue
}
sibling = node.next
if (sibling && (sibling.name === 'ul' || sibling.name === 'ol')) {
sibling.insert(node, sibling.firstChild, true)
continue
}
node.wrap(filterNode(new AstNode('ul', 1)))
continue
}
if (
schema.isValidChild(node.parent.name, 'div') &&
schema.isValidChild('div', node.name)
) {
node.wrap(filterNode(new AstNode('div', 1)))
} else {
removeOrUnwrapInvalidNode(node)
}
}
}
}
var filterNode = function (node) {
var name = node.name
if (name in nodeFilters) {
var list = matchedNodes[name]
if (list) {
list.push(node)
} else {
matchedNodes[name] = [node]
}
}
var i = attributeFilters.length
while (i--) {
var attrName = attributeFilters[i].name
if (attrName in node.attributes.map) {
var list = matchedAttributes[attrName]
if (list) {
list.push(node)
} else {
matchedAttributes[attrName] = [node]
}
}
}
return node
}
var addNodeFilter = function (name, callback) {
each$6(explode$2(name), function (name) {
var list = nodeFilters[name]
if (!list) {
nodeFilters[name] = list = []
}
list.push(callback)
})
}
var getNodeFilters = function () {
var out = []
for (var name_1 in nodeFilters) {
if (has$2(nodeFilters, name_1)) {
out.push({
name: name_1,
callbacks: nodeFilters[name_1],
})
}
}
return out
}
var addAttributeFilter = function (name, callback) {
each$6(explode$2(name), function (name) {
var i
for (i = 0; i < attributeFilters.length; i++) {
if (attributeFilters[i].name === name) {
attributeFilters[i].callbacks.push(callback)
return
}
}
attributeFilters.push({
name: name,
callbacks: [callback],
})
})
}
var getAttributeFilters = function () {
return [].concat(attributeFilters)
}
var parse = function (html, args) {
var nodes, i, l, fi, fl, list, name
var invalidChildren = []
var node
var getRootBlockName = function (name) {
if (name === false) {
return ''
} else if (name === true) {
return 'p'
} else {
return name
}
}
args = args || {}
matchedNodes = {}
matchedAttributes = {}
var blockElements = extend$4(
makeMap('script,style,head,html,body,title,meta,param'),
schema.getBlockElements()
)
var nonEmptyElements = schema.getNonEmptyElements()
var children = schema.children
var validate = settings.validate
var forcedRootBlockName =
'forced_root_block' in args
? args.forced_root_block
: settings.forced_root_block
var rootBlockName = getRootBlockName(forcedRootBlockName)
var whiteSpaceElements = schema.getWhiteSpaceElements()
var startWhiteSpaceRegExp = /^[ \t\r\n]+/
var endWhiteSpaceRegExp = /[ \t\r\n]+$/
var allWhiteSpaceRegExp = /[ \t\r\n]+/g
var isAllWhiteSpaceRegExp = /^[ \t\r\n]+$/
var isInWhiteSpacePreservedElement =
has$2(whiteSpaceElements, args.context) ||
has$2(whiteSpaceElements, settings.root_name)
var addRootBlocks = function () {
var node = rootNode.firstChild,
rootBlockNode = null
var trim = function (rootBlock) {
if (rootBlock) {
node = rootBlock.firstChild
if (node && node.type === 3) {
node.value = node.value.replace(startWhiteSpaceRegExp, '')
}
node = rootBlock.lastChild
if (node && node.type === 3) {
node.value = node.value.replace(endWhiteSpaceRegExp, '')
}
}
}
if (!schema.isValidChild(rootNode.name, rootBlockName.toLowerCase())) {
return
}
while (node) {
var next = node.next
if (
node.type === 3 ||
(node.type === 1 &&
node.name !== 'p' &&
!blockElements[node.name] &&
!node.attr('data-mce-type'))
) {
if (!rootBlockNode) {
rootBlockNode = createNode(rootBlockName, 1)
rootBlockNode.attr(settings.forced_root_block_attrs)
rootNode.insert(rootBlockNode, node)
rootBlockNode.append(node)
} else {
rootBlockNode.append(node)
}
} else {
trim(rootBlockNode)
rootBlockNode = null
}
node = next
}
trim(rootBlockNode)
}
var createNode = function (name, type) {
var node = new AstNode(name, type)
var list
if (name in nodeFilters) {
list = matchedNodes[name]
if (list) {
list.push(node)
} else {
matchedNodes[name] = [node]
}
}
return node
}
var removeWhitespaceBefore = function (node) {
var blockElements = schema.getBlockElements()
for (var textNode = node.prev; textNode && textNode.type === 3; ) {
var textVal = textNode.value.replace(endWhiteSpaceRegExp, '')
if (textVal.length > 0) {
textNode.value = textVal
return
}
var textNodeNext = textNode.next
if (textNodeNext) {
if (textNodeNext.type === 3 && textNodeNext.value.length) {
textNode = textNode.prev
continue
}
if (
!blockElements[textNodeNext.name] &&
textNodeNext.name !== 'script' &&
textNodeNext.name !== 'style'
) {
textNode = textNode.prev
continue
}
}
var sibling = textNode.prev
textNode.remove()
textNode = sibling
}
}
var cloneAndExcludeBlocks = function (input) {
var output = {}
for (var name_2 in input) {
if (name_2 !== 'li' && name_2 !== 'p') {
output[name_2] = input[name_2]
}
}
return output
}
var parser = SaxParser(
{
validate: validate,
document: settings.document,
allow_html_data_urls: settings.allow_html_data_urls,
allow_svg_data_urls: settings.allow_svg_data_urls,
allow_script_urls: settings.allow_script_urls,
allow_conditional_comments: settings.allow_conditional_comments,
preserve_cdata: settings.preserve_cdata,
self_closing_elements: cloneAndExcludeBlocks(
schema.getSelfClosingElements()
),
cdata: function (text) {
node.append(createNode('#cdata', 4)).value = text
},
text: function (text, raw) {
var textNode
if (!isInWhiteSpacePreservedElement) {
text = text.replace(allWhiteSpaceRegExp, ' ')
if (isLineBreakNode(node.lastChild, blockElements)) {
text = text.replace(startWhiteSpaceRegExp, '')
}
}
if (text.length !== 0) {
textNode = createNode('#text', 3)
textNode.raw = !!raw
node.append(textNode).value = text
}
},
comment: function (text) {
node.append(createNode('#comment', 8)).value = text
},
pi: function (name, text) {
node.append(createNode(name, 7)).value = text
removeWhitespaceBefore(node)
},
doctype: function (text) {
var newNode = node.append(createNode('#doctype', 10))
newNode.value = text
removeWhitespaceBefore(node)
},
start: function (name, attrs, empty) {
var elementRule = validate ? schema.getElementRule(name) : {}
if (elementRule) {
var newNode = createNode(elementRule.outputName || name, 1)
newNode.attributes = attrs
newNode.shortEnded = empty
node.append(newNode)
var parent_2 = children[node.name]
if (
parent_2 &&
children[newNode.name] &&
!parent_2[newNode.name]
) {
invalidChildren.push(newNode)
}
var attrFiltersLen = attributeFilters.length
while (attrFiltersLen--) {
var attrName = attributeFilters[attrFiltersLen].name
if (attrName in attrs.map) {
list = matchedAttributes[attrName]
if (list) {
list.push(newNode)
} else {
matchedAttributes[attrName] = [newNode]
}
}
}
if (blockElements[name]) {
removeWhitespaceBefore(newNode)
}
if (!empty) {
node = newNode
}
if (!isInWhiteSpacePreservedElement && whiteSpaceElements[name]) {
isInWhiteSpacePreservedElement = true
}
}
},
end: function (name) {
var textNode, text, sibling, tempNode
var elementRule = validate ? schema.getElementRule(name) : {}
if (elementRule) {
if (blockElements[name]) {
if (!isInWhiteSpacePreservedElement) {
textNode = node.firstChild
if (textNode && textNode.type === 3) {
text = textNode.value.replace(startWhiteSpaceRegExp, '')
if (text.length > 0) {
textNode.value = text
textNode = textNode.next
} else {
sibling = textNode.next
textNode.remove()
textNode = sibling
while (textNode && textNode.type === 3) {
text = textNode.value
sibling = textNode.next
if (
text.length === 0 ||
isAllWhiteSpaceRegExp.test(text)
) {
textNode.remove()
textNode = sibling
}
textNode = sibling
}
}
}
textNode = node.lastChild
if (textNode && textNode.type === 3) {
text = textNode.value.replace(endWhiteSpaceRegExp, '')
if (text.length > 0) {
textNode.value = text
textNode = textNode.prev
} else {
sibling = textNode.prev
textNode.remove()
textNode = sibling
while (textNode && textNode.type === 3) {
text = textNode.value
sibling = textNode.prev
if (
text.length === 0 ||
isAllWhiteSpaceRegExp.test(text)
) {
textNode.remove()
textNode = sibling
}
textNode = sibling
}
}
}
}
}
if (isInWhiteSpacePreservedElement && whiteSpaceElements[name]) {
isInWhiteSpacePreservedElement = false
}
if (
elementRule.removeEmpty &&
isEmpty(schema, nonEmptyElements, whiteSpaceElements, node)
) {
tempNode = node.parent
if (blockElements[node.name]) {
node.empty().remove()
} else {
node.unwrap()
}
node = tempNode
return
}
if (
elementRule.paddEmpty &&
(isPaddedWithNbsp(node) ||
isEmpty(schema, nonEmptyElements, whiteSpaceElements, node))
) {
paddEmptyNode(settings, args, blockElements, node)
}
node = node.parent
}
},
},
schema
)
var rootNode = (node = new AstNode(
args.context || settings.root_name,
11
))
parser.parse(html, args.format)
if (validate && invalidChildren.length) {
if (!args.context) {
fixInvalidChildren(invalidChildren)
} else {
args.invalid = true
}
}
if (rootBlockName && (rootNode.name === 'body' || args.isRootContent)) {
addRootBlocks()
}
if (!args.invalid) {
for (name in matchedNodes) {
if (!has$2(matchedNodes, name)) {
continue
}
list = nodeFilters[name]
nodes = matchedNodes[name]
fi = nodes.length
while (fi--) {
if (!nodes[fi].parent) {
nodes.splice(fi, 1)
}
}
for (i = 0, l = list.length; i < l; i++) {
list[i](nodes, name, args)
}
}
for (i = 0, l = attributeFilters.length; i < l; i++) {
list = attributeFilters[i]
if (list.name in matchedAttributes) {
nodes = matchedAttributes[list.name]
fi = nodes.length
while (fi--) {
if (!nodes[fi].parent) {
nodes.splice(fi, 1)
}
}
for (fi = 0, fl = list.callbacks.length; fi < fl; fi++) {
list.callbacks[fi](nodes, list.name, args)
}
}
}
}
return rootNode
}
var exports = {
schema: schema,
addAttributeFilter: addAttributeFilter,
getAttributeFilters: getAttributeFilters,
addNodeFilter: addNodeFilter,
getNodeFilters: getNodeFilters,
filterNode: filterNode,
parse: parse,
}
register$1(exports, settings)
register$2(exports, settings)
return exports
}
var register = function (htmlParser, settings, dom) {
htmlParser.addAttributeFilter('data-mce-tabindex', function (nodes, name) {
var i = nodes.length
while (i--) {
var node = nodes[i]
node.attr('tabindex', node.attr('data-mce-tabindex'))
node.attr(name, null)
}
})
htmlParser.addAttributeFilter('src,href,style', function (nodes, name) {
var internalName = 'data-mce-' + name
var urlConverter = settings.url_converter
var urlConverterScope = settings.url_converter_scope
var i = nodes.length
while (i--) {
var node = nodes[i]
var value = node.attr(internalName)
if (value !== undefined) {
node.attr(name, value.length > 0 ? value : null)
node.attr(internalName, null)
} else {
value = node.attr(name)
if (name === 'style') {
value = dom.serializeStyle(dom.parseStyle(value), node.name)
} else if (urlConverter) {
value = urlConverter.call(urlConverterScope, value, name, node.name)
}
node.attr(name, value.length > 0 ? value : null)
}
}
})
htmlParser.addAttributeFilter('class', function (nodes) {
var i = nodes.length
while (i--) {
var node = nodes[i]
var value = node.attr('class')
if (value) {
value = node.attr('class').replace(/(?:^|\s)mce-item-\w+(?!\S)/g, '')
node.attr('class', value.length > 0 ? value : null)
}
}
})
htmlParser.addAttributeFilter(
'data-mce-type',
function (nodes, name, args) {
var i = nodes.length
while (i--) {
var node = nodes[i]
if (node.attr('data-mce-type') === 'bookmark' && !args.cleanup) {
var hasChildren = Optional.from(node.firstChild).exists(function (
firstChild
) {
return !isZwsp(firstChild.value)
})
if (hasChildren) {
node.unwrap()
} else {
node.remove()
}
}
}
}
)
htmlParser.addNodeFilter('noscript', function (nodes) {
var i = nodes.length
while (i--) {
var node = nodes[i].firstChild
if (node) {
node.value = Entities.decode(node.value)
}
}
})
htmlParser.addNodeFilter('script,style', function (nodes, name) {
var trim = function (value) {
return value
.replace(/()/g, '\n')
.replace(/^[\r\n]*|[\r\n]*$/g, '')
.replace(
/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,
''
)
}
var i = nodes.length
while (i--) {
var node = nodes[i]
var value = node.firstChild ? node.firstChild.value : ''
if (name === 'script') {
var type = node.attr('type')
if (type) {
node.attr(
'type',
type === 'mce-no/type' ? null : type.replace(/^mce\-/, '')
)
}
if (settings.element_format === 'xhtml' && value.length > 0) {
node.firstChild.value = '// '
}
} else {
if (settings.element_format === 'xhtml' && value.length > 0) {
node.firstChild.value = ''
}
}
}
})
htmlParser.addNodeFilter('#comment', function (nodes) {
var i = nodes.length
while (i--) {
var node = nodes[i]
if (settings.preserve_cdata && node.value.indexOf('[CDATA[') === 0) {
node.name = '#cdata'
node.type = 4
node.value = dom.decode(node.value.replace(/^\[CDATA\[|\]\]$/g, ''))
} else if (node.value.indexOf('mce:protected ') === 0) {
node.name = '#text'
node.type = 3
node.raw = true
node.value = unescape(node.value).substr(14)
}
}
})
htmlParser.addNodeFilter('xml:namespace,input', function (nodes, name) {
var i = nodes.length
while (i--) {
var node = nodes[i]
if (node.type === 7) {
node.remove()
} else if (node.type === 1) {
if (name === 'input' && !node.attr('type')) {
node.attr('type', 'text')
}
}
}
})
htmlParser.addAttributeFilter('data-mce-type', function (nodes) {
each$k(nodes, function (node) {
if (node.attr('data-mce-type') === 'format-caret') {
if (node.isEmpty(htmlParser.schema.getNonEmptyElements())) {
node.remove()
} else {
node.unwrap()
}
}
})
})
htmlParser.addAttributeFilter(
'data-mce-src,data-mce-href,data-mce-style,' +
'data-mce-selected,data-mce-expando,' +
'data-mce-type,data-mce-resize,data-mce-placeholder',
function (nodes, name) {
var i = nodes.length
while (i--) {
nodes[i].attr(name, null)
}
}
)
}
var trimTrailingBr = function (rootNode) {
var isBr = function (node) {
return node && node.name === 'br'
}
var brNode1 = rootNode.lastChild
if (isBr(brNode1)) {
var brNode2 = brNode1.prev
if (isBr(brNode2)) {
brNode1.remove()
brNode2.remove()
}
}
}
var preProcess = function (editor, node, args) {
var oldDoc
var dom = editor.dom
var clonedNode = node.cloneNode(true)
var impl = document.implementation
if (impl.createHTMLDocument) {
var doc_1 = impl.createHTMLDocument('')
Tools.each(
clonedNode.nodeName === 'BODY' ? clonedNode.childNodes : [clonedNode],
function (node) {
doc_1.body.appendChild(doc_1.importNode(node, true))
}
)
if (clonedNode.nodeName !== 'BODY') {
clonedNode = doc_1.body.firstChild
} else {
clonedNode = doc_1.body
}
oldDoc = dom.doc
dom.doc = doc_1
}
firePreProcess(editor, __assign(__assign({}, args), { node: clonedNode }))
if (oldDoc) {
dom.doc = oldDoc
}
return clonedNode
}
var shouldFireEvent = function (editor, args) {
return editor && editor.hasEventListeners('PreProcess') && !args.no_events
}
var process = function (editor, node, args) {
return shouldFireEvent(editor, args) ? preProcess(editor, node, args) : node
}
var addTempAttr = function (htmlParser, tempAttrs, name) {
if (Tools.inArray(tempAttrs, name) === -1) {
htmlParser.addAttributeFilter(name, function (nodes, name) {
var i = nodes.length
while (i--) {
nodes[i].attr(name, null)
}
})
tempAttrs.push(name)
}
}
var postProcess = function (editor, args, content) {
if (!args.no_events && editor) {
var outArgs = firePostProcess(
editor,
__assign(__assign({}, args), { content: content })
)
return outArgs.content
} else {
return content
}
}
var getHtmlFromNode = function (dom, node, args) {
var html = trim$2(args.getInner ? node.innerHTML : dom.getOuterHTML(node))
return args.selection || isWsPreserveElement(SugarElement.fromDom(node))
? html
: Tools.trim(html)
}
var parseHtml = function (htmlParser, html, args) {
var parserArgs = args.selection
? __assign({ forced_root_block: false }, args)
: args
var rootNode = htmlParser.parse(html, parserArgs)
trimTrailingBr(rootNode)
return rootNode
}
var serializeNode = function (settings, schema, node) {
var htmlSerializer = HtmlSerializer(settings, schema)
return htmlSerializer.serialize(node)
}
var toHtml = function (editor, settings, schema, rootNode, args) {
var content = serializeNode(settings, schema, rootNode)
return postProcess(editor, args, content)
}
var DomSerializerImpl = function (settings, editor) {
var tempAttrs = ['data-mce-selected']
var dom = editor && editor.dom ? editor.dom : DOMUtils.DOM
var schema = editor && editor.schema ? editor.schema : Schema(settings)
settings.entity_encoding = settings.entity_encoding || 'named'
settings.remove_trailing_brs =
'remove_trailing_brs' in settings ? settings.remove_trailing_brs : true
var htmlParser = DomParser(settings, schema)
register(htmlParser, settings, dom)
var serialize = function (node, parserArgs) {
if (parserArgs === void 0) {
parserArgs = {}
}
var args = __assign({ format: 'html' }, parserArgs)
var targetNode = process(editor, node, args)
var html = getHtmlFromNode(dom, targetNode, args)
var rootNode = parseHtml(htmlParser, html, args)
return args.format === 'tree'
? rootNode
: toHtml(editor, settings, schema, rootNode, args)
}
return {
schema: schema,
addNodeFilter: htmlParser.addNodeFilter,
addAttributeFilter: htmlParser.addAttributeFilter,
serialize: serialize,
addRules: schema.addValidElements,
setRules: schema.setValidElements,
addTempAttr: curry(addTempAttr, htmlParser, tempAttrs),
getTempAttrs: constant(tempAttrs),
getNodeFilters: htmlParser.getNodeFilters,
getAttributeFilters: htmlParser.getAttributeFilters,
}
}
var DomSerializer = function (settings, editor) {
var domSerializer = DomSerializerImpl(settings, editor)
return {
schema: domSerializer.schema,
addNodeFilter: domSerializer.addNodeFilter,
addAttributeFilter: domSerializer.addAttributeFilter,
serialize: domSerializer.serialize,
addRules: domSerializer.addRules,
setRules: domSerializer.setRules,
addTempAttr: domSerializer.addTempAttr,
getTempAttrs: domSerializer.getTempAttrs,
getNodeFilters: domSerializer.getNodeFilters,
getAttributeFilters: domSerializer.getAttributeFilters,
}
}
var defaultFormat = 'html'
var getContent = function (editor, args) {
if (args === void 0) {
args = {}
}
var format = args.format ? args.format : defaultFormat
return getContent$2(editor, args, format)
}
var setContent = function (editor, content, args) {
if (args === void 0) {
args = {}
}
return setContent$2(editor, content, args)
}
var DOM$7 = DOMUtils.DOM
var restoreOriginalStyles = function (editor) {
DOM$7.setStyle(editor.id, 'display', editor.orgDisplay)
}
var safeDestroy = function (x) {
return Optional.from(x).each(function (x) {
return x.destroy()
})
}
var clearDomReferences = function (editor) {
editor.contentAreaContainer =
editor.formElement =
editor.container =
editor.editorContainer =
null
editor.bodyElement = editor.contentDocument = editor.contentWindow = null
editor.iframeElement = editor.targetElm = null
if (editor.selection) {
editor.selection =
editor.selection.win =
editor.selection.dom =
editor.selection.dom.doc =
null
}
}
var restoreForm = function (editor) {
var form = editor.formElement
if (form) {
if (form._mceOldSubmit) {
form.submit = form._mceOldSubmit
form._mceOldSubmit = null
}
DOM$7.unbind(form, 'submit reset', editor.formEventDelegate)
}
}
var remove = function (editor) {
if (!editor.removed) {
var _selectionOverrides = editor._selectionOverrides,
editorUpload = editor.editorUpload
var body = editor.getBody()
var element = editor.getElement()
if (body) {
editor.save({ is_removing: true })
}
editor.removed = true
editor.unbindAllNativeEvents()
if (editor.hasHiddenInput && element) {
DOM$7.remove(element.nextSibling)
}
fireRemove(editor)
editor.editorManager.remove(editor)
if (!editor.inline && body) {
restoreOriginalStyles(editor)
}
fireDetach(editor)
DOM$7.remove(editor.getContainer())
safeDestroy(_selectionOverrides)
safeDestroy(editorUpload)
editor.destroy()
}
}
var destroy = function (editor, automatic) {
var selection = editor.selection,
dom = editor.dom
if (editor.destroyed) {
return
}
if (!automatic && !editor.removed) {
editor.remove()
return
}
if (!automatic) {
editor.editorManager.off('beforeunload', editor._beforeUnload)
if (editor.theme && editor.theme.destroy) {
editor.theme.destroy()
}
safeDestroy(selection)
safeDestroy(dom)
}
restoreForm(editor)
clearDomReferences(editor)
editor.destroyed = true
}
var deep = function (old, nu) {
var bothObjects = isObject(old) && isObject(nu)
return bothObjects ? deepMerge(old, nu) : nu
}
var baseMerge = function (merger) {
return function () {
var objects = []
for (var _i = 0; _i < arguments.length; _i++) {
objects[_i] = arguments[_i]
}
if (objects.length === 0) {
throw new Error("Can't merge zero objects")
}
var ret = {}
for (var j = 0; j < objects.length; j++) {
var curObject = objects[j]
for (var key in curObject) {
if (has$2(curObject, key)) {
ret[key] = merger(ret[key], curObject[key])
}
}
}
return ret
}
}
var deepMerge = baseMerge(deep)
var deprecatedSettings = (
'autoresize_on_init,content_editable_state,convert_fonts_to_spans,inline_styles,padd_empty_with_br,block_elements,' +
'boolean_attributes,editor_deselector,editor_selector,elements,file_browser_callback_types,filepicker_validator_handler,' +
'force_hex_style_colors,force_p_newlines,gecko_spellcheck,images_dataimg_filter,media_scripts,mode,move_caret_before_on_enter_elements,' +
'non_empty_elements,self_closing_elements,short_ended_elements,special,spellchecker_select_languages,spellchecker_whitelist,' +
'tab_focus,table_responsive_width,text_block_elements,text_inline_elements,toolbar_drawer,types,validate,whitespace_elements,' +
'paste_word_valid_elements,paste_retain_style_properties,paste_convert_word_fake_lists'
).split(',')
var deprecatedPlugins =
'bbcode,colorpicker,contextmenu,fullpage,legacyoutput,spellchecker,textcolor'.split(
','
)
var movedToPremiumPlugins = 'imagetools,toc'.split(',')
var getDeprecatedSettings = function (settings) {
var settingNames = filter$4(deprecatedSettings, function (setting) {
return has$2(settings, setting)
})
var forcedRootBlock = settings.forced_root_block
if (forcedRootBlock === false || forcedRootBlock === '') {
settingNames.push('forced_root_block (false only)')
}
return sort(settingNames)
}
var getDeprecatedPlugins = function (settings) {
var plugins = Tools.makeMap(settings.plugins, ' ')
var hasPlugin = function (plugin) {
return has$2(plugins, plugin)
}
var pluginNames = __spreadArray(
__spreadArray([], filter$4(deprecatedPlugins, hasPlugin), true),
bind(movedToPremiumPlugins, function (plugin) {
return hasPlugin(plugin) ? [plugin + ' (moving to premium)'] : []
}),
true
)
return sort(pluginNames)
}
var logDeprecationsWarning = function (rawSettings, finalSettings) {
var deprecatedSettings = getDeprecatedSettings(rawSettings)
var deprecatedPlugins = getDeprecatedPlugins(finalSettings)
var hasDeprecatedPlugins = deprecatedPlugins.length > 0
var hasDeprecatedSettings = deprecatedSettings.length > 0
var isLegacyMobileTheme = finalSettings.theme === 'mobile'
if (hasDeprecatedPlugins || hasDeprecatedSettings || isLegacyMobileTheme) {
var listJoiner = '\n- '
var themesMessage = isLegacyMobileTheme
? '\n\nThemes:' + listJoiner + 'mobile'
: ''
var pluginsMessage = hasDeprecatedPlugins
? '\n\nPlugins:' + listJoiner + deprecatedPlugins.join(listJoiner)
: ''
var settingsMessage = hasDeprecatedSettings
? '\n\nSettings:' + listJoiner + deprecatedSettings.join(listJoiner)
: ''
console.warn(
'The following deprecated features are currently enabled, these will be removed in TinyMCE 6.0. ' +
'See https://www.tiny.cloud/docs/release-notes/6.0-upcoming-changes/ for more information.' +
themesMessage +
pluginsMessage +
settingsMessage
)
}
}
var sectionResult = function (sections, settings) {
return {
sections: constant(sections),
settings: constant(settings),
}
}
var deviceDetection = detect().deviceType
var isTouch = deviceDetection.isTouch()
var isPhone = deviceDetection.isPhone()
var isTablet = deviceDetection.isTablet()
var legacyMobilePlugins = ['lists', 'autolink', 'autosave']
var defaultTouchSettings = {
table_grid: false,
object_resizing: false,
resize: false,
}
var normalizePlugins = function (plugins) {
var pluginNames = isArray$1(plugins) ? plugins.join(' ') : plugins
var trimmedPlugins = map$3(
isString$1(pluginNames) ? pluginNames.split(' ') : [],
trim$4
)
return filter$4(trimmedPlugins, function (item) {
return item.length > 0
})
}
var filterLegacyMobilePlugins = function (plugins) {
return filter$4(plugins, curry(contains$3, legacyMobilePlugins))
}
var extractSections = function (keys, settings) {
var result = bifilter(settings, function (value, key) {
return contains$3(keys, key)
})
return sectionResult(result.t, result.f)
}
var getSection = function (sectionResult, name, defaults) {
if (defaults === void 0) {
defaults = {}
}
var sections = sectionResult.sections()
var sectionSettings = get$9(sections, name).getOr({})
return Tools.extend({}, defaults, sectionSettings)
}
var hasSection = function (sectionResult, name) {
return has$2(sectionResult.sections(), name)
}
var isSectionTheme = function (sectionResult, name, theme) {
var section = sectionResult.sections()
return hasSection(sectionResult, name) && section[name].theme === theme
}
var getSectionConfig = function (sectionResult, name) {
return hasSection(sectionResult, name) ? sectionResult.sections()[name] : {}
}
var getToolbarMode = function (settings, defaultVal) {
return get$9(settings, 'toolbar_mode')
.orThunk(function () {
return get$9(settings, 'toolbar_drawer').map(function (val) {
return val === false ? 'wrap' : val
})
})
.getOr(defaultVal)
}
var getDefaultSettings = function (
settings,
id,
documentBaseUrl,
isTouch,
editor
) {
var baseDefaults = {
id: id,
theme: 'silver',
toolbar_mode: getToolbarMode(settings, 'floating'),
plugins: '',
document_base_url: documentBaseUrl,
add_form_submit_trigger: true,
submit_patch: true,
add_unload_trigger: true,
convert_urls: true,
relative_urls: true,
remove_script_host: true,
object_resizing: true,
doctype: '',
visual: true,
font_size_legacy_values:
'xx-small,small,medium,large,x-large,xx-large,300%',
forced_root_block: 'p',
hidden_input: true,
inline_styles: true,
convert_fonts_to_spans: true,
indent: true,
indent_before:
'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' +
'tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist',
indent_after:
'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,' +
'tfoot,tbody,tr,section,summary,article,hgroup,aside,figure,figcaption,option,optgroup,datalist',
entity_encoding: 'named',
url_converter: editor.convertURL,
url_converter_scope: editor,
}
return __assign(
__assign({}, baseDefaults),
isTouch ? defaultTouchSettings : {}
)
}
var getDefaultMobileSettings = function (mobileSettings, isPhone) {
var defaultMobileSettings = {
resize: false,
toolbar_mode: getToolbarMode(mobileSettings, 'scrolling'),
toolbar_sticky: false,
}
var defaultPhoneSettings = { menubar: false }
return __assign(
__assign(__assign({}, defaultTouchSettings), defaultMobileSettings),
isPhone ? defaultPhoneSettings : {}
)
}
var getExternalPlugins = function (overrideSettings, settings) {
var userDefinedExternalPlugins = settings.external_plugins
? settings.external_plugins
: {}
if (overrideSettings && overrideSettings.external_plugins) {
return Tools.extend(
{},
overrideSettings.external_plugins,
userDefinedExternalPlugins
)
} else {
return userDefinedExternalPlugins
}
}
var combinePlugins = function (forcedPlugins, plugins) {
return []
.concat(normalizePlugins(forcedPlugins))
.concat(normalizePlugins(plugins))
}
var getPlatformPlugins = function (
isMobileDevice,
sectionResult,
desktopPlugins,
mobilePlugins
) {
if (isMobileDevice && isSectionTheme(sectionResult, 'mobile', 'mobile')) {
return filterLegacyMobilePlugins(mobilePlugins)
} else if (isMobileDevice && hasSection(sectionResult, 'mobile')) {
return mobilePlugins
} else {
return desktopPlugins
}
}
var processPlugins = function (
isMobileDevice,
sectionResult,
defaultOverrideSettings,
settings
) {
var forcedPlugins = normalizePlugins(defaultOverrideSettings.forced_plugins)
var desktopPlugins = normalizePlugins(settings.plugins)
var mobileConfig = getSectionConfig(sectionResult, 'mobile')
var mobilePlugins = mobileConfig.plugins
? normalizePlugins(mobileConfig.plugins)
: desktopPlugins
var platformPlugins = getPlatformPlugins(
isMobileDevice,
sectionResult,
desktopPlugins,
mobilePlugins
)
var combinedPlugins = combinePlugins(forcedPlugins, platformPlugins)
if (Env.browser.isIE() && contains$3(combinedPlugins, 'rtc')) {
throw new Error('RTC plugin is not supported on IE 11.')
}
return Tools.extend(settings, { plugins: combinedPlugins.join(' ') })
}
var isOnMobile = function (isMobileDevice, sectionResult) {
return isMobileDevice && hasSection(sectionResult, 'mobile')
}
var combineSettings = function (
isMobileDevice,
isPhone,
defaultSettings,
defaultOverrideSettings,
settings
) {
var defaultDeviceSettings = isMobileDevice
? { mobile: getDefaultMobileSettings(settings.mobile || {}, isPhone) }
: {}
var sectionResult = extractSections(
['mobile'],
deepMerge(defaultDeviceSettings, settings)
)
var extendedSettings = Tools.extend(
defaultSettings,
defaultOverrideSettings,
sectionResult.settings(),
isOnMobile(isMobileDevice, sectionResult)
? getSection(sectionResult, 'mobile')
: {},
{
validate: true,
external_plugins: getExternalPlugins(
defaultOverrideSettings,
sectionResult.settings()
),
}
)
return processPlugins(
isMobileDevice,
sectionResult,
defaultOverrideSettings,
extendedSettings
)
}
var getEditorSettings = function (
editor,
id,
documentBaseUrl,
defaultOverrideSettings,
settings
) {
var defaultSettings = getDefaultSettings(
settings,
id,
documentBaseUrl,
isTouch,
editor
)
var finalSettings = combineSettings(
isPhone || isTablet,
isPhone,
defaultSettings,
defaultOverrideSettings,
settings
)
if (finalSettings.deprecation_warnings !== false) {
logDeprecationsWarning(settings, finalSettings)
}
return finalSettings
}
var getFiltered = function (predicate, editor, name) {
return Optional.from(editor.settings[name]).filter(predicate)
}
var getParamObject = function (value) {
var output = {}
if (typeof value === 'string') {
each$k(
value.indexOf('=') > 0
? value.split(/[;,](?![^=;,]*(?:[;,]|$))/)
: value.split(','),
function (val) {
var arr = val.split('=')
if (arr.length > 1) {
output[Tools.trim(arr[0])] = Tools.trim(arr[1])
} else {
output[Tools.trim(arr[0])] = Tools.trim(arr[0])
}
}
)
} else {
output = value
}
return output
}
var isArrayOf = function (p) {
return function (a) {
return isArray$1(a) && forall(a, p)
}
}
var getParam = function (editor, name, defaultVal, type) {
var value = name in editor.settings ? editor.settings[name] : defaultVal
if (type === 'hash') {
return getParamObject(value)
} else if (type === 'string') {
return getFiltered(isString$1, editor, name).getOr(defaultVal)
} else if (type === 'number') {
return getFiltered(isNumber, editor, name).getOr(defaultVal)
} else if (type === 'boolean') {
return getFiltered(isBoolean, editor, name).getOr(defaultVal)
} else if (type === 'object') {
return getFiltered(isObject, editor, name).getOr(defaultVal)
} else if (type === 'array') {
return getFiltered(isArray$1, editor, name).getOr(defaultVal)
} else if (type === 'string[]') {
return getFiltered(isArrayOf(isString$1), editor, name).getOr(defaultVal)
} else if (type === 'function') {
return getFiltered(isFunction, editor, name).getOr(defaultVal)
} else {
return value
}
}
var CreateIconManager = function () {
var lookup = {}
var add = function (id, iconPack) {
lookup[id] = iconPack
}
var get = function (id) {
if (lookup[id]) {
return lookup[id]
}
return { icons: {} }
}
var has = function (id) {
return has$2(lookup, id)
}
return {
add: add,
get: get,
has: has,
}
}
var IconManager = CreateIconManager()
var getProp = function (propName, elm) {
var rawElm = elm.dom
return rawElm[propName]
}
var getComputedSizeProp = function (propName, elm) {
return parseInt(get$5(elm, propName), 10)
}
var getClientWidth = curry(getProp, 'clientWidth')
var getClientHeight = curry(getProp, 'clientHeight')
var getMarginTop = curry(getComputedSizeProp, 'margin-top')
var getMarginLeft = curry(getComputedSizeProp, 'margin-left')
var getBoundingClientRect = function (elm) {
return elm.dom.getBoundingClientRect()
}
var isInsideElementContentArea = function (bodyElm, clientX, clientY) {
var clientWidth = getClientWidth(bodyElm)
var clientHeight = getClientHeight(bodyElm)
return (
clientX >= 0 &&
clientY >= 0 &&
clientX <= clientWidth &&
clientY <= clientHeight
)
}
var transpose = function (inline, elm, clientX, clientY) {
var clientRect = getBoundingClientRect(elm)
var deltaX = inline
? clientRect.left + elm.dom.clientLeft + getMarginLeft(elm)
: 0
var deltaY = inline
? clientRect.top + elm.dom.clientTop + getMarginTop(elm)
: 0
var x = clientX - deltaX
var y = clientY - deltaY
return {
x: x,
y: y,
}
}
var isXYInContentArea = function (editor, clientX, clientY) {
var bodyElm = SugarElement.fromDom(editor.getBody())
var targetElm = editor.inline ? bodyElm : documentElement(bodyElm)
var transposedPoint = transpose(editor.inline, targetElm, clientX, clientY)
return isInsideElementContentArea(
targetElm,
transposedPoint.x,
transposedPoint.y
)
}
var fromDomSafe = function (node) {
return Optional.from(node).map(SugarElement.fromDom)
}
var isEditorAttachedToDom = function (editor) {
var rawContainer = editor.inline
? editor.getBody()
: editor.getContentAreaContainer()
return fromDomSafe(rawContainer).map(inBody).getOr(false)
}
var NotificationManagerImpl = function () {
var unimplemented = function () {
throw new Error(
'Theme did not provide a NotificationManager implementation.'
)
}
return {
open: unimplemented,
close: unimplemented,
reposition: unimplemented,
getArgs: unimplemented,
}
}
var NotificationManager = function (editor) {
var notifications = []
var getImplementation = function () {
var theme = editor.theme
return theme && theme.getNotificationManagerImpl
? theme.getNotificationManagerImpl()
: NotificationManagerImpl()
}
var getTopNotification = function () {
return Optional.from(notifications[0])
}
var isEqual = function (a, b) {
return (
a.type === b.type &&
a.text === b.text &&
!a.progressBar &&
!a.timeout &&
!b.progressBar &&
!b.timeout
)
}
var reposition = function () {
if (notifications.length > 0) {
getImplementation().reposition(notifications)
}
}
var addNotification = function (notification) {
notifications.push(notification)
}
var closeNotification = function (notification) {
findIndex$2(notifications, function (otherNotification) {
return otherNotification === notification
}).each(function (index) {
notifications.splice(index, 1)
})
}
var open = function (spec, fireEvent) {
if (fireEvent === void 0) {
fireEvent = true
}
if (editor.removed || !isEditorAttachedToDom(editor)) {
return
}
if (fireEvent) {
editor.fire('BeforeOpenNotification', { notification: spec })
}
return find$3(notifications, function (notification) {
return isEqual(getImplementation().getArgs(notification), spec)
}).getOrThunk(function () {
editor.editorManager.setActive(editor)
var notification = getImplementation().open(spec, function () {
closeNotification(notification)
reposition()
getTopNotification().fold(
function () {
return editor.focus()
},
function (top) {
return focus$1(SugarElement.fromDom(top.getEl()))
}
)
})
addNotification(notification)
reposition()
editor.fire('OpenNotification', {
notification: __assign({}, notification),
})
return notification
})
}
var close = function () {
getTopNotification().each(function (notification) {
getImplementation().close(notification)
closeNotification(notification)
reposition()
})
}
var getNotifications = constant(notifications)
var registerEvents = function (editor) {
editor.on('SkinLoaded', function () {
var serviceMessage = getServiceMessage(editor)
if (serviceMessage) {
open(
{
text: serviceMessage,
type: 'warning',
timeout: 0,
},
false
)
}
reposition()
})
editor.on('show ResizeEditor ResizeWindow NodeChange', function () {
Delay.requestAnimationFrame(reposition)
})
editor.on('remove', function () {
each$k(notifications.slice(), function (notification) {
getImplementation().close(notification)
})
})
}
registerEvents(editor)
return {
open: open,
close: close,
getNotifications: getNotifications,
}
}
var PluginManager = AddOnManager.PluginManager
var ThemeManager = AddOnManager.ThemeManager
function WindowManagerImpl() {
var unimplemented = function () {
throw new Error('Theme did not provide a WindowManager implementation.')
}
return {
open: unimplemented,
openUrl: unimplemented,
alert: unimplemented,
confirm: unimplemented,
close: unimplemented,
getParams: unimplemented,
setParams: unimplemented,
}
}
var WindowManager = function (editor) {
var dialogs = []
var getImplementation = function () {
var theme = editor.theme
return theme && theme.getWindowManagerImpl
? theme.getWindowManagerImpl()
: WindowManagerImpl()
}
var funcBind = function (scope, f) {
return function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
return f ? f.apply(scope, args) : undefined
}
}
var fireOpenEvent = function (dialog) {
editor.fire('OpenWindow', { dialog: dialog })
}
var fireCloseEvent = function (dialog) {
editor.fire('CloseWindow', { dialog: dialog })
}
var addDialog = function (dialog) {
dialogs.push(dialog)
fireOpenEvent(dialog)
}
var closeDialog = function (dialog) {
fireCloseEvent(dialog)
dialogs = filter$4(dialogs, function (otherDialog) {
return otherDialog !== dialog
})
if (dialogs.length === 0) {
editor.focus()
}
}
var getTopDialog = function () {
return Optional.from(dialogs[dialogs.length - 1])
}
var storeSelectionAndOpenDialog = function (openDialog) {
editor.editorManager.setActive(editor)
store(editor)
var dialog = openDialog()
addDialog(dialog)
return dialog
}
var open = function (args, params) {
return storeSelectionAndOpenDialog(function () {
return getImplementation().open(args, params, closeDialog)
})
}
var openUrl = function (args) {
return storeSelectionAndOpenDialog(function () {
return getImplementation().openUrl(args, closeDialog)
})
}
var alert = function (message, callback, scope) {
var windowManagerImpl = getImplementation()
windowManagerImpl.alert(
message,
funcBind(scope ? scope : windowManagerImpl, callback)
)
}
var confirm = function (message, callback, scope) {
var windowManagerImpl = getImplementation()
windowManagerImpl.confirm(
message,
funcBind(scope ? scope : windowManagerImpl, callback)
)
}
var close = function () {
getTopDialog().each(function (dialog) {
getImplementation().close(dialog)
closeDialog(dialog)
})
}
editor.on('remove', function () {
each$k(dialogs, function (dialog) {
getImplementation().close(dialog)
})
})
return {
open: open,
openUrl: openUrl,
alert: alert,
confirm: confirm,
close: close,
}
}
var displayNotification = function (editor, message) {
editor.notificationManager.open({
type: 'error',
text: message,
})
}
var displayError = function (editor, message) {
if (editor._skinLoaded) {
displayNotification(editor, message)
} else {
editor.on('SkinLoaded', function () {
displayNotification(editor, message)
})
}
}
var uploadError = function (editor, message) {
displayError(
editor,
I18n.translate(['Failed to upload image: {0}', message])
)
}
var logError = function (editor, errorType, msg) {
fireError(editor, errorType, { message: msg })
console.error(msg)
}
var createLoadError = function (type, url, name) {
return name
? 'Failed to load ' + type + ': ' + name + ' from url ' + url
: 'Failed to load ' + type + ' url: ' + url
}
var pluginLoadError = function (editor, url, name) {
logError(editor, 'PluginLoadError', createLoadError('plugin', url, name))
}
var iconsLoadError = function (editor, url, name) {
logError(editor, 'IconsLoadError', createLoadError('icons', url, name))
}
var languageLoadError = function (editor, url, name) {
logError(
editor,
'LanguageLoadError',
createLoadError('language', url, name)
)
}
var pluginInitError = function (editor, name, err) {
var message = I18n.translate(['Failed to initialize plugin: {0}', name])
fireError(editor, 'PluginLoadError', { message: message })
initError(message, err)
displayError(editor, message)
}
var initError = function (message) {
var x = []
for (var _i = 1; _i < arguments.length; _i++) {
x[_i - 1] = arguments[_i]
}
var console = window.console
if (console) {
if (console.error) {
console.error.apply(console, __spreadArray([message], x, false))
} else {
console.log.apply(console, __spreadArray([message], x, false))
}
}
}
var isContentCssSkinName = function (url) {
return /^[a-z0-9\-]+$/i.test(url)
}
var getContentCssUrls = function (editor) {
return transformToUrls(editor, getContentCss(editor))
}
var getFontCssUrls = function (editor) {
return transformToUrls(editor, getFontCss(editor))
}
var transformToUrls = function (editor, cssLinks) {
var skinUrl = editor.editorManager.baseURL + '/skins/content'
var suffix = editor.editorManager.suffix
var contentCssFile = 'content' + suffix + '.css'
var inline = editor.inline === true
return map$3(cssLinks, function (url) {
if (isContentCssSkinName(url) && !inline) {
return skinUrl + '/' + url + '/' + contentCssFile
} else {
return editor.documentBaseURI.toAbsolute(url)
}
})
}
var appendContentCssFromSettings = function (editor) {
editor.contentCSS = editor.contentCSS.concat(
getContentCssUrls(editor),
getFontCssUrls(editor)
)
}
var UploadStatus = function () {
var PENDING = 1,
UPLOADED = 2
var blobUriStatuses = {}
var createStatus = function (status, resultUri) {
return {
status: status,
resultUri: resultUri,
}
}
var hasBlobUri = function (blobUri) {
return blobUri in blobUriStatuses
}
var getResultUri = function (blobUri) {
var result = blobUriStatuses[blobUri]
return result ? result.resultUri : null
}
var isPending = function (blobUri) {
return hasBlobUri(blobUri)
? blobUriStatuses[blobUri].status === PENDING
: false
}
var isUploaded = function (blobUri) {
return hasBlobUri(blobUri)
? blobUriStatuses[blobUri].status === UPLOADED
: false
}
var markPending = function (blobUri) {
blobUriStatuses[blobUri] = createStatus(PENDING, null)
}
var markUploaded = function (blobUri, resultUri) {
blobUriStatuses[blobUri] = createStatus(UPLOADED, resultUri)
}
var removeFailed = function (blobUri) {
delete blobUriStatuses[blobUri]
}
var destroy = function () {
blobUriStatuses = {}
}
return {
hasBlobUri: hasBlobUri,
getResultUri: getResultUri,
isPending: isPending,
isUploaded: isUploaded,
markPending: markPending,
markUploaded: markUploaded,
removeFailed: removeFailed,
destroy: destroy,
}
}
var count = 0
var seed = function () {
var rnd = function () {
return Math.round(Math.random() * 4294967295).toString(36)
}
var now = new Date().getTime()
return 's' + now.toString(36) + rnd() + rnd() + rnd()
}
var uuid = function (prefix) {
return prefix + count++ + seed()
}
var BlobCache = function () {
var cache = []
var mimeToExt = function (mime) {
var mimes = {
'image/jpeg': 'jpg',
'image/jpg': 'jpg',
'image/gif': 'gif',
'image/png': 'png',
'image/apng': 'apng',
'image/avif': 'avif',
'image/svg+xml': 'svg',
'image/webp': 'webp',
'image/bmp': 'bmp',
'image/tiff': 'tiff',
}
return mimes[mime.toLowerCase()] || 'dat'
}
var create = function (o, blob, base64, name, filename) {
if (isString$1(o)) {
var id = o
return toBlobInfo({
id: id,
name: name,
filename: filename,
blob: blob,
base64: base64,
})
} else if (isObject(o)) {
return toBlobInfo(o)
} else {
throw new Error('Unknown input type')
}
}
var toBlobInfo = function (o) {
if (!o.blob || !o.base64) {
throw new Error(
'blob and base64 representations of the image are required for BlobInfo to be created'
)
}
var id = o.id || uuid('blobid')
var name = o.name || id
var blob = o.blob
return {
id: constant(id),
name: constant(name),
filename: constant(o.filename || name + '.' + mimeToExt(blob.type)),
blob: constant(blob),
base64: constant(o.base64),
blobUri: constant(o.blobUri || URL.createObjectURL(blob)),
uri: constant(o.uri),
}
}
var add = function (blobInfo) {
if (!get(blobInfo.id())) {
cache.push(blobInfo)
}
}
var findFirst = function (predicate) {
return find$3(cache, predicate).getOrUndefined()
}
var get = function (id) {
return findFirst(function (cachedBlobInfo) {
return cachedBlobInfo.id() === id
})
}
var getByUri = function (blobUri) {
return findFirst(function (blobInfo) {
return blobInfo.blobUri() === blobUri
})
}
var getByData = function (base64, type) {
return findFirst(function (blobInfo) {
return blobInfo.base64() === base64 && blobInfo.blob().type === type
})
}
var removeByUri = function (blobUri) {
cache = filter$4(cache, function (blobInfo) {
if (blobInfo.blobUri() === blobUri) {
URL.revokeObjectURL(blobInfo.blobUri())
return false
}
return true
})
}
var destroy = function () {
each$k(cache, function (cachedBlobInfo) {
URL.revokeObjectURL(cachedBlobInfo.blobUri())
})
cache = []
}
return {
create: create,
add: add,
get: get,
getByUri: getByUri,
getByData: getByData,
findFirst: findFirst,
removeByUri: removeByUri,
destroy: destroy,
}
}
var Uploader = function (uploadStatus, settings) {
var pendingPromises = {}
var pathJoin = function (path1, path2) {
if (path1) {
return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, '')
}
return path2
}
var defaultHandler = function (blobInfo, success, failure, progress) {
var xhr = new XMLHttpRequest()
xhr.open('POST', settings.url)
xhr.withCredentials = settings.credentials
xhr.upload.onprogress = function (e) {
progress((e.loaded / e.total) * 100)
}
xhr.onerror = function () {
failure(
'Image upload failed due to a XHR Transport error. Code: ' +
xhr.status
)
}
xhr.onload = function () {
if (xhr.status < 200 || xhr.status >= 300) {
failure('HTTP Error: ' + xhr.status)
return
}
var json = JSON.parse(xhr.responseText)
if (!json || typeof json.location !== 'string') {
failure('Invalid JSON: ' + xhr.responseText)
return
}
success(pathJoin(settings.basePath, json.location))
}
var formData = new FormData()
formData.append('file', blobInfo.blob(), blobInfo.filename())
xhr.send(formData)
}
var noUpload = function () {
return new promiseObj(function (resolve) {
resolve([])
})
}
var handlerSuccess = function (blobInfo, url) {
return {
url: url,
blobInfo: blobInfo,
status: true,
}
}
var handlerFailure = function (blobInfo, message, options) {
return {
url: '',
blobInfo: blobInfo,
status: false,
error: {
message: message,
options: options,
},
}
}
var resolvePending = function (blobUri, result) {
Tools.each(pendingPromises[blobUri], function (resolve) {
resolve(result)
})
delete pendingPromises[blobUri]
}
var uploadBlobInfo = function (blobInfo, handler, openNotification) {
uploadStatus.markPending(blobInfo.blobUri())
return new promiseObj(function (resolve) {
var notification, progress
try {
var closeNotification_1 = function () {
if (notification) {
notification.close()
progress = noop
}
}
var success = function (url) {
closeNotification_1()
uploadStatus.markUploaded(blobInfo.blobUri(), url)
resolvePending(blobInfo.blobUri(), handlerSuccess(blobInfo, url))
resolve(handlerSuccess(blobInfo, url))
}
var failure = function (error, options) {
var failureOptions = options ? options : {}
closeNotification_1()
uploadStatus.removeFailed(blobInfo.blobUri())
resolvePending(
blobInfo.blobUri(),
handlerFailure(blobInfo, error, failureOptions)
)
resolve(handlerFailure(blobInfo, error, failureOptions))
}
progress = function (percent) {
if (percent < 0 || percent > 100) {
return
}
Optional.from(notification)
.orThunk(function () {
return Optional.from(openNotification).map(apply)
})
.each(function (n) {
notification = n
n.progressBar.value(percent)
})
}
handler(blobInfo, success, failure, progress)
} catch (ex) {
resolve(handlerFailure(blobInfo, ex.message, {}))
}
})
}
var isDefaultHandler = function (handler) {
return handler === defaultHandler
}
var pendingUploadBlobInfo = function (blobInfo) {
var blobUri = blobInfo.blobUri()
return new promiseObj(function (resolve) {
pendingPromises[blobUri] = pendingPromises[blobUri] || []
pendingPromises[blobUri].push(resolve)
})
}
var uploadBlobs = function (blobInfos, openNotification) {
blobInfos = Tools.grep(blobInfos, function (blobInfo) {
return !uploadStatus.isUploaded(blobInfo.blobUri())
})
return promiseObj.all(
Tools.map(blobInfos, function (blobInfo) {
return uploadStatus.isPending(blobInfo.blobUri())
? pendingUploadBlobInfo(blobInfo)
: uploadBlobInfo(blobInfo, settings.handler, openNotification)
})
)
}
var upload = function (blobInfos, openNotification) {
return !settings.url && isDefaultHandler(settings.handler)
? noUpload()
: uploadBlobs(blobInfos, openNotification)
}
if (isFunction(settings.handler) === false) {
settings.handler = defaultHandler
}
return { upload: upload }
}
var openNotification = function (editor) {
return function () {
return editor.notificationManager.open({
text: editor.translate('Image uploading...'),
type: 'info',
timeout: -1,
progressBar: true,
})
}
}
var createUploader = function (editor, uploadStatus) {
return Uploader(uploadStatus, {
url: getImageUploadUrl(editor),
basePath: getImageUploadBasePath(editor),
credentials: getImagesUploadCredentials(editor),
handler: getImagesUploadHandler(editor),
})
}
var ImageUploader = function (editor) {
var uploadStatus = UploadStatus()
var uploader = createUploader(editor, uploadStatus)
return {
upload: function (blobInfos, showNotification) {
if (showNotification === void 0) {
showNotification = true
}
return uploader.upload(
blobInfos,
showNotification ? openNotification(editor) : undefined
)
},
}
}
var UploadChangeHandler = function (editor) {
var lastChangedLevel = Cell(null)
editor.on('change AddUndo', function (e) {
lastChangedLevel.set(__assign({}, e.level))
})
var fireIfChanged = function () {
var data = editor.undoManager.data
last$2(data)
.filter(function (level) {
return !isEq$1(lastChangedLevel.get(), level)
})
.each(function (level) {
editor.setDirty(true)
editor.fire('change', {
level: level,
lastLevel: get$a(data, data.length - 2).getOrNull(),
})
})
}
return { fireIfChanged: fireIfChanged }
}
var EditorUpload = function (editor) {
var blobCache = BlobCache()
var uploader, imageScanner
var uploadStatus = UploadStatus()
var urlFilters = []
var changeHandler = UploadChangeHandler(editor)
var aliveGuard = function (callback) {
return function (result) {
if (editor.selection) {
return callback(result)
}
return []
}
}
var cacheInvalidator = function (url) {
return url + (url.indexOf('?') === -1 ? '?' : '&') + new Date().getTime()
}
var replaceString = function (content, search, replace) {
var index = 0
do {
index = content.indexOf(search, index)
if (index !== -1) {
content =
content.substring(0, index) +
replace +
content.substr(index + search.length)
index += replace.length - search.length + 1
}
} while (index !== -1)
return content
}
var replaceImageUrl = function (content, targetUrl, replacementUrl) {
var replacementString =
'src="' +
replacementUrl +
'"' +
(replacementUrl === Env.transparentSrc
? ' data-mce-placeholder="1"'
: '')
content = replaceString(
content,
'src="' + targetUrl + '"',
replacementString
)
content = replaceString(
content,
'data-mce-src="' + targetUrl + '"',
'data-mce-src="' + replacementUrl + '"'
)
return content
}
var replaceUrlInUndoStack = function (targetUrl, replacementUrl) {
each$k(editor.undoManager.data, function (level) {
if (level.type === 'fragmented') {
level.fragments = map$3(level.fragments, function (fragment) {
return replaceImageUrl(fragment, targetUrl, replacementUrl)
})
} else {
level.content = replaceImageUrl(
level.content,
targetUrl,
replacementUrl
)
}
})
}
var replaceImageUriInView = function (image, resultUri) {
var src = editor.convertURL(resultUri, 'src')
replaceUrlInUndoStack(image.src, resultUri)
editor.$(image).attr({
src: shouldReuseFileName(editor)
? cacheInvalidator(resultUri)
: resultUri,
'data-mce-src': src,
})
}
var uploadImages = function (callback) {
if (!uploader) {
uploader = createUploader(editor, uploadStatus)
}
return scanForImages().then(
aliveGuard(function (imageInfos) {
var blobInfos = map$3(imageInfos, function (imageInfo) {
return imageInfo.blobInfo
})
return uploader.upload(blobInfos, openNotification(editor)).then(
aliveGuard(function (result) {
var imagesToRemove = []
var filteredResult = map$3(result, function (uploadInfo, index) {
var blobInfo = imageInfos[index].blobInfo
var image = imageInfos[index].image
if (uploadInfo.status && shouldReplaceBlobUris(editor)) {
blobCache.removeByUri(image.src)
if (isRtc(editor));
else {
replaceImageUriInView(image, uploadInfo.url)
}
} else if (uploadInfo.error) {
if (uploadInfo.error.options.remove) {
replaceUrlInUndoStack(
image.getAttribute('src'),
Env.transparentSrc
)
imagesToRemove.push(image)
}
uploadError(editor, uploadInfo.error.message)
}
return {
element: image,
status: uploadInfo.status,
uploadUri: uploadInfo.url,
blobInfo: blobInfo,
}
})
if (filteredResult.length > 0) {
changeHandler.fireIfChanged()
}
if (imagesToRemove.length > 0) {
if (isRtc(editor)) {
console.error(
'Removing images on failed uploads is currently unsupported for RTC'
)
} else {
editor.undoManager.transact(function () {
each$k(imagesToRemove, function (element) {
editor.dom.remove(element)
blobCache.removeByUri(element.src)
})
})
}
}
if (callback) {
callback(filteredResult)
}
return filteredResult
})
)
})
)
}
var uploadImagesAuto = function (callback) {
if (isAutomaticUploadsEnabled(editor)) {
return uploadImages(callback)
}
}
var isValidDataUriImage = function (imgElm) {
if (
forall(urlFilters, function (filter) {
return filter(imgElm)
}) === false
) {
return false
}
if (imgElm.getAttribute('src').indexOf('data:') === 0) {
var dataImgFilter = getImagesDataImgFilter(editor)
return dataImgFilter(imgElm)
}
return true
}
var addFilter = function (filter) {
urlFilters.push(filter)
}
var scanForImages = function () {
if (!imageScanner) {
imageScanner = ImageScanner(uploadStatus, blobCache)
}
return imageScanner.findAll(editor.getBody(), isValidDataUriImage).then(
aliveGuard(function (result) {
result = filter$4(result, function (resultItem) {
if (typeof resultItem === 'string') {
displayError(editor, resultItem)
return false
}
return true
})
if (isRtc(editor));
else {
each$k(result, function (resultItem) {
replaceUrlInUndoStack(
resultItem.image.src,
resultItem.blobInfo.blobUri()
)
resultItem.image.src = resultItem.blobInfo.blobUri()
resultItem.image.removeAttribute('data-mce-src')
})
}
return result
})
)
}
var destroy = function () {
blobCache.destroy()
uploadStatus.destroy()
imageScanner = uploader = null
}
var replaceBlobUris = function (content) {
return content.replace(/src="(blob:[^"]+)"/g, function (match, blobUri) {
var resultUri = uploadStatus.getResultUri(blobUri)
if (resultUri) {
return 'src="' + resultUri + '"'
}
var blobInfo = blobCache.getByUri(blobUri)
if (!blobInfo) {
blobInfo = foldl(
editor.editorManager.get(),
function (result, editor) {
return (
result ||
(editor.editorUpload &&
editor.editorUpload.blobCache.getByUri(blobUri))
)
},
null
)
}
if (blobInfo) {
var blob = blobInfo.blob()
return 'src="data:' + blob.type + ';base64,' + blobInfo.base64() + '"'
}
return match
})
}
editor.on('SetContent', function () {
if (isAutomaticUploadsEnabled(editor)) {
uploadImagesAuto()
} else {
scanForImages()
}
})
editor.on('RawSaveContent', function (e) {
e.content = replaceBlobUris(e.content)
})
editor.on('GetContent', function (e) {
if (e.source_view || e.format === 'raw' || e.format === 'tree') {
return
}
e.content = replaceBlobUris(e.content)
})
editor.on('PostRender', function () {
editor.parser.addNodeFilter('img', function (images) {
each$k(images, function (img) {
var src = img.attr('src')
if (blobCache.getByUri(src)) {
return
}
var resultUri = uploadStatus.getResultUri(src)
if (resultUri) {
img.attr('src', resultUri)
}
})
})
})
return {
blobCache: blobCache,
addFilter: addFilter,
uploadImages: uploadImages,
uploadImagesAuto: uploadImagesAuto,
scanForImages: scanForImages,
destroy: destroy,
}
}
var get = function (dom) {
var formats = {
valigntop: [
{
selector: 'td,th',
styles: { verticalAlign: 'top' },
},
],
valignmiddle: [
{
selector: 'td,th',
styles: { verticalAlign: 'middle' },
},
],
valignbottom: [
{
selector: 'td,th',
styles: { verticalAlign: 'bottom' },
},
],
alignleft: [
{
selector: 'figure.image',
collapsed: false,
classes: 'align-left',
ceFalseOverride: true,
preview: 'font-family font-size',
},
{
selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li',
styles: { textAlign: 'left' },
inherit: false,
preview: false,
defaultBlock: 'div',
},
{
selector: 'img,table,audio,video',
collapsed: false,
styles: { float: 'left' },
preview: 'font-family font-size',
},
],
aligncenter: [
{
selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li',
styles: { textAlign: 'center' },
inherit: false,
preview: 'font-family font-size',
defaultBlock: 'div',
},
{
selector: 'figure.image',
collapsed: false,
classes: 'align-center',
ceFalseOverride: true,
preview: 'font-family font-size',
},
{
selector: 'img,audio,video',
collapsed: false,
styles: {
display: 'block',
marginLeft: 'auto',
marginRight: 'auto',
},
preview: false,
},
{
selector: 'table',
collapsed: false,
styles: {
marginLeft: 'auto',
marginRight: 'auto',
},
preview: 'font-family font-size',
},
],
alignright: [
{
selector: 'figure.image',
collapsed: false,
classes: 'align-right',
ceFalseOverride: true,
preview: 'font-family font-size',
},
{
selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li',
styles: { textAlign: 'right' },
inherit: false,
preview: 'font-family font-size',
defaultBlock: 'div',
},
{
selector: 'img,table,audio,video',
collapsed: false,
styles: { float: 'right' },
preview: 'font-family font-size',
},
],
alignjustify: [
{
selector: 'figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li',
styles: { textAlign: 'justify' },
inherit: false,
defaultBlock: 'div',
preview: 'font-family font-size',
},
],
bold: [
{
inline: 'strong',
remove: 'all',
preserve_attributes: ['class', 'style'],
},
{
inline: 'span',
styles: { fontWeight: 'bold' },
},
{
inline: 'b',
remove: 'all',
preserve_attributes: ['class', 'style'],
},
],
italic: [
{
inline: 'em',
remove: 'all',
preserve_attributes: ['class', 'style'],
},
{
inline: 'span',
styles: { fontStyle: 'italic' },
},
{
inline: 'i',
remove: 'all',
preserve_attributes: ['class', 'style'],
},
],
underline: [
{
inline: 'span',
styles: { textDecoration: 'underline' },
exact: true,
},
{
inline: 'u',
remove: 'all',
preserve_attributes: ['class', 'style'],
},
],
strikethrough: [
{
inline: 'span',
styles: { textDecoration: 'line-through' },
exact: true,
},
{
inline: 'strike',
remove: 'all',
preserve_attributes: ['class', 'style'],
},
{
inline: 's',
remove: 'all',
preserve_attributes: ['class', 'style'],
},
],
forecolor: {
inline: 'span',
styles: { color: '%value' },
links: true,
remove_similar: true,
clear_child_styles: true,
},
hilitecolor: {
inline: 'span',
styles: { backgroundColor: '%value' },
links: true,
remove_similar: true,
clear_child_styles: true,
},
fontname: {
inline: 'span',
toggle: false,
styles: { fontFamily: '%value' },
clear_child_styles: true,
},
fontsize: {
inline: 'span',
toggle: false,
styles: { fontSize: '%value' },
clear_child_styles: true,
},
lineheight: {
selector: 'h1,h2,h3,h4,h5,h6,p,li,td,th,div',
defaultBlock: 'p',
styles: { lineHeight: '%value' },
},
fontsize_class: {
inline: 'span',
attributes: { class: '%value' },
},
blockquote: {
block: 'blockquote',
wrapper: true,
remove: 'all',
},
subscript: { inline: 'sub' },
superscript: { inline: 'sup' },
code: { inline: 'code' },
link: {
inline: 'a',
selector: 'a',
remove: 'all',
split: true,
deep: true,
onmatch: function (node, _fmt, _itemName) {
return isElement$5(node) && node.hasAttribute('href')
},
onformat: function (elm, _fmt, vars) {
Tools.each(vars, function (value, key) {
dom.setAttrib(elm, key, value)
})
},
},
lang: {
inline: 'span',
clear_child_styles: true,
remove_similar: true,
attributes: {
lang: '%value',
'data-mce-lang': function (vars) {
var _a
return (_a =
vars === null || vars === void 0 ? void 0 : vars.customValue) !==
null && _a !== void 0
? _a
: null
},
},
},
removeformat: [
{
selector:
'b,strong,em,i,font,u,strike,s,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins,small',
remove: 'all',
split: true,
expand: false,
block_expand: true,
deep: true,
},
{
selector: 'span',
attributes: ['style', 'class'],
remove: 'empty',
split: true,
expand: false,
deep: true,
},
{
selector: '*',
attributes: ['style', 'class'],
split: false,
expand: false,
deep: true,
},
],
}
Tools.each(
'p h1 h2 h3 h4 h5 h6 div address pre dt dd samp'.split(/\s/),
function (name) {
formats[name] = {
block: name,
remove: 'all',
}
}
)
return formats
}
var FormatRegistry = function (editor) {
var formats = {}
var get$1 = function (name) {
return isNonNullable(name) ? formats[name] : formats
}
var has = function (name) {
return has$2(formats, name)
}
var register = function (name, format) {
if (name) {
if (!isString$1(name)) {
each$j(name, function (format, name) {
register(name, format)
})
} else {
if (!isArray$1(format)) {
format = [format]
}
each$k(format, function (format) {
if (isUndefined(format.deep)) {
format.deep = !isSelectorFormat(format)
}
if (isUndefined(format.split)) {
format.split = !isSelectorFormat(format) || isInlineFormat(format)
}
if (
isUndefined(format.remove) &&
isSelectorFormat(format) &&
!isInlineFormat(format)
) {
format.remove = 'none'
}
if (isSelectorFormat(format) && isInlineFormat(format)) {
format.mixed = true
format.block_expand = true
}
if (isString$1(format.classes)) {
format.classes = format.classes.split(/\s+/)
}
})
formats[name] = format
}
}
}
var unregister = function (name) {
if (name && formats[name]) {
delete formats[name]
}
return formats
}
register(get(editor.dom))
register(getFormats(editor))
return {
get: get$1,
has: has,
register: register,
unregister: unregister,
}
}
var each$5 = Tools.each
var dom = DOMUtils.DOM
var parsedSelectorToHtml = function (ancestry, editor) {
var elm, item, fragment
var schema = (editor && editor.schema) || Schema({})
var decorate = function (elm, item) {
if (item.classes.length) {
dom.addClass(elm, item.classes.join(' '))
}
dom.setAttribs(elm, item.attrs)
}
var createElement = function (sItem) {
item =
typeof sItem === 'string'
? {
name: sItem,
classes: [],
attrs: {},
}
: sItem
var elm = dom.create(item.name)
decorate(elm, item)
return elm
}
var getRequiredParent = function (elm, candidate) {
var name = typeof elm !== 'string' ? elm.nodeName.toLowerCase() : elm
var elmRule = schema.getElementRule(name)
var parentsRequired = elmRule && elmRule.parentsRequired
if (parentsRequired && parentsRequired.length) {
return candidate && Tools.inArray(parentsRequired, candidate) !== -1
? candidate
: parentsRequired[0]
} else {
return false
}
}
var wrapInHtml = function (elm, ancestry, siblings) {
var parent, parentCandidate
var ancestor = ancestry.length > 0 && ancestry[0]
var ancestorName = ancestor && ancestor.name
var parentRequired = getRequiredParent(elm, ancestorName)
if (parentRequired) {
if (ancestorName === parentRequired) {
parentCandidate = ancestry[0]
ancestry = ancestry.slice(1)
} else {
parentCandidate = parentRequired
}
} else if (ancestor) {
parentCandidate = ancestry[0]
ancestry = ancestry.slice(1)
} else if (!siblings) {
return elm
}
if (parentCandidate) {
parent = createElement(parentCandidate)
parent.appendChild(elm)
}
if (siblings) {
if (!parent) {
parent = dom.create('div')
parent.appendChild(elm)
}
Tools.each(siblings, function (sibling) {
var siblingElm = createElement(sibling)
parent.insertBefore(siblingElm, elm)
})
}
return wrapInHtml(
parent,
ancestry,
parentCandidate && parentCandidate.siblings
)
}
if (ancestry && ancestry.length) {
item = ancestry[0]
elm = createElement(item)
fragment = dom.create('div')
fragment.appendChild(wrapInHtml(elm, ancestry.slice(1), item.siblings))
return fragment
} else {
return ''
}
}
var parseSelectorItem = function (item) {
var tagName
var obj = {
classes: [],
attrs: {},
}
item = obj.selector = Tools.trim(item)
if (item !== '*') {
tagName = item.replace(
/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g,
function ($0, $1, $2, $3, $4) {
switch ($1) {
case '#':
obj.attrs.id = $2
break
case '.':
obj.classes.push($2)
break
case ':':
if (
Tools.inArray(
'checked disabled enabled read-only required'.split(' '),
$2
) !== -1
) {
obj.attrs[$2] = $2
}
break
}
if ($3 === '[') {
var m = $4.match(/([\w\-]+)(?:\=\"([^\"]+))?/)
if (m) {
obj.attrs[m[1]] = m[2]
}
}
return ''
}
)
}
obj.name = tagName || 'div'
return obj
}
var parseSelector = function (selector) {
if (!selector || typeof selector !== 'string') {
return []
}
selector = selector.split(/\s*,\s*/)[0]
selector = selector.replace(/\s*(~\+|~|\+|>)\s*/g, '$1')
return Tools.map(
selector.split(/(?:>|\s+(?![^\[\]]+\]))/),
function (item) {
var siblings = Tools.map(item.split(/(?:~\+|~|\+)/), parseSelectorItem)
var obj = siblings.pop()
if (siblings.length) {
obj.siblings = siblings
}
return obj
}
).reverse()
}
var getCssText = function (editor, format) {
var name, previewFrag
var previewCss = '',
parentFontSize
var previewStyles = getPreviewStyles(editor)
if (previewStyles === '') {
return ''
}
var removeVars = function (val) {
return val.replace(/%(\w+)/g, '')
}
if (typeof format === 'string') {
format = editor.formatter.get(format)
if (!format) {
return
}
format = format[0]
}
if ('preview' in format) {
var previewOpt = get$9(format, 'preview')
if (is$1(previewOpt, false)) {
return ''
} else {
previewStyles = previewOpt.getOr(previewStyles)
}
}
name = format.block || format.inline || 'span'
var items = parseSelector(format.selector)
if (items.length) {
if (!items[0].name) {
items[0].name = name
}
name = format.selector
previewFrag = parsedSelectorToHtml(items, editor)
} else {
previewFrag = parsedSelectorToHtml([name], editor)
}
var previewElm = dom.select(name, previewFrag)[0] || previewFrag.firstChild
each$5(format.styles, function (value, name) {
var newValue = removeVars(value)
if (newValue) {
dom.setStyle(previewElm, name, newValue)
}
})
each$5(format.attributes, function (value, name) {
var newValue = removeVars(value)
if (newValue) {
dom.setAttrib(previewElm, name, newValue)
}
})
each$5(format.classes, function (value) {
var newValue = removeVars(value)
if (!dom.hasClass(previewElm, newValue)) {
dom.addClass(previewElm, newValue)
}
})
editor.fire('PreviewFormats')
dom.setStyles(previewFrag, {
position: 'absolute',
left: -65535,
})
editor.getBody().appendChild(previewFrag)
parentFontSize = dom.getStyle(editor.getBody(), 'fontSize', true)
parentFontSize = /px$/.test(parentFontSize)
? parseInt(parentFontSize, 10)
: 0
each$5(previewStyles.split(' '), function (name) {
var value = dom.getStyle(previewElm, name, true)
if (
name === 'background-color' &&
/transparent|rgba\s*\([^)]+,\s*0\)/.test(value)
) {
value = dom.getStyle(editor.getBody(), name, true)
if (dom.toHex(value).toLowerCase() === '#ffffff') {
return
}
}
if (name === 'color') {
if (dom.toHex(value).toLowerCase() === '#000000') {
return
}
}
if (name === 'font-size') {
if (/em|%$/.test(value)) {
if (parentFontSize === 0) {
return
}
var numValue = parseFloat(value) / (/%$/.test(value) ? 100 : 1)
value = numValue * parentFontSize + 'px'
}
}
if (name === 'border' && value) {
previewCss += 'padding:0 2px;'
}
previewCss += name + ':' + value + ';'
})
editor.fire('AfterPreviewFormats')
dom.remove(previewFrag)
return previewCss
}
var setup$h = function (editor) {
editor.addShortcut('meta+b', '', 'Bold')
editor.addShortcut('meta+i', '', 'Italic')
editor.addShortcut('meta+u', '', 'Underline')
for (var i = 1; i <= 6; i++) {
editor.addShortcut('access+' + i, '', ['FormatBlock', false, 'h' + i])
}
editor.addShortcut('access+7', '', ['FormatBlock', false, 'p'])
editor.addShortcut('access+8', '', ['FormatBlock', false, 'div'])
editor.addShortcut('access+9', '', ['FormatBlock', false, 'address'])
}
var Formatter = function (editor) {
var formats = FormatRegistry(editor)
var formatChangeState = Cell(null)
setup$h(editor)
setup$k(editor)
return {
get: formats.get,
has: formats.has,
register: formats.register,
unregister: formats.unregister,
apply: function (name, vars, node) {
applyFormat(editor, name, vars, node)
},
remove: function (name, vars, node, similar) {
removeFormat(editor, name, vars, node, similar)
},
toggle: function (name, vars, node) {
toggleFormat(editor, name, vars, node)
},
match: function (name, vars, node, similar) {
return matchFormat(editor, name, vars, node, similar)
},
closest: function (names) {
return closestFormat(editor, names)
},
matchAll: function (names, vars) {
return matchAllFormats(editor, names, vars)
},
matchNode: function (node, name, vars, similar) {
return matchNodeFormat(editor, node, name, vars, similar)
},
canApply: function (name) {
return canApplyFormat(editor, name)
},
formatChanged: function (formats, callback, similar, vars) {
return formatChanged(
editor,
formatChangeState,
formats,
callback,
similar,
vars
)
},
getCssText: curry(getCssText, editor),
}
}
var shouldIgnoreCommand = function (cmd) {
switch (cmd.toLowerCase()) {
case 'undo':
case 'redo':
case 'mcerepaint':
case 'mcefocus':
return true
default:
return false
}
}
var registerEvents = function (editor, undoManager, locks) {
var isFirstTypedCharacter = Cell(false)
var addNonTypingUndoLevel = function (e) {
setTyping(undoManager, false, locks)
undoManager.add({}, e)
}
editor.on('init', function () {
undoManager.add()
})
editor.on('BeforeExecCommand', function (e) {
var cmd = e.command
if (!shouldIgnoreCommand(cmd)) {
endTyping(undoManager, locks)
undoManager.beforeChange()
}
})
editor.on('ExecCommand', function (e) {
var cmd = e.command
if (!shouldIgnoreCommand(cmd)) {
addNonTypingUndoLevel(e)
}
})
editor.on('ObjectResizeStart cut', function () {
undoManager.beforeChange()
})
editor.on('SaveContent ObjectResized blur', addNonTypingUndoLevel)
editor.on('dragend', addNonTypingUndoLevel)
editor.on('keyup', function (e) {
var keyCode = e.keyCode
if (e.isDefaultPrevented()) {
return
}
if (
(keyCode >= 33 && keyCode <= 36) ||
(keyCode >= 37 && keyCode <= 40) ||
keyCode === 45 ||
e.ctrlKey
) {
addNonTypingUndoLevel()
editor.nodeChanged()
}
if (keyCode === 46 || keyCode === 8) {
editor.nodeChanged()
}
if (
isFirstTypedCharacter.get() &&
undoManager.typing &&
isEq$1(createFromEditor(editor), undoManager.data[0]) === false
) {
if (editor.isDirty() === false) {
editor.setDirty(true)
editor.fire('change', {
level: undoManager.data[0],
lastLevel: null,
})
}
editor.fire('TypingUndo')
isFirstTypedCharacter.set(false)
editor.nodeChanged()
}
})
editor.on('keydown', function (e) {
var keyCode = e.keyCode
if (e.isDefaultPrevented()) {
return
}
if (
(keyCode >= 33 && keyCode <= 36) ||
(keyCode >= 37 && keyCode <= 40) ||
keyCode === 45
) {
if (undoManager.typing) {
addNonTypingUndoLevel(e)
}
return
}
var modKey = (e.ctrlKey && !e.altKey) || e.metaKey
if (
(keyCode < 16 || keyCode > 20) &&
keyCode !== 224 &&
keyCode !== 91 &&
!undoManager.typing &&
!modKey
) {
undoManager.beforeChange()
setTyping(undoManager, true, locks)
undoManager.add({}, e)
isFirstTypedCharacter.set(true)
}
})
editor.on('mousedown', function (e) {
if (undoManager.typing) {
addNonTypingUndoLevel(e)
}
})
var isInsertReplacementText = function (event) {
return event.inputType === 'insertReplacementText'
}
var isInsertTextDataNull = function (event) {
return event.inputType === 'insertText' && event.data === null
}
var isInsertFromPasteOrDrop = function (event) {
return (
event.inputType === 'insertFromPaste' ||
event.inputType === 'insertFromDrop'
)
}
editor.on('input', function (e) {
if (
e.inputType &&
(isInsertReplacementText(e) ||
isInsertTextDataNull(e) ||
isInsertFromPasteOrDrop(e))
) {
addNonTypingUndoLevel(e)
}
})
editor.on('AddUndo Undo Redo ClearUndos', function (e) {
if (!e.isDefaultPrevented()) {
editor.nodeChanged()
}
})
}
var addKeyboardShortcuts = function (editor) {
editor.addShortcut('meta+z', '', 'Undo')
editor.addShortcut('meta+y,meta+shift+z', '', 'Redo')
}
var UndoManager = function (editor) {
var beforeBookmark = value()
var locks = Cell(0)
var index = Cell(0)
var undoManager = {
data: [],
typing: false,
beforeChange: function () {
beforeChange(editor, locks, beforeBookmark)
},
add: function (level, event) {
return addUndoLevel(
editor,
undoManager,
index,
locks,
beforeBookmark,
level,
event
)
},
undo: function () {
return undo(editor, undoManager, locks, index)
},
redo: function () {
return redo(editor, index, undoManager.data)
},
clear: function () {
clear(editor, undoManager, index)
},
reset: function () {
reset(editor, undoManager)
},
hasUndo: function () {
return hasUndo(editor, undoManager, index)
},
hasRedo: function () {
return hasRedo(editor, undoManager, index)
},
transact: function (callback) {
return transact(editor, undoManager, locks, callback)
},
ignore: function (callback) {
ignore(editor, locks, callback)
},
extra: function (callback1, callback2) {
extra(editor, undoManager, index, callback1, callback2)
},
}
if (!isRtc(editor)) {
registerEvents(editor, undoManager, locks)
}
addKeyboardShortcuts(editor)
return undoManager
}
var nonTypingKeycodes = [
9,
27,
VK.HOME,
VK.END,
19,
20,
44,
144,
145,
33,
34,
45,
16,
17,
18,
91,
92,
93,
VK.DOWN,
VK.UP,
VK.LEFT,
VK.RIGHT,
].concat(Env.browser.isFirefox() ? [224] : [])
var placeholderAttr = 'data-mce-placeholder'
var isKeyboardEvent = function (e) {
return e.type === 'keydown' || e.type === 'keyup'
}
var isDeleteEvent = function (e) {
var keyCode = e.keyCode
return keyCode === VK.BACKSPACE || keyCode === VK.DELETE
}
var isNonTypingKeyboardEvent = function (e) {
if (isKeyboardEvent(e)) {
var keyCode = e.keyCode
return (
!isDeleteEvent(e) &&
(VK.metaKeyPressed(e) ||
e.altKey ||
(keyCode >= 112 && keyCode <= 123) ||
contains$3(nonTypingKeycodes, keyCode))
)
} else {
return false
}
}
var isTypingKeyboardEvent = function (e) {
return (
isKeyboardEvent(e) &&
!(isDeleteEvent(e) || (e.type === 'keyup' && e.keyCode === 229))
)
}
var isVisuallyEmpty = function (dom, rootElm, forcedRootBlock) {
if (isEmpty$2(SugarElement.fromDom(rootElm), false)) {
var isForcedRootBlockFalse = forcedRootBlock === ''
var firstElement = rootElm.firstElementChild
if (!firstElement) {
return true
} else if (
dom.getStyle(rootElm.firstElementChild, 'padding-left') ||
dom.getStyle(rootElm.firstElementChild, 'padding-right')
) {
return false
} else {
return isForcedRootBlockFalse
? !dom.isBlock(firstElement)
: forcedRootBlock === firstElement.nodeName.toLowerCase()
}
} else {
return false
}
}
var setup$g = function (editor) {
var dom = editor.dom
var rootBlock = getForcedRootBlock(editor)
var placeholder = getPlaceholder(editor)
var updatePlaceholder = function (e, initial) {
if (isNonTypingKeyboardEvent(e)) {
return
}
var body = editor.getBody()
var showPlaceholder = isTypingKeyboardEvent(e)
? false
: isVisuallyEmpty(dom, body, rootBlock)
var isPlaceholderShown = dom.getAttrib(body, placeholderAttr) !== ''
if (isPlaceholderShown !== showPlaceholder || initial) {
dom.setAttrib(
body,
placeholderAttr,
showPlaceholder ? placeholder : null
)
dom.setAttrib(
body,
'aria-placeholder',
showPlaceholder ? placeholder : null
)
firePlaceholderToggle(editor, showPlaceholder)
editor.on(showPlaceholder ? 'keydown' : 'keyup', updatePlaceholder)
editor.off(showPlaceholder ? 'keyup' : 'keydown', updatePlaceholder)
}
}
if (placeholder) {
editor.on('init', function (e) {
updatePlaceholder(e, true)
editor.on('change SetContent ExecCommand', updatePlaceholder)
editor.on('paste', function (e) {
return Delay.setEditorTimeout(editor, function () {
return updatePlaceholder(e)
})
})
})
}
}
var strongRtl = /[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/
var hasStrongRtl = function (text) {
return strongRtl.test(text)
}
var isInlineTarget = function (editor, elm) {
return is$2(SugarElement.fromDom(elm), getInlineBoundarySelector(editor))
}
var isRtl = function (element) {
return (
DOMUtils.DOM.getStyle(element, 'direction', true) === 'rtl' ||
hasStrongRtl(element.textContent)
)
}
var findInlineParents = function (isInlineTarget, rootNode, pos) {
return filter$4(
DOMUtils.DOM.getParents(pos.container(), '*', rootNode),
isInlineTarget
)
}
var findRootInline = function (isInlineTarget, rootNode, pos) {
var parents = findInlineParents(isInlineTarget, rootNode, pos)
return Optional.from(parents[parents.length - 1])
}
var hasSameParentBlock = function (rootNode, node1, node2) {
var block1 = getParentBlock$2(node1, rootNode)
var block2 = getParentBlock$2(node2, rootNode)
return block1 && block1 === block2
}
var isAtZwsp = function (pos) {
return isBeforeInline(pos) || isAfterInline(pos)
}
var normalizePosition = function (forward, pos) {
if (!pos) {
return pos
}
var container = pos.container(),
offset = pos.offset()
if (forward) {
if (isCaretContainerInline(container)) {
if (isText$7(container.nextSibling)) {
return CaretPosition(container.nextSibling, 0)
} else {
return CaretPosition.after(container)
}
} else {
return isBeforeInline(pos) ? CaretPosition(container, offset + 1) : pos
}
} else {
if (isCaretContainerInline(container)) {
if (isText$7(container.previousSibling)) {
return CaretPosition(
container.previousSibling,
container.previousSibling.data.length
)
} else {
return CaretPosition.before(container)
}
} else {
return isAfterInline(pos) ? CaretPosition(container, offset - 1) : pos
}
}
}
var normalizeForwards = curry(normalizePosition, true)
var normalizeBackwards = curry(normalizePosition, false)
var isBeforeRoot = function (rootNode) {
return function (elm) {
return eq(rootNode, SugarElement.fromDom(elm.dom.parentNode))
}
}
var isTextBlockOrListItem = function (element) {
return isTextBlock$2(element) || isListItem(element)
}
var getParentBlock$1 = function (rootNode, elm) {
if (contains$1(rootNode, elm)) {
return closest$3(elm, isTextBlockOrListItem, isBeforeRoot(rootNode))
} else {
return Optional.none()
}
}
var placeCaretInEmptyBody = function (editor) {
var body = editor.getBody()
var node =
body.firstChild && editor.dom.isBlock(body.firstChild)
? body.firstChild
: body
editor.selection.setCursorLocation(node, 0)
}
var paddEmptyBody = function (editor) {
if (editor.dom.isEmpty(editor.getBody())) {
editor.setContent('')
placeCaretInEmptyBody(editor)
}
}
var willDeleteLastPositionInElement = function (forward, fromPos, elm) {
return lift2(
firstPositionIn(elm),
lastPositionIn(elm),
function (firstPos, lastPos) {
var normalizedFirstPos = normalizePosition(true, firstPos)
var normalizedLastPos = normalizePosition(false, lastPos)
var normalizedFromPos = normalizePosition(false, fromPos)
if (forward) {
return nextPosition(elm, normalizedFromPos).exists(function (
nextPos
) {
return (
nextPos.isEqual(normalizedLastPos) &&
fromPos.isEqual(normalizedFirstPos)
)
})
} else {
return prevPosition(elm, normalizedFromPos).exists(function (
prevPos
) {
return (
prevPos.isEqual(normalizedFirstPos) &&
fromPos.isEqual(normalizedLastPos)
)
})
}
}
).getOr(true)
}
var blockPosition = function (block, position) {
return {
block: block,
position: position,
}
}
var blockBoundary = function (from, to) {
return {
from: from,
to: to,
}
}
var getBlockPosition = function (rootNode, pos) {
var rootElm = SugarElement.fromDom(rootNode)
var containerElm = SugarElement.fromDom(pos.container())
return getParentBlock$1(rootElm, containerElm).map(function (block) {
return blockPosition(block, pos)
})
}
var isDifferentBlocks = function (blockBoundary) {
return eq(blockBoundary.from.block, blockBoundary.to.block) === false
}
var hasSameParent = function (blockBoundary) {
return parent(blockBoundary.from.block)
.bind(function (parent1) {
return parent(blockBoundary.to.block).filter(function (parent2) {
return eq(parent1, parent2)
})
})
.isSome()
}
var isEditable$1 = function (blockBoundary) {
return (
isContentEditableFalse$b(blockBoundary.from.block.dom) === false &&
isContentEditableFalse$b(blockBoundary.to.block.dom) === false
)
}
var skipLastBr = function (rootNode, forward, blockPosition) {
if (
isBr$5(blockPosition.position.getNode()) &&
isEmpty$2(blockPosition.block) === false
) {
return positionIn(false, blockPosition.block.dom)
.bind(function (lastPositionInBlock) {
if (lastPositionInBlock.isEqual(blockPosition.position)) {
return fromPosition(forward, rootNode, lastPositionInBlock).bind(
function (to) {
return getBlockPosition(rootNode, to)
}
)
} else {
return Optional.some(blockPosition)
}
})
.getOr(blockPosition)
} else {
return blockPosition
}
}
var readFromRange = function (rootNode, forward, rng) {
var fromBlockPos = getBlockPosition(
rootNode,
CaretPosition.fromRangeStart(rng)
)
var toBlockPos = fromBlockPos.bind(function (blockPos) {
return fromPosition(forward, rootNode, blockPos.position).bind(function (
to
) {
return getBlockPosition(rootNode, to).map(function (blockPos) {
return skipLastBr(rootNode, forward, blockPos)
})
})
})
return lift2(fromBlockPos, toBlockPos, blockBoundary).filter(function (
blockBoundary
) {
return (
isDifferentBlocks(blockBoundary) &&
hasSameParent(blockBoundary) &&
isEditable$1(blockBoundary)
)
})
}
var read$1 = function (rootNode, forward, rng) {
return rng.collapsed
? readFromRange(rootNode, forward, rng)
: Optional.none()
}
var getChildrenUntilBlockBoundary = function (block) {
var children$1 = children(block)
return findIndex$2(children$1, isBlock$2).fold(
constant(children$1),
function (index) {
return children$1.slice(0, index)
}
)
}
var extractChildren = function (block) {
var children = getChildrenUntilBlockBoundary(block)
each$k(children, remove$7)
return children
}
var removeEmptyRoot = function (rootNode, block) {
var parents = parentsAndSelf(block, rootNode)
return find$3(parents.reverse(), function (element) {
return isEmpty$2(element)
}).each(remove$7)
}
var isEmptyBefore = function (el) {
return (
filter$4(prevSiblings(el), function (el) {
return !isEmpty$2(el)
}).length === 0
)
}
var nestedBlockMerge = function (
rootNode,
fromBlock,
toBlock,
insertionPoint
) {
if (isEmpty$2(toBlock)) {
fillWithPaddingBr(toBlock)
return firstPositionIn(toBlock.dom)
}
if (isEmptyBefore(insertionPoint) && isEmpty$2(fromBlock)) {
before$4(insertionPoint, SugarElement.fromTag('br'))
}
var position = prevPosition(
toBlock.dom,
CaretPosition.before(insertionPoint.dom)
)
each$k(extractChildren(fromBlock), function (child) {
before$4(insertionPoint, child)
})
removeEmptyRoot(rootNode, fromBlock)
return position
}
var sidelongBlockMerge = function (rootNode, fromBlock, toBlock) {
if (isEmpty$2(toBlock)) {
remove$7(toBlock)
if (isEmpty$2(fromBlock)) {
fillWithPaddingBr(fromBlock)
}
return firstPositionIn(fromBlock.dom)
}
var position = lastPositionIn(toBlock.dom)
each$k(extractChildren(fromBlock), function (child) {
append$1(toBlock, child)
})
removeEmptyRoot(rootNode, fromBlock)
return position
}
var findInsertionPoint = function (toBlock, block) {
var parentsAndSelf$1 = parentsAndSelf(block, toBlock)
return Optional.from(parentsAndSelf$1[parentsAndSelf$1.length - 1])
}
var getInsertionPoint = function (fromBlock, toBlock) {
return contains$1(toBlock, fromBlock)
? findInsertionPoint(toBlock, fromBlock)
: Optional.none()
}
var trimBr = function (first, block) {
positionIn(first, block.dom)
.map(function (position) {
return position.getNode()
})
.map(SugarElement.fromDom)
.filter(isBr$4)
.each(remove$7)
}
var mergeBlockInto = function (rootNode, fromBlock, toBlock) {
trimBr(true, fromBlock)
trimBr(false, toBlock)
return getInsertionPoint(fromBlock, toBlock).fold(
curry(sidelongBlockMerge, rootNode, fromBlock, toBlock),
curry(nestedBlockMerge, rootNode, fromBlock, toBlock)
)
}
var mergeBlocks = function (rootNode, forward, block1, block2) {
return forward
? mergeBlockInto(rootNode, block2, block1)
: mergeBlockInto(rootNode, block1, block2)
}
var backspaceDelete$8 = function (editor, forward) {
var rootNode = SugarElement.fromDom(editor.getBody())
var position = read$1(
rootNode.dom,
forward,
editor.selection.getRng()
).bind(function (blockBoundary) {
return mergeBlocks(
rootNode,
forward,
blockBoundary.from.block,
blockBoundary.to.block
)
})
position.each(function (pos) {
editor.selection.setRng(pos.toRange())
})
return position.isSome()
}
var deleteRangeMergeBlocks = function (rootNode, selection) {
var rng = selection.getRng()
return lift2(
getParentBlock$1(rootNode, SugarElement.fromDom(rng.startContainer)),
getParentBlock$1(rootNode, SugarElement.fromDom(rng.endContainer)),
function (block1, block2) {
if (eq(block1, block2) === false) {
rng.deleteContents()
mergeBlocks(rootNode, true, block1, block2).each(function (pos) {
selection.setRng(pos.toRange())
})
return true
} else {
return false
}
}
).getOr(false)
}
var isRawNodeInTable = function (root, rawNode) {
var node = SugarElement.fromDom(rawNode)
var isRoot = curry(eq, root)
return ancestor$3(node, isTableCell$4, isRoot).isSome()
}
var isSelectionInTable = function (root, rng) {
return (
isRawNodeInTable(root, rng.startContainer) ||
isRawNodeInTable(root, rng.endContainer)
)
}
var isEverythingSelected = function (root, rng) {
var noPrevious = prevPosition(
root.dom,
CaretPosition.fromRangeStart(rng)
).isNone()
var noNext = nextPosition(
root.dom,
CaretPosition.fromRangeEnd(rng)
).isNone()
return !isSelectionInTable(root, rng) && noPrevious && noNext
}
var emptyEditor = function (editor) {
editor.setContent('')
editor.selection.setCursorLocation()
return true
}
var deleteRange$1 = function (editor) {
var rootNode = SugarElement.fromDom(editor.getBody())
var rng = editor.selection.getRng()
return isEverythingSelected(rootNode, rng)
? emptyEditor(editor)
: deleteRangeMergeBlocks(rootNode, editor.selection)
}
var backspaceDelete$7 = function (editor, _forward) {
return editor.selection.isCollapsed() ? false : deleteRange$1(editor)
}
var isContentEditableTrue$2 = isContentEditableTrue$4
var isContentEditableFalse$4 = isContentEditableFalse$b
var showCaret = function (direction, editor, node, before, scrollIntoView) {
return Optional.from(
editor._selectionOverrides.showCaret(
direction,
node,
before,
scrollIntoView
)
)
}
var getNodeRange = function (node) {
var rng = node.ownerDocument.createRange()
rng.selectNode(node)
return rng
}
var selectNode = function (editor, node) {
var e = editor.fire('BeforeObjectSelected', { target: node })
if (e.isDefaultPrevented()) {
return Optional.none()
}
return Optional.some(getNodeRange(node))
}
var renderCaretAtRange = function (editor, range, scrollIntoView) {
var normalizedRange = normalizeRange(1, editor.getBody(), range)
var caretPosition = CaretPosition.fromRangeStart(normalizedRange)
var caretPositionNode = caretPosition.getNode()
if (isInlineFakeCaretTarget(caretPositionNode)) {
return showCaret(
1,
editor,
caretPositionNode,
!caretPosition.isAtEnd(),
false
)
}
var caretPositionBeforeNode = caretPosition.getNode(true)
if (isInlineFakeCaretTarget(caretPositionBeforeNode)) {
return showCaret(1, editor, caretPositionBeforeNode, false, false)
}
var ceRoot = editor.dom.getParent(caretPosition.getNode(), function (node) {
return isContentEditableFalse$4(node) || isContentEditableTrue$2(node)
})
if (isInlineFakeCaretTarget(ceRoot)) {
return showCaret(1, editor, ceRoot, false, scrollIntoView)
}
return Optional.none()
}
var renderRangeCaret = function (editor, range, scrollIntoView) {
return range.collapsed
? renderCaretAtRange(editor, range, scrollIntoView).getOr(range)
: range
}
var isBeforeBoundary = function (pos) {
return isBeforeContentEditableFalse(pos) || isBeforeMedia(pos)
}
var isAfterBoundary = function (pos) {
return isAfterContentEditableFalse(pos) || isAfterMedia(pos)
}
var trimEmptyTextNode = function (dom, node) {
if (isText$7(node) && node.data.length === 0) {
dom.remove(node)
}
}
var deleteContentAndShowCaret = function (
editor,
range,
node,
direction,
forward,
peekCaretPosition
) {
showCaret(
direction,
editor,
peekCaretPosition.getNode(!forward),
forward,
true
).each(function (caretRange) {
if (range.collapsed) {
var deleteRange = range.cloneRange()
if (forward) {
deleteRange.setEnd(caretRange.startContainer, caretRange.startOffset)
} else {
deleteRange.setStart(caretRange.endContainer, caretRange.endOffset)
}
deleteRange.deleteContents()
} else {
range.deleteContents()
}
editor.selection.setRng(caretRange)
})
trimEmptyTextNode(editor.dom, node)
return true
}
var deleteBoundaryText = function (editor, forward) {
var range = editor.selection.getRng()
if (!isText$7(range.commonAncestorContainer)) {
return false
}
var direction = forward ? HDirection.Forwards : HDirection.Backwards
var caretWalker = CaretWalker(editor.getBody())
var getNextPosFn = curry(
getVisualCaretPosition,
forward ? caretWalker.next : caretWalker.prev
)
var isBeforeFn = forward ? isBeforeBoundary : isAfterBoundary
var caretPosition = getNormalizedRangeEndPoint(
direction,
editor.getBody(),
range
)
var nextCaretPosition = normalizePosition(
forward,
getNextPosFn(caretPosition)
)
if (
!nextCaretPosition ||
!isMoveInsideSameBlock(caretPosition, nextCaretPosition)
) {
return false
} else if (isBeforeFn(nextCaretPosition)) {
return deleteContentAndShowCaret(
editor,
range,
caretPosition.getNode(),
direction,
forward,
nextCaretPosition
)
}
var peekCaretPosition = getNextPosFn(nextCaretPosition)
if (peekCaretPosition && isBeforeFn(peekCaretPosition)) {
if (isMoveInsideSameBlock(nextCaretPosition, peekCaretPosition)) {
return deleteContentAndShowCaret(
editor,
range,
caretPosition.getNode(),
direction,
forward,
peekCaretPosition
)
}
}
return false
}
var backspaceDelete$6 = function (editor, forward) {
return deleteBoundaryText(editor, forward)
}
var isCompoundElement = function (node) {
return (
isTableCell$4(SugarElement.fromDom(node)) ||
isListItem(SugarElement.fromDom(node))
)
}
var DeleteAction = Adt.generate([
{ remove: ['element'] },
{ moveToElement: ['element'] },
{ moveToPosition: ['position'] },
])
var isAtContentEditableBlockCaret = function (forward, from) {
var elm = from.getNode(forward === false)
var caretLocation = forward ? 'after' : 'before'
return (
isElement$5(elm) && elm.getAttribute('data-mce-caret') === caretLocation
)
}
var isDeleteFromCefDifferentBlocks = function (root, forward, from, to) {
var inSameBlock = function (elm) {
return (
isInline$1(SugarElement.fromDom(elm)) && !isInSameBlock(from, to, root)
)
}
return getRelativeCefElm(!forward, from).fold(function () {
return getRelativeCefElm(forward, to).fold(never, inSameBlock)
}, inSameBlock)
}
var deleteEmptyBlockOrMoveToCef = function (root, forward, from, to) {
var toCefElm = to.getNode(forward === false)
return getParentBlock$1(
SugarElement.fromDom(root),
SugarElement.fromDom(from.getNode())
)
.map(function (blockElm) {
return isEmpty$2(blockElm)
? DeleteAction.remove(blockElm.dom)
: DeleteAction.moveToElement(toCefElm)
})
.orThunk(function () {
return Optional.some(DeleteAction.moveToElement(toCefElm))
})
}
var findCefPosition = function (root, forward, from) {
return fromPosition(forward, root, from).bind(function (to) {
if (isCompoundElement(to.getNode())) {
return Optional.none()
} else if (isDeleteFromCefDifferentBlocks(root, forward, from, to)) {
return Optional.none()
} else if (forward && isContentEditableFalse$b(to.getNode())) {
return deleteEmptyBlockOrMoveToCef(root, forward, from, to)
} else if (
forward === false &&
isContentEditableFalse$b(to.getNode(true))
) {
return deleteEmptyBlockOrMoveToCef(root, forward, from, to)
} else if (forward && isAfterContentEditableFalse(from)) {
return Optional.some(DeleteAction.moveToPosition(to))
} else if (forward === false && isBeforeContentEditableFalse(from)) {
return Optional.some(DeleteAction.moveToPosition(to))
} else {
return Optional.none()
}
})
}
var getContentEditableBlockAction = function (forward, elm) {
if (forward && isContentEditableFalse$b(elm.nextSibling)) {
return Optional.some(DeleteAction.moveToElement(elm.nextSibling))
} else if (
forward === false &&
isContentEditableFalse$b(elm.previousSibling)
) {
return Optional.some(DeleteAction.moveToElement(elm.previousSibling))
} else {
return Optional.none()
}
}
var skipMoveToActionFromInlineCefToContent = function (
root,
from,
deleteAction
) {
return deleteAction.fold(
function (elm) {
return Optional.some(DeleteAction.remove(elm))
},
function (elm) {
return Optional.some(DeleteAction.moveToElement(elm))
},
function (to) {
if (isInSameBlock(from, to, root)) {
return Optional.none()
} else {
return Optional.some(DeleteAction.moveToPosition(to))
}
}
)
}
var getContentEditableAction = function (root, forward, from) {
if (isAtContentEditableBlockCaret(forward, from)) {
return getContentEditableBlockAction(
forward,
from.getNode(forward === false)
).fold(function () {
return findCefPosition(root, forward, from)
}, Optional.some)
} else {
return findCefPosition(root, forward, from).bind(function (deleteAction) {
return skipMoveToActionFromInlineCefToContent(root, from, deleteAction)
})
}
}
var read = function (root, forward, rng) {
var normalizedRange = normalizeRange(forward ? 1 : -1, root, rng)
var from = CaretPosition.fromRangeStart(normalizedRange)
var rootElement = SugarElement.fromDom(root)
if (forward === false && isAfterContentEditableFalse(from)) {
return Optional.some(DeleteAction.remove(from.getNode(true)))
} else if (forward && isBeforeContentEditableFalse(from)) {
return Optional.some(DeleteAction.remove(from.getNode()))
} else if (
forward === false &&
isBeforeContentEditableFalse(from) &&
isAfterBr(rootElement, from)
) {
return findPreviousBr(rootElement, from).map(function (br) {
return DeleteAction.remove(br.getNode())
})
} else if (
forward &&
isAfterContentEditableFalse(from) &&
isBeforeBr$1(rootElement, from)
) {
return findNextBr(rootElement, from).map(function (br) {
return DeleteAction.remove(br.getNode())
})
} else {
return getContentEditableAction(root, forward, from)
}
}
var deleteElement$1 = function (editor, forward) {
return function (element) {
editor._selectionOverrides.hideFakeCaret()
deleteElement$2(editor, forward, SugarElement.fromDom(element))
return true
}
}
var moveToElement = function (editor, forward) {
return function (element) {
var pos = forward
? CaretPosition.before(element)
: CaretPosition.after(element)
editor.selection.setRng(pos.toRange())
return true
}
}
var moveToPosition = function (editor) {
return function (pos) {
editor.selection.setRng(pos.toRange())
return true
}
}
var getAncestorCe = function (editor, node) {
return Optional.from(getContentEditableRoot$1(editor.getBody(), node))
}
var backspaceDeleteCaret = function (editor, forward) {
var selectedNode = editor.selection.getNode()
return getAncestorCe(editor, selectedNode)
.filter(isContentEditableFalse$b)
.fold(function () {
return read(
editor.getBody(),
forward,
editor.selection.getRng()
).exists(function (deleteAction) {
return deleteAction.fold(
deleteElement$1(editor, forward),
moveToElement(editor, forward),
moveToPosition(editor)
)
})
}, always)
}
var deleteOffscreenSelection = function (rootElement) {
each$k(descendants(rootElement, '.mce-offscreen-selection'), remove$7)
}
var backspaceDeleteRange = function (editor, forward) {
var selectedNode = editor.selection.getNode()
if (
isContentEditableFalse$b(selectedNode) &&
!isTableCell$5(selectedNode)
) {
var hasCefAncestor = getAncestorCe(
editor,
selectedNode.parentNode
).filter(isContentEditableFalse$b)
return hasCefAncestor.fold(function () {
deleteOffscreenSelection(SugarElement.fromDom(editor.getBody()))
deleteElement$2(
editor,
forward,
SugarElement.fromDom(editor.selection.getNode())
)
paddEmptyBody(editor)
return true
}, always)
}
return false
}
var paddEmptyElement = function (editor) {
var dom = editor.dom,
selection = editor.selection
var ceRoot = getContentEditableRoot$1(editor.getBody(), selection.getNode())
if (
isContentEditableTrue$4(ceRoot) &&
dom.isBlock(ceRoot) &&
dom.isEmpty(ceRoot)
) {
var br = dom.create('br', { 'data-mce-bogus': '1' })
dom.setHTML(ceRoot, '')
ceRoot.appendChild(br)
selection.setRng(CaretPosition.before(br).toRange())
}
return true
}
var backspaceDelete$5 = function (editor, forward) {
if (editor.selection.isCollapsed()) {
return backspaceDeleteCaret(editor, forward)
} else {
return backspaceDeleteRange(editor, forward)
}
}
var deleteCaret$2 = function (editor, forward) {
var fromPos = CaretPosition.fromRangeStart(editor.selection.getRng())
return fromPosition(forward, editor.getBody(), fromPos)
.filter(function (pos) {
return forward ? isBeforeImageBlock(pos) : isAfterImageBlock(pos)
})
.bind(function (pos) {
return Optional.from(
getChildNodeAtRelativeOffset(forward ? 0 : -1, pos)
)
})
.exists(function (elm) {
editor.selection.select(elm)
return true
})
}
var backspaceDelete$4 = function (editor, forward) {
return editor.selection.isCollapsed()
? deleteCaret$2(editor, forward)
: false
}
var isText = isText$7
var startsWithCaretContainer = function (node) {
return isText(node) && node.data[0] === ZWSP$1
}
var endsWithCaretContainer = function (node) {
return isText(node) && node.data[node.data.length - 1] === ZWSP$1
}
var createZwsp = function (node) {
return node.ownerDocument.createTextNode(ZWSP$1)
}
var insertBefore = function (node) {
if (isText(node.previousSibling)) {
if (endsWithCaretContainer(node.previousSibling)) {
return node.previousSibling
} else {
node.previousSibling.appendData(ZWSP$1)
return node.previousSibling
}
} else if (isText(node)) {
if (startsWithCaretContainer(node)) {
return node
} else {
node.insertData(0, ZWSP$1)
return node
}
} else {
var newNode = createZwsp(node)
node.parentNode.insertBefore(newNode, node)
return newNode
}
}
var insertAfter = function (node) {
if (isText(node.nextSibling)) {
if (startsWithCaretContainer(node.nextSibling)) {
return node.nextSibling
} else {
node.nextSibling.insertData(0, ZWSP$1)
return node.nextSibling
}
} else if (isText(node)) {
if (endsWithCaretContainer(node)) {
return node
} else {
node.appendData(ZWSP$1)
return node
}
} else {
var newNode = createZwsp(node)
if (node.nextSibling) {
node.parentNode.insertBefore(newNode, node.nextSibling)
} else {
node.parentNode.appendChild(newNode)
}
return newNode
}
}
var insertInline = function (before, node) {
return before ? insertBefore(node) : insertAfter(node)
}
var insertInlineBefore = curry(insertInline, true)
var insertInlineAfter = curry(insertInline, false)
var insertInlinePos = function (pos, before) {
if (isText$7(pos.container())) {
return insertInline(before, pos.container())
} else {
return insertInline(before, pos.getNode())
}
}
var isPosCaretContainer = function (pos, caret) {
var caretNode = caret.get()
return (
caretNode &&
pos.container() === caretNode &&
isCaretContainerInline(caretNode)
)
}
var renderCaret = function (caret, location) {
return location.fold(
function (element) {
remove$2(caret.get())
var text = insertInlineBefore(element)
caret.set(text)
return Optional.some(CaretPosition(text, text.length - 1))
},
function (element) {
return firstPositionIn(element).map(function (pos) {
if (!isPosCaretContainer(pos, caret)) {
remove$2(caret.get())
var text = insertInlinePos(pos, true)
caret.set(text)
return CaretPosition(text, 1)
} else {
return CaretPosition(caret.get(), 1)
}
})
},
function (element) {
return lastPositionIn(element).map(function (pos) {
if (!isPosCaretContainer(pos, caret)) {
remove$2(caret.get())
var text = insertInlinePos(pos, false)
caret.set(text)
return CaretPosition(text, text.length - 1)
} else {
return CaretPosition(caret.get(), caret.get().length - 1)
}
})
},
function (element) {
remove$2(caret.get())
var text = insertInlineAfter(element)
caret.set(text)
return Optional.some(CaretPosition(text, 1))
}
)
}
var evaluateUntil = function (fns, args) {
for (var i = 0; i < fns.length; i++) {
var result = fns[i].apply(null, args)
if (result.isSome()) {
return result
}
}
return Optional.none()
}
var Location = Adt.generate([
{ before: ['element'] },
{ start: ['element'] },
{ end: ['element'] },
{ after: ['element'] },
])
var rescope$1 = function (rootNode, node) {
var parentBlock = getParentBlock$2(node, rootNode)
return parentBlock ? parentBlock : rootNode
}
var before = function (isInlineTarget, rootNode, pos) {
var nPos = normalizeForwards(pos)
var scope = rescope$1(rootNode, nPos.container())
return findRootInline(isInlineTarget, scope, nPos).fold(function () {
return nextPosition(scope, nPos)
.bind(curry(findRootInline, isInlineTarget, scope))
.map(function (inline) {
return Location.before(inline)
})
}, Optional.none)
}
var isNotInsideFormatCaretContainer = function (rootNode, elm) {
return getParentCaretContainer(rootNode, elm) === null
}
var findInsideRootInline = function (isInlineTarget, rootNode, pos) {
return findRootInline(isInlineTarget, rootNode, pos).filter(
curry(isNotInsideFormatCaretContainer, rootNode)
)
}
var start$1 = function (isInlineTarget, rootNode, pos) {
var nPos = normalizeBackwards(pos)
return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(function (
inline
) {
var prevPos = prevPosition(inline, nPos)
return prevPos.isNone()
? Optional.some(Location.start(inline))
: Optional.none()
})
}
var end = function (isInlineTarget, rootNode, pos) {
var nPos = normalizeForwards(pos)
return findInsideRootInline(isInlineTarget, rootNode, nPos).bind(function (
inline
) {
var nextPos = nextPosition(inline, nPos)
return nextPos.isNone()
? Optional.some(Location.end(inline))
: Optional.none()
})
}
var after = function (isInlineTarget, rootNode, pos) {
var nPos = normalizeBackwards(pos)
var scope = rescope$1(rootNode, nPos.container())
return findRootInline(isInlineTarget, scope, nPos).fold(function () {
return prevPosition(scope, nPos)
.bind(curry(findRootInline, isInlineTarget, scope))
.map(function (inline) {
return Location.after(inline)
})
}, Optional.none)
}
var isValidLocation = function (location) {
return isRtl(getElement(location)) === false
}
var readLocation = function (isInlineTarget, rootNode, pos) {
var location = evaluateUntil(
[before, start$1, end, after],
[isInlineTarget, rootNode, pos]
)
return location.filter(isValidLocation)
}
var getElement = function (location) {
return location.fold(identity, identity, identity, identity)
}
var getName = function (location) {
return location.fold(
constant('before'),
constant('start'),
constant('end'),
constant('after')
)
}
var outside = function (location) {
return location.fold(
Location.before,
Location.before,
Location.after,
Location.after
)
}
var inside = function (location) {
return location.fold(
Location.start,
Location.start,
Location.end,
Location.end
)
}
var isEq = function (location1, location2) {
return (
getName(location1) === getName(location2) &&
getElement(location1) === getElement(location2)
)
}
var betweenInlines = function (
forward,
isInlineTarget,
rootNode,
from,
to,
location
) {
return lift2(
findRootInline(isInlineTarget, rootNode, from),
findRootInline(isInlineTarget, rootNode, to),
function (fromInline, toInline) {
if (
fromInline !== toInline &&
hasSameParentBlock(rootNode, fromInline, toInline)
) {
return Location.after(forward ? fromInline : toInline)
} else {
return location
}
}
).getOr(location)
}
var skipNoMovement = function (fromLocation, toLocation) {
return fromLocation.fold(always, function (fromLocation) {
return !isEq(fromLocation, toLocation)
})
}
var findLocationTraverse = function (
forward,
isInlineTarget,
rootNode,
fromLocation,
pos
) {
var from = normalizePosition(forward, pos)
var to = fromPosition(forward, rootNode, from).map(
curry(normalizePosition, forward)
)
var location = to.fold(
function () {
return fromLocation.map(outside)
},
function (to) {
return readLocation(isInlineTarget, rootNode, to)
.map(
curry(betweenInlines, forward, isInlineTarget, rootNode, from, to)
)
.filter(curry(skipNoMovement, fromLocation))
}
)
return location.filter(isValidLocation)
}
var findLocationSimple = function (forward, location) {
if (forward) {
return location.fold(
compose(Optional.some, Location.start),
Optional.none,
compose(Optional.some, Location.after),
Optional.none
)
} else {
return location.fold(
Optional.none,
compose(Optional.some, Location.before),
Optional.none,
compose(Optional.some, Location.end)
)
}
}
var findLocation$1 = function (forward, isInlineTarget, rootNode, pos) {
var from = normalizePosition(forward, pos)
var fromLocation = readLocation(isInlineTarget, rootNode, from)
return readLocation(isInlineTarget, rootNode, from)
.bind(curry(findLocationSimple, forward))
.orThunk(function () {
return findLocationTraverse(
forward,
isInlineTarget,
rootNode,
fromLocation,
pos
)
})
}
curry(findLocation$1, false)
curry(findLocation$1, true)
var hasSelectionModifyApi = function (editor) {
return isFunction(editor.selection.getSel().modify)
}
var moveRel = function (forward, selection, pos) {
var delta = forward ? 1 : -1
selection.setRng(
CaretPosition(pos.container(), pos.offset() + delta).toRange()
)
selection.getSel().modify('move', forward ? 'forward' : 'backward', 'word')
return true
}
var moveByWord = function (forward, editor) {
var rng = editor.selection.getRng()
var pos = forward
? CaretPosition.fromRangeEnd(rng)
: CaretPosition.fromRangeStart(rng)
if (!hasSelectionModifyApi(editor)) {
return false
} else if (forward && isBeforeInline(pos)) {
return moveRel(true, editor.selection, pos)
} else if (!forward && isAfterInline(pos)) {
return moveRel(false, editor.selection, pos)
} else {
return false
}
}
var BreakType
;(function (BreakType) {
BreakType[(BreakType['Br'] = 0)] = 'Br'
BreakType[(BreakType['Block'] = 1)] = 'Block'
BreakType[(BreakType['Wrap'] = 2)] = 'Wrap'
BreakType[(BreakType['Eol'] = 3)] = 'Eol'
})(BreakType || (BreakType = {}))
var flip = function (direction, positions) {
return direction === HDirection.Backwards ? reverse(positions) : positions
}
var walk = function (direction, caretWalker, pos) {
return direction === HDirection.Forwards
? caretWalker.next(pos)
: caretWalker.prev(pos)
}
var getBreakType = function (scope, direction, currentPos, nextPos) {
if (isBr$5(nextPos.getNode(direction === HDirection.Forwards))) {
return BreakType.Br
} else if (isInSameBlock(currentPos, nextPos) === false) {
return BreakType.Block
} else {
return BreakType.Wrap
}
}
var getPositionsUntil = function (predicate, direction, scope, start) {
var caretWalker = CaretWalker(scope)
var currentPos = start
var positions = []
while (currentPos) {
var nextPos = walk(direction, caretWalker, currentPos)
if (!nextPos) {
break
}
if (isBr$5(nextPos.getNode(false))) {
if (direction === HDirection.Forwards) {
return {
positions: flip(direction, positions).concat([nextPos]),
breakType: BreakType.Br,
breakAt: Optional.some(nextPos),
}
} else {
return {
positions: flip(direction, positions),
breakType: BreakType.Br,
breakAt: Optional.some(nextPos),
}
}
}
if (!nextPos.isVisible()) {
currentPos = nextPos
continue
}
if (predicate(currentPos, nextPos)) {
var breakType = getBreakType(scope, direction, currentPos, nextPos)
return {
positions: flip(direction, positions),
breakType: breakType,
breakAt: Optional.some(nextPos),
}
}
positions.push(nextPos)
currentPos = nextPos
}
return {
positions: flip(direction, positions),
breakType: BreakType.Eol,
breakAt: Optional.none(),
}
}
var getAdjacentLinePositions = function (
direction,
getPositionsUntilBreak,
scope,
start
) {
return getPositionsUntilBreak(scope, start)
.breakAt.map(function (pos) {
var positions = getPositionsUntilBreak(scope, pos).positions
return direction === HDirection.Backwards
? positions.concat(pos)
: [pos].concat(positions)
})
.getOr([])
}
var findClosestHorizontalPositionFromPoint = function (positions, x) {
return foldl(
positions,
function (acc, newPos) {
return acc.fold(
function () {
return Optional.some(newPos)
},
function (lastPos) {
return lift2(
head(lastPos.getClientRects()),
head(newPos.getClientRects()),
function (lastRect, newRect) {
var lastDist = Math.abs(x - lastRect.left)
var newDist = Math.abs(x - newRect.left)
return newDist <= lastDist ? newPos : lastPos
}
).or(acc)
}
)
},
Optional.none()
)
}
var findClosestHorizontalPosition = function (positions, pos) {
return head(pos.getClientRects()).bind(function (targetRect) {
return findClosestHorizontalPositionFromPoint(positions, targetRect.left)
})
}
var getPositionsUntilPreviousLine = curry(
getPositionsUntil,
CaretPosition.isAbove,
-1
)
var getPositionsUntilNextLine = curry(
getPositionsUntil,
CaretPosition.isBelow,
1
)
var getPositionsAbove = curry(
getAdjacentLinePositions,
-1,
getPositionsUntilPreviousLine
)
var getPositionsBelow = curry(
getAdjacentLinePositions,
1,
getPositionsUntilNextLine
)
var isAtFirstLine = function (scope, pos) {
return getPositionsUntilPreviousLine(scope, pos).breakAt.isNone()
}
var isAtLastLine = function (scope, pos) {
return getPositionsUntilNextLine(scope, pos).breakAt.isNone()
}
var getFirstLinePositions = function (scope) {
return firstPositionIn(scope)
.map(function (pos) {
return [pos].concat(getPositionsUntilNextLine(scope, pos).positions)
})
.getOr([])
}
var getLastLinePositions = function (scope) {
return lastPositionIn(scope)
.map(function (pos) {
return getPositionsUntilPreviousLine(scope, pos).positions.concat(pos)
})
.getOr([])
}
var getNodeClientRects = function (node) {
var toArrayWithNode = function (clientRects) {
return map$3(clientRects, function (rect) {
var clientRect = clone(rect)
clientRect.node = node
return clientRect
})
}
if (isElement$5(node)) {
return toArrayWithNode(node.getClientRects())
}
if (isText$7(node)) {
var rng = node.ownerDocument.createRange()
rng.setStart(node, 0)
rng.setEnd(node, node.data.length)
return toArrayWithNode(rng.getClientRects())
}
}
var getClientRects = function (nodes) {
return bind(nodes, getNodeClientRects)
}
var VDirection
;(function (VDirection) {
VDirection[(VDirection['Up'] = -1)] = 'Up'
VDirection[(VDirection['Down'] = 1)] = 'Down'
})(VDirection || (VDirection = {}))
var findUntil = function (direction, root, predicateFn, node) {
while (
(node = findNode$1(node, direction, isEditableCaretCandidate$1, root))
) {
if (predicateFn(node)) {
return
}
}
}
var walkUntil$1 = function (
direction,
isAboveFn,
isBeflowFn,
root,
predicateFn,
caretPosition
) {
var line = 0
var result = []
var add = function (node) {
var clientRects = getClientRects([node])
if (direction === -1) {
clientRects = clientRects.reverse()
}
for (var i = 0; i < clientRects.length; i++) {
var clientRect = clientRects[i]
if (isBeflowFn(clientRect, targetClientRect)) {
continue
}
if (result.length > 0 && isAboveFn(clientRect, last$1(result))) {
line++
}
clientRect.line = line
if (predicateFn(clientRect)) {
return true
}
result.push(clientRect)
}
}
var targetClientRect = last$1(caretPosition.getClientRects())
if (!targetClientRect) {
return result
}
var node = caretPosition.getNode()
add(node)
findUntil(direction, root, add, node)
return result
}
var aboveLineNumber = function (lineNumber, clientRect) {
return clientRect.line > lineNumber
}
var isLineNumber = function (lineNumber, clientRect) {
return clientRect.line === lineNumber
}
var upUntil = curry(walkUntil$1, VDirection.Up, isAbove$1, isBelow$1)
var downUntil = curry(walkUntil$1, VDirection.Down, isBelow$1, isAbove$1)
var positionsUntil = function (direction, root, predicateFn, node) {
var caretWalker = CaretWalker(root)
var walkFn
var isBelowFn
var isAboveFn
var caretPosition
var result = []
var line = 0
var getClientRect = function (caretPosition) {
if (direction === 1) {
return last$1(caretPosition.getClientRects())
}
return last$1(caretPosition.getClientRects())
}
if (direction === 1) {
walkFn = caretWalker.next
isBelowFn = isBelow$1
isAboveFn = isAbove$1
caretPosition = CaretPosition.after(node)
} else {
walkFn = caretWalker.prev
isBelowFn = isAbove$1
isAboveFn = isBelow$1
caretPosition = CaretPosition.before(node)
}
var targetClientRect = getClientRect(caretPosition)
do {
if (!caretPosition.isVisible()) {
continue
}
var rect = getClientRect(caretPosition)
if (isAboveFn(rect, targetClientRect)) {
continue
}
if (result.length > 0 && isBelowFn(rect, last$1(result))) {
line++
}
var clientRect = clone(rect)
clientRect.position = caretPosition
clientRect.line = line
if (predicateFn(clientRect)) {
return result
}
result.push(clientRect)
} while ((caretPosition = walkFn(caretPosition)))
return result
}
var isAboveLine = function (lineNumber) {
return function (clientRect) {
return aboveLineNumber(lineNumber, clientRect)
}
}
var isLine = function (lineNumber) {
return function (clientRect) {
return isLineNumber(lineNumber, clientRect)
}
}
var isContentEditableFalse$3 = isContentEditableFalse$b
var findNode = findNode$1
var distanceToRectLeft = function (clientRect, clientX) {
return Math.abs(clientRect.left - clientX)
}
var distanceToRectRight = function (clientRect, clientX) {
return Math.abs(clientRect.right - clientX)
}
var isInsideX = function (clientX, clientRect) {
return clientX >= clientRect.left && clientX <= clientRect.right
}
var isInsideY = function (clientY, clientRect) {
return clientY >= clientRect.top && clientY <= clientRect.bottom
}
var isNodeClientRect = function (rect) {
return hasNonNullableKey(rect, 'node')
}
var findClosestClientRect = function (clientRects, clientX, allowInside) {
if (allowInside === void 0) {
allowInside = always
}
return reduce(clientRects, function (oldClientRect, clientRect) {
if (isInsideX(clientX, clientRect)) {
return allowInside(clientRect) ? clientRect : oldClientRect
}
if (isInsideX(clientX, oldClientRect)) {
return allowInside(oldClientRect) ? oldClientRect : clientRect
}
var oldDistance = Math.min(
distanceToRectLeft(oldClientRect, clientX),
distanceToRectRight(oldClientRect, clientX)
)
var newDistance = Math.min(
distanceToRectLeft(clientRect, clientX),
distanceToRectRight(clientRect, clientX)
)
if (
newDistance === oldDistance &&
isNodeClientRect(clientRect) &&
isContentEditableFalse$3(clientRect.node)
) {
return clientRect
}
if (newDistance < oldDistance) {
return clientRect
}
return oldClientRect
})
}
var walkUntil = function (
direction,
root,
predicateFn,
startNode,
includeChildren
) {
var node = findNode(
startNode,
direction,
isEditableCaretCandidate$1,
root,
!includeChildren
)
do {
if (!node || predicateFn(node)) {
return
}
} while (
(node = findNode(node, direction, isEditableCaretCandidate$1, root))
)
}
var findLineNodeRects = function (root, targetNodeRect, includeChildren) {
if (includeChildren === void 0) {
includeChildren = true
}
var clientRects = []
var collect = function (checkPosFn, node) {
var lineRects = filter$4(getClientRects([node]), function (clientRect) {
return !checkPosFn(clientRect, targetNodeRect)
})
clientRects = clientRects.concat(lineRects)
return lineRects.length === 0
}
clientRects.push(targetNodeRect)
walkUntil(
VDirection.Up,
root,
curry(collect, isAbove$1),
targetNodeRect.node,
includeChildren
)
walkUntil(
VDirection.Down,
root,
curry(collect, isBelow$1),
targetNodeRect.node,
includeChildren
)
return clientRects
}
var getFakeCaretTargets = function (root) {
return filter$4(from(root.getElementsByTagName('*')), isFakeCaretTarget)
}
var caretInfo = function (clientRect, clientX) {
return {
node: clientRect.node,
before:
distanceToRectLeft(clientRect, clientX) <
distanceToRectRight(clientRect, clientX),
}
}
var closestFakeCaret = function (root, clientX, clientY) {
var fakeTargetNodeRects = getClientRects(getFakeCaretTargets(root))
var targetNodeRects = filter$4(
fakeTargetNodeRects,
curry(isInsideY, clientY)
)
var checkInside = function (clientRect) {
return !isTable$3(clientRect.node) && !isMedia$2(clientRect.node)
}
var closestNodeRect = findClosestClientRect(
targetNodeRects,
clientX,
checkInside
)
if (closestNodeRect) {
var includeChildren = checkInside(closestNodeRect)
closestNodeRect = findClosestClientRect(
findLineNodeRects(root, closestNodeRect, includeChildren),
clientX,
checkInside
)
if (closestNodeRect && isFakeCaretTarget(closestNodeRect.node)) {
return caretInfo(closestNodeRect, clientX)
}
}
return null
}
var moveToRange = function (editor, rng) {
editor.selection.setRng(rng)
scrollRangeIntoView(editor, editor.selection.getRng())
}
var renderRangeCaretOpt = function (editor, range, scrollIntoView) {
return Optional.some(renderRangeCaret(editor, range, scrollIntoView))
}
var moveHorizontally = function (
editor,
direction,
range,
isBefore,
isAfter,
isElement
) {
var forwards = direction === HDirection.Forwards
var caretWalker = CaretWalker(editor.getBody())
var getNextPosFn = curry(
getVisualCaretPosition,
forwards ? caretWalker.next : caretWalker.prev
)
var isBeforeFn = forwards ? isBefore : isAfter
if (!range.collapsed) {
var node = getSelectedNode(range)
if (isElement(node)) {
return showCaret(
direction,
editor,
node,
direction === HDirection.Backwards,
false
)
}
}
var caretPosition = getNormalizedRangeEndPoint(
direction,
editor.getBody(),
range
)
if (isBeforeFn(caretPosition)) {
return selectNode(editor, caretPosition.getNode(!forwards))
}
var nextCaretPosition = normalizePosition(
forwards,
getNextPosFn(caretPosition)
)
var rangeIsInContainerBlock = isRangeInCaretContainerBlock(range)
if (!nextCaretPosition) {
return rangeIsInContainerBlock ? Optional.some(range) : Optional.none()
}
if (isBeforeFn(nextCaretPosition)) {
return showCaret(
direction,
editor,
nextCaretPosition.getNode(!forwards),
forwards,
false
)
}
var peekCaretPosition = getNextPosFn(nextCaretPosition)
if (peekCaretPosition && isBeforeFn(peekCaretPosition)) {
if (isMoveInsideSameBlock(nextCaretPosition, peekCaretPosition)) {
return showCaret(
direction,
editor,
peekCaretPosition.getNode(!forwards),
forwards,
false
)
}
}
if (rangeIsInContainerBlock) {
return renderRangeCaretOpt(editor, nextCaretPosition.toRange(), false)
}
return Optional.none()
}
var moveVertically = function (
editor,
direction,
range,
isBefore,
isAfter,
isElement
) {
var caretPosition = getNormalizedRangeEndPoint(
direction,
editor.getBody(),
range
)
var caretClientRect = last$1(caretPosition.getClientRects())
var forwards = direction === VDirection.Down
if (!caretClientRect) {
return Optional.none()
}
var walkerFn = forwards ? downUntil : upUntil
var linePositions = walkerFn(
editor.getBody(),
isAboveLine(1),
caretPosition
)
var nextLinePositions = filter$4(linePositions, isLine(1))
var clientX = caretClientRect.left
var nextLineRect = findClosestClientRect(nextLinePositions, clientX)
if (nextLineRect && isElement(nextLineRect.node)) {
var dist1 = Math.abs(clientX - nextLineRect.left)
var dist2 = Math.abs(clientX - nextLineRect.right)
return showCaret(
direction,
editor,
nextLineRect.node,
dist1 < dist2,
false
)
}
var currentNode
if (isBefore(caretPosition)) {
currentNode = caretPosition.getNode()
} else if (isAfter(caretPosition)) {
currentNode = caretPosition.getNode(true)
} else {
currentNode = getSelectedNode(range)
}
if (currentNode) {
var caretPositions = positionsUntil(
direction,
editor.getBody(),
isAboveLine(1),
currentNode
)
var closestNextLineRect = findClosestClientRect(
filter$4(caretPositions, isLine(1)),
clientX
)
if (closestNextLineRect) {
return renderRangeCaretOpt(
editor,
closestNextLineRect.position.toRange(),
false
)
}
closestNextLineRect = last$1(filter$4(caretPositions, isLine(0)))
if (closestNextLineRect) {
return renderRangeCaretOpt(
editor,
closestNextLineRect.position.toRange(),
false
)
}
}
if (nextLinePositions.length === 0) {
return getLineEndPoint(editor, forwards)
.filter(forwards ? isAfter : isBefore)
.map(function (pos) {
return renderRangeCaret(editor, pos.toRange(), false)
})
}
return Optional.none()
}
var getLineEndPoint = function (editor, forward) {
var rng = editor.selection.getRng()
var body = editor.getBody()
if (forward) {
var from = CaretPosition.fromRangeEnd(rng)
var result = getPositionsUntilNextLine(body, from)
return last$2(result.positions)
} else {
var from = CaretPosition.fromRangeStart(rng)
var result = getPositionsUntilPreviousLine(body, from)
return head(result.positions)
}
}
var moveToLineEndPoint$3 = function (editor, forward, isElementPosition) {
return getLineEndPoint(editor, forward)
.filter(isElementPosition)
.exists(function (pos) {
editor.selection.setRng(pos.toRange())
return true
})
}
var setCaretPosition = function (editor, pos) {
var rng = editor.dom.createRng()
rng.setStart(pos.container(), pos.offset())
rng.setEnd(pos.container(), pos.offset())
editor.selection.setRng(rng)
}
var setSelected = function (state, elm) {
if (state) {
elm.setAttribute('data-mce-selected', 'inline-boundary')
} else {
elm.removeAttribute('data-mce-selected')
}
}
var renderCaretLocation = function (editor, caret, location) {
return renderCaret(caret, location).map(function (pos) {
setCaretPosition(editor, pos)
return location
})
}
var findLocation = function (editor, caret, forward) {
var rootNode = editor.getBody()
var from = CaretPosition.fromRangeStart(editor.selection.getRng())
var isInlineTarget$1 = curry(isInlineTarget, editor)
var location = findLocation$1(forward, isInlineTarget$1, rootNode, from)
return location.bind(function (location) {
return renderCaretLocation(editor, caret, location)
})
}
var toggleInlines = function (isInlineTarget, dom, elms) {
var inlineBoundaries = map$3(
descendants(
SugarElement.fromDom(dom.getRoot()),
'*[data-mce-selected="inline-boundary"]'
),
function (e) {
return e.dom
}
)
var selectedInlines = filter$4(inlineBoundaries, isInlineTarget)
var targetInlines = filter$4(elms, isInlineTarget)
each$k(
difference(selectedInlines, targetInlines),
curry(setSelected, false)
)
each$k(difference(targetInlines, selectedInlines), curry(setSelected, true))
}
var safeRemoveCaretContainer = function (editor, caret) {
if (
editor.selection.isCollapsed() &&
editor.composing !== true &&
caret.get()
) {
var pos = CaretPosition.fromRangeStart(editor.selection.getRng())
if (CaretPosition.isTextPosition(pos) && isAtZwsp(pos) === false) {
setCaretPosition(editor, removeAndReposition(caret.get(), pos))
caret.set(null)
}
}
}
var renderInsideInlineCaret = function (isInlineTarget, editor, caret, elms) {
if (editor.selection.isCollapsed()) {
var inlines = filter$4(elms, isInlineTarget)
each$k(inlines, function (_inline) {
var pos = CaretPosition.fromRangeStart(editor.selection.getRng())
readLocation(isInlineTarget, editor.getBody(), pos).bind(function (
location
) {
return renderCaretLocation(editor, caret, location)
})
})
}
}
var move$2 = function (editor, caret, forward) {
return isInlineBoundariesEnabled(editor)
? findLocation(editor, caret, forward).isSome()
: false
}
var moveWord = function (forward, editor, _caret) {
return isInlineBoundariesEnabled(editor)
? moveByWord(forward, editor)
: false
}
var setupSelectedState = function (editor) {
var caret = Cell(null)
var isInlineTarget$1 = curry(isInlineTarget, editor)
editor.on('NodeChange', function (e) {
if (
isInlineBoundariesEnabled(editor) &&
!(Env.browser.isIE() && e.initial)
) {
toggleInlines(isInlineTarget$1, editor.dom, e.parents)
safeRemoveCaretContainer(editor, caret)
renderInsideInlineCaret(isInlineTarget$1, editor, caret, e.parents)
}
})
return caret
}
var moveNextWord = curry(moveWord, true)
var movePrevWord = curry(moveWord, false)
var moveToLineEndPoint$2 = function (editor, forward, caret) {
if (isInlineBoundariesEnabled(editor)) {
var linePoint = getLineEndPoint(editor, forward).getOrThunk(function () {
var rng = editor.selection.getRng()
return forward
? CaretPosition.fromRangeEnd(rng)
: CaretPosition.fromRangeStart(rng)
})
return readLocation(
curry(isInlineTarget, editor),
editor.getBody(),
linePoint
).exists(function (loc) {
var outsideLoc = outside(loc)
return renderCaret(caret, outsideLoc).exists(function (pos) {
setCaretPosition(editor, pos)
return true
})
})
} else {
return false
}
}
var rangeFromPositions = function (from, to) {
var range = document.createRange()
range.setStart(from.container(), from.offset())
range.setEnd(to.container(), to.offset())
return range
}
var hasOnlyTwoOrLessPositionsLeft = function (elm) {
return lift2(
firstPositionIn(elm),
lastPositionIn(elm),
function (firstPos, lastPos) {
var normalizedFirstPos = normalizePosition(true, firstPos)
var normalizedLastPos = normalizePosition(false, lastPos)
return nextPosition(elm, normalizedFirstPos).forall(function (pos) {
return pos.isEqual(normalizedLastPos)
})
}
).getOr(true)
}
var setCaretLocation = function (editor, caret) {
return function (location) {
return renderCaret(caret, location).exists(function (pos) {
setCaretPosition(editor, pos)
return true
})
}
}
var deleteFromTo = function (editor, caret, from, to) {
var rootNode = editor.getBody()
var isInlineTarget$1 = curry(isInlineTarget, editor)
editor.undoManager.ignore(function () {
editor.selection.setRng(rangeFromPositions(from, to))
editor.execCommand('Delete')
readLocation(
isInlineTarget$1,
rootNode,
CaretPosition.fromRangeStart(editor.selection.getRng())
)
.map(inside)
.map(setCaretLocation(editor, caret))
})
editor.nodeChanged()
}
var rescope = function (rootNode, node) {
var parentBlock = getParentBlock$2(node, rootNode)
return parentBlock ? parentBlock : rootNode
}
var backspaceDeleteCollapsed = function (editor, caret, forward, from) {
var rootNode = rescope(editor.getBody(), from.container())
var isInlineTarget$1 = curry(isInlineTarget, editor)
var fromLocation = readLocation(isInlineTarget$1, rootNode, from)
return fromLocation
.bind(function (location) {
if (forward) {
return location.fold(
constant(Optional.some(inside(location))),
Optional.none,
constant(Optional.some(outside(location))),
Optional.none
)
} else {
return location.fold(
Optional.none,
constant(Optional.some(outside(location))),
Optional.none,
constant(Optional.some(inside(location)))
)
}
})
.map(setCaretLocation(editor, caret))
.getOrThunk(function () {
var toPosition = navigate(forward, rootNode, from)
var toLocation = toPosition.bind(function (pos) {
return readLocation(isInlineTarget$1, rootNode, pos)
})
return lift2(fromLocation, toLocation, function () {
return findRootInline(isInlineTarget$1, rootNode, from).exists(
function (elm) {
if (hasOnlyTwoOrLessPositionsLeft(elm)) {
deleteElement$2(editor, forward, SugarElement.fromDom(elm))
return true
} else {
return false
}
}
)
})
.orThunk(function () {
return toLocation.bind(function (_) {
return toPosition.map(function (to) {
if (forward) {
deleteFromTo(editor, caret, from, to)
} else {
deleteFromTo(editor, caret, to, from)
}
return true
})
})
})
.getOr(false)
})
}
var backspaceDelete$3 = function (editor, caret, forward) {
if (editor.selection.isCollapsed() && isInlineBoundariesEnabled(editor)) {
var from = CaretPosition.fromRangeStart(editor.selection.getRng())
return backspaceDeleteCollapsed(editor, caret, forward, from)
}
return false
}
var getParentInlines = function (rootElm, startElm) {
var parents = parentsAndSelf(startElm, rootElm)
return findIndex$2(parents, isBlock$2).fold(
constant(parents),
function (index) {
return parents.slice(0, index)
}
)
}
var hasOnlyOneChild = function (elm) {
return childNodesCount(elm) === 1
}
var deleteLastPosition = function (forward, editor, target, parentInlines) {
var isFormatElement$1 = curry(isFormatElement, editor)
var formatNodes = map$3(
filter$4(parentInlines, isFormatElement$1),
function (elm) {
return elm.dom
}
)
if (formatNodes.length === 0) {
deleteElement$2(editor, forward, target)
} else {
var pos = replaceWithCaretFormat(target.dom, formatNodes)
editor.selection.setRng(pos.toRange())
}
}
var deleteCaret$1 = function (editor, forward) {
var rootElm = SugarElement.fromDom(editor.getBody())
var startElm = SugarElement.fromDom(editor.selection.getStart())
var parentInlines = filter$4(
getParentInlines(rootElm, startElm),
hasOnlyOneChild
)
return last$2(parentInlines).exists(function (target) {
var fromPos = CaretPosition.fromRangeStart(editor.selection.getRng())
if (
willDeleteLastPositionInElement(forward, fromPos, target.dom) &&
!isEmptyCaretFormatElement(target)
) {
deleteLastPosition(forward, editor, target, parentInlines)
return true
} else {
return false
}
})
}
var backspaceDelete$2 = function (editor, forward) {
return editor.selection.isCollapsed()
? deleteCaret$1(editor, forward)
: false
}
var deleteElement = function (editor, forward, element) {
editor._selectionOverrides.hideFakeCaret()
deleteElement$2(editor, forward, SugarElement.fromDom(element))
return true
}
var deleteCaret = function (editor, forward) {
var isNearMedia = forward ? isBeforeMedia : isAfterMedia
var direction = forward ? HDirection.Forwards : HDirection.Backwards
var fromPos = getNormalizedRangeEndPoint(
direction,
editor.getBody(),
editor.selection.getRng()
)
if (isNearMedia(fromPos)) {
return deleteElement(editor, forward, fromPos.getNode(!forward))
} else {
return Optional.from(normalizePosition(forward, fromPos))
.filter(function (pos) {
return isNearMedia(pos) && isMoveInsideSameBlock(fromPos, pos)
})
.exists(function (pos) {
return deleteElement(editor, forward, pos.getNode(!forward))
})
}
}
var deleteRange = function (editor, forward) {
var selectedNode = editor.selection.getNode()
return isMedia$2(selectedNode)
? deleteElement(editor, forward, selectedNode)
: false
}
var backspaceDelete$1 = function (editor, forward) {
return editor.selection.isCollapsed()
? deleteCaret(editor, forward)
: deleteRange(editor, forward)
}
var isEditable = function (target) {
return closest$3(target, function (elm) {
return (
isContentEditableTrue$4(elm.dom) || isContentEditableFalse$b(elm.dom)
)
}).exists(function (elm) {
return isContentEditableTrue$4(elm.dom)
})
}
var parseIndentValue = function (value) {
var number = parseInt(value, 10)
return isNaN(number) ? 0 : number
}
var getIndentStyleName = function (useMargin, element) {
var indentStyleName = useMargin || isTable$2(element) ? 'margin' : 'padding'
var suffix = get$5(element, 'direction') === 'rtl' ? '-right' : '-left'
return indentStyleName + suffix
}
var indentElement = function (dom, command, useMargin, value, unit, element) {
var indentStyleName = getIndentStyleName(
useMargin,
SugarElement.fromDom(element)
)
if (command === 'outdent') {
var styleValue = Math.max(
0,
parseIndentValue(element.style[indentStyleName]) - value
)
dom.setStyle(
element,
indentStyleName,
styleValue ? styleValue + unit : ''
)
} else {
var styleValue =
parseIndentValue(element.style[indentStyleName]) + value + unit
dom.setStyle(element, indentStyleName, styleValue)
}
}
var validateBlocks = function (editor, blocks) {
return forall(blocks, function (block) {
var indentStyleName = getIndentStyleName(
shouldIndentUseMargin(editor),
block
)
var intentValue = getRaw(block, indentStyleName)
.map(parseIndentValue)
.getOr(0)
var contentEditable = editor.dom.getContentEditable(block.dom)
return contentEditable !== 'false' && intentValue > 0
})
}
var canOutdent = function (editor) {
var blocks = getBlocksToIndent(editor)
return (
!editor.mode.isReadOnly() &&
(blocks.length > 1 || validateBlocks(editor, blocks))
)
}
var isListComponent = function (el) {
return isList(el) || isListItem(el)
}
var parentIsListComponent = function (el) {
return parent(el).exists(isListComponent)
}
var getBlocksToIndent = function (editor) {
return filter$4(
fromDom$1(editor.selection.getSelectedBlocks()),
function (el) {
return (
!isListComponent(el) && !parentIsListComponent(el) && isEditable(el)
)
}
)
}
var handle = function (editor, command) {
var dom = editor.dom,
selection = editor.selection,
formatter = editor.formatter
var indentation = getIndentation(editor)
var indentUnit = /[a-z%]+$/i.exec(indentation)[0]
var indentValue = parseInt(indentation, 10)
var useMargin = shouldIndentUseMargin(editor)
var forcedRootBlock = getForcedRootBlock(editor)
if (
!editor.queryCommandState('InsertUnorderedList') &&
!editor.queryCommandState('InsertOrderedList')
) {
if (
forcedRootBlock === '' &&
!dom.getParent(selection.getNode(), dom.isBlock)
) {
formatter.apply('div')
}
}
each$k(getBlocksToIndent(editor), function (block) {
indentElement(dom, command, useMargin, indentValue, indentUnit, block.dom)
})
}
var backspaceDelete = function (editor, _forward) {
if (editor.selection.isCollapsed() && canOutdent(editor)) {
var dom = editor.dom
var rng = editor.selection.getRng()
var pos = CaretPosition.fromRangeStart(rng)
var block = dom.getParent(rng.startContainer, dom.isBlock)
if (
block !== null &&
isAtStartOfBlock(SugarElement.fromDom(block), pos)
) {
handle(editor, 'outdent')
return true
}
}
return false
}
var nativeCommand = function (editor, command) {
editor.getDoc().execCommand(command, false, null)
}
var deleteCommand = function (editor, caret) {
if (backspaceDelete(editor)) {
return
} else if (backspaceDelete$5(editor, false)) {
return
} else if (backspaceDelete$6(editor, false)) {
return
} else if (backspaceDelete$3(editor, caret, false)) {
return
} else if (backspaceDelete$8(editor, false)) {
return
} else if (backspaceDelete$9(editor)) {
return
} else if (backspaceDelete$4(editor, false)) {
return
} else if (backspaceDelete$1(editor, false)) {
return
} else if (backspaceDelete$7(editor)) {
return
} else if (backspaceDelete$2(editor, false)) {
return
} else {
nativeCommand(editor, 'Delete')
paddEmptyBody(editor)
}
}
var forwardDeleteCommand = function (editor, caret) {
if (backspaceDelete$5(editor, true)) {
return
} else if (backspaceDelete$6(editor, true)) {
return
} else if (backspaceDelete$3(editor, caret, true)) {
return
} else if (backspaceDelete$8(editor, true)) {
return
} else if (backspaceDelete$9(editor)) {
return
} else if (backspaceDelete$4(editor, true)) {
return
} else if (backspaceDelete$1(editor, true)) {
return
} else if (backspaceDelete$7(editor)) {
return
} else if (backspaceDelete$2(editor, true)) {
return
} else {
nativeCommand(editor, 'ForwardDelete')
}
}
var setup$f = function (editor, caret) {
editor.addCommand('delete', function () {
deleteCommand(editor, caret)
})
editor.addCommand('forwardDelete', function () {
forwardDeleteCommand(editor, caret)
})
}
var SIGNIFICANT_MOVE = 5
var LONGPRESS_DELAY = 400
var getTouch = function (event) {
if (event.touches === undefined || event.touches.length !== 1) {
return Optional.none()
}
return Optional.some(event.touches[0])
}
var isFarEnough = function (touch, data) {
var distX = Math.abs(touch.clientX - data.x)
var distY = Math.abs(touch.clientY - data.y)
return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE
}
var setup$e = function (editor) {
var startData = value()
var longpressFired = Cell(false)
var debounceLongpress = last(function (e) {
editor.fire('longpress', __assign(__assign({}, e), { type: 'longpress' }))
longpressFired.set(true)
}, LONGPRESS_DELAY)
editor.on(
'touchstart',
function (e) {
getTouch(e).each(function (touch) {
debounceLongpress.cancel()
var data = {
x: touch.clientX,
y: touch.clientY,
target: e.target,
}
debounceLongpress.throttle(e)
longpressFired.set(false)
startData.set(data)
})
},
true
)
editor.on(
'touchmove',
function (e) {
debounceLongpress.cancel()
getTouch(e).each(function (touch) {
startData.on(function (data) {
if (isFarEnough(touch, data)) {
startData.clear()
longpressFired.set(false)
editor.fire('longpresscancel')
}
})
})
},
true
)
editor.on(
'touchend touchcancel',
function (e) {
debounceLongpress.cancel()
if (e.type === 'touchcancel') {
return
}
startData
.get()
.filter(function (data) {
return data.target.isEqualNode(e.target)
})
.each(function () {
if (longpressFired.get()) {
e.preventDefault()
} else {
editor.fire('tap', __assign(__assign({}, e), { type: 'tap' }))
}
})
},
true
)
}
var isBlockElement = function (blockElements, node) {
return has$2(blockElements, node.nodeName)
}
var isValidTarget = function (blockElements, node) {
if (isText$7(node)) {
return true
} else if (isElement$5(node)) {
return !isBlockElement(blockElements, node) && !isBookmarkNode$1(node)
} else {
return false
}
}
var hasBlockParent = function (blockElements, root, node) {
return exists(
parents(SugarElement.fromDom(node), SugarElement.fromDom(root)),
function (elm) {
return isBlockElement(blockElements, elm.dom)
}
)
}
var shouldRemoveTextNode = function (blockElements, node) {
if (isText$7(node)) {
if (node.nodeValue.length === 0) {
return true
} else if (
/^\s+$/.test(node.nodeValue) &&
(!node.nextSibling || isBlockElement(blockElements, node.nextSibling))
) {
return true
}
}
return false
}
var addRootBlocks = function (editor) {
var dom = editor.dom,
selection = editor.selection
var schema = editor.schema,
blockElements = schema.getBlockElements()
var node = selection.getStart()
var rootNode = editor.getBody()
var rootBlockNode, tempNode, wrapped
var forcedRootBlock = getForcedRootBlock(editor)
if (!node || !isElement$5(node) || !forcedRootBlock) {
return
}
var rootNodeName = rootNode.nodeName.toLowerCase()
if (
!schema.isValidChild(rootNodeName, forcedRootBlock.toLowerCase()) ||
hasBlockParent(blockElements, rootNode, node)
) {
return
}
var rng = selection.getRng()
var startContainer = rng.startContainer
var startOffset = rng.startOffset
var endContainer = rng.endContainer
var endOffset = rng.endOffset
var restoreSelection = hasFocus(editor)
node = rootNode.firstChild
while (node) {
if (isValidTarget(blockElements, node)) {
if (shouldRemoveTextNode(blockElements, node)) {
tempNode = node
node = node.nextSibling
dom.remove(tempNode)
continue
}
if (!rootBlockNode) {
rootBlockNode = dom.create(
forcedRootBlock,
getForcedRootBlockAttrs(editor)
)
node.parentNode.insertBefore(rootBlockNode, node)
wrapped = true
}
tempNode = node
node = node.nextSibling
rootBlockNode.appendChild(tempNode)
} else {
rootBlockNode = null
node = node.nextSibling
}
}
if (wrapped && restoreSelection) {
rng.setStart(startContainer, startOffset)
rng.setEnd(endContainer, endOffset)
selection.setRng(rng)
editor.nodeChanged()
}
}
var setup$d = function (editor) {
if (getForcedRootBlock(editor)) {
editor.on('NodeChange', curry(addRootBlocks, editor))
}
}
var findBlockCaretContainer = function (editor) {
return descendant(
SugarElement.fromDom(editor.getBody()),
'*[data-mce-caret]'
)
.map(function (elm) {
return elm.dom
})
.getOrNull()
}
var removeIeControlRect = function (editor) {
editor.selection.setRng(editor.selection.getRng())
}
var showBlockCaretContainer = function (editor, blockCaretContainer) {
if (blockCaretContainer.hasAttribute('data-mce-caret')) {
showCaretContainerBlock(blockCaretContainer)
removeIeControlRect(editor)
editor.selection.scrollIntoView(blockCaretContainer)
}
}
var handleBlockContainer = function (editor, e) {
var blockCaretContainer = findBlockCaretContainer(editor)
if (!blockCaretContainer) {
return
}
if (e.type === 'compositionstart') {
e.preventDefault()
e.stopPropagation()
showBlockCaretContainer(editor, blockCaretContainer)
return
}
if (hasContent(blockCaretContainer)) {
showBlockCaretContainer(editor, blockCaretContainer)
editor.undoManager.add()
}
}
var setup$c = function (editor) {
editor.on('keyup compositionstart', curry(handleBlockContainer, editor))
}
var isContentEditableFalse$2 = isContentEditableFalse$b
var moveToCeFalseHorizontally = function (direction, editor, range) {
return moveHorizontally(
editor,
direction,
range,
isBeforeContentEditableFalse,
isAfterContentEditableFalse,
isContentEditableFalse$2
)
}
var moveToCeFalseVertically = function (direction, editor, range) {
var isBefore = function (caretPosition) {
return (
isBeforeContentEditableFalse(caretPosition) ||
isBeforeTable(caretPosition)
)
}
var isAfter = function (caretPosition) {
return (
isAfterContentEditableFalse(caretPosition) ||
isAfterTable(caretPosition)
)
}
return moveVertically(
editor,
direction,
range,
isBefore,
isAfter,
isContentEditableFalse$2
)
}
var createTextBlock = function (editor) {
var textBlock = editor.dom.create(getForcedRootBlock(editor))
if (!Env.ie || Env.ie >= 11) {
textBlock.innerHTML = '
'
}
return textBlock
}
var exitPreBlock = function (editor, direction, range) {
var caretWalker = CaretWalker(editor.getBody())
var getVisualCaretPosition$1 = curry(
getVisualCaretPosition,
direction === 1 ? caretWalker.next : caretWalker.prev
)
if (range.collapsed && hasForcedRootBlock(editor)) {
var pre = editor.dom.getParent(range.startContainer, 'PRE')
if (!pre) {
return
}
var caretPos = getVisualCaretPosition$1(
CaretPosition.fromRangeStart(range)
)
if (!caretPos) {
var newBlock = createTextBlock(editor)
if (direction === 1) {
editor.$(pre).after(newBlock)
} else {
editor.$(pre).before(newBlock)
}
editor.selection.select(newBlock, true)
editor.selection.collapse()
}
}
}
var getHorizontalRange = function (editor, forward) {
var direction = forward ? HDirection.Forwards : HDirection.Backwards
var range = editor.selection.getRng()
return moveToCeFalseHorizontally(direction, editor, range).orThunk(
function () {
exitPreBlock(editor, direction, range)
return Optional.none()
}
)
}
var getVerticalRange = function (editor, down) {
var direction = down ? 1 : -1
var range = editor.selection.getRng()
return moveToCeFalseVertically(direction, editor, range).orThunk(
function () {
exitPreBlock(editor, direction, range)
return Optional.none()
}
)
}
var moveH$2 = function (editor, forward) {
return getHorizontalRange(editor, forward).exists(function (newRange) {
moveToRange(editor, newRange)
return true
})
}
var moveV$3 = function (editor, down) {
return getVerticalRange(editor, down).exists(function (newRange) {
moveToRange(editor, newRange)
return true
})
}
var moveToLineEndPoint$1 = function (editor, forward) {
var isCefPosition = forward
? isAfterContentEditableFalse
: isBeforeContentEditableFalse
return moveToLineEndPoint$3(editor, forward, isCefPosition)
}
var isTarget = function (node) {
return contains$3(['figcaption'], name(node))
}
var rangeBefore = function (target) {
var rng = document.createRange()
rng.setStartBefore(target.dom)
rng.setEndBefore(target.dom)
return rng
}
var insertElement = function (root, elm, forward) {
if (forward) {
append$1(root, elm)
} else {
prepend(root, elm)
}
}
var insertBr = function (root, forward) {
var br = SugarElement.fromTag('br')
insertElement(root, br, forward)
return rangeBefore(br)
}
var insertBlock = function (root, forward, blockName, attrs) {
var block = SugarElement.fromTag(blockName)
var br = SugarElement.fromTag('br')
setAll$1(block, attrs)
append$1(block, br)
insertElement(root, block, forward)
return rangeBefore(br)
}
var insertEmptyLine = function (root, rootBlockName, attrs, forward) {
if (rootBlockName === '') {
return insertBr(root, forward)
} else {
return insertBlock(root, forward, rootBlockName, attrs)
}
}
var getClosestTargetBlock = function (pos, root) {
var isRoot = curry(eq, root)
return closest$3(
SugarElement.fromDom(pos.container()),
isBlock$2,
isRoot
).filter(isTarget)
}
var isAtFirstOrLastLine = function (root, forward, pos) {
return forward ? isAtLastLine(root.dom, pos) : isAtFirstLine(root.dom, pos)
}
var moveCaretToNewEmptyLine = function (editor, forward) {
var root = SugarElement.fromDom(editor.getBody())
var pos = CaretPosition.fromRangeStart(editor.selection.getRng())
var rootBlock = getForcedRootBlock(editor)
var rootBlockAttrs = getForcedRootBlockAttrs(editor)
return getClosestTargetBlock(pos, root).exists(function () {
if (isAtFirstOrLastLine(root, forward, pos)) {
var rng = insertEmptyLine(root, rootBlock, rootBlockAttrs, forward)
editor.selection.setRng(rng)
return true
} else {
return false
}
})
}
var moveV$2 = function (editor, forward) {
if (editor.selection.isCollapsed()) {
return moveCaretToNewEmptyLine(editor, forward)
} else {
return false
}
}
var defaultPatterns = function (patterns) {
return map$3(patterns, function (pattern) {
return __assign(
{
shiftKey: false,
altKey: false,
ctrlKey: false,
metaKey: false,
keyCode: 0,
action: noop,
},
pattern
)
})
}
var matchesEvent = function (pattern, evt) {
return (
evt.keyCode === pattern.keyCode &&
evt.shiftKey === pattern.shiftKey &&
evt.altKey === pattern.altKey &&
evt.ctrlKey === pattern.ctrlKey &&
evt.metaKey === pattern.metaKey
)
}
var match$1 = function (patterns, evt) {
return bind(defaultPatterns(patterns), function (pattern) {
return matchesEvent(pattern, evt) ? [pattern] : []
})
}
var action = function (f) {
var x = []
for (var _i = 1; _i < arguments.length; _i++) {
x[_i - 1] = arguments[_i]
}
return function () {
return f.apply(null, x)
}
}
var execute = function (patterns, evt) {
return find$3(match$1(patterns, evt), function (pattern) {
return pattern.action()
})
}
var moveH$1 = function (editor, forward) {
var direction = forward ? HDirection.Forwards : HDirection.Backwards
var range = editor.selection.getRng()
return moveHorizontally(
editor,
direction,
range,
isBeforeMedia,
isAfterMedia,
isMedia$2
).exists(function (newRange) {
moveToRange(editor, newRange)
return true
})
}
var moveV$1 = function (editor, down) {
var direction = down ? 1 : -1
var range = editor.selection.getRng()
return moveVertically(
editor,
direction,
range,
isBeforeMedia,
isAfterMedia,
isMedia$2
).exists(function (newRange) {
moveToRange(editor, newRange)
return true
})
}
var moveToLineEndPoint = function (editor, forward) {
var isNearMedia = forward ? isAfterMedia : isBeforeMedia
return moveToLineEndPoint$3(editor, forward, isNearMedia)
}
var deflate = function (rect, delta) {
return {
left: rect.left - delta,
top: rect.top - delta,
right: rect.right + delta * 2,
bottom: rect.bottom + delta * 2,
width: rect.width + delta,
height: rect.height + delta,
}
}
var getCorners = function (getYAxisValue, tds) {
return bind(tds, function (td) {
var rect = deflate(clone(td.getBoundingClientRect()), -1)
return [
{
x: rect.left,
y: getYAxisValue(rect),
cell: td,
},
{
x: rect.right,
y: getYAxisValue(rect),
cell: td,
},
]
})
}
var findClosestCorner = function (corners, x, y) {
return foldl(
corners,
function (acc, newCorner) {
return acc.fold(
function () {
return Optional.some(newCorner)
},
function (oldCorner) {
var oldDist = Math.sqrt(
Math.abs(oldCorner.x - x) + Math.abs(oldCorner.y - y)
)
var newDist = Math.sqrt(
Math.abs(newCorner.x - x) + Math.abs(newCorner.y - y)
)
return Optional.some(newDist < oldDist ? newCorner : oldCorner)
}
)
},
Optional.none()
)
}
var getClosestCell = function (getYAxisValue, isTargetCorner, table, x, y) {
var cells = descendants(SugarElement.fromDom(table), 'td,th,caption').map(
function (e) {
return e.dom
}
)
var corners = filter$4(getCorners(getYAxisValue, cells), function (corner) {
return isTargetCorner(corner, y)
})
return findClosestCorner(corners, x, y).map(function (corner) {
return corner.cell
})
}
var getBottomValue = function (rect) {
return rect.bottom
}
var getTopValue = function (rect) {
return rect.top
}
var isAbove = function (corner, y) {
return corner.y < y
}
var isBelow = function (corner, y) {
return corner.y > y
}
var getClosestCellAbove = curry(getClosestCell, getBottomValue, isAbove)
var getClosestCellBelow = curry(getClosestCell, getTopValue, isBelow)
var findClosestPositionInAboveCell = function (table, pos) {
return head(pos.getClientRects())
.bind(function (rect) {
return getClosestCellAbove(table, rect.left, rect.top)
})
.bind(function (cell) {
return findClosestHorizontalPosition(getLastLinePositions(cell), pos)
})
}
var findClosestPositionInBelowCell = function (table, pos) {
return last$2(pos.getClientRects())
.bind(function (rect) {
return getClosestCellBelow(table, rect.left, rect.top)
})
.bind(function (cell) {
return findClosestHorizontalPosition(getFirstLinePositions(cell), pos)
})
}
var hasNextBreak = function (getPositionsUntil, scope, lineInfo) {
return lineInfo.breakAt.exists(function (breakPos) {
return getPositionsUntil(scope, breakPos).breakAt.isSome()
})
}
var startsWithWrapBreak = function (lineInfo) {
return (
lineInfo.breakType === BreakType.Wrap && lineInfo.positions.length === 0
)
}
var startsWithBrBreak = function (lineInfo) {
return (
lineInfo.breakType === BreakType.Br && lineInfo.positions.length === 1
)
}
var isAtTableCellLine = function (getPositionsUntil, scope, pos) {
var lineInfo = getPositionsUntil(scope, pos)
if (
startsWithWrapBreak(lineInfo) ||
(!isBr$5(pos.getNode()) && startsWithBrBreak(lineInfo))
) {
return !hasNextBreak(getPositionsUntil, scope, lineInfo)
} else {
return lineInfo.breakAt.isNone()
}
}
var isAtFirstTableCellLine = curry(
isAtTableCellLine,
getPositionsUntilPreviousLine
)
var isAtLastTableCellLine = curry(
isAtTableCellLine,
getPositionsUntilNextLine
)
var isCaretAtStartOrEndOfTable = function (forward, rng, table) {
var caretPos = CaretPosition.fromRangeStart(rng)
return positionIn(!forward, table).exists(function (pos) {
return pos.isEqual(caretPos)
})
}
var navigateHorizontally = function (editor, forward, table, _td) {
var rng = editor.selection.getRng()
var direction = forward ? 1 : -1
if (
isFakeCaretTableBrowser() &&
isCaretAtStartOrEndOfTable(forward, rng, table)
) {
showCaret(direction, editor, table, !forward, false).each(function (
newRng
) {
moveToRange(editor, newRng)
})
return true
}
return false
}
var getClosestAbovePosition = function (root, table, start) {
return findClosestPositionInAboveCell(table, start)
.orThunk(function () {
return head(start.getClientRects()).bind(function (rect) {
return findClosestHorizontalPositionFromPoint(
getPositionsAbove(root, CaretPosition.before(table)),
rect.left
)
})
})
.getOr(CaretPosition.before(table))
}
var getClosestBelowPosition = function (root, table, start) {
return findClosestPositionInBelowCell(table, start)
.orThunk(function () {
return head(start.getClientRects()).bind(function (rect) {
return findClosestHorizontalPositionFromPoint(
getPositionsBelow(root, CaretPosition.after(table)),
rect.left
)
})
})
.getOr(CaretPosition.after(table))
}
var getTable = function (previous, pos) {
var node = pos.getNode(previous)
return isElement$5(node) && node.nodeName === 'TABLE'
? Optional.some(node)
: Optional.none()
}
var renderBlock = function (down, editor, table, pos) {
var forcedRootBlock = getForcedRootBlock(editor)
if (forcedRootBlock) {
editor.undoManager.transact(function () {
var element = SugarElement.fromTag(forcedRootBlock)
setAll$1(element, getForcedRootBlockAttrs(editor))
append$1(element, SugarElement.fromTag('br'))
if (down) {
after$3(SugarElement.fromDom(table), element)
} else {
before$4(SugarElement.fromDom(table), element)
}
var rng = editor.dom.createRng()
rng.setStart(element.dom, 0)
rng.setEnd(element.dom, 0)
moveToRange(editor, rng)
})
} else {
moveToRange(editor, pos.toRange())
}
}
var moveCaret = function (editor, down, pos) {
var table = down ? getTable(true, pos) : getTable(false, pos)
var last = down === false
table.fold(
function () {
return moveToRange(editor, pos.toRange())
},
function (table) {
return positionIn(last, editor.getBody())
.filter(function (lastPos) {
return lastPos.isEqual(pos)
})
.fold(
function () {
return moveToRange(editor, pos.toRange())
},
function (_) {
return renderBlock(down, editor, table, pos)
}
)
}
)
}
var navigateVertically = function (editor, down, table, td) {
var rng = editor.selection.getRng()
var pos = CaretPosition.fromRangeStart(rng)
var root = editor.getBody()
if (!down && isAtFirstTableCellLine(td, pos)) {
var newPos = getClosestAbovePosition(root, table, pos)
moveCaret(editor, down, newPos)
return true
} else if (down && isAtLastTableCellLine(td, pos)) {
var newPos = getClosestBelowPosition(root, table, pos)
moveCaret(editor, down, newPos)
return true
} else {
return false
}
}
var move$1 = function (editor, forward, mover) {
return Optional.from(
editor.dom.getParent(editor.selection.getNode(), 'td,th')
)
.bind(function (td) {
return Optional.from(editor.dom.getParent(td, 'table')).map(function (
table
) {
return mover(editor, forward, table, td)
})
})
.getOr(false)
}
var moveH = function (editor, forward) {
return move$1(editor, forward, navigateHorizontally)
}
var moveV = function (editor, forward) {
return move$1(editor, forward, navigateVertically)
}
var executeKeydownOverride$3 = function (editor, caret, evt) {
var os = detect().os
execute(
[
{
keyCode: VK.RIGHT,
action: action(moveH$2, editor, true),
},
{
keyCode: VK.LEFT,
action: action(moveH$2, editor, false),
},
{
keyCode: VK.UP,
action: action(moveV$3, editor, false),
},
{
keyCode: VK.DOWN,
action: action(moveV$3, editor, true),
},
{
keyCode: VK.RIGHT,
action: action(moveH, editor, true),
},
{
keyCode: VK.LEFT,
action: action(moveH, editor, false),
},
{
keyCode: VK.UP,
action: action(moveV, editor, false),
},
{
keyCode: VK.DOWN,
action: action(moveV, editor, true),
},
{
keyCode: VK.RIGHT,
action: action(moveH$1, editor, true),
},
{
keyCode: VK.LEFT,
action: action(moveH$1, editor, false),
},
{
keyCode: VK.UP,
action: action(moveV$1, editor, false),
},
{
keyCode: VK.DOWN,
action: action(moveV$1, editor, true),
},
{
keyCode: VK.RIGHT,
action: action(move$2, editor, caret, true),
},
{
keyCode: VK.LEFT,
action: action(move$2, editor, caret, false),
},
{
keyCode: VK.RIGHT,
ctrlKey: !os.isOSX(),
altKey: os.isOSX(),
action: action(moveNextWord, editor, caret),
},
{
keyCode: VK.LEFT,
ctrlKey: !os.isOSX(),
altKey: os.isOSX(),
action: action(movePrevWord, editor, caret),
},
{
keyCode: VK.UP,
action: action(moveV$2, editor, false),
},
{
keyCode: VK.DOWN,
action: action(moveV$2, editor, true),
},
],
evt
).each(function (_) {
evt.preventDefault()
})
}
var setup$b = function (editor, caret) {
editor.on('keydown', function (evt) {
if (evt.isDefaultPrevented() === false) {
executeKeydownOverride$3(editor, caret, evt)
}
})
}
var executeKeydownOverride$2 = function (editor, caret, evt) {
execute(
[
{
keyCode: VK.BACKSPACE,
action: action(backspaceDelete, editor, false),
},
{
keyCode: VK.BACKSPACE,
action: action(backspaceDelete$5, editor, false),
},
{
keyCode: VK.DELETE,
action: action(backspaceDelete$5, editor, true),
},
{
keyCode: VK.BACKSPACE,
action: action(backspaceDelete$6, editor, false),
},
{
keyCode: VK.DELETE,
action: action(backspaceDelete$6, editor, true),
},
{
keyCode: VK.BACKSPACE,
action: action(backspaceDelete$3, editor, caret, false),
},
{
keyCode: VK.DELETE,
action: action(backspaceDelete$3, editor, caret, true),
},
{
keyCode: VK.BACKSPACE,
action: action(backspaceDelete$9, editor, false),
},
{
keyCode: VK.DELETE,
action: action(backspaceDelete$9, editor, true),
},
{
keyCode: VK.BACKSPACE,
action: action(backspaceDelete$4, editor, false),
},
{
keyCode: VK.DELETE,
action: action(backspaceDelete$4, editor, true),
},
{
keyCode: VK.BACKSPACE,
action: action(backspaceDelete$1, editor, false),
},
{
keyCode: VK.DELETE,
action: action(backspaceDelete$1, editor, true),
},
{
keyCode: VK.BACKSPACE,
action: action(backspaceDelete$7, editor, false),
},
{
keyCode: VK.DELETE,
action: action(backspaceDelete$7, editor, true),
},
{
keyCode: VK.BACKSPACE,
action: action(backspaceDelete$8, editor, false),
},
{
keyCode: VK.DELETE,
action: action(backspaceDelete$8, editor, true),
},
{
keyCode: VK.BACKSPACE,
action: action(backspaceDelete$2, editor, false),
},
{
keyCode: VK.DELETE,
action: action(backspaceDelete$2, editor, true),
},
],
evt
).each(function (_) {
evt.preventDefault()
})
}
var executeKeyupOverride = function (editor, evt) {
execute(
[
{
keyCode: VK.BACKSPACE,
action: action(paddEmptyElement, editor),
},
{
keyCode: VK.DELETE,
action: action(paddEmptyElement, editor),
},
],
evt
)
}
var setup$a = function (editor, caret) {
editor.on('keydown', function (evt) {
if (evt.isDefaultPrevented() === false) {
executeKeydownOverride$2(editor, caret, evt)
}
})
editor.on('keyup', function (evt) {
if (evt.isDefaultPrevented() === false) {
executeKeyupOverride(editor, evt)
}
})
}
var firstNonWhiteSpaceNodeSibling = function (node) {
while (node) {
if (
node.nodeType === 1 ||
(node.nodeType === 3 && node.data && /[\r\n\s]/.test(node.data))
) {
return node
}
node = node.nextSibling
}
}
var moveToCaretPosition = function (editor, root) {
var node,
lastNode = root
var dom = editor.dom
var moveCaretBeforeOnEnterElementsMap =
editor.schema.getMoveCaretBeforeOnEnterElements()
if (!root) {
return
}
if (/^(LI|DT|DD)$/.test(root.nodeName)) {
var firstChild = firstNonWhiteSpaceNodeSibling(root.firstChild)
if (firstChild && /^(UL|OL|DL)$/.test(firstChild.nodeName)) {
root.insertBefore(dom.doc.createTextNode(nbsp), root.firstChild)
}
}
var rng = dom.createRng()
root.normalize()
if (root.hasChildNodes()) {
var walker = new DomTreeWalker(root, root)
while ((node = walker.current())) {
if (isText$7(node)) {
rng.setStart(node, 0)
rng.setEnd(node, 0)
break
}
if (moveCaretBeforeOnEnterElementsMap[node.nodeName.toLowerCase()]) {
rng.setStartBefore(node)
rng.setEndBefore(node)
break
}
lastNode = node
node = walker.next()
}
if (!node) {
rng.setStart(lastNode, 0)
rng.setEnd(lastNode, 0)
}
} else {
if (isBr$5(root)) {
if (root.nextSibling && dom.isBlock(root.nextSibling)) {
rng.setStartBefore(root)
rng.setEndBefore(root)
} else {
rng.setStartAfter(root)
rng.setEndAfter(root)
}
} else {
rng.setStart(root, 0)
rng.setEnd(root, 0)
}
}
editor.selection.setRng(rng)
scrollRangeIntoView(editor, rng)
}
var getEditableRoot$1 = function (dom, node) {
var root = dom.getRoot()
var parent, editableRoot
parent = node
while (parent !== root && dom.getContentEditable(parent) !== 'false') {
if (dom.getContentEditable(parent) === 'true') {
editableRoot = parent
}
parent = parent.parentNode
}
return parent !== root ? editableRoot : root
}
var getParentBlock = function (editor) {
return Optional.from(
editor.dom.getParent(editor.selection.getStart(true), editor.dom.isBlock)
)
}
var getParentBlockName = function (editor) {
return getParentBlock(editor).fold(constant(''), function (parentBlock) {
return parentBlock.nodeName.toUpperCase()
})
}
var isListItemParentBlock = function (editor) {
return getParentBlock(editor)
.filter(function (elm) {
return isListItem(SugarElement.fromDom(elm))
})
.isSome()
}
var hasFirstChild = function (elm, name) {
return elm.firstChild && elm.firstChild.nodeName === name
}
var isFirstChild = function (elm) {
var _a
return (
((_a = elm.parentNode) === null || _a === void 0
? void 0
: _a.firstChild) === elm
)
}
var hasParent = function (elm, parentName) {
return elm && elm.parentNode && elm.parentNode.nodeName === parentName
}
var isListBlock = function (elm) {
return elm && /^(OL|UL|LI)$/.test(elm.nodeName)
}
var isNestedList = function (elm) {
return isListBlock(elm) && isListBlock(elm.parentNode)
}
var getContainerBlock = function (containerBlock) {
var containerBlockParent = containerBlock.parentNode
if (/^(LI|DT|DD)$/.test(containerBlockParent.nodeName)) {
return containerBlockParent
}
return containerBlock
}
var isFirstOrLastLi = function (containerBlock, parentBlock, first) {
var node = containerBlock[first ? 'firstChild' : 'lastChild']
while (node) {
if (isElement$5(node)) {
break
}
node = node[first ? 'nextSibling' : 'previousSibling']
}
return node === parentBlock
}
var insert$3 = function (
editor,
createNewBlock,
containerBlock,
parentBlock,
newBlockName
) {
var dom = editor.dom
var rng = editor.selection.getRng()
if (containerBlock === editor.getBody()) {
return
}
if (isNestedList(containerBlock)) {
newBlockName = 'LI'
}
var newBlock = newBlockName
? createNewBlock(newBlockName)
: dom.create('BR')
if (
isFirstOrLastLi(containerBlock, parentBlock, true) &&
isFirstOrLastLi(containerBlock, parentBlock, false)
) {
if (hasParent(containerBlock, 'LI')) {
var containerBlockParent = getContainerBlock(containerBlock)
dom.insertAfter(newBlock, containerBlockParent)
if (isFirstChild(containerBlock)) {
dom.remove(containerBlockParent)
} else {
dom.remove(containerBlock)
}
} else {
dom.replace(newBlock, containerBlock)
}
} else if (isFirstOrLastLi(containerBlock, parentBlock, true)) {
if (hasParent(containerBlock, 'LI')) {
dom.insertAfter(newBlock, getContainerBlock(containerBlock))
newBlock.appendChild(dom.doc.createTextNode(' '))
newBlock.appendChild(containerBlock)
} else {
containerBlock.parentNode.insertBefore(newBlock, containerBlock)
}
dom.remove(parentBlock)
} else if (isFirstOrLastLi(containerBlock, parentBlock, false)) {
dom.insertAfter(newBlock, getContainerBlock(containerBlock))
dom.remove(parentBlock)
} else {
containerBlock = getContainerBlock(containerBlock)
var tmpRng = rng.cloneRange()
tmpRng.setStartAfter(parentBlock)
tmpRng.setEndAfter(containerBlock)
var fragment = tmpRng.extractContents()
if (newBlockName === 'LI' && hasFirstChild(fragment, 'LI')) {
newBlock = fragment.firstChild
dom.insertAfter(fragment, containerBlock)
} else {
dom.insertAfter(fragment, containerBlock)
dom.insertAfter(newBlock, containerBlock)
}
dom.remove(parentBlock)
}
moveToCaretPosition(editor, newBlock)
}
var trimZwsp = function (fragment) {
each$k(
descendants$1(SugarElement.fromDom(fragment), isText$8),
function (text) {
var rawNode = text.dom
rawNode.nodeValue = trim$2(rawNode.nodeValue)
}
)
}
var isEmptyAnchor = function (dom, elm) {
return elm && elm.nodeName === 'A' && dom.isEmpty(elm)
}
var isTableCell = function (node) {
return node && /^(TD|TH|CAPTION)$/.test(node.nodeName)
}
var emptyBlock = function (elm) {
elm.innerHTML = '
'
}
var containerAndSiblingName = function (container, nodeName) {
return (
container.nodeName === nodeName ||
(container.previousSibling &&
container.previousSibling.nodeName === nodeName)
)
}
var canSplitBlock = function (dom, node) {
return (
node &&
dom.isBlock(node) &&
!/^(TD|TH|CAPTION|FORM)$/.test(node.nodeName) &&
!/^(fixed|absolute)/i.test(node.style.position) &&
dom.getContentEditable(node) !== 'true'
)
}
var trimInlineElementsOnLeftSideOfBlock = function (
dom,
nonEmptyElementsMap,
block
) {
var node = block
var firstChilds = []
var i
if (!node) {
return
}
while ((node = node.firstChild)) {
if (dom.isBlock(node)) {
return
}
if (
isElement$5(node) &&
!nonEmptyElementsMap[node.nodeName.toLowerCase()]
) {
firstChilds.push(node)
}
}
i = firstChilds.length
while (i--) {
node = firstChilds[i]
if (
!node.hasChildNodes() ||
(node.firstChild === node.lastChild && node.firstChild.nodeValue === '')
) {
dom.remove(node)
} else {
if (isEmptyAnchor(dom, node)) {
dom.remove(node)
}
}
}
}
var normalizeZwspOffset = function (start, container, offset) {
if (isText$7(container) === false) {
return offset
} else if (start) {
return offset === 1 && container.data.charAt(offset - 1) === ZWSP$1
? 0
: offset
} else {
return offset === container.data.length - 1 &&
container.data.charAt(offset) === ZWSP$1
? container.data.length
: offset
}
}
var includeZwspInRange = function (rng) {
var newRng = rng.cloneRange()
newRng.setStart(
rng.startContainer,
normalizeZwspOffset(true, rng.startContainer, rng.startOffset)
)
newRng.setEnd(
rng.endContainer,
normalizeZwspOffset(false, rng.endContainer, rng.endOffset)
)
return newRng
}
var trimLeadingLineBreaks = function (node) {
do {
if (isText$7(node)) {
node.nodeValue = node.nodeValue.replace(/^[\r\n]+/, '')
}
node = node.firstChild
} while (node)
}
var getEditableRoot = function (dom, node) {
var root = dom.getRoot()
var parent, editableRoot
parent = node
while (parent !== root && dom.getContentEditable(parent) !== 'false') {
if (dom.getContentEditable(parent) === 'true') {
editableRoot = parent
}
parent = parent.parentNode
}
return parent !== root ? editableRoot : root
}
var applyAttributes = function (editor, node, forcedRootBlockAttrs) {
var dom = editor.dom
Optional.from(forcedRootBlockAttrs.style)
.map(dom.parseStyle)
.each(function (attrStyles) {
var currentStyles = getAllRaw(SugarElement.fromDom(node))
var newStyles = __assign(__assign({}, currentStyles), attrStyles)
dom.setStyles(node, newStyles)
})
var attrClassesOpt = Optional.from(forcedRootBlockAttrs.class).map(
function (attrClasses) {
return attrClasses.split(/\s+/)
}
)
var currentClassesOpt = Optional.from(node.className).map(function (
currentClasses
) {
return filter$4(currentClasses.split(/\s+/), function (clazz) {
return clazz !== ''
})
})
lift2(
attrClassesOpt,
currentClassesOpt,
function (attrClasses, currentClasses) {
var filteredClasses = filter$4(currentClasses, function (clazz) {
return !contains$3(attrClasses, clazz)
})
var newClasses = __spreadArray(
__spreadArray([], attrClasses, true),
filteredClasses,
true
)
dom.setAttrib(node, 'class', newClasses.join(' '))
}
)
var appliedAttrs = ['style', 'class']
var remainingAttrs = filter$3(forcedRootBlockAttrs, function (_, attrs) {
return !contains$3(appliedAttrs, attrs)
})
dom.setAttribs(node, remainingAttrs)
}
var setForcedBlockAttrs = function (editor, node) {
var forcedRootBlockName = getForcedRootBlock(editor)
if (
forcedRootBlockName &&
forcedRootBlockName.toLowerCase() === node.tagName.toLowerCase()
) {
var forcedRootBlockAttrs = getForcedRootBlockAttrs(editor)
applyAttributes(editor, node, forcedRootBlockAttrs)
}
}
var wrapSelfAndSiblingsInDefaultBlock = function (
editor,
newBlockName,
rng,
container,
offset
) {
var newBlock, parentBlock, startNode, node, next, rootBlockName
var blockName = newBlockName || 'P'
var dom = editor.dom,
editableRoot = getEditableRoot(dom, container)
parentBlock = dom.getParent(container, dom.isBlock)
if (!parentBlock || !canSplitBlock(dom, parentBlock)) {
parentBlock = parentBlock || editableRoot
if (parentBlock === editor.getBody() || isTableCell(parentBlock)) {
rootBlockName = parentBlock.nodeName.toLowerCase()
} else {
rootBlockName = parentBlock.parentNode.nodeName.toLowerCase()
}
if (!parentBlock.hasChildNodes()) {
newBlock = dom.create(blockName)
setForcedBlockAttrs(editor, newBlock)
parentBlock.appendChild(newBlock)
rng.setStart(newBlock, 0)
rng.setEnd(newBlock, 0)
return newBlock
}
node = container
while (node.parentNode !== parentBlock) {
node = node.parentNode
}
while (node && !dom.isBlock(node)) {
startNode = node
node = node.previousSibling
}
if (
startNode &&
editor.schema.isValidChild(rootBlockName, blockName.toLowerCase())
) {
newBlock = dom.create(blockName)
setForcedBlockAttrs(editor, newBlock)
startNode.parentNode.insertBefore(newBlock, startNode)
node = startNode
while (node && !dom.isBlock(node)) {
next = node.nextSibling
newBlock.appendChild(node)
node = next
}
rng.setStart(container, offset)
rng.setEnd(container, offset)
}
}
return container
}
var addBrToBlockIfNeeded = function (dom, block) {
block.normalize()
var lastChild = block.lastChild
if (
!lastChild ||
/^(left|right)$/gi.test(dom.getStyle(lastChild, 'float', true))
) {
dom.add(block, 'br')
}
}
var insert$2 = function (editor, evt) {
var tmpRng, container, offset, parentBlock
var newBlock,
fragment,
containerBlock,
parentBlockName,
newBlockName,
isAfterLastNodeInContainer
var dom = editor.dom
var schema = editor.schema,
nonEmptyElementsMap = schema.getNonEmptyElements()
var rng = editor.selection.getRng()
var createNewBlock = function (name) {
var node = container,
block,
clonedNode,
caretNode
var textInlineElements = schema.getTextInlineElements()
if (name || parentBlockName === 'TABLE' || parentBlockName === 'HR') {
block = dom.create(name || newBlockName)
} else {
block = parentBlock.cloneNode(false)
}
caretNode = block
if (shouldKeepStyles(editor) === false) {
dom.setAttrib(block, 'style', null)
dom.setAttrib(block, 'class', null)
} else {
do {
if (textInlineElements[node.nodeName]) {
if (isCaretNode(node) || isBookmarkNode$1(node)) {
continue
}
clonedNode = node.cloneNode(false)
dom.setAttrib(clonedNode, 'id', '')
if (block.hasChildNodes()) {
clonedNode.appendChild(block.firstChild)
block.appendChild(clonedNode)
} else {
caretNode = clonedNode
block.appendChild(clonedNode)
}
}
} while ((node = node.parentNode) && node !== editableRoot)
}
setForcedBlockAttrs(editor, block)
emptyBlock(caretNode)
return block
}
var isCaretAtStartOrEndOfBlock = function (start) {
var node, name
var normalizedOffset = normalizeZwspOffset(start, container, offset)
if (
isText$7(container) &&
(start
? normalizedOffset > 0
: normalizedOffset < container.nodeValue.length)
) {
return false
}
if (
container.parentNode === parentBlock &&
isAfterLastNodeInContainer &&
!start
) {
return true
}
if (
start &&
isElement$5(container) &&
container === parentBlock.firstChild
) {
return true
}
if (
containerAndSiblingName(container, 'TABLE') ||
containerAndSiblingName(container, 'HR')
) {
return (
(isAfterLastNodeInContainer && !start) ||
(!isAfterLastNodeInContainer && start)
)
}
var walker = new DomTreeWalker(container, parentBlock)
if (isText$7(container)) {
if (start && normalizedOffset === 0) {
walker.prev()
} else if (!start && normalizedOffset === container.nodeValue.length) {
walker.next()
}
}
while ((node = walker.current())) {
if (isElement$5(node)) {
if (!node.getAttribute('data-mce-bogus')) {
name = node.nodeName.toLowerCase()
if (nonEmptyElementsMap[name] && name !== 'br') {
return false
}
}
} else if (isText$7(node) && !isWhitespaceText(node.nodeValue)) {
return false
}
if (start) {
walker.prev()
} else {
walker.next()
}
}
return true
}
var insertNewBlockAfter = function () {
if (
/^(H[1-6]|PRE|FIGURE)$/.test(parentBlockName) &&
containerBlockName !== 'HGROUP'
) {
newBlock = createNewBlock(newBlockName)
} else {
newBlock = createNewBlock()
}
if (
shouldEndContainerOnEmptyBlock(editor) &&
canSplitBlock(dom, containerBlock) &&
dom.isEmpty(parentBlock)
) {
newBlock = dom.split(containerBlock, parentBlock)
} else {
dom.insertAfter(newBlock, parentBlock)
}
moveToCaretPosition(editor, newBlock)
}
normalize$2(dom, rng).each(function (normRng) {
rng.setStart(normRng.startContainer, normRng.startOffset)
rng.setEnd(normRng.endContainer, normRng.endOffset)
})
container = rng.startContainer
offset = rng.startOffset
newBlockName = getForcedRootBlock(editor)
var shiftKey = !!(evt && evt.shiftKey)
var ctrlKey = !!(evt && evt.ctrlKey)
if (isElement$5(container) && container.hasChildNodes()) {
isAfterLastNodeInContainer = offset > container.childNodes.length - 1
container =
container.childNodes[
Math.min(offset, container.childNodes.length - 1)
] || container
if (isAfterLastNodeInContainer && isText$7(container)) {
offset = container.nodeValue.length
} else {
offset = 0
}
}
var editableRoot = getEditableRoot(dom, container)
if (!editableRoot) {
return
}
if ((newBlockName && !shiftKey) || (!newBlockName && shiftKey)) {
container = wrapSelfAndSiblingsInDefaultBlock(
editor,
newBlockName,
rng,
container,
offset
)
}
parentBlock = dom.getParent(container, dom.isBlock)
containerBlock = parentBlock
? dom.getParent(parentBlock.parentNode, dom.isBlock)
: null
parentBlockName = parentBlock ? parentBlock.nodeName.toUpperCase() : ''
var containerBlockName = containerBlock
? containerBlock.nodeName.toUpperCase()
: ''
if (containerBlockName === 'LI' && !ctrlKey) {
parentBlock = containerBlock
containerBlock = containerBlock.parentNode
parentBlockName = containerBlockName
}
if (/^(LI|DT|DD)$/.test(parentBlockName)) {
if (dom.isEmpty(parentBlock)) {
insert$3(
editor,
createNewBlock,
containerBlock,
parentBlock,
newBlockName
)
return
}
}
if (newBlockName && parentBlock === editor.getBody()) {
return
}
newBlockName = newBlockName || 'P'
if (isCaretContainerBlock$1(parentBlock)) {
newBlock = showCaretContainerBlock(parentBlock)
if (dom.isEmpty(parentBlock)) {
emptyBlock(parentBlock)
}
setForcedBlockAttrs(editor, newBlock)
moveToCaretPosition(editor, newBlock)
} else if (isCaretAtStartOrEndOfBlock()) {
insertNewBlockAfter()
} else if (isCaretAtStartOrEndOfBlock(true)) {
newBlock = parentBlock.parentNode.insertBefore(
createNewBlock(),
parentBlock
)
moveToCaretPosition(
editor,
containerAndSiblingName(parentBlock, 'HR') ? newBlock : parentBlock
)
} else {
tmpRng = includeZwspInRange(rng).cloneRange()
tmpRng.setEndAfter(parentBlock)
fragment = tmpRng.extractContents()
trimZwsp(fragment)
trimLeadingLineBreaks(fragment)
newBlock = fragment.firstChild
dom.insertAfter(fragment, parentBlock)
trimInlineElementsOnLeftSideOfBlock(dom, nonEmptyElementsMap, newBlock)
addBrToBlockIfNeeded(dom, parentBlock)
if (dom.isEmpty(parentBlock)) {
emptyBlock(parentBlock)
}
newBlock.normalize()
if (dom.isEmpty(newBlock)) {
dom.remove(newBlock)
insertNewBlockAfter()
} else {
setForcedBlockAttrs(editor, newBlock)
moveToCaretPosition(editor, newBlock)
}
}
dom.setAttrib(newBlock, 'id', '')
editor.fire('NewBlock', { newBlock: newBlock })
}
var hasRightSideContent = function (schema, container, parentBlock) {
var walker = new DomTreeWalker(container, parentBlock)
var node
var nonEmptyElementsMap = schema.getNonEmptyElements()
while ((node = walker.next())) {
if (nonEmptyElementsMap[node.nodeName.toLowerCase()] || node.length > 0) {
return true
}
}
}
var moveSelectionToBr = function (editor, brElm, extraBr) {
var rng = editor.dom.createRng()
if (!extraBr) {
rng.setStartAfter(brElm)
rng.setEndAfter(brElm)
} else {
rng.setStartBefore(brElm)
rng.setEndBefore(brElm)
}
editor.selection.setRng(rng)
scrollRangeIntoView(editor, rng)
}
var insertBrAtCaret = function (editor, evt) {
var selection = editor.selection
var dom = editor.dom
var rng = selection.getRng()
var brElm
var extraBr
normalize$2(dom, rng).each(function (normRng) {
rng.setStart(normRng.startContainer, normRng.startOffset)
rng.setEnd(normRng.endContainer, normRng.endOffset)
})
var offset = rng.startOffset
var container = rng.startContainer
if (container.nodeType === 1 && container.hasChildNodes()) {
var isAfterLastNodeInContainer = offset > container.childNodes.length - 1
container =
container.childNodes[
Math.min(offset, container.childNodes.length - 1)
] || container
if (isAfterLastNodeInContainer && container.nodeType === 3) {
offset = container.nodeValue.length
} else {
offset = 0
}
}
var parentBlock = dom.getParent(container, dom.isBlock)
var containerBlock = parentBlock
? dom.getParent(parentBlock.parentNode, dom.isBlock)
: null
var containerBlockName = containerBlock
? containerBlock.nodeName.toUpperCase()
: ''
var isControlKey = !!(evt && evt.ctrlKey)
if (containerBlockName === 'LI' && !isControlKey) {
parentBlock = containerBlock
}
if (
container &&
container.nodeType === 3 &&
offset >= container.nodeValue.length
) {
if (!hasRightSideContent(editor.schema, container, parentBlock)) {
brElm = dom.create('br')
rng.insertNode(brElm)
rng.setStartAfter(brElm)
rng.setEndAfter(brElm)
extraBr = true
}
}
brElm = dom.create('br')
rangeInsertNode(dom, rng, brElm)
moveSelectionToBr(editor, brElm, extraBr)
editor.undoManager.add()
}
var insertBrBefore = function (editor, inline) {
var br = SugarElement.fromTag('br')
before$4(SugarElement.fromDom(inline), br)
editor.undoManager.add()
}
var insertBrAfter = function (editor, inline) {
if (!hasBrAfter(editor.getBody(), inline)) {
after$3(SugarElement.fromDom(inline), SugarElement.fromTag('br'))
}
var br = SugarElement.fromTag('br')
after$3(SugarElement.fromDom(inline), br)
moveSelectionToBr(editor, br.dom, false)
editor.undoManager.add()
}
var isBeforeBr = function (pos) {
return isBr$5(pos.getNode())
}
var hasBrAfter = function (rootNode, startNode) {
if (isBeforeBr(CaretPosition.after(startNode))) {
return true
} else {
return nextPosition(rootNode, CaretPosition.after(startNode))
.map(function (pos) {
return isBr$5(pos.getNode())
})
.getOr(false)
}
}
var isAnchorLink = function (elm) {
return elm && elm.nodeName === 'A' && 'href' in elm
}
var isInsideAnchor = function (location) {
return location.fold(never, isAnchorLink, isAnchorLink, never)
}
var readInlineAnchorLocation = function (editor) {
var isInlineTarget$1 = curry(isInlineTarget, editor)
var position = CaretPosition.fromRangeStart(editor.selection.getRng())
return readLocation(isInlineTarget$1, editor.getBody(), position).filter(
isInsideAnchor
)
}
var insertBrOutsideAnchor = function (editor, location) {
location.fold(
noop,
curry(insertBrBefore, editor),
curry(insertBrAfter, editor),
noop
)
}
var insert$1 = function (editor, evt) {
var anchorLocation = readInlineAnchorLocation(editor)
if (anchorLocation.isSome()) {
anchorLocation.each(curry(insertBrOutsideAnchor, editor))
} else {
insertBrAtCaret(editor, evt)
}
}
var matchesSelector = function (editor, selector) {
return getParentBlock(editor)
.filter(function (parentBlock) {
return (
selector.length > 0 &&
is$2(SugarElement.fromDom(parentBlock), selector)
)
})
.isSome()
}
var shouldInsertBr = function (editor) {
return matchesSelector(editor, getBrNewLineSelector(editor))
}
var shouldBlockNewLine$1 = function (editor) {
return matchesSelector(editor, getNoNewLineSelector(editor))
}
var newLineAction = Adt.generate([{ br: [] }, { block: [] }, { none: [] }])
var shouldBlockNewLine = function (editor, _shiftKey) {
return shouldBlockNewLine$1(editor)
}
var isBrMode = function (requiredState) {
return function (editor, _shiftKey) {
var brMode = getForcedRootBlock(editor) === ''
return brMode === requiredState
}
}
var inListBlock = function (requiredState) {
return function (editor, _shiftKey) {
return isListItemParentBlock(editor) === requiredState
}
}
var inBlock = function (blockName, requiredState) {
return function (editor, _shiftKey) {
var state = getParentBlockName(editor) === blockName.toUpperCase()
return state === requiredState
}
}
var inPreBlock = function (requiredState) {
return inBlock('pre', requiredState)
}
var inSummaryBlock = function () {
return inBlock('summary', true)
}
var shouldPutBrInPre = function (requiredState) {
return function (editor, _shiftKey) {
return shouldPutBrInPre$1(editor) === requiredState
}
}
var inBrContext = function (editor, _shiftKey) {
return shouldInsertBr(editor)
}
var hasShiftKey = function (_editor, shiftKey) {
return shiftKey
}
var canInsertIntoEditableRoot = function (editor) {
var forcedRootBlock = getForcedRootBlock(editor)
var rootEditable = getEditableRoot$1(
editor.dom,
editor.selection.getStart()
)
return (
rootEditable &&
editor.schema.isValidChild(
rootEditable.nodeName,
forcedRootBlock ? forcedRootBlock : 'P'
)
)
}
var match = function (predicates, action) {
return function (editor, shiftKey) {
var isMatch = foldl(
predicates,
function (res, p) {
return res && p(editor, shiftKey)
},
true
)
return isMatch ? Optional.some(action) : Optional.none()
}
}
var getAction = function (editor, evt) {
return evaluateUntil(
[
match([shouldBlockNewLine], newLineAction.none()),
match([inSummaryBlock()], newLineAction.br()),
match(
[inPreBlock(true), shouldPutBrInPre(false), hasShiftKey],
newLineAction.br()
),
match(
[inPreBlock(true), shouldPutBrInPre(false)],
newLineAction.block()
),
match(
[inPreBlock(true), shouldPutBrInPre(true), hasShiftKey],
newLineAction.block()
),
match([inPreBlock(true), shouldPutBrInPre(true)], newLineAction.br()),
match([inListBlock(true), hasShiftKey], newLineAction.br()),
match([inListBlock(true)], newLineAction.block()),
match(
[isBrMode(true), hasShiftKey, canInsertIntoEditableRoot],
newLineAction.block()
),
match([isBrMode(true)], newLineAction.br()),
match([inBrContext], newLineAction.br()),
match([isBrMode(false), hasShiftKey], newLineAction.br()),
match([canInsertIntoEditableRoot], newLineAction.block()),
],
[editor, !!(evt && evt.shiftKey)]
).getOr(newLineAction.none())
}
var insert = function (editor, evt) {
getAction(editor, evt).fold(
function () {
insert$1(editor, evt)
},
function () {
insert$2(editor, evt)
},
noop
)
}
var handleEnterKeyEvent = function (editor, event) {
if (event.isDefaultPrevented()) {
return
}
event.preventDefault()
endTypingLevelIgnoreLocks(editor.undoManager)
editor.undoManager.transact(function () {
if (editor.selection.isCollapsed() === false) {
editor.execCommand('Delete')
}
insert(editor, event)
})
}
var setup$9 = function (editor) {
editor.on('keydown', function (event) {
if (event.keyCode === VK.ENTER) {
handleEnterKeyEvent(editor, event)
}
})
}
var executeKeydownOverride$1 = function (editor, caret, evt) {
execute(
[
{
keyCode: VK.END,
action: action(moveToLineEndPoint$1, editor, true),
},
{
keyCode: VK.HOME,
action: action(moveToLineEndPoint$1, editor, false),
},
{
keyCode: VK.END,
action: action(moveToLineEndPoint, editor, true),
},
{
keyCode: VK.HOME,
action: action(moveToLineEndPoint, editor, false),
},
{
keyCode: VK.END,
action: action(moveToLineEndPoint$2, editor, true, caret),
},
{
keyCode: VK.HOME,
action: action(moveToLineEndPoint$2, editor, false, caret),
},
],
evt
).each(function (_) {
evt.preventDefault()
})
}
var setup$8 = function (editor, caret) {
editor.on('keydown', function (evt) {
if (evt.isDefaultPrevented() === false) {
executeKeydownOverride$1(editor, caret, evt)
}
})
}
var browser = detect().browser
var setupIeInput = function (editor) {
var keypressThrotter = first(function () {
if (!editor.composing) {
normalizeNbspsInEditor(editor)
}
}, 0)
if (browser.isIE()) {
editor.on('keypress', function (_e) {
keypressThrotter.throttle()
})
editor.on('remove', function (_e) {
keypressThrotter.cancel()
})
}
}
var setup$7 = function (editor) {
setupIeInput(editor)
editor.on('input', function (e) {
if (e.isComposing === false) {
normalizeNbspsInEditor(editor)
}
})
}
var platform = detect()
var executeKeyupAction = function (editor, caret, evt) {
execute(
[
{
keyCode: VK.PAGE_UP,
action: action(moveToLineEndPoint$2, editor, false, caret),
},
{
keyCode: VK.PAGE_DOWN,
action: action(moveToLineEndPoint$2, editor, true, caret),
},
],
evt
)
}
var stopImmediatePropagation = function (e) {
return e.stopImmediatePropagation()
}
var isPageUpDown = function (evt) {
return evt.keyCode === VK.PAGE_UP || evt.keyCode === VK.PAGE_DOWN
}
var setNodeChangeBlocker = function (blocked, editor, block) {
if (block && !blocked.get()) {
editor.on('NodeChange', stopImmediatePropagation, true)
} else if (!block && blocked.get()) {
editor.off('NodeChange', stopImmediatePropagation)
}
blocked.set(block)
}
var setup$6 = function (editor, caret) {
if (platform.os.isOSX()) {
return
}
var blocked = Cell(false)
editor.on('keydown', function (evt) {
if (isPageUpDown(evt)) {
setNodeChangeBlocker(blocked, editor, true)
}
})
editor.on('keyup', function (evt) {
if (evt.isDefaultPrevented() === false) {
executeKeyupAction(editor, caret, evt)
}
if (isPageUpDown(evt) && blocked.get()) {
setNodeChangeBlocker(blocked, editor, false)
editor.nodeChanged()
}
})
}
var insertTextAtPosition = function (text, pos) {
var container = pos.container()
var offset = pos.offset()
if (isText$7(container)) {
container.insertData(offset, text)
return Optional.some(CaretPosition(container, offset + text.length))
} else {
return getElementFromPosition(pos).map(function (elm) {
var textNode = SugarElement.fromText(text)
if (pos.isAtEnd()) {
after$3(elm, textNode)
} else {
before$4(elm, textNode)
}
return CaretPosition(textNode.dom, text.length)
})
}
}
var insertNbspAtPosition = curry(insertTextAtPosition, nbsp)
var insertSpaceAtPosition = curry(insertTextAtPosition, ' ')
var locationToCaretPosition = function (root) {
return function (location) {
return location.fold(
function (element) {
return prevPosition(root.dom, CaretPosition.before(element))
},
function (element) {
return firstPositionIn(element)
},
function (element) {
return lastPositionIn(element)
},
function (element) {
return nextPosition(root.dom, CaretPosition.after(element))
}
)
}
}
var insertInlineBoundarySpaceOrNbsp = function (root, pos) {
return function (checkPos) {
return needsToHaveNbsp(root, checkPos)
? insertNbspAtPosition(pos)
: insertSpaceAtPosition(pos)
}
}
var setSelection = function (editor) {
return function (pos) {
editor.selection.setRng(pos.toRange())
editor.nodeChanged()
return true
}
}
var insertSpaceOrNbspAtSelection = function (editor) {
var pos = CaretPosition.fromRangeStart(editor.selection.getRng())
var root = SugarElement.fromDom(editor.getBody())
if (editor.selection.isCollapsed()) {
var isInlineTarget$1 = curry(isInlineTarget, editor)
var caretPosition = CaretPosition.fromRangeStart(
editor.selection.getRng()
)
return readLocation(isInlineTarget$1, editor.getBody(), caretPosition)
.bind(locationToCaretPosition(root))
.bind(insertInlineBoundarySpaceOrNbsp(root, pos))
.exists(setSelection(editor))
} else {
return false
}
}
var executeKeydownOverride = function (editor, evt) {
execute(
[
{
keyCode: VK.SPACEBAR,
action: action(insertSpaceOrNbspAtSelection, editor),
},
],
evt
).each(function (_) {
evt.preventDefault()
})
}
var setup$5 = function (editor) {
editor.on('keydown', function (evt) {
if (evt.isDefaultPrevented() === false) {
executeKeydownOverride(editor, evt)
}
})
}
var registerKeyboardOverrides = function (editor) {
var caret = setupSelectedState(editor)
setup$c(editor)
setup$b(editor, caret)
setup$a(editor, caret)
setup$9(editor)
setup$5(editor)
setup$7(editor)
setup$8(editor, caret)
setup$6(editor, caret)
return caret
}
var setup$4 = function (editor) {
if (!isRtc(editor)) {
return registerKeyboardOverrides(editor)
} else {
return Cell(null)
}
}
var NodeChange = (function () {
function NodeChange(editor) {
this.lastPath = []
this.editor = editor
var lastRng
var self = this
if (!('onselectionchange' in editor.getDoc())) {
editor.on('NodeChange click mouseup keyup focus', function (e) {
var nativeRng = editor.selection.getRng()
var fakeRng = {
startContainer: nativeRng.startContainer,
startOffset: nativeRng.startOffset,
endContainer: nativeRng.endContainer,
endOffset: nativeRng.endOffset,
}
if (e.type === 'nodechange' || !isEq$4(fakeRng, lastRng)) {
editor.fire('SelectionChange')
}
lastRng = fakeRng
})
}
editor.on('contextmenu', function () {
editor.fire('SelectionChange')
})
editor.on('SelectionChange', function () {
var startElm = editor.selection.getStart(true)
if (!startElm || (!Env.range && editor.selection.isCollapsed())) {
return
}
if (
hasAnyRanges(editor) &&
!self.isSameElementPath(startElm) &&
editor.dom.isChildOf(startElm, editor.getBody())
) {
editor.nodeChanged({ selectionChange: true })
}
})
editor.on('mouseup', function (e) {
if (!e.isDefaultPrevented() && hasAnyRanges(editor)) {
if (editor.selection.getNode().nodeName === 'IMG') {
Delay.setEditorTimeout(editor, function () {
editor.nodeChanged()
})
} else {
editor.nodeChanged()
}
}
})
}
NodeChange.prototype.nodeChanged = function (args) {
var selection = this.editor.selection
var node, parents, root
if (
this.editor.initialized &&
selection &&
!shouldDisableNodeChange(this.editor) &&
!this.editor.mode.isReadOnly()
) {
root = this.editor.getBody()
node = selection.getStart(true) || root
if (
node.ownerDocument !== this.editor.getDoc() ||
!this.editor.dom.isChildOf(node, root)
) {
node = root
}
parents = []
this.editor.dom.getParent(node, function (node) {
if (node === root) {
return true
}
parents.push(node)
})
args = args || {}
args.element = node
args.parents = parents
this.editor.fire('NodeChange', args)
}
}
NodeChange.prototype.isSameElementPath = function (startElm) {
var i
var currentPath = this.editor
.$(startElm)
.parentsUntil(this.editor.getBody())
.add(startElm)
if (currentPath.length === this.lastPath.length) {
for (i = currentPath.length; i >= 0; i--) {
if (currentPath[i] !== this.lastPath[i]) {
break
}
}
if (i === -1) {
this.lastPath = currentPath
return true
}
}
this.lastPath = currentPath
return false
}
return NodeChange
})()
var preventSummaryToggle = function (editor) {
editor.on('click', function (e) {
if (editor.dom.getParent(e.target, 'details')) {
e.preventDefault()
}
})
}
var filterDetails = function (editor) {
editor.parser.addNodeFilter('details', function (elms) {
each$k(elms, function (details) {
details.attr('data-mce-open', details.attr('open'))
details.attr('open', 'open')
})
})
editor.serializer.addNodeFilter('details', function (elms) {
each$k(elms, function (details) {
var open = details.attr('data-mce-open')
details.attr('open', isString$1(open) ? open : null)
details.attr('data-mce-open', null)
})
})
}
var setup$3 = function (editor) {
preventSummaryToggle(editor)
filterDetails(editor)
}
var isTextBlockNode = function (node) {
return isElement$5(node) && isTextBlock$2(SugarElement.fromDom(node))
}
var normalizeSelection = function (editor) {
var rng = editor.selection.getRng()
var startPos = CaretPosition.fromRangeStart(rng)
var endPos = CaretPosition.fromRangeEnd(rng)
if (CaretPosition.isElementPosition(startPos)) {
var container = startPos.container()
if (isTextBlockNode(container)) {
firstPositionIn(container).each(function (pos) {
return rng.setStart(pos.container(), pos.offset())
})
}
}
if (CaretPosition.isElementPosition(endPos)) {
var container = startPos.container()
if (isTextBlockNode(container)) {
lastPositionIn(container).each(function (pos) {
return rng.setEnd(pos.container(), pos.offset())
})
}
}
editor.selection.setRng(normalize(rng))
}
var setup$2 = function (editor) {
editor.on('click', function (e) {
if (e.detail >= 3) {
normalizeSelection(editor)
}
})
}
var getAbsolutePosition = function (elm) {
var clientRect = elm.getBoundingClientRect()
var doc = elm.ownerDocument
var docElem = doc.documentElement
var win = doc.defaultView
return {
top: clientRect.top + win.pageYOffset - docElem.clientTop,
left: clientRect.left + win.pageXOffset - docElem.clientLeft,
}
}
var getBodyPosition = function (editor) {
return editor.inline
? getAbsolutePosition(editor.getBody())
: {
left: 0,
top: 0,
}
}
var getScrollPosition = function (editor) {
var body = editor.getBody()
return editor.inline
? {
left: body.scrollLeft,
top: body.scrollTop,
}
: {
left: 0,
top: 0,
}
}
var getBodyScroll = function (editor) {
var body = editor.getBody(),
docElm = editor.getDoc().documentElement
var inlineScroll = {
left: body.scrollLeft,
top: body.scrollTop,
}
var iframeScroll = {
left: body.scrollLeft || docElm.scrollLeft,
top: body.scrollTop || docElm.scrollTop,
}
return editor.inline ? inlineScroll : iframeScroll
}
var getMousePosition = function (editor, event) {
if (event.target.ownerDocument !== editor.getDoc()) {
var iframePosition = getAbsolutePosition(editor.getContentAreaContainer())
var scrollPosition = getBodyScroll(editor)
return {
left: event.pageX - iframePosition.left + scrollPosition.left,
top: event.pageY - iframePosition.top + scrollPosition.top,
}
}
return {
left: event.pageX,
top: event.pageY,
}
}
var calculatePosition = function (
bodyPosition,
scrollPosition,
mousePosition
) {
return {
pageX: mousePosition.left - bodyPosition.left + scrollPosition.left,
pageY: mousePosition.top - bodyPosition.top + scrollPosition.top,
}
}
var calc = function (editor, event) {
return calculatePosition(
getBodyPosition(editor),
getScrollPosition(editor),
getMousePosition(editor, event)
)
}
var isContentEditableFalse$1 = isContentEditableFalse$b,
isContentEditableTrue$1 = isContentEditableTrue$4
var isDraggable = function (rootElm, elm) {
return isContentEditableFalse$1(elm) && elm !== rootElm
}
var isValidDropTarget = function (editor, targetElement, dragElement) {
if (
targetElement === dragElement ||
editor.dom.isChildOf(targetElement, dragElement)
) {
return false
}
return !isContentEditableFalse$1(targetElement)
}
var cloneElement = function (elm) {
var cloneElm = elm.cloneNode(true)
cloneElm.removeAttribute('data-mce-selected')
return cloneElm
}
var createGhost = function (editor, elm, width, height) {
var dom = editor.dom
var clonedElm = elm.cloneNode(true)
dom.setStyles(clonedElm, {
width: width,
height: height,
})
dom.setAttrib(clonedElm, 'data-mce-selected', null)
var ghostElm = dom.create('div', {
class: 'mce-drag-container',
'data-mce-bogus': 'all',
unselectable: 'on',
contenteditable: 'false',
})
dom.setStyles(ghostElm, {
position: 'absolute',
opacity: 0.5,
overflow: 'hidden',
border: 0,
padding: 0,
margin: 0,
width: width,
height: height,
})
dom.setStyles(clonedElm, {
margin: 0,
boxSizing: 'border-box',
})
ghostElm.appendChild(clonedElm)
return ghostElm
}
var appendGhostToBody = function (ghostElm, bodyElm) {
if (ghostElm.parentNode !== bodyElm) {
bodyElm.appendChild(ghostElm)
}
}
var moveGhost = function (ghostElm, position, width, height, maxX, maxY) {
var overflowX = 0,
overflowY = 0
ghostElm.style.left = position.pageX + 'px'
ghostElm.style.top = position.pageY + 'px'
if (position.pageX + width > maxX) {
overflowX = position.pageX + width - maxX
}
if (position.pageY + height > maxY) {
overflowY = position.pageY + height - maxY
}
ghostElm.style.width = width - overflowX + 'px'
ghostElm.style.height = height - overflowY + 'px'
}
var removeElement = function (elm) {
if (elm && elm.parentNode) {
elm.parentNode.removeChild(elm)
}
}
var isLeftMouseButtonPressed = function (e) {
return e.button === 0
}
var applyRelPos = function (state, position) {
return {
pageX: position.pageX - state.relX,
pageY: position.pageY + 5,
}
}
var start = function (state, editor) {
return function (e) {
if (isLeftMouseButtonPressed(e)) {
var ceElm = find$3(
editor.dom.getParents(e.target),
or(isContentEditableFalse$1, isContentEditableTrue$1)
).getOr(null)
if (isDraggable(editor.getBody(), ceElm)) {
var elmPos = editor.dom.getPos(ceElm)
var bodyElm = editor.getBody()
var docElm = editor.getDoc().documentElement
state.set({
element: ceElm,
dragging: false,
screenX: e.screenX,
screenY: e.screenY,
maxX:
(editor.inline ? bodyElm.scrollWidth : docElm.offsetWidth) - 2,
maxY:
(editor.inline ? bodyElm.scrollHeight : docElm.offsetHeight) - 2,
relX: e.pageX - elmPos.x,
relY: e.pageY - elmPos.y,
width: ceElm.offsetWidth,
height: ceElm.offsetHeight,
ghost: createGhost(
editor,
ceElm,
ceElm.offsetWidth,
ceElm.offsetHeight
),
})
}
}
}
}
var move = function (state, editor) {
var throttledPlaceCaretAt = Delay.throttle(function (clientX, clientY) {
editor._selectionOverrides.hideFakeCaret()
editor.selection.placeCaretAt(clientX, clientY)
}, 0)
editor.on('remove', throttledPlaceCaretAt.stop)
return function (e) {
return state.on(function (state) {
var movement = Math.max(
Math.abs(e.screenX - state.screenX),
Math.abs(e.screenY - state.screenY)
)
if (!state.dragging && movement > 10) {
var args = editor.fire('dragstart', { target: state.element })
if (args.isDefaultPrevented()) {
return
}
state.dragging = true
editor.focus()
}
if (state.dragging) {
var targetPos = applyRelPos(state, calc(editor, e))
appendGhostToBody(state.ghost, editor.getBody())
moveGhost(
state.ghost,
targetPos,
state.width,
state.height,
state.maxX,
state.maxY
)
throttledPlaceCaretAt(e.clientX, e.clientY)
}
})
}
}
var getRawTarget = function (selection) {
var rng = selection.getSel().getRangeAt(0)
var startContainer = rng.startContainer
return startContainer.nodeType === 3
? startContainer.parentNode
: startContainer
}
var drop = function (state, editor) {
return function (e) {
state.on(function (state) {
if (state.dragging) {
if (
isValidDropTarget(
editor,
getRawTarget(editor.selection),
state.element
)
) {
var targetClone_1 = cloneElement(state.element)
var args = editor.fire('drop', {
clientX: e.clientX,
clientY: e.clientY,
})
if (!args.isDefaultPrevented()) {
editor.undoManager.transact(function () {
removeElement(state.element)
editor.insertContent(editor.dom.getOuterHTML(targetClone_1))
editor._selectionOverrides.hideFakeCaret()
})
}
}
editor.fire('dragend')
}
})
removeDragState(state)
}
}
var stop = function (state, editor) {
return function () {
state.on(function (state) {
if (state.dragging) {
editor.fire('dragend')
}
})
removeDragState(state)
}
}
var removeDragState = function (state) {
state.on(function (state) {
removeElement(state.ghost)
})
state.clear()
}
var bindFakeDragEvents = function (editor) {
var state = value()
var pageDom = DOMUtils.DOM
var rootDocument = document
var dragStartHandler = start(state, editor)
var dragHandler = move(state, editor)
var dropHandler = drop(state, editor)
var dragEndHandler = stop(state, editor)
editor.on('mousedown', dragStartHandler)
editor.on('mousemove', dragHandler)
editor.on('mouseup', dropHandler)
pageDom.bind(rootDocument, 'mousemove', dragHandler)
pageDom.bind(rootDocument, 'mouseup', dragEndHandler)
editor.on('remove', function () {
pageDom.unbind(rootDocument, 'mousemove', dragHandler)
pageDom.unbind(rootDocument, 'mouseup', dragEndHandler)
})
editor.on('keydown', function (e) {
if (e.keyCode === VK.ESC) {
dragEndHandler()
}
})
}
var blockIeDrop = function (editor) {
editor.on('drop', function (e) {
var realTarget =
typeof e.clientX !== 'undefined'
? editor.getDoc().elementFromPoint(e.clientX, e.clientY)
: null
if (
isContentEditableFalse$1(realTarget) ||
editor.dom.getContentEditableParent(realTarget) === 'false'
) {
e.preventDefault()
}
})
}
var blockUnsupportedFileDrop = function (editor) {
var preventFileDrop = function (e) {
if (!e.isDefaultPrevented()) {
var dataTransfer = e.dataTransfer
if (
dataTransfer &&
(contains$3(dataTransfer.types, 'Files') ||
dataTransfer.files.length > 0)
) {
e.preventDefault()
if (e.type === 'drop') {
displayError(editor, 'Dropped file type is not supported')
}
}
}
}
var preventFileDropIfUIElement = function (e) {
if (isUIElement(editor, e.target)) {
preventFileDrop(e)
}
}
var setup = function () {
var pageDom = DOMUtils.DOM
var dom = editor.dom
var doc = document
var editorRoot = editor.inline ? editor.getBody() : editor.getDoc()
var eventNames = ['drop', 'dragover']
each$k(eventNames, function (name) {
pageDom.bind(doc, name, preventFileDropIfUIElement)
dom.bind(editorRoot, name, preventFileDrop)
})
editor.on('remove', function () {
each$k(eventNames, function (name) {
pageDom.unbind(doc, name, preventFileDropIfUIElement)
dom.unbind(editorRoot, name, preventFileDrop)
})
})
}
editor.on('init', function () {
Delay.setEditorTimeout(editor, setup, 0)
})
}
var init$2 = function (editor) {
bindFakeDragEvents(editor)
blockIeDrop(editor)
if (shouldBlockUnsupportedDrop(editor)) {
blockUnsupportedFileDrop(editor)
}
}
var setup$1 = function (editor) {
var renderFocusCaret = first(function () {
if (
!editor.removed &&
editor.getBody().contains(document.activeElement)
) {
var rng = editor.selection.getRng()
if (rng.collapsed) {
var caretRange = renderRangeCaret(editor, rng, false)
editor.selection.setRng(caretRange)
}
}
}, 0)
editor.on('focus', function () {
renderFocusCaret.throttle()
})
editor.on('blur', function () {
renderFocusCaret.cancel()
})
}
var setup = function (editor) {
editor.on('init', function () {
editor.on('focusin', function (e) {
var target = e.target
if (isMedia$2(target)) {
var ceRoot = getContentEditableRoot$1(editor.getBody(), target)
var node = isContentEditableFalse$b(ceRoot) ? ceRoot : target
if (editor.selection.getNode() !== node) {
selectNode(editor, node).each(function (rng) {
return editor.selection.setRng(rng)
})
}
}
})
})
}
var isContentEditableTrue = isContentEditableTrue$4
var isContentEditableFalse = isContentEditableFalse$b
var getContentEditableRoot = function (editor, node) {
return getContentEditableRoot$1(editor.getBody(), node)
}
var SelectionOverrides = function (editor) {
var selection = editor.selection,
dom = editor.dom
var isBlock = dom.isBlock
var rootNode = editor.getBody()
var fakeCaret = FakeCaret(editor, rootNode, isBlock, function () {
return hasFocus(editor)
})
var realSelectionId = 'sel-' + dom.uniqueId()
var elementSelectionAttr = 'data-mce-selected'
var selectedElement
var isFakeSelectionElement = function (node) {
return dom.hasClass(node, 'mce-offscreen-selection')
}
var isFakeSelectionTargetElement = function (node) {
return (
node !== rootNode &&
(isContentEditableFalse(node) || isMedia$2(node)) &&
dom.isChildOf(node, rootNode)
)
}
var isNearFakeSelectionElement = function (pos) {
return (
isBeforeContentEditableFalse(pos) ||
isAfterContentEditableFalse(pos) ||
isBeforeMedia(pos) ||
isAfterMedia(pos)
)
}
var getRealSelectionElement = function () {
var container = dom.get(realSelectionId)
return container ? container.getElementsByTagName('*')[0] : container
}
var setRange = function (range) {
if (range) {
selection.setRng(range)
}
}
var getRange = selection.getRng
var showCaret = function (direction, node, before, scrollIntoView) {
if (scrollIntoView === void 0) {
scrollIntoView = true
}
var e = editor.fire('ShowCaret', {
target: node,
direction: direction,
before: before,
})
if (e.isDefaultPrevented()) {
return null
}
if (scrollIntoView) {
selection.scrollIntoView(node, direction === -1)
}
return fakeCaret.show(before, node)
}
var showBlockCaretContainer = function (blockCaretContainer) {
if (blockCaretContainer.hasAttribute('data-mce-caret')) {
showCaretContainerBlock(blockCaretContainer)
setRange(getRange())
selection.scrollIntoView(blockCaretContainer)
}
}
var registerEvents = function () {
editor.on('mouseup', function (e) {
var range = getRange()
if (
range.collapsed &&
isXYInContentArea(editor, e.clientX, e.clientY)
) {
renderCaretAtRange(editor, range, false).each(setRange)
}
})
editor.on('click', function (e) {
var contentEditableRoot = getContentEditableRoot(editor, e.target)
if (contentEditableRoot) {
if (isContentEditableFalse(contentEditableRoot)) {
e.preventDefault()
editor.focus()
}
if (isContentEditableTrue(contentEditableRoot)) {
if (dom.isChildOf(contentEditableRoot, selection.getNode())) {
removeElementSelection()
}
}
}
})
editor.on('blur NewBlock', removeElementSelection)
editor.on('ResizeWindow FullscreenStateChanged', fakeCaret.reposition)
var hasNormalCaretPosition = function (elm) {
var start = elm.firstChild
if (isNullable(start)) {
return false
}
var startPos = CaretPosition.before(start)
if (isBr$5(startPos.getNode()) && elm.childNodes.length === 1) {
return !isNearFakeSelectionElement(startPos)
} else {
var caretWalker = CaretWalker(elm)
var newPos = caretWalker.next(startPos)
return newPos && !isNearFakeSelectionElement(newPos)
}
}
var isInSameBlock = function (node1, node2) {
var block1 = dom.getParent(node1, isBlock)
var block2 = dom.getParent(node2, isBlock)
return block1 === block2
}
var hasBetterMouseTarget = function (targetNode, caretNode) {
var targetBlock = dom.getParent(targetNode, isBlock)
var caretBlock = dom.getParent(caretNode, isBlock)
if (isNullable(targetBlock)) {
return false
}
if (
targetNode !== caretBlock &&
dom.isChildOf(targetBlock, caretBlock) &&
isContentEditableFalse(
getContentEditableRoot(editor, targetBlock)
) === false
) {
return true
}
return (
!dom.isChildOf(caretBlock, targetBlock) &&
!isInSameBlock(targetBlock, caretBlock) &&
hasNormalCaretPosition(targetBlock)
)
}
editor.on(
'tap',
function (e) {
var targetElm = e.target
var contentEditableRoot = getContentEditableRoot(editor, targetElm)
if (isContentEditableFalse(contentEditableRoot)) {
e.preventDefault()
selectNode(editor, contentEditableRoot).each(setElementSelection)
} else if (isFakeSelectionTargetElement(targetElm)) {
selectNode(editor, targetElm).each(setElementSelection)
}
},
true
)
editor.on('mousedown', function (e) {
var targetElm = e.target
if (
targetElm !== rootNode &&
targetElm.nodeName !== 'HTML' &&
!dom.isChildOf(targetElm, rootNode)
) {
return
}
if (isXYInContentArea(editor, e.clientX, e.clientY) === false) {
return
}
var contentEditableRoot = getContentEditableRoot(editor, targetElm)
if (contentEditableRoot) {
if (isContentEditableFalse(contentEditableRoot)) {
e.preventDefault()
selectNode(editor, contentEditableRoot).each(setElementSelection)
} else {
removeElementSelection()
if (
!(isContentEditableTrue(contentEditableRoot) && e.shiftKey) &&
!isXYWithinRange(e.clientX, e.clientY, selection.getRng())
) {
hideFakeCaret()
selection.placeCaretAt(e.clientX, e.clientY)
}
}
} else if (isFakeSelectionTargetElement(targetElm)) {
selectNode(editor, targetElm).each(setElementSelection)
} else if (isFakeCaretTarget(targetElm) === false) {
removeElementSelection()
hideFakeCaret()
var fakeCaretInfo = closestFakeCaret(rootNode, e.clientX, e.clientY)
if (fakeCaretInfo) {
if (!hasBetterMouseTarget(targetElm, fakeCaretInfo.node)) {
e.preventDefault()
var range = showCaret(
1,
fakeCaretInfo.node,
fakeCaretInfo.before,
false
)
setRange(range)
editor.getBody().focus()
}
}
}
})
editor.on('keypress', function (e) {
if (VK.modifierPressed(e)) {
return
}
if (isContentEditableFalse(selection.getNode())) {
e.preventDefault()
}
})
editor.on('GetSelectionRange', function (e) {
var rng = e.range
if (selectedElement) {
if (!selectedElement.parentNode) {
selectedElement = null
return
}
rng = rng.cloneRange()
rng.selectNode(selectedElement)
e.range = rng
}
})
editor.on('SetSelectionRange', function (e) {
e.range = normalizeShortEndedElementSelection(e.range)
var rng = setElementSelection(e.range, e.forward)
if (rng) {
e.range = rng
}
})
var isPasteBin = function (node) {
return node.id === 'mcepastebin'
}
editor.on('AfterSetSelectionRange', function (e) {
var rng = e.range
var parentNode = rng.startContainer.parentNode
if (!isRangeInCaretContainer(rng) && !isPasteBin(parentNode)) {
hideFakeCaret()
}
if (!isFakeSelectionElement(parentNode)) {
removeElementSelection()
}
})
editor.on('copy', function (e) {
var clipboardData = e.clipboardData
if (!e.isDefaultPrevented() && e.clipboardData && !Env.ie) {
var realSelectionElement = getRealSelectionElement()
if (realSelectionElement) {
e.preventDefault()
clipboardData.clearData()
clipboardData.setData('text/html', realSelectionElement.outerHTML)
clipboardData.setData(
'text/plain',
realSelectionElement.outerText || realSelectionElement.innerText
)
}
}
})
init$2(editor)
setup$1(editor)
setup(editor)
}
var isWithinCaretContainer = function (node) {
return (
isCaretContainer$2(node) ||
startsWithCaretContainer$1(node) ||
endsWithCaretContainer$1(node)
)
}
var isRangeInCaretContainer = function (rng) {
return (
isWithinCaretContainer(rng.startContainer) ||
isWithinCaretContainer(rng.endContainer)
)
}
var normalizeShortEndedElementSelection = function (rng) {
var shortEndedElements = editor.schema.getShortEndedElements()
var newRng = dom.createRng()
var startContainer = rng.startContainer
var startOffset = rng.startOffset
var endContainer = rng.endContainer
var endOffset = rng.endOffset
if (has$2(shortEndedElements, startContainer.nodeName.toLowerCase())) {
if (startOffset === 0) {
newRng.setStartBefore(startContainer)
} else {
newRng.setStartAfter(startContainer)
}
} else {
newRng.setStart(startContainer, startOffset)
}
if (has$2(shortEndedElements, endContainer.nodeName.toLowerCase())) {
if (endOffset === 0) {
newRng.setEndBefore(endContainer)
} else {
newRng.setEndAfter(endContainer)
}
} else {
newRng.setEnd(endContainer, endOffset)
}
return newRng
}
var setupOffscreenSelection = function (
node,
targetClone,
origTargetClone
) {
var $ = editor.$
var $realSelectionContainer = descendant(
SugarElement.fromDom(editor.getBody()),
'#' + realSelectionId
).fold(
function () {
return $([])
},
function (elm) {
return $([elm.dom])
}
)
if ($realSelectionContainer.length === 0) {
$realSelectionContainer = $(
''
).attr('id', realSelectionId)
$realSelectionContainer.appendTo(editor.getBody())
}
var newRange = dom.createRng()
if (targetClone === origTargetClone && Env.ie) {
$realSelectionContainer
.empty()
.append('\xA0
')
.append(targetClone)
newRange.setStartAfter($realSelectionContainer[0].firstChild.firstChild)
newRange.setEndAfter(targetClone)
} else {
$realSelectionContainer
.empty()
.append(nbsp)
.append(targetClone)
.append(nbsp)
newRange.setStart($realSelectionContainer[0].firstChild, 1)
newRange.setEnd($realSelectionContainer[0].lastChild, 0)
}
$realSelectionContainer.css({ top: dom.getPos(node, editor.getBody()).y })
$realSelectionContainer[0].focus()
var sel = selection.getSel()
sel.removeAllRanges()
sel.addRange(newRange)
return newRange
}
var selectElement = function (elm) {
var targetClone = elm.cloneNode(true)
var e = editor.fire('ObjectSelected', {
target: elm,
targetClone: targetClone,
})
if (e.isDefaultPrevented()) {
return null
}
var range = setupOffscreenSelection(elm, e.targetClone, targetClone)
var nodeElm = SugarElement.fromDom(elm)
each$k(
descendants(
SugarElement.fromDom(editor.getBody()),
'*[data-mce-selected]'
),
function (elm) {
if (!eq(nodeElm, elm)) {
remove$6(elm, elementSelectionAttr)
}
}
)
if (!dom.getAttrib(elm, elementSelectionAttr)) {
elm.setAttribute(elementSelectionAttr, '1')
}
selectedElement = elm
hideFakeCaret()
return range
}
var setElementSelection = function (range, forward) {
if (!range) {
return null
}
if (range.collapsed) {
if (!isRangeInCaretContainer(range)) {
var dir = forward ? 1 : -1
var caretPosition = getNormalizedRangeEndPoint(dir, rootNode, range)
var beforeNode = caretPosition.getNode(!forward)
if (isFakeCaretTarget(beforeNode)) {
return showCaret(
dir,
beforeNode,
forward ? !caretPosition.isAtEnd() : false,
false
)
}
var afterNode = caretPosition.getNode(forward)
if (isFakeCaretTarget(afterNode)) {
return showCaret(
dir,
afterNode,
forward ? false : !caretPosition.isAtEnd(),
false
)
}
}
return null
}
var startContainer = range.startContainer
var startOffset = range.startOffset
var endOffset = range.endOffset
if (
startContainer.nodeType === 3 &&
startOffset === 0 &&
isContentEditableFalse(startContainer.parentNode)
) {
startContainer = startContainer.parentNode
startOffset = dom.nodeIndex(startContainer)
startContainer = startContainer.parentNode
}
if (startContainer.nodeType !== 1) {
return null
}
if (
endOffset === startOffset + 1 &&
startContainer === range.endContainer
) {
var node = startContainer.childNodes[startOffset]
if (isFakeSelectionTargetElement(node)) {
return selectElement(node)
}
}
return null
}
var removeElementSelection = function () {
if (selectedElement) {
selectedElement.removeAttribute(elementSelectionAttr)
}
descendant(
SugarElement.fromDom(editor.getBody()),
'#' + realSelectionId
).each(remove$7)
selectedElement = null
}
var destroy = function () {
fakeCaret.destroy()
selectedElement = null
}
var hideFakeCaret = function () {
fakeCaret.hide()
}
if (Env.ceFalse && !isRtc(editor)) {
registerEvents()
}
return {
showCaret: showCaret,
showBlockCaretContainer: showBlockCaretContainer,
hideFakeCaret: hideFakeCaret,
destroy: destroy,
}
}
var Quirks = function (editor) {
var each = Tools.each
var BACKSPACE = VK.BACKSPACE,
DELETE = VK.DELETE,
dom = editor.dom,
selection = editor.selection,
parser = editor.parser
var isGecko = Env.gecko,
isIE = Env.ie,
isWebKit = Env.webkit
var mceInternalUrlPrefix = 'data:text/mce-internal,'
var mceInternalDataType = isIE ? 'Text' : 'URL'
var setEditorCommandState = function (cmd, state) {
try {
editor.getDoc().execCommand(cmd, false, state)
} catch (ex) {}
}
var isDefaultPrevented = function (e) {
return e.isDefaultPrevented()
}
var setMceInternalContent = function (e) {
var selectionHtml, internalContent
if (e.dataTransfer) {
if (editor.selection.isCollapsed() && e.target.tagName === 'IMG') {
selection.select(e.target)
}
selectionHtml = editor.selection.getContent()
if (selectionHtml.length > 0) {
internalContent =
mceInternalUrlPrefix +
escape(editor.id) +
',' +
escape(selectionHtml)
e.dataTransfer.setData(mceInternalDataType, internalContent)
}
}
}
var getMceInternalContent = function (e) {
var internalContent
if (e.dataTransfer) {
internalContent = e.dataTransfer.getData(mceInternalDataType)
if (
internalContent &&
internalContent.indexOf(mceInternalUrlPrefix) >= 0
) {
internalContent = internalContent
.substr(mceInternalUrlPrefix.length)
.split(',')
return {
id: unescape(internalContent[0]),
html: unescape(internalContent[1]),
}
}
}
return null
}
var insertClipboardContents = function (content, internal) {
if (editor.queryCommandSupported('mceInsertClipboardContent')) {
editor.execCommand('mceInsertClipboardContent', false, {
content: content,
internal: internal,
})
} else {
editor.execCommand('mceInsertContent', false, content)
}
}
var emptyEditorWhenDeleting = function () {
var serializeRng = function (rng) {
var body = dom.create('body')
var contents = rng.cloneContents()
body.appendChild(contents)
return selection.serializer.serialize(body, { format: 'html' })
}
var allContentsSelected = function (rng) {
var selection = serializeRng(rng)
var allRng = dom.createRng()
allRng.selectNode(editor.getBody())
var allSelection = serializeRng(allRng)
return selection === allSelection
}
editor.on('keydown', function (e) {
var keyCode = e.keyCode
var isCollapsed, body
if (
!isDefaultPrevented(e) &&
(keyCode === DELETE || keyCode === BACKSPACE)
) {
isCollapsed = editor.selection.isCollapsed()
body = editor.getBody()
if (isCollapsed && !dom.isEmpty(body)) {
return
}
if (!isCollapsed && !allContentsSelected(editor.selection.getRng())) {
return
}
e.preventDefault()
editor.setContent('')
if (body.firstChild && dom.isBlock(body.firstChild)) {
editor.selection.setCursorLocation(body.firstChild, 0)
} else {
editor.selection.setCursorLocation(body, 0)
}
editor.nodeChanged()
}
})
}
var selectAll = function () {
editor.shortcuts.add('meta+a', null, 'SelectAll')
}
var documentElementEditingFocus = function () {
if (!editor.inline) {
dom.bind(editor.getDoc(), 'mousedown mouseup', function (e) {
var rng
if (e.target === editor.getDoc().documentElement) {
rng = selection.getRng()
editor.getBody().focus()
if (e.type === 'mousedown') {
if (isCaretContainer$2(rng.startContainer)) {
return
}
selection.placeCaretAt(e.clientX, e.clientY)
} else {
selection.setRng(rng)
}
}
})
}
}
var removeHrOnBackspace = function () {
editor.on('keydown', function (e) {
if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {
if (!editor.getBody().getElementsByTagName('hr').length) {
return
}
if (selection.isCollapsed() && selection.getRng().startOffset === 0) {
var node = selection.getNode()
var previousSibling = node.previousSibling
if (node.nodeName === 'HR') {
dom.remove(node)
e.preventDefault()
return
}
if (
previousSibling &&
previousSibling.nodeName &&
previousSibling.nodeName.toLowerCase() === 'hr'
) {
dom.remove(previousSibling)
e.preventDefault()
}
}
}
})
}
var focusBody = function () {
if (!Range.prototype.getClientRects) {
editor.on('mousedown', function (e) {
if (!isDefaultPrevented(e) && e.target.nodeName === 'HTML') {
var body_1 = editor.getBody()
body_1.blur()
Delay.setEditorTimeout(editor, function () {
body_1.focus()
})
}
})
}
}
var selectControlElements = function () {
editor.on('click', function (e) {
var target = e.target
if (
/^(IMG|HR)$/.test(target.nodeName) &&
dom.getContentEditableParent(target) !== 'false'
) {
e.preventDefault()
editor.selection.select(target)
editor.nodeChanged()
}
if (
target.nodeName === 'A' &&
dom.hasClass(target, 'mce-item-anchor')
) {
e.preventDefault()
selection.select(target)
}
})
}
var removeStylesWhenDeletingAcrossBlockElements = function () {
var getAttributeApplyFunction = function () {
var template = dom.getAttribs(selection.getStart().cloneNode(false))
return function () {
var target = selection.getStart()
if (target !== editor.getBody()) {
dom.setAttrib(target, 'style', null)
each(template, function (attr) {
target.setAttributeNode(attr.cloneNode(true))
})
}
}
}
var isSelectionAcrossElements = function () {
return (
!selection.isCollapsed() &&
dom.getParent(selection.getStart(), dom.isBlock) !==
dom.getParent(selection.getEnd(), dom.isBlock)
)
}
editor.on('keypress', function (e) {
var applyAttributes
if (
!isDefaultPrevented(e) &&
(e.keyCode === 8 || e.keyCode === 46) &&
isSelectionAcrossElements()
) {
applyAttributes = getAttributeApplyFunction()
editor.getDoc().execCommand('delete', false, null)
applyAttributes()
e.preventDefault()
return false
}
})
dom.bind(editor.getDoc(), 'cut', function (e) {
var applyAttributes
if (!isDefaultPrevented(e) && isSelectionAcrossElements()) {
applyAttributes = getAttributeApplyFunction()
Delay.setEditorTimeout(editor, function () {
applyAttributes()
})
}
})
}
var disableBackspaceIntoATable = function () {
editor.on('keydown', function (e) {
if (!isDefaultPrevented(e) && e.keyCode === BACKSPACE) {
if (selection.isCollapsed() && selection.getRng().startOffset === 0) {
var previousSibling = selection.getNode().previousSibling
if (
previousSibling &&
previousSibling.nodeName &&
previousSibling.nodeName.toLowerCase() === 'table'
) {
e.preventDefault()
return false
}
}
}
})
}
var removeBlockQuoteOnBackSpace = function () {
editor.on('keydown', function (e) {
var rng, parent
if (isDefaultPrevented(e) || e.keyCode !== VK.BACKSPACE) {
return
}
rng = selection.getRng()
var container = rng.startContainer
var offset = rng.startOffset
var root = dom.getRoot()
parent = container
if (!rng.collapsed || offset !== 0) {
return
}
while (
parent &&
parent.parentNode &&
parent.parentNode.firstChild === parent &&
parent.parentNode !== root
) {
parent = parent.parentNode
}
if (parent.tagName === 'BLOCKQUOTE') {
editor.formatter.toggle('blockquote', null, parent)
rng = dom.createRng()
rng.setStart(container, 0)
rng.setEnd(container, 0)
selection.setRng(rng)
}
})
}
var setGeckoEditingOptions = function () {
var setOpts = function () {
setEditorCommandState('StyleWithCSS', false)
setEditorCommandState('enableInlineTableEditing', false)
if (!getObjectResizing(editor)) {
setEditorCommandState('enableObjectResizing', false)
}
}
if (!isReadOnly$1(editor)) {
editor.on('BeforeExecCommand mousedown', setOpts)
}
}
var addBrAfterLastLinks = function () {
var fixLinks = function () {
each(dom.select('a'), function (node) {
var parentNode = node.parentNode
var root = dom.getRoot()
if (parentNode.lastChild === node) {
while (parentNode && !dom.isBlock(parentNode)) {
if (
parentNode.parentNode.lastChild !== parentNode ||
parentNode === root
) {
return
}
parentNode = parentNode.parentNode
}
dom.add(parentNode, 'br', { 'data-mce-bogus': 1 })
}
})
}
editor.on('SetContent ExecCommand', function (e) {
if (e.type === 'setcontent' || e.command === 'mceInsertLink') {
fixLinks()
}
})
}
var setDefaultBlockType = function () {
if (getForcedRootBlock(editor)) {
editor.on('init', function () {
setEditorCommandState(
'DefaultParagraphSeparator',
getForcedRootBlock(editor)
)
})
}
}
var normalizeSelection = function () {
editor.on(
'keyup focusin mouseup',
function (e) {
if (!VK.modifierPressed(e)) {
selection.normalize()
}
},
true
)
}
var showBrokenImageIcon = function () {
editor.contentStyles.push(
'img:-moz-broken {' +
'-moz-force-broken-image-icon:1;' +
'min-width:24px;' +
'min-height:24px' +
'}'
)
}
var restoreFocusOnKeyDown = function () {
if (!editor.inline) {
editor.on('keydown', function () {
if (document.activeElement === document.body) {
editor.getWin().focus()
}
})
}
}
var bodyHeight = function () {
if (!editor.inline) {
editor.contentStyles.push('body {min-height: 150px}')
editor.on('click', function (e) {
var rng
if (e.target.nodeName === 'HTML') {
if (Env.ie > 11) {
editor.getBody().focus()
return
}
rng = editor.selection.getRng()
editor.getBody().focus()
editor.selection.setRng(rng)
editor.selection.normalize()
editor.nodeChanged()
}
})
}
}
var blockCmdArrowNavigation = function () {
if (Env.mac) {
editor.on('keydown', function (e) {
if (
VK.metaKeyPressed(e) &&
!e.shiftKey &&
(e.keyCode === 37 || e.keyCode === 39)
) {
e.preventDefault()
var selection_1 = editor.selection.getSel()
selection_1.modify(
'move',
e.keyCode === 37 ? 'backward' : 'forward',
'lineboundary'
)
}
})
}
}
var disableAutoUrlDetect = function () {
setEditorCommandState('AutoUrlDetect', false)
}
var tapLinksAndImages = function () {
editor.on('click', function (e) {
var elm = e.target
do {
if (elm.tagName === 'A') {
e.preventDefault()
return
}
} while ((elm = elm.parentNode))
})
editor.contentStyles.push(
'.mce-content-body {-webkit-touch-callout: none}'
)
}
var blockFormSubmitInsideEditor = function () {
editor.on('init', function () {
editor.dom.bind(editor.getBody(), 'submit', function (e) {
e.preventDefault()
})
})
}
var removeAppleInterchangeBrs = function () {
parser.addNodeFilter('br', function (nodes) {
var i = nodes.length
while (i--) {
if (nodes[i].attr('class') === 'Apple-interchange-newline') {
nodes[i].remove()
}
}
})
}
var ieInternalDragAndDrop = function () {
editor.on('dragstart', function (e) {
setMceInternalContent(e)
})
editor.on('drop', function (e) {
if (!isDefaultPrevented(e)) {
var internalContent = getMceInternalContent(e)
if (internalContent && internalContent.id !== editor.id) {
e.preventDefault()
var rng = fromPoint(e.x, e.y, editor.getDoc())
selection.setRng(rng)
insertClipboardContents(internalContent.html, true)
}
}
})
}
var refreshContentEditable = noop
var isHidden = function () {
if (!isGecko || editor.removed) {
return false
}
var sel = editor.selection.getSel()
return !sel || !sel.rangeCount || sel.rangeCount === 0
}
var setupRtc = function () {
if (isWebKit) {
documentElementEditingFocus()
selectControlElements()
blockFormSubmitInsideEditor()
selectAll()
if (Env.iOS) {
restoreFocusOnKeyDown()
bodyHeight()
tapLinksAndImages()
}
}
if (isGecko) {
focusBody()
setGeckoEditingOptions()
showBrokenImageIcon()
blockCmdArrowNavigation()
}
}
var setup = function () {
removeBlockQuoteOnBackSpace()
emptyEditorWhenDeleting()
if (!Env.windowsPhone) {
normalizeSelection()
}
if (isWebKit) {
documentElementEditingFocus()
selectControlElements()
setDefaultBlockType()
blockFormSubmitInsideEditor()
disableBackspaceIntoATable()
removeAppleInterchangeBrs()
if (Env.iOS) {
restoreFocusOnKeyDown()
bodyHeight()
tapLinksAndImages()
} else {
selectAll()
}
}
if (Env.ie >= 11) {
bodyHeight()
disableBackspaceIntoATable()
}
if (Env.ie) {
selectAll()
disableAutoUrlDetect()
ieInternalDragAndDrop()
}
if (isGecko) {
removeHrOnBackspace()
focusBody()
removeStylesWhenDeletingAcrossBlockElements()
setGeckoEditingOptions()
addBrAfterLastLinks()
showBrokenImageIcon()
blockCmdArrowNavigation()
disableBackspaceIntoATable()
}
}
if (isRtc(editor)) {
setupRtc()
} else {
setup()
}
return {
refreshContentEditable: refreshContentEditable,
isHidden: isHidden,
}
}
var DOM$6 = DOMUtils.DOM
var appendStyle = function (editor, text) {
var body = SugarElement.fromDom(editor.getBody())
var container = getStyleContainer(getRootNode(body))
var style = SugarElement.fromTag('style')
set$1(style, 'type', 'text/css')
append$1(style, SugarElement.fromText(text))
append$1(container, style)
editor.on('remove', function () {
remove$7(style)
})
}
var getRootName = function (editor) {
return editor.inline
? editor.getElement().nodeName.toLowerCase()
: undefined
}
var removeUndefined = function (obj) {
return filter$3(obj, function (v) {
return isUndefined(v) === false
})
}
var mkParserSettings = function (editor) {
var settings = editor.settings
var blobCache = editor.editorUpload.blobCache
return removeUndefined({
allow_conditional_comments: settings.allow_conditional_comments,
allow_html_data_urls: settings.allow_html_data_urls,
allow_svg_data_urls: settings.allow_svg_data_urls,
allow_html_in_named_anchor: settings.allow_html_in_named_anchor,
allow_script_urls: settings.allow_script_urls,
allow_unsafe_link_target: settings.allow_unsafe_link_target,
convert_fonts_to_spans: settings.convert_fonts_to_spans,
fix_list_elements: settings.fix_list_elements,
font_size_legacy_values: settings.font_size_legacy_values,
forced_root_block: settings.forced_root_block,
forced_root_block_attrs: settings.forced_root_block_attrs,
padd_empty_with_br: settings.padd_empty_with_br,
preserve_cdata: settings.preserve_cdata,
remove_trailing_brs: settings.remove_trailing_brs,
inline_styles: settings.inline_styles,
root_name: getRootName(editor),
validate: true,
blob_cache: blobCache,
document: editor.getDoc(),
images_dataimg_filter: settings.images_dataimg_filter,
})
}
var mkSerializerSettings = function (editor) {
var settings = editor.settings
return __assign(
__assign({}, mkParserSettings(editor)),
removeUndefined({
url_converter: settings.url_converter,
url_converter_scope: settings.url_converter_scope,
element_format: settings.element_format,
entities: settings.entities,
entity_encoding: settings.entity_encoding,
indent: settings.indent,
indent_after: settings.indent_after,
indent_before: settings.indent_before,
block_elements: settings.block_elements,
boolean_attributes: settings.boolean_attributes,
custom_elements: settings.custom_elements,
extended_valid_elements: settings.extended_valid_elements,
invalid_elements: settings.invalid_elements,
invalid_styles: settings.invalid_styles,
move_caret_before_on_enter_elements:
settings.move_caret_before_on_enter_elements,
non_empty_elements: settings.non_empty_elements,
schema: settings.schema,
self_closing_elements: settings.self_closing_elements,
short_ended_elements: settings.short_ended_elements,
special: settings.special,
text_block_elements: settings.text_block_elements,
text_inline_elements: settings.text_inline_elements,
valid_children: settings.valid_children,
valid_classes: settings.valid_classes,
valid_elements: settings.valid_elements,
valid_styles: settings.valid_styles,
verify_html: settings.verify_html,
whitespace_elements: settings.whitespace_elements,
})
)
}
var createParser = function (editor) {
var parser = DomParser(mkParserSettings(editor), editor.schema)
parser.addAttributeFilter(
'src,href,style,tabindex',
function (nodes, name) {
var i = nodes.length,
node,
value
var dom = editor.dom
var internalName = 'data-mce-' + name
while (i--) {
node = nodes[i]
value = node.attr(name)
if (value && !node.attr(internalName)) {
if (value.indexOf('data:') === 0 || value.indexOf('blob:') === 0) {
continue
}
if (name === 'style') {
value = dom.serializeStyle(dom.parseStyle(value), node.name)
if (!value.length) {
value = null
}
node.attr(internalName, value)
node.attr(name, value)
} else if (name === 'tabindex') {
node.attr(internalName, value)
node.attr(name, null)
} else {
node.attr(internalName, editor.convertURL(value, name, node.name))
}
}
}
}
)
parser.addNodeFilter('script', function (nodes) {
var i = nodes.length
while (i--) {
var node = nodes[i]
var type = node.attr('type') || 'no/type'
if (type.indexOf('mce-') !== 0) {
node.attr('type', 'mce-' + type)
}
}
})
if (editor.settings.preserve_cdata) {
parser.addNodeFilter('#cdata', function (nodes) {
var i = nodes.length
while (i--) {
var node = nodes[i]
node.type = 8
node.name = '#comment'
node.value = '[CDATA[' + editor.dom.encode(node.value) + ']]'
}
})
}
parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div', function (nodes) {
var i = nodes.length
var nonEmptyElements = editor.schema.getNonEmptyElements()
while (i--) {
var node = nodes[i]
if (node.isEmpty(nonEmptyElements) && node.getAll('br').length === 0) {
node.append(new AstNode('br', 1)).shortEnded = true
}
}
})
return parser
}
var autoFocus = function (editor) {
if (editor.settings.auto_focus) {
Delay.setEditorTimeout(
editor,
function () {
var focusEditor
if (editor.settings.auto_focus === true) {
focusEditor = editor
} else {
focusEditor = editor.editorManager.get(editor.settings.auto_focus)
}
if (!focusEditor.destroyed) {
focusEditor.focus()
}
},
100
)
}
}
var moveSelectionToFirstCaretPosition = function (editor) {
var root = editor.dom.getRoot()
if (
!editor.inline &&
(!hasAnyRanges(editor) || editor.selection.getStart(true) === root)
) {
firstPositionIn(root).each(function (pos) {
var node = pos.getNode()
var caretPos = isTable$3(node) ? firstPositionIn(node).getOr(pos) : pos
if (Env.browser.isIE()) {
storeNative(editor, caretPos.toRange())
} else {
editor.selection.setRng(caretPos.toRange())
}
})
}
}
var initEditor = function (editor) {
editor.bindPendingEventDelegates()
editor.initialized = true
fireInit(editor)
editor.focus(true)
moveSelectionToFirstCaretPosition(editor)
editor.nodeChanged({ initial: true })
editor.execCallback('init_instance_callback', editor)
autoFocus(editor)
}
var getStyleSheetLoader$1 = function (editor) {
return editor.inline
? editor.ui.styleSheetLoader
: editor.dom.styleSheetLoader
}
var makeStylesheetLoadingPromises = function (editor, css, framedFonts) {
var promises = [
new promiseObj(function (resolve, reject) {
return getStyleSheetLoader$1(editor).loadAll(css, resolve, reject)
}),
]
if (editor.inline) {
return promises
} else {
return promises.concat([
new promiseObj(function (resolve, reject) {
return editor.ui.styleSheetLoader.loadAll(
framedFonts,
resolve,
reject
)
}),
])
}
}
var loadContentCss = function (editor) {
var styleSheetLoader = getStyleSheetLoader$1(editor)
var fontCss = getFontCss(editor)
var css = editor.contentCSS
var removeCss = function () {
styleSheetLoader.unloadAll(css)
if (!editor.inline) {
editor.ui.styleSheetLoader.unloadAll(fontCss)
}
}
var loaded = function () {
if (editor.removed) {
removeCss()
} else {
editor.on('remove', removeCss)
}
}
if (editor.contentStyles.length > 0) {
var contentCssText_1 = ''
Tools.each(editor.contentStyles, function (style) {
contentCssText_1 += style + '\r\n'
})
editor.dom.addStyle(contentCssText_1)
}
var allStylesheets = promiseObj
.all(makeStylesheetLoadingPromises(editor, css, fontCss))
.then(loaded)
.catch(loaded)
if (editor.settings.content_style) {
appendStyle(editor, editor.settings.content_style)
}
return allStylesheets
}
var preInit = function (editor) {
var settings = editor.settings,
doc = editor.getDoc(),
body = editor.getBody()
firePreInit(editor)
if (!settings.browser_spellcheck && !settings.gecko_spellcheck) {
doc.body.spellcheck = false
DOM$6.setAttrib(body, 'spellcheck', 'false')
}
editor.quirks = Quirks(editor)
firePostRender(editor)
var directionality = getDirectionality(editor)
if (directionality !== undefined) {
body.dir = directionality
}
if (settings.protect) {
editor.on('BeforeSetContent', function (e) {
Tools.each(settings.protect, function (pattern) {
e.content = e.content.replace(pattern, function (str) {
return ''
})
})
})
}
editor.on('SetContent', function () {
editor.addVisual(editor.getBody())
})
editor.on('compositionstart compositionend', function (e) {
editor.composing = e.type === 'compositionstart'
})
}
var loadInitialContent = function (editor) {
if (!isRtc(editor)) {
editor.load({
initial: true,
format: 'html',
})
}
editor.startContent = editor.getContent({ format: 'raw' })
}
var initEditorWithInitialContent = function (editor) {
if (editor.removed !== true) {
loadInitialContent(editor)
initEditor(editor)
}
}
var initContentBody = function (editor, skipWrite) {
var settings = editor.settings
var targetElm = editor.getElement()
var doc = editor.getDoc()
if (!settings.inline) {
editor.getElement().style.visibility = editor.orgVisibility
}
if (!skipWrite && !editor.inline) {
doc.open()
doc.write(editor.iframeHTML)
doc.close()
}
if (editor.inline) {
DOM$6.addClass(targetElm, 'mce-content-body')
editor.contentDocument = doc = document
editor.contentWindow = window
editor.bodyElement = targetElm
editor.contentAreaContainer = targetElm
}
var body = editor.getBody()
body.disabled = true
editor.readonly = !!settings.readonly
if (!editor.readonly) {
if (
editor.inline &&
DOM$6.getStyle(body, 'position', true) === 'static'
) {
body.style.position = 'relative'
}
body.contentEditable = editor.getParam('content_editable_state', true)
}
body.disabled = false
editor.editorUpload = EditorUpload(editor)
editor.schema = Schema(settings)
editor.dom = DOMUtils(doc, {
keep_values: true,
url_converter: editor.convertURL,
url_converter_scope: editor,
hex_colors: settings.force_hex_style_colors,
update_styles: true,
root_element: editor.inline ? editor.getBody() : null,
collect: function () {
return editor.inline
},
schema: editor.schema,
contentCssCors: shouldUseContentCssCors(editor),
referrerPolicy: getReferrerPolicy(editor),
onSetAttrib: function (e) {
editor.fire('SetAttrib', e)
},
})
editor.parser = createParser(editor)
editor.serializer = DomSerializer(mkSerializerSettings(editor), editor)
editor.selection = EditorSelection(
editor.dom,
editor.getWin(),
editor.serializer,
editor
)
editor.annotator = Annotator(editor)
editor.formatter = Formatter(editor)
editor.undoManager = UndoManager(editor)
editor._nodeChangeDispatcher = new NodeChange(editor)
editor._selectionOverrides = SelectionOverrides(editor)
setup$e(editor)
setup$3(editor)
if (!isRtc(editor)) {
setup$2(editor)
}
var caret = setup$4(editor)
setup$f(editor, caret)
setup$d(editor)
setup$g(editor)
var setupRtcThunk = setup$i(editor)
preInit(editor)
setupRtcThunk.fold(
function () {
loadContentCss(editor).then(function () {
return initEditorWithInitialContent(editor)
})
},
function (setupRtc) {
editor.setProgressState(true)
loadContentCss(editor).then(function () {
setupRtc().then(
function (_rtcMode) {
editor.setProgressState(false)
initEditorWithInitialContent(editor)
},
function (err) {
editor.notificationManager.open({
type: 'error',
text: String(err),
})
initEditorWithInitialContent(editor)
}
)
})
}
)
}
var DOM$5 = DOMUtils.DOM
var relaxDomain = function (editor, ifr) {
if (document.domain !== window.location.hostname && Env.browser.isIE()) {
var bodyUuid = uuid('mce')
editor[bodyUuid] = function () {
initContentBody(editor)
}
var domainRelaxUrl =
'javascript:(function(){' +
'document.open();document.domain="' +
document.domain +
'";' +
'var ed = window.parent.tinymce.get("' +
editor.id +
'");document.write(ed.iframeHTML);' +
'document.close();ed.' +
bodyUuid +
'(true);})()'
DOM$5.setAttrib(ifr, 'src', domainRelaxUrl)
return true
}
return false
}
var createIframeElement = function (id, title, height, customAttrs) {
var iframe = SugarElement.fromTag('iframe')
setAll$1(iframe, customAttrs)
setAll$1(iframe, {
id: id + '_ifr',
frameBorder: '0',
allowTransparency: 'true',
title: title,
})
add$1(iframe, 'tox-edit-area__iframe')
return iframe
}
var getIframeHtml = function (editor) {
var iframeHTML = getDocType(editor) + ''
if (getDocumentBaseUrl(editor) !== editor.documentBaseUrl) {
iframeHTML += ''
}
iframeHTML +=
''
var bodyId = getBodyId(editor)
var bodyClass = getBodyClass(editor)
var translatedAriaText = editor.translate(getIframeAriaText(editor))
if (getContentSecurityPolicy(editor)) {
iframeHTML +=
''
}
iframeHTML +=
'' +
('') +
'
' +
''
return iframeHTML
}
var createIframe = function (editor, o) {
var iframeTitle = editor.translate('Rich Text Area')
var ifr = createIframeElement(
editor.id,
iframeTitle,
o.height,
getIframeAttrs(editor)
).dom
ifr.onload = function () {
ifr.onload = null
editor.fire('load')
}
var isDomainRelaxed = relaxDomain(editor, ifr)
editor.contentAreaContainer = o.iframeContainer
editor.iframeElement = ifr
editor.iframeHTML = getIframeHtml(editor)
DOM$5.add(o.iframeContainer, ifr)
return isDomainRelaxed
}
var init$1 = function (editor, boxInfo) {
var isDomainRelaxed = createIframe(editor, boxInfo)
if (boxInfo.editorContainer) {
DOM$5.get(boxInfo.editorContainer).style.display = editor.orgDisplay
editor.hidden = DOM$5.isHidden(boxInfo.editorContainer)
}
editor.getElement().style.display = 'none'
DOM$5.setAttrib(editor.id, 'aria-hidden', 'true')
if (!isDomainRelaxed) {
initContentBody(editor)
}
}
var DOM$4 = DOMUtils.DOM
var initPlugin = function (editor, initializedPlugins, plugin) {
var Plugin = PluginManager.get(plugin)
var pluginUrl =
PluginManager.urls[plugin] || editor.documentBaseUrl.replace(/\/$/, '')
plugin = Tools.trim(plugin)
if (Plugin && Tools.inArray(initializedPlugins, plugin) === -1) {
Tools.each(PluginManager.dependencies(plugin), function (dep) {
initPlugin(editor, initializedPlugins, dep)
})
if (editor.plugins[plugin]) {
return
}
try {
var pluginInstance = new Plugin(editor, pluginUrl, editor.$)
editor.plugins[plugin] = pluginInstance
if (pluginInstance.init) {
pluginInstance.init(editor, pluginUrl)
initializedPlugins.push(plugin)
}
} catch (e) {
pluginInitError(editor, plugin, e)
}
}
}
var trimLegacyPrefix = function (name) {
return name.replace(/^\-/, '')
}
var initPlugins = function (editor) {
var initializedPlugins = []
Tools.each(getPlugins(editor).split(/[ ,]/), function (name) {
initPlugin(editor, initializedPlugins, trimLegacyPrefix(name))
})
}
var initIcons = function (editor) {
var iconPackName = Tools.trim(getIconPackName(editor))
var currentIcons = editor.ui.registry.getAll().icons
var loadIcons = __assign(
__assign({}, IconManager.get('default').icons),
IconManager.get(iconPackName).icons
)
each$j(loadIcons, function (svgData, icon) {
if (!has$2(currentIcons, icon)) {
editor.ui.registry.addIcon(icon, svgData)
}
})
}
var initTheme = function (editor) {
var theme = getTheme(editor)
if (isString$1(theme)) {
editor.settings.theme = trimLegacyPrefix(theme)
var Theme = ThemeManager.get(theme)
editor.theme = new Theme(editor, ThemeManager.urls[theme])
if (editor.theme.init) {
editor.theme.init(
editor,
ThemeManager.urls[theme] || editor.documentBaseUrl.replace(/\/$/, ''),
editor.$
)
}
} else {
editor.theme = {}
}
}
var renderFromLoadedTheme = function (editor) {
return editor.theme.renderUI()
}
var renderFromThemeFunc = function (editor) {
var elm = editor.getElement()
var theme = getTheme(editor)
var info = theme(editor, elm)
if (info.editorContainer.nodeType) {
info.editorContainer.id = info.editorContainer.id || editor.id + '_parent'
}
if (info.iframeContainer && info.iframeContainer.nodeType) {
info.iframeContainer.id =
info.iframeContainer.id || editor.id + '_iframecontainer'
}
info.height = info.iframeHeight ? info.iframeHeight : elm.offsetHeight
return info
}
var createThemeFalseResult = function (element) {
return {
editorContainer: element,
iframeContainer: element,
api: {},
}
}
var renderThemeFalseIframe = function (targetElement) {
var iframeContainer = DOM$4.create('div')
DOM$4.insertAfter(iframeContainer, targetElement)
return createThemeFalseResult(iframeContainer)
}
var renderThemeFalse = function (editor) {
var targetElement = editor.getElement()
return editor.inline
? createThemeFalseResult(null)
: renderThemeFalseIframe(targetElement)
}
var renderThemeUi = function (editor) {
var elm = editor.getElement()
editor.orgDisplay = elm.style.display
if (isString$1(getTheme(editor))) {
return renderFromLoadedTheme(editor)
} else if (isFunction(getTheme(editor))) {
return renderFromThemeFunc(editor)
} else {
return renderThemeFalse(editor)
}
}
var augmentEditorUiApi = function (editor, api) {
var uiApiFacade = {
show: Optional.from(api.show).getOr(noop),
hide: Optional.from(api.hide).getOr(noop),
disable: Optional.from(api.disable).getOr(noop),
isDisabled: Optional.from(api.isDisabled).getOr(never),
enable: function () {
if (!editor.mode.isReadOnly()) {
Optional.from(api.enable).map(call)
}
},
}
editor.ui = __assign(__assign({}, editor.ui), uiApiFacade)
}
var init = function (editor) {
editor.fire('ScriptsLoaded')
initIcons(editor)
initTheme(editor)
initPlugins(editor)
var renderInfo = renderThemeUi(editor)
augmentEditorUiApi(editor, Optional.from(renderInfo.api).getOr({}))
var boxInfo = {
editorContainer: renderInfo.editorContainer,
iframeContainer: renderInfo.iframeContainer,
}
editor.editorContainer = boxInfo.editorContainer
? boxInfo.editorContainer
: null
appendContentCssFromSettings(editor)
if (editor.inline) {
return initContentBody(editor)
} else {
return init$1(editor, boxInfo)
}
}
var DOM$3 = DOMUtils.DOM
var hasSkipLoadPrefix = function (name) {
return name.charAt(0) === '-'
}
var loadLanguage = function (scriptLoader, editor) {
var languageCode = getLanguageCode(editor)
var languageUrl = getLanguageUrl(editor)
if (I18n.hasCode(languageCode) === false && languageCode !== 'en') {
var url_1 =
languageUrl !== ''
? languageUrl
: editor.editorManager.baseURL + '/langs/' + languageCode + '.js'
scriptLoader.add(url_1, noop, undefined, function () {
languageLoadError(editor, url_1, languageCode)
})
}
}
var loadTheme = function (scriptLoader, editor, suffix, callback) {
var theme = getTheme(editor)
if (isString$1(theme)) {
if (!hasSkipLoadPrefix(theme) && !has$2(ThemeManager.urls, theme)) {
var themeUrl = getThemeUrl(editor)
if (themeUrl) {
ThemeManager.load(theme, editor.documentBaseURI.toAbsolute(themeUrl))
} else {
ThemeManager.load(
theme,
'themes/' + theme + '/theme' + suffix + '.js'
)
}
}
scriptLoader.loadQueue(function () {
ThemeManager.waitFor(theme, callback)
})
} else {
callback()
}
}
var getIconsUrlMetaFromUrl = function (editor) {
return Optional.from(getIconsUrl(editor))
.filter(function (url) {
return url.length > 0
})
.map(function (url) {
return {
url: url,
name: Optional.none(),
}
})
}
var getIconsUrlMetaFromName = function (editor, name, suffix) {
return Optional.from(name)
.filter(function (name) {
return name.length > 0 && !IconManager.has(name)
})
.map(function (name) {
return {
url:
editor.editorManager.baseURL +
'/icons/' +
name +
'/icons' +
suffix +
'.js',
name: Optional.some(name),
}
})
}
var loadIcons = function (scriptLoader, editor, suffix) {
var defaultIconsUrl = getIconsUrlMetaFromName(editor, 'default', suffix)
var customIconsUrl = getIconsUrlMetaFromUrl(editor).orThunk(function () {
return getIconsUrlMetaFromName(editor, getIconPackName(editor), '')
})
each$k(cat([defaultIconsUrl, customIconsUrl]), function (urlMeta) {
scriptLoader.add(urlMeta.url, noop, undefined, function () {
iconsLoadError(editor, urlMeta.url, urlMeta.name.getOrUndefined())
})
})
}
var loadPlugins = function (editor, suffix) {
Tools.each(getExternalPlugins$1(editor), function (url, name) {
PluginManager.load(name, url, noop, undefined, function () {
pluginLoadError(editor, url, name)
})
editor.settings.plugins += ' ' + name
})
Tools.each(getPlugins(editor).split(/[ ,]/), function (plugin) {
plugin = Tools.trim(plugin)
if (plugin && !PluginManager.urls[plugin]) {
if (hasSkipLoadPrefix(plugin)) {
plugin = plugin.substr(1, plugin.length)
var dependencies = PluginManager.dependencies(plugin)
Tools.each(dependencies, function (depPlugin) {
var defaultSettings = {
prefix: 'plugins/',
resource: depPlugin,
suffix: '/plugin' + suffix + '.js',
}
var dep = PluginManager.createUrl(defaultSettings, depPlugin)
PluginManager.load(dep.resource, dep, noop, undefined, function () {
pluginLoadError(
editor,
dep.prefix + dep.resource + dep.suffix,
dep.resource
)
})
})
} else {
var url_2 = {
prefix: 'plugins/',
resource: plugin,
suffix: '/plugin' + suffix + '.js',
}
PluginManager.load(plugin, url_2, noop, undefined, function () {
pluginLoadError(
editor,
url_2.prefix + url_2.resource + url_2.suffix,
plugin
)
})
}
}
})
}
var loadScripts = function (editor, suffix) {
var scriptLoader = ScriptLoader.ScriptLoader
loadTheme(scriptLoader, editor, suffix, function () {
loadLanguage(scriptLoader, editor)
loadIcons(scriptLoader, editor, suffix)
loadPlugins(editor, suffix)
scriptLoader.loadQueue(
function () {
if (!editor.removed) {
init(editor)
}
},
editor,
function () {
if (!editor.removed) {
init(editor)
}
}
)
})
}
var getStyleSheetLoader = function (element, editor) {
return instance.forElement(element, {
contentCssCors: hasContentCssCors(editor),
referrerPolicy: getReferrerPolicy(editor),
})
}
var render = function (editor) {
var id = editor.id
I18n.setCode(getLanguageCode(editor))
var readyHandler = function () {
DOM$3.unbind(window, 'ready', readyHandler)
editor.render()
}
if (!EventUtils.Event.domLoaded) {
DOM$3.bind(window, 'ready', readyHandler)
return
}
if (!editor.getElement()) {
return
}
if (!Env.contentEditable) {
return
}
var element = SugarElement.fromDom(editor.getElement())
var snapshot = clone$3(element)
editor.on('remove', function () {
eachr(element.dom.attributes, function (attr) {
return remove$6(element, attr.name)
})
setAll$1(element, snapshot)
})
editor.ui.styleSheetLoader = getStyleSheetLoader(element, editor)
if (!isInline(editor)) {
editor.orgVisibility = editor.getElement().style.visibility
editor.getElement().style.visibility = 'hidden'
} else {
editor.inline = true
}
var form = editor.getElement().form || DOM$3.getParent(id, 'form')
if (form) {
editor.formElement = form
if (hasHiddenInput(editor) && !isTextareaOrInput(editor.getElement())) {
DOM$3.insertAfter(
DOM$3.create('input', {
type: 'hidden',
name: id,
}),
id
)
editor.hasHiddenInput = true
}
editor.formEventDelegate = function (e) {
editor.fire(e.type, e)
}
DOM$3.bind(form, 'submit reset', editor.formEventDelegate)
editor.on('reset', function () {
editor.resetContent()
})
if (
shouldPatchSubmit(editor) &&
!form.submit.nodeType &&
!form.submit.length &&
!form._mceOldSubmit
) {
form._mceOldSubmit = form.submit
form.submit = function () {
editor.editorManager.triggerSave()
editor.setDirty(false)
return form._mceOldSubmit(form)
}
}
}
editor.windowManager = WindowManager(editor)
editor.notificationManager = NotificationManager(editor)
if (isEncodingXml(editor)) {
editor.on('GetContent', function (e) {
if (e.save) {
e.content = DOM$3.encode(e.content)
}
})
}
if (shouldAddFormSubmitTrigger(editor)) {
editor.on('submit', function () {
if (editor.initialized) {
editor.save()
}
})
}
if (shouldAddUnloadTrigger(editor)) {
editor._beforeUnload = function () {
if (editor.initialized && !editor.destroyed && !editor.isHidden()) {
editor.save({
format: 'raw',
no_events: true,
set_dirty: false,
})
}
}
editor.editorManager.on('BeforeUnload', editor._beforeUnload)
}
editor.editorManager.add(editor)
loadScripts(editor, editor.suffix)
}
var addVisual = function (editor, elm) {
return addVisual$1(editor, elm)
}
var legacyPropNames = {
'font-size': 'size',
'font-family': 'face',
}
var getSpecifiedFontProp = function (propName, rootElm, elm) {
var getProperty = function (elm) {
return getRaw(elm, propName).orThunk(function () {
if (name(elm) === 'font') {
return get$9(legacyPropNames, propName).bind(function (
legacyPropName
) {
return getOpt(elm, legacyPropName)
})
} else {
return Optional.none()
}
})
}
var isRoot = function (elm) {
return eq(SugarElement.fromDom(rootElm), elm)
}
return closest$1(
SugarElement.fromDom(elm),
function (elm) {
return getProperty(elm)
},
isRoot
)
}
var normalizeFontFamily = function (fontFamily) {
return fontFamily.replace(/[\'\"\\]/g, '').replace(/,\s+/g, ',')
}
var getComputedFontProp = function (propName, elm) {
return Optional.from(DOMUtils.DOM.getStyle(elm, propName, true))
}
var getFontProp = function (propName) {
return function (rootElm, elm) {
return Optional.from(elm)
.map(SugarElement.fromDom)
.filter(isElement$6)
.bind(function (element) {
return getSpecifiedFontProp(propName, rootElm, element.dom).or(
getComputedFontProp(propName, element.dom)
)
})
.getOr('')
}
}
var getFontSize = getFontProp('font-size')
var getFontFamily = compose(normalizeFontFamily, getFontProp('font-family'))
var findFirstCaretElement = function (editor) {
return firstPositionIn(editor.getBody()).map(function (caret) {
var container = caret.container()
return isText$7(container) ? container.parentNode : container
})
}
var getCaretElement = function (editor) {
return Optional.from(editor.selection.getRng()).bind(function (rng) {
var root = editor.getBody()
var atStartOfNode = rng.startContainer === root && rng.startOffset === 0
return atStartOfNode
? Optional.none()
: Optional.from(editor.selection.getStart(true))
})
}
var bindRange = function (editor, binder) {
return getCaretElement(editor)
.orThunk(curry(findFirstCaretElement, editor))
.map(SugarElement.fromDom)
.filter(isElement$6)
.bind(binder)
}
var mapRange = function (editor, mapper) {
return bindRange(editor, compose1(Optional.some, mapper))
}
var fromFontSizeNumber = function (editor, value) {
if (/^[0-9.]+$/.test(value)) {
var fontSizeNumber = parseInt(value, 10)
if (fontSizeNumber >= 1 && fontSizeNumber <= 7) {
var fontSizes = getFontStyleValues(editor)
var fontClasses = getFontSizeClasses(editor)
if (fontClasses) {
return fontClasses[fontSizeNumber - 1] || value
} else {
return fontSizes[fontSizeNumber - 1] || value
}
} else {
return value
}
} else {
return value
}
}
var normalizeFontNames = function (font) {
var fonts = font.split(/\s*,\s*/)
return map$3(fonts, function (font) {
if (
font.indexOf(' ') !== -1 &&
!(startsWith(font, '"') || startsWith(font, "'"))
) {
return "'" + font + "'"
} else {
return font
}
}).join(',')
}
var fontNameAction = function (editor, value) {
var font = fromFontSizeNumber(editor, value)
editor.formatter.toggle('fontname', { value: normalizeFontNames(font) })
editor.nodeChanged()
}
var fontNameQuery = function (editor) {
return mapRange(editor, function (elm) {
return getFontFamily(editor.getBody(), elm.dom)
}).getOr('')
}
var fontSizeAction = function (editor, value) {
editor.formatter.toggle('fontsize', {
value: fromFontSizeNumber(editor, value),
})
editor.nodeChanged()
}
var fontSizeQuery = function (editor) {
return mapRange(editor, function (elm) {
return getFontSize(editor.getBody(), elm.dom)
}).getOr('')
}
var lineHeightQuery = function (editor) {
return mapRange(editor, function (elm) {
var root = SugarElement.fromDom(editor.getBody())
var specifiedStyle = closest$1(
elm,
function (elm) {
return getRaw(elm, 'line-height')
},
curry(eq, root)
)
var computedStyle = function () {
var lineHeight = parseFloat(get$5(elm, 'line-height'))
var fontSize = parseFloat(get$5(elm, 'font-size'))
return String(lineHeight / fontSize)
}
return specifiedStyle.getOrThunk(computedStyle)
}).getOr('')
}
var lineHeightAction = function (editor, lineHeight) {
editor.formatter.toggle('lineheight', { value: String(lineHeight) })
editor.nodeChanged()
}
var processValue = function (value) {
if (typeof value !== 'string') {
var details = Tools.extend(
{
paste: value.paste,
data: { paste: value.paste },
},
value
)
return {
content: value.content,
details: details,
}
}
return {
content: value,
details: {},
}
}
var insertAtCaret = function (editor, value) {
var result = processValue(value)
insertContent(editor, result.content, result.details)
}
var each$4 = Tools.each
var map = Tools.map,
inArray = Tools.inArray
var EditorCommands = (function () {
function EditorCommands(editor) {
this.commands = {
state: {},
exec: {},
value: {},
}
this.editor = editor
this.setupCommands(editor)
}
EditorCommands.prototype.execCommand = function (command, ui, value, args) {
var func,
state = false
var self = this
if (self.editor.removed) {
return
}
if (command.toLowerCase() !== 'mcefocus') {
if (
!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(
command
) &&
(!args || !args.skip_focus)
) {
self.editor.focus()
} else {
restore(self.editor)
}
}
args = self.editor.fire('BeforeExecCommand', {
command: command,
ui: ui,
value: value,
})
if (args.isDefaultPrevented()) {
return false
}
var customCommand = command.toLowerCase()
if ((func = self.commands.exec[customCommand])) {
func(customCommand, ui, value)
self.editor.fire('ExecCommand', {
command: command,
ui: ui,
value: value,
})
return true
}
each$4(this.editor.plugins, function (p) {
if (p.execCommand && p.execCommand(command, ui, value)) {
self.editor.fire('ExecCommand', {
command: command,
ui: ui,
value: value,
})
state = true
return false
}
})
if (state) {
return state
}
if (
self.editor.theme &&
self.editor.theme.execCommand &&
self.editor.theme.execCommand(command, ui, value)
) {
self.editor.fire('ExecCommand', {
command: command,
ui: ui,
value: value,
})
return true
}
try {
state = self.editor.getDoc().execCommand(command, ui, value)
} catch (ex) {}
if (state) {
self.editor.fire('ExecCommand', {
command: command,
ui: ui,
value: value,
})
return true
}
return false
}
EditorCommands.prototype.queryCommandState = function (command) {
var func
if (this.editor.quirks.isHidden() || this.editor.removed) {
return
}
command = command.toLowerCase()
if ((func = this.commands.state[command])) {
return func(command)
}
try {
return this.editor.getDoc().queryCommandState(command)
} catch (ex) {}
return false
}
EditorCommands.prototype.queryCommandValue = function (command) {
var func
if (this.editor.quirks.isHidden() || this.editor.removed) {
return
}
command = command.toLowerCase()
if ((func = this.commands.value[command])) {
return func(command)
}
try {
return this.editor.getDoc().queryCommandValue(command)
} catch (ex) {}
}
EditorCommands.prototype.addCommands = function (commandList, type) {
if (type === void 0) {
type = 'exec'
}
var self = this
each$4(commandList, function (callback, command) {
each$4(command.toLowerCase().split(','), function (command) {
self.commands[type][command] = callback
})
})
}
EditorCommands.prototype.addCommand = function (command, callback, scope) {
var _this = this
command = command.toLowerCase()
this.commands.exec[command] = function (command, ui, value, args) {
return callback.call(scope || _this.editor, ui, value, args)
}
}
EditorCommands.prototype.queryCommandSupported = function (command) {
command = command.toLowerCase()
if (this.commands.exec[command]) {
return true
}
try {
return this.editor.getDoc().queryCommandSupported(command)
} catch (ex) {}
return false
}
EditorCommands.prototype.addQueryStateHandler = function (
command,
callback,
scope
) {
var _this = this
command = command.toLowerCase()
this.commands.state[command] = function () {
return callback.call(scope || _this.editor)
}
}
EditorCommands.prototype.addQueryValueHandler = function (
command,
callback,
scope
) {
var _this = this
command = command.toLowerCase()
this.commands.value[command] = function () {
return callback.call(scope || _this.editor)
}
}
EditorCommands.prototype.hasCustomCommand = function (command) {
command = command.toLowerCase()
return !!this.commands.exec[command]
}
EditorCommands.prototype.execNativeCommand = function (command, ui, value) {
if (ui === undefined) {
ui = false
}
if (value === undefined) {
value = null
}
return this.editor.getDoc().execCommand(command, ui, value)
}
EditorCommands.prototype.isFormatMatch = function (name) {
return this.editor.formatter.match(name)
}
EditorCommands.prototype.toggleFormat = function (name, value) {
this.editor.formatter.toggle(name, value)
this.editor.nodeChanged()
}
EditorCommands.prototype.storeSelection = function (type) {
this.selectionBookmark = this.editor.selection.getBookmark(type)
}
EditorCommands.prototype.restoreSelection = function () {
this.editor.selection.moveToBookmark(this.selectionBookmark)
}
EditorCommands.prototype.setupCommands = function (editor) {
var self = this
this.addCommands({
'mceResetDesignMode,mceBeginUndoLevel': noop,
'mceEndUndoLevel,mceAddUndoLevel': function () {
editor.undoManager.add()
},
mceFocus: function (_command, _ui, value) {
focus(editor, value)
},
'Cut,Copy,Paste': function (command) {
var doc = editor.getDoc()
var failed
try {
self.execNativeCommand(command)
} catch (ex) {
failed = true
}
if (command === 'paste' && !doc.queryCommandEnabled(command)) {
failed = true
}
if (failed || !doc.queryCommandSupported(command)) {
var msg = editor.translate(
"Your browser doesn't support direct access to the clipboard. " +
'Please use the Ctrl+X/C/V keyboard shortcuts instead.'
)
if (Env.mac) {
msg = msg.replace(/Ctrl\+/g, '\u2318+')
}
editor.notificationManager.open({
text: msg,
type: 'error',
})
}
},
unlink: function () {
if (editor.selection.isCollapsed()) {
var elm = editor.dom.getParent(editor.selection.getStart(), 'a')
if (elm) {
editor.dom.remove(elm, true)
}
return
}
editor.formatter.remove('link')
},
'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone':
function (command) {
var align = command.substring(7)
if (align === 'full') {
align = 'justify'
}
each$4('left,center,right,justify'.split(','), function (name) {
if (align !== name) {
editor.formatter.remove('align' + name)
}
})
if (align !== 'none') {
self.toggleFormat('align' + align)
}
},
'InsertUnorderedList,InsertOrderedList': function (command) {
var listParent
self.execNativeCommand(command)
var listElm = editor.dom.getParent(
editor.selection.getNode(),
'ol,ul'
)
if (listElm) {
listParent = listElm.parentNode
if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) {
self.storeSelection()
editor.dom.split(listParent, listElm)
self.restoreSelection()
}
}
},
'Bold,Italic,Underline,Strikethrough,Superscript,Subscript': function (
command
) {
self.toggleFormat(command)
},
'ForeColor,HiliteColor': function (command, ui, value) {
self.toggleFormat(command, { value: value })
},
FontName: function (command, ui, value) {
fontNameAction(editor, value)
},
FontSize: function (command, ui, value) {
fontSizeAction(editor, value)
},
LineHeight: function (command, ui, value) {
lineHeightAction(editor, value)
},
Lang: function (command, ui, lang) {
self.toggleFormat(command, {
value: lang.code,
customValue: lang.customCode,
})
},
RemoveFormat: function (command) {
editor.formatter.remove(command)
},
mceBlockQuote: function () {
self.toggleFormat('blockquote')
},
FormatBlock: function (command, ui, value) {
return self.toggleFormat(value || 'p')
},
mceCleanup: function () {
var bookmark = editor.selection.getBookmark()
editor.setContent(editor.getContent())
editor.selection.moveToBookmark(bookmark)
},
mceRemoveNode: function (command, ui, value) {
var node = value || editor.selection.getNode()
if (node !== editor.getBody()) {
self.storeSelection()
editor.dom.remove(node, true)
self.restoreSelection()
}
},
mceSelectNodeDepth: function (command, ui, value) {
var counter = 0
editor.dom.getParent(
editor.selection.getNode(),
function (node) {
if (node.nodeType === 1 && counter++ === value) {
editor.selection.select(node)
return false
}
},
editor.getBody()
)
},
mceSelectNode: function (command, ui, value) {
editor.selection.select(value)
},
mceInsertContent: function (command, ui, value) {
insertAtCaret(editor, value)
},
mceInsertRawHTML: function (command, ui, value) {
editor.selection.setContent('tiny_mce_marker')
var content = editor.getContent()
editor.setContent(
content.replace(/tiny_mce_marker/g, function () {
return value
})
)
},
mceInsertNewLine: function (command, ui, value) {
insert(editor, value)
},
mceToggleFormat: function (command, ui, value) {
self.toggleFormat(value)
},
mceSetContent: function (command, ui, value) {
editor.setContent(value)
},
'Indent,Outdent': function (command) {
handle(editor, command)
},
mceRepaint: noop,
InsertHorizontalRule: function () {
editor.execCommand('mceInsertContent', false, '
')
},
mceToggleVisualAid: function () {
editor.hasVisual = !editor.hasVisual
editor.addVisual()
},
mceReplaceContent: function (command, ui, value) {
editor.execCommand(
'mceInsertContent',
false,
value.replace(
/\{\$selection\}/g,
editor.selection.getContent({ format: 'text' })
)
)
},
mceInsertLink: function (command, ui, value) {
if (typeof value === 'string') {
value = { href: value }
}
var anchor = editor.dom.getParent(editor.selection.getNode(), 'a')
value.href = value.href.replace(/ /g, '%20')
if (!anchor || !value.href) {
editor.formatter.remove('link')
}
if (value.href) {
editor.formatter.apply('link', value, anchor)
}
},
selectAll: function () {
var editingHost = editor.dom.getParent(
editor.selection.getStart(),
isContentEditableTrue$4
)
if (editingHost) {
var rng = editor.dom.createRng()
rng.selectNodeContents(editingHost)
editor.selection.setRng(rng)
}
},
mceNewDocument: function () {
editor.setContent('')
},
InsertLineBreak: function (command, ui, value) {
insert$1(editor, value)
return true
},
})
var alignStates = function (name) {
return function () {
var selection = editor.selection
var nodes = selection.isCollapsed()
? [editor.dom.getParent(selection.getNode(), editor.dom.isBlock)]
: selection.getSelectedBlocks()
var matches = map(nodes, function (node) {
return !!editor.formatter.matchNode(node, name)
})
return inArray(matches, true) !== -1
}
}
self.addCommands(
{
JustifyLeft: alignStates('alignleft'),
JustifyCenter: alignStates('aligncenter'),
JustifyRight: alignStates('alignright'),
JustifyFull: alignStates('alignjustify'),
'Bold,Italic,Underline,Strikethrough,Superscript,Subscript':
function (command) {
return self.isFormatMatch(command)
},
mceBlockQuote: function () {
return self.isFormatMatch('blockquote')
},
Outdent: function () {
return canOutdent(editor)
},
'InsertUnorderedList,InsertOrderedList': function (command) {
var list = editor.dom.getParent(editor.selection.getNode(), 'ul,ol')
return (
list &&
((command === 'insertunorderedlist' && list.tagName === 'UL') ||
(command === 'insertorderedlist' && list.tagName === 'OL'))
)
},
},
'state'
)
self.addCommands({
Undo: function () {
editor.undoManager.undo()
},
Redo: function () {
editor.undoManager.redo()
},
})
self.addQueryValueHandler(
'FontName',
function () {
return fontNameQuery(editor)
},
this
)
self.addQueryValueHandler(
'FontSize',
function () {
return fontSizeQuery(editor)
},
this
)
self.addQueryValueHandler(
'LineHeight',
function () {
return lineHeightQuery(editor)
},
this
)
}
return EditorCommands
})()
var internalContentEditableAttr = 'data-mce-contenteditable'
var toggleClass = function (elm, cls, state) {
if (has(elm, cls) && state === false) {
remove$3(elm, cls)
} else if (state) {
add$1(elm, cls)
}
}
var setEditorCommandState = function (editor, cmd, state) {
try {
editor.getDoc().execCommand(cmd, false, String(state))
} catch (ex) {}
}
var setContentEditable = function (elm, state) {
elm.dom.contentEditable = state ? 'true' : 'false'
}
var switchOffContentEditableTrue = function (elm) {
each$k(descendants(elm, '*[contenteditable="true"]'), function (elm) {
set$1(elm, internalContentEditableAttr, 'true')
setContentEditable(elm, false)
})
}
var switchOnContentEditableTrue = function (elm) {
each$k(
descendants(elm, '*[' + internalContentEditableAttr + '="true"]'),
function (elm) {
remove$6(elm, internalContentEditableAttr)
setContentEditable(elm, true)
}
)
}
var removeFakeSelection = function (editor) {
Optional.from(editor.selection.getNode()).each(function (elm) {
elm.removeAttribute('data-mce-selected')
})
}
var restoreFakeSelection = function (editor) {
editor.selection.setRng(editor.selection.getRng())
}
var toggleReadOnly = function (editor, state) {
var body = SugarElement.fromDom(editor.getBody())
toggleClass(body, 'mce-content-readonly', state)
if (state) {
editor.selection.controlSelection.hideResizeRect()
editor._selectionOverrides.hideFakeCaret()
removeFakeSelection(editor)
editor.readonly = true
setContentEditable(body, false)
switchOffContentEditableTrue(body)
} else {
editor.readonly = false
setContentEditable(body, true)
switchOnContentEditableTrue(body)
setEditorCommandState(editor, 'StyleWithCSS', false)
setEditorCommandState(editor, 'enableInlineTableEditing', false)
setEditorCommandState(editor, 'enableObjectResizing', false)
if (hasEditorOrUiFocus(editor)) {
editor.focus()
}
restoreFakeSelection(editor)
editor.nodeChanged()
}
}
var isReadOnly = function (editor) {
return editor.readonly
}
var registerFilters = function (editor) {
editor.parser.addAttributeFilter('contenteditable', function (nodes) {
if (isReadOnly(editor)) {
each$k(nodes, function (node) {
node.attr(internalContentEditableAttr, node.attr('contenteditable'))
node.attr('contenteditable', 'false')
})
}
})
editor.serializer.addAttributeFilter(
internalContentEditableAttr,
function (nodes) {
if (isReadOnly(editor)) {
each$k(nodes, function (node) {
node.attr('contenteditable', node.attr(internalContentEditableAttr))
})
}
}
)
editor.serializer.addTempAttr(internalContentEditableAttr)
}
var registerReadOnlyContentFilters = function (editor) {
if (editor.serializer) {
registerFilters(editor)
} else {
editor.on('PreInit', function () {
registerFilters(editor)
})
}
}
var isClickEvent = function (e) {
return e.type === 'click'
}
var getAnchorHrefOpt = function (editor, elm) {
var isRoot = function (elm) {
return eq(elm, SugarElement.fromDom(editor.getBody()))
}
return closest$2(elm, 'a', isRoot).bind(function (a) {
return getOpt(a, 'href')
})
}
var processReadonlyEvents = function (editor, e) {
if (isClickEvent(e) && !VK.metaKeyPressed(e)) {
var elm = SugarElement.fromDom(e.target)
getAnchorHrefOpt(editor, elm).each(function (href) {
e.preventDefault()
if (/^#/.test(href)) {
var targetEl = editor.dom.select(
href + ',[name="' + removeLeading(href, '#') + '"]'
)
if (targetEl.length) {
editor.selection.scrollIntoView(targetEl[0], true)
}
} else {
window.open(
href,
'_blank',
'rel=noopener noreferrer,menubar=yes,toolbar=yes,location=yes,status=yes,resizable=yes,scrollbars=yes'
)
}
})
}
}
var registerReadOnlySelectionBlockers = function (editor) {
editor.on('ShowCaret', function (e) {
if (isReadOnly(editor)) {
e.preventDefault()
}
})
editor.on('ObjectSelected', function (e) {
if (isReadOnly(editor)) {
e.preventDefault()
}
})
}
var nativeEvents = Tools.makeMap(
'focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange ' +
'mouseout mouseenter mouseleave wheel keydown keypress keyup input beforeinput contextmenu dragstart dragend dragover ' +
'draggesture dragdrop drop drag submit ' +
'compositionstart compositionend compositionupdate touchstart touchmove touchend touchcancel',
' '
)
var EventDispatcher = (function () {
function EventDispatcher(settings) {
this.bindings = {}
this.settings = settings || {}
this.scope = this.settings.scope || this
this.toggleEvent = this.settings.toggleEvent || never
}
EventDispatcher.isNative = function (name) {
return !!nativeEvents[name.toLowerCase()]
}
EventDispatcher.prototype.fire = function (name, args) {
var lcName = name.toLowerCase()
var event = normalize$3(lcName, args || {}, this.scope)
if (this.settings.beforeFire) {
this.settings.beforeFire(event)
}
var handlers = this.bindings[lcName]
if (handlers) {
for (var i = 0, l = handlers.length; i < l; i++) {
var callback = handlers[i]
if (callback.removed) {
continue
}
if (callback.once) {
this.off(lcName, callback.func)
}
if (event.isImmediatePropagationStopped()) {
return event
}
if (callback.func.call(this.scope, event) === false) {
event.preventDefault()
return event
}
}
}
return event
}
EventDispatcher.prototype.on = function (name, callback, prepend, extra) {
if (callback === false) {
callback = never
}
if (callback) {
var wrappedCallback = {
func: callback,
removed: false,
}
if (extra) {
Tools.extend(wrappedCallback, extra)
}
var names = name.toLowerCase().split(' ')
var i = names.length
while (i--) {
var currentName = names[i]
var handlers = this.bindings[currentName]
if (!handlers) {
handlers = []
this.toggleEvent(currentName, true)
}
if (prepend) {
handlers = __spreadArray([wrappedCallback], handlers, true)
} else {
handlers = __spreadArray(
__spreadArray([], handlers, true),
[wrappedCallback],
false
)
}
this.bindings[currentName] = handlers
}
}
return this
}
EventDispatcher.prototype.off = function (name, callback) {
var _this = this
if (name) {
var names = name.toLowerCase().split(' ')
var i = names.length
while (i--) {
var currentName = names[i]
var handlers = this.bindings[currentName]
if (!currentName) {
each$j(this.bindings, function (_value, bindingName) {
_this.toggleEvent(bindingName, false)
delete _this.bindings[bindingName]
})
return this
}
if (handlers) {
if (!callback) {
handlers.length = 0
} else {
var filteredHandlers = partition(handlers, function (handler) {
return handler.func === callback
})
handlers = filteredHandlers.fail
this.bindings[currentName] = handlers
each$k(filteredHandlers.pass, function (handler) {
handler.removed = true
})
}
if (!handlers.length) {
this.toggleEvent(name, false)
delete this.bindings[currentName]
}
}
}
} else {
each$j(this.bindings, function (_value, name) {
_this.toggleEvent(name, false)
})
this.bindings = {}
}
return this
}
EventDispatcher.prototype.once = function (name, callback, prepend) {
return this.on(name, callback, prepend, { once: true })
}
EventDispatcher.prototype.has = function (name) {
name = name.toLowerCase()
return !(!this.bindings[name] || this.bindings[name].length === 0)
}
return EventDispatcher
})()
var getEventDispatcher = function (obj) {
if (!obj._eventDispatcher) {
obj._eventDispatcher = new EventDispatcher({
scope: obj,
toggleEvent: function (name, state) {
if (EventDispatcher.isNative(name) && obj.toggleNativeEvent) {
obj.toggleNativeEvent(name, state)
}
},
})
}
return obj._eventDispatcher
}
var Observable = {
fire: function (name, args, bubble) {
var self = this
if (self.removed && name !== 'remove' && name !== 'detach') {
return args
}
var dispatcherArgs = getEventDispatcher(self).fire(name, args)
if (bubble !== false && self.parent) {
var parent_1 = self.parent()
while (parent_1 && !dispatcherArgs.isPropagationStopped()) {
parent_1.fire(name, dispatcherArgs, false)
parent_1 = parent_1.parent()
}
}
return dispatcherArgs
},
on: function (name, callback, prepend) {
return getEventDispatcher(this).on(name, callback, prepend)
},
off: function (name, callback) {
return getEventDispatcher(this).off(name, callback)
},
once: function (name, callback) {
return getEventDispatcher(this).once(name, callback)
},
hasEventListeners: function (name) {
return getEventDispatcher(this).has(name)
},
}
var DOM$2 = DOMUtils.DOM
var customEventRootDelegates
var getEventTarget = function (editor, eventName) {
if (eventName === 'selectionchange') {
return editor.getDoc()
}
if (
!editor.inline &&
/^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(eventName)
) {
return editor.getDoc().documentElement
}
var eventRoot = getEventRoot(editor)
if (eventRoot) {
if (!editor.eventRoot) {
editor.eventRoot = DOM$2.select(eventRoot)[0]
}
return editor.eventRoot
}
return editor.getBody()
}
var isListening = function (editor) {
return !editor.hidden && !isReadOnly(editor)
}
var fireEvent = function (editor, eventName, e) {
if (isListening(editor)) {
editor.fire(eventName, e)
} else if (isReadOnly(editor)) {
processReadonlyEvents(editor, e)
}
}
var bindEventDelegate = function (editor, eventName) {
var delegate
if (!editor.delegates) {
editor.delegates = {}
}
if (editor.delegates[eventName] || editor.removed) {
return
}
var eventRootElm = getEventTarget(editor, eventName)
if (getEventRoot(editor)) {
if (!customEventRootDelegates) {
customEventRootDelegates = {}
editor.editorManager.on('removeEditor', function () {
if (!editor.editorManager.activeEditor) {
if (customEventRootDelegates) {
each$j(customEventRootDelegates, function (_value, name) {
editor.dom.unbind(getEventTarget(editor, name))
})
customEventRootDelegates = null
}
}
})
}
if (customEventRootDelegates[eventName]) {
return
}
delegate = function (e) {
var target = e.target
var editors = editor.editorManager.get()
var i = editors.length
while (i--) {
var body = editors[i].getBody()
if (body === target || DOM$2.isChildOf(target, body)) {
fireEvent(editors[i], eventName, e)
}
}
}
customEventRootDelegates[eventName] = delegate
DOM$2.bind(eventRootElm, eventName, delegate)
} else {
delegate = function (e) {
fireEvent(editor, eventName, e)
}
DOM$2.bind(eventRootElm, eventName, delegate)
editor.delegates[eventName] = delegate
}
}
var EditorObservable = __assign(__assign({}, Observable), {
bindPendingEventDelegates: function () {
var self = this
Tools.each(self._pendingNativeEvents, function (name) {
bindEventDelegate(self, name)
})
},
toggleNativeEvent: function (name, state) {
var self = this
if (name === 'focus' || name === 'blur') {
return
}
if (self.removed) {
return
}
if (state) {
if (self.initialized) {
bindEventDelegate(self, name)
} else {
if (!self._pendingNativeEvents) {
self._pendingNativeEvents = [name]
} else {
self._pendingNativeEvents.push(name)
}
}
} else if (self.initialized) {
self.dom.unbind(getEventTarget(self, name), name, self.delegates[name])
delete self.delegates[name]
}
},
unbindAllNativeEvents: function () {
var self = this
var body = self.getBody()
var dom = self.dom
if (self.delegates) {
each$j(self.delegates, function (value, name) {
self.dom.unbind(getEventTarget(self, name), name, value)
})
delete self.delegates
}
if (!self.inline && body && dom) {
body.onload = null
dom.unbind(self.getWin())
dom.unbind(self.getDoc())
}
if (dom) {
dom.unbind(body)
dom.unbind(self.getContainer())
}
},
})
var defaultModes = ['design', 'readonly']
var switchToMode = function (editor, activeMode, availableModes, mode) {
var oldMode = availableModes[activeMode.get()]
var newMode = availableModes[mode]
try {
newMode.activate()
} catch (e) {
console.error('problem while activating editor mode ' + mode + ':', e)
return
}
oldMode.deactivate()
if (oldMode.editorReadOnly !== newMode.editorReadOnly) {
toggleReadOnly(editor, newMode.editorReadOnly)
}
activeMode.set(mode)
fireSwitchMode(editor, mode)
}
var setMode = function (editor, availableModes, activeMode, mode) {
if (mode === activeMode.get()) {
return
} else if (!has$2(availableModes, mode)) {
throw new Error("Editor mode '" + mode + "' is invalid")
}
if (editor.initialized) {
switchToMode(editor, activeMode, availableModes, mode)
} else {
editor.on('init', function () {
return switchToMode(editor, activeMode, availableModes, mode)
})
}
}
var registerMode = function (availableModes, mode, api) {
var _a
if (contains$3(defaultModes, mode)) {
throw new Error('Cannot override default mode ' + mode)
}
return __assign(
__assign({}, availableModes),
((_a = {}),
(_a[mode] = __assign(__assign({}, api), {
deactivate: function () {
try {
api.deactivate()
} catch (e) {
console.error(
'problem while deactivating editor mode ' + mode + ':',
e
)
}
},
})),
_a)
)
}
var create$4 = function (editor) {
var activeMode = Cell('design')
var availableModes = Cell({
design: {
activate: noop,
deactivate: noop,
editorReadOnly: false,
},
readonly: {
activate: noop,
deactivate: noop,
editorReadOnly: true,
},
})
registerReadOnlyContentFilters(editor)
registerReadOnlySelectionBlockers(editor)
return {
isReadOnly: function () {
return isReadOnly(editor)
},
set: function (mode) {
return setMode(editor, availableModes.get(), activeMode, mode)
},
get: function () {
return activeMode.get()
},
register: function (mode, api) {
availableModes.set(registerMode(availableModes.get(), mode, api))
},
}
}
var each$3 = Tools.each,
explode$1 = Tools.explode
var keyCodeLookup = {
f1: 112,
f2: 113,
f3: 114,
f4: 115,
f5: 116,
f6: 117,
f7: 118,
f8: 119,
f9: 120,
f10: 121,
f11: 122,
f12: 123,
}
var modifierNames = Tools.makeMap('alt,ctrl,shift,meta,access')
var parseShortcut = function (pattern) {
var key
var shortcut = {}
each$3(explode$1(pattern.toLowerCase(), '+'), function (value) {
if (value in modifierNames) {
shortcut[value] = true
} else {
if (/^[0-9]{2,}$/.test(value)) {
shortcut.keyCode = parseInt(value, 10)
} else {
shortcut.charCode = value.charCodeAt(0)
shortcut.keyCode =
keyCodeLookup[value] || value.toUpperCase().charCodeAt(0)
}
}
})
var id = [shortcut.keyCode]
for (key in modifierNames) {
if (shortcut[key]) {
id.push(key)
} else {
shortcut[key] = false
}
}
shortcut.id = id.join(',')
if (shortcut.access) {
shortcut.alt = true
if (Env.mac) {
shortcut.ctrl = true
} else {
shortcut.shift = true
}
}
if (shortcut.meta) {
if (Env.mac) {
shortcut.meta = true
} else {
shortcut.ctrl = true
shortcut.meta = false
}
}
return shortcut
}
var Shortcuts = (function () {
function Shortcuts(editor) {
this.shortcuts = {}
this.pendingPatterns = []
this.editor = editor
var self = this
editor.on('keyup keypress keydown', function (e) {
if (
(self.hasModifier(e) || self.isFunctionKey(e)) &&
!e.isDefaultPrevented()
) {
each$3(self.shortcuts, function (shortcut) {
if (self.matchShortcut(e, shortcut)) {
self.pendingPatterns = shortcut.subpatterns.slice(0)
if (e.type === 'keydown') {
self.executeShortcutAction(shortcut)
}
return true
}
})
if (self.matchShortcut(e, self.pendingPatterns[0])) {
if (self.pendingPatterns.length === 1) {
if (e.type === 'keydown') {
self.executeShortcutAction(self.pendingPatterns[0])
}
}
self.pendingPatterns.shift()
}
}
})
}
Shortcuts.prototype.add = function (pattern, desc, cmdFunc, scope) {
var self = this
var func = self.normalizeCommandFunc(cmdFunc)
each$3(explode$1(Tools.trim(pattern)), function (pattern) {
var shortcut = self.createShortcut(pattern, desc, func, scope)
self.shortcuts[shortcut.id] = shortcut
})
return true
}
Shortcuts.prototype.remove = function (pattern) {
var shortcut = this.createShortcut(pattern)
if (this.shortcuts[shortcut.id]) {
delete this.shortcuts[shortcut.id]
return true
}
return false
}
Shortcuts.prototype.normalizeCommandFunc = function (cmdFunc) {
var self = this
var cmd = cmdFunc
if (typeof cmd === 'string') {
return function () {
self.editor.execCommand(cmd, false, null)
}
} else if (Tools.isArray(cmd)) {
return function () {
self.editor.execCommand(cmd[0], cmd[1], cmd[2])
}
} else {
return cmd
}
}
Shortcuts.prototype.createShortcut = function (
pattern,
desc,
cmdFunc,
scope
) {
var shortcuts = Tools.map(explode$1(pattern, '>'), parseShortcut)
shortcuts[shortcuts.length - 1] = Tools.extend(
shortcuts[shortcuts.length - 1],
{
func: cmdFunc,
scope: scope || this.editor,
}
)
return Tools.extend(shortcuts[0], {
desc: this.editor.translate(desc),
subpatterns: shortcuts.slice(1),
})
}
Shortcuts.prototype.hasModifier = function (e) {
return e.altKey || e.ctrlKey || e.metaKey
}
Shortcuts.prototype.isFunctionKey = function (e) {
return e.type === 'keydown' && e.keyCode >= 112 && e.keyCode <= 123
}
Shortcuts.prototype.matchShortcut = function (e, shortcut) {
if (!shortcut) {
return false
}
if (shortcut.ctrl !== e.ctrlKey || shortcut.meta !== e.metaKey) {
return false
}
if (shortcut.alt !== e.altKey || shortcut.shift !== e.shiftKey) {
return false
}
if (
e.keyCode === shortcut.keyCode ||
(e.charCode && e.charCode === shortcut.charCode)
) {
e.preventDefault()
return true
}
return false
}
Shortcuts.prototype.executeShortcutAction = function (shortcut) {
return shortcut.func ? shortcut.func.call(shortcut.scope) : null
}
return Shortcuts
})()
var create$3 = function () {
var buttons = {}
var menuItems = {}
var popups = {}
var icons = {}
var contextMenus = {}
var contextToolbars = {}
var sidebars = {}
var add = function (collection, type) {
return function (name, spec) {
return (collection[name.toLowerCase()] = __assign(__assign({}, spec), {
type: type,
}))
}
}
var addIcon = function (name, svgData) {
return (icons[name.toLowerCase()] = svgData)
}
return {
addButton: add(buttons, 'button'),
addGroupToolbarButton: add(buttons, 'grouptoolbarbutton'),
addToggleButton: add(buttons, 'togglebutton'),
addMenuButton: add(buttons, 'menubutton'),
addSplitButton: add(buttons, 'splitbutton'),
addMenuItem: add(menuItems, 'menuitem'),
addNestedMenuItem: add(menuItems, 'nestedmenuitem'),
addToggleMenuItem: add(menuItems, 'togglemenuitem'),
addAutocompleter: add(popups, 'autocompleter'),
addContextMenu: add(contextMenus, 'contextmenu'),
addContextToolbar: add(contextToolbars, 'contexttoolbar'),
addContextForm: add(contextToolbars, 'contextform'),
addSidebar: add(sidebars, 'sidebar'),
addIcon: addIcon,
getAll: function () {
return {
buttons: buttons,
menuItems: menuItems,
icons: icons,
popups: popups,
contextMenus: contextMenus,
contextToolbars: contextToolbars,
sidebars: sidebars,
}
},
}
}
var registry = function () {
var bridge = create$3()
return {
addAutocompleter: bridge.addAutocompleter,
addButton: bridge.addButton,
addContextForm: bridge.addContextForm,
addContextMenu: bridge.addContextMenu,
addContextToolbar: bridge.addContextToolbar,
addIcon: bridge.addIcon,
addMenuButton: bridge.addMenuButton,
addMenuItem: bridge.addMenuItem,
addNestedMenuItem: bridge.addNestedMenuItem,
addSidebar: bridge.addSidebar,
addSplitButton: bridge.addSplitButton,
addToggleButton: bridge.addToggleButton,
addGroupToolbarButton: bridge.addGroupToolbarButton,
addToggleMenuItem: bridge.addToggleMenuItem,
getAll: bridge.getAll,
}
}
var DOM$1 = DOMUtils.DOM
var extend$3 = Tools.extend,
each$2 = Tools.each
var resolve = Tools.resolve
var ie = Env.ie
var Editor = (function () {
function Editor(id, settings, editorManager) {
var _this = this
this.plugins = {}
this.contentCSS = []
this.contentStyles = []
this.loadedCSS = {}
this.isNotDirty = false
this.editorManager = editorManager
this.documentBaseUrl = editorManager.documentBaseURL
extend$3(this, EditorObservable)
this.settings = getEditorSettings(
this,
id,
this.documentBaseUrl,
editorManager.defaultSettings,
settings
)
if (this.settings.suffix) {
editorManager.suffix = this.settings.suffix
}
this.suffix = editorManager.suffix
if (this.settings.base_url) {
editorManager._setBaseUrl(this.settings.base_url)
}
this.baseUri = editorManager.baseURI
if (this.settings.referrer_policy) {
ScriptLoader.ScriptLoader._setReferrerPolicy(
this.settings.referrer_policy
)
DOMUtils.DOM.styleSheetLoader._setReferrerPolicy(
this.settings.referrer_policy
)
}
AddOnManager.languageLoad = this.settings.language_load
AddOnManager.baseURL = editorManager.baseURL
this.id = id
this.setDirty(false)
this.documentBaseURI = new URI(this.settings.document_base_url, {
base_uri: this.baseUri,
})
this.baseURI = this.baseUri
this.inline = !!this.settings.inline
this.shortcuts = new Shortcuts(this)
this.editorCommands = new EditorCommands(this)
if (this.settings.cache_suffix) {
Env.cacheSuffix = this.settings.cache_suffix.replace(/^[\?\&]+/, '')
}
this.ui = {
registry: registry(),
styleSheetLoader: undefined,
show: noop,
hide: noop,
enable: noop,
disable: noop,
isDisabled: never,
}
var self = this
var modeInstance = create$4(self)
this.mode = modeInstance
this.setMode = modeInstance.set
editorManager.fire('SetupEditor', { editor: this })
this.execCallback('setup', this)
this.$ = DomQuery.overrideDefaults(function () {
return {
context: _this.inline ? _this.getBody() : _this.getDoc(),
element: _this.getBody(),
}
})
}
Editor.prototype.render = function () {
render(this)
}
Editor.prototype.focus = function (skipFocus) {
this.execCommand('mceFocus', false, skipFocus)
}
Editor.prototype.hasFocus = function () {
return hasFocus(this)
}
Editor.prototype.execCallback = function (name) {
var x = []
for (var _i = 1; _i < arguments.length; _i++) {
x[_i - 1] = arguments[_i]
}
var self = this
var callback = self.settings[name],
scope
if (!callback) {
return
}
if (self.callbackLookup && (scope = self.callbackLookup[name])) {
callback = scope.func
scope = scope.scope
}
if (typeof callback === 'string') {
scope = callback.replace(/\.\w+$/, '')
scope = scope ? resolve(scope) : 0
callback = resolve(callback)
self.callbackLookup = self.callbackLookup || {}
self.callbackLookup[name] = {
func: callback,
scope: scope,
}
}
return callback.apply(scope || self, x)
}
Editor.prototype.translate = function (text) {
return I18n.translate(text)
}
Editor.prototype.getParam = function (name, defaultVal, type) {
return getParam(this, name, defaultVal, type)
}
Editor.prototype.hasPlugin = function (name, loaded) {
var hasPlugin = contains$3(getPlugins(this).split(/[ ,]/), name)
if (hasPlugin) {
return loaded ? PluginManager.get(name) !== undefined : true
} else {
return false
}
}
Editor.prototype.nodeChanged = function (args) {
this._nodeChangeDispatcher.nodeChanged(args)
}
Editor.prototype.addCommand = function (name, callback, scope) {
this.editorCommands.addCommand(name, callback, scope)
}
Editor.prototype.addQueryStateHandler = function (name, callback, scope) {
this.editorCommands.addQueryStateHandler(name, callback, scope)
}
Editor.prototype.addQueryValueHandler = function (name, callback, scope) {
this.editorCommands.addQueryValueHandler(name, callback, scope)
}
Editor.prototype.addShortcut = function (pattern, desc, cmdFunc, scope) {
this.shortcuts.add(pattern, desc, cmdFunc, scope)
}
Editor.prototype.execCommand = function (cmd, ui, value, args) {
return this.editorCommands.execCommand(cmd, ui, value, args)
}
Editor.prototype.queryCommandState = function (cmd) {
return this.editorCommands.queryCommandState(cmd)
}
Editor.prototype.queryCommandValue = function (cmd) {
return this.editorCommands.queryCommandValue(cmd)
}
Editor.prototype.queryCommandSupported = function (cmd) {
return this.editorCommands.queryCommandSupported(cmd)
}
Editor.prototype.show = function () {
var self = this
if (self.hidden) {
self.hidden = false
if (self.inline) {
self.getBody().contentEditable = 'true'
} else {
DOM$1.show(self.getContainer())
DOM$1.hide(self.id)
}
self.load()
self.fire('show')
}
}
Editor.prototype.hide = function () {
var self = this,
doc = self.getDoc()
if (!self.hidden) {
if (ie && doc && !self.inline) {
doc.execCommand('SelectAll')
}
self.save()
if (self.inline) {
self.getBody().contentEditable = 'false'
if (self === self.editorManager.focusedEditor) {
self.editorManager.focusedEditor = null
}
} else {
DOM$1.hide(self.getContainer())
DOM$1.setStyle(self.id, 'display', self.orgDisplay)
}
self.hidden = true
self.fire('hide')
}
}
Editor.prototype.isHidden = function () {
return !!this.hidden
}
Editor.prototype.setProgressState = function (state, time) {
this.fire('ProgressState', {
state: state,
time: time,
})
}
Editor.prototype.load = function (args) {
var self = this
var elm = self.getElement(),
html
if (self.removed) {
return ''
}
if (elm) {
args = args || {}
args.load = true
var value = isTextareaOrInput(elm) ? elm.value : elm.innerHTML
html = self.setContent(value, args)
args.element = elm
if (!args.no_events) {
self.fire('LoadContent', args)
}
args.element = elm = null
return html
}
}
Editor.prototype.save = function (args) {
var self = this
var elm = self.getElement(),
html,
form
if (!elm || !self.initialized || self.removed) {
return
}
args = args || {}
args.save = true
args.element = elm
html = args.content = self.getContent(args)
if (!args.no_events) {
self.fire('SaveContent', args)
}
if (args.format === 'raw') {
self.fire('RawSaveContent', args)
}
html = args.content
if (!isTextareaOrInput(elm)) {
if (args.is_removing || !self.inline) {
elm.innerHTML = html
}
if ((form = DOM$1.getParent(self.id, 'form'))) {
each$2(form.elements, function (elm) {
if (elm.name === self.id) {
elm.value = html
return false
}
})
}
} else {
elm.value = html
}
args.element = elm = null
if (args.set_dirty !== false) {
self.setDirty(false)
}
return html
}
Editor.prototype.setContent = function (content, args) {
return setContent(this, content, args)
}
Editor.prototype.getContent = function (args) {
return getContent(this, args)
}
Editor.prototype.insertContent = function (content, args) {
if (args) {
content = extend$3({ content: content }, args)
}
this.execCommand('mceInsertContent', false, content)
}
Editor.prototype.resetContent = function (initialContent) {
if (initialContent === undefined) {
setContent(this, this.startContent, { format: 'raw' })
} else {
setContent(this, initialContent)
}
this.undoManager.reset()
this.setDirty(false)
this.nodeChanged()
}
Editor.prototype.isDirty = function () {
return !this.isNotDirty
}
Editor.prototype.setDirty = function (state) {
var oldState = !this.isNotDirty
this.isNotDirty = !state
if (state && state !== oldState) {
this.fire('dirty')
}
}
Editor.prototype.getContainer = function () {
var self = this
if (!self.container) {
self.container = DOM$1.get(self.editorContainer || self.id + '_parent')
}
return self.container
}
Editor.prototype.getContentAreaContainer = function () {
return this.contentAreaContainer
}
Editor.prototype.getElement = function () {
if (!this.targetElm) {
this.targetElm = DOM$1.get(this.id)
}
return this.targetElm
}
Editor.prototype.getWin = function () {
var self = this
var elm
if (!self.contentWindow) {
elm = self.iframeElement
if (elm) {
self.contentWindow = elm.contentWindow
}
}
return self.contentWindow
}
Editor.prototype.getDoc = function () {
var self = this
var win
if (!self.contentDocument) {
win = self.getWin()
if (win) {
self.contentDocument = win.document
}
}
return self.contentDocument
}
Editor.prototype.getBody = function () {
var doc = this.getDoc()
return this.bodyElement || (doc ? doc.body : null)
}
Editor.prototype.convertURL = function (url, name, elm) {
var self = this,
settings = self.settings
if (settings.urlconverter_callback) {
return self.execCallback('urlconverter_callback', url, elm, true, name)
}
if (
!settings.convert_urls ||
(elm && elm.nodeName === 'LINK') ||
url.indexOf('file:') === 0 ||
url.length === 0
) {
return url
}
if (settings.relative_urls) {
return self.documentBaseURI.toRelative(url)
}
url = self.documentBaseURI.toAbsolute(url, settings.remove_script_host)
return url
}
Editor.prototype.addVisual = function (elm) {
addVisual(this, elm)
}
Editor.prototype.remove = function () {
remove(this)
}
Editor.prototype.destroy = function (automatic) {
destroy(this, automatic)
}
Editor.prototype.uploadImages = function (callback) {
return this.editorUpload.uploadImages(callback)
}
Editor.prototype._scanForImages = function () {
return this.editorUpload.scanForImages()
}
Editor.prototype.addButton = function () {
throw new Error(
'editor.addButton has been removed in tinymce 5x, use editor.ui.registry.addButton or editor.ui.registry.addToggleButton or editor.ui.registry.addSplitButton instead'
)
}
Editor.prototype.addSidebar = function () {
throw new Error(
'editor.addSidebar has been removed in tinymce 5x, use editor.ui.registry.addSidebar instead'
)
}
Editor.prototype.addMenuItem = function () {
throw new Error(
'editor.addMenuItem has been removed in tinymce 5x, use editor.ui.registry.addMenuItem instead'
)
}
Editor.prototype.addContextToolbar = function () {
throw new Error(
'editor.addContextToolbar has been removed in tinymce 5x, use editor.ui.registry.addContextToolbar instead'
)
}
return Editor
})()
var DOM = DOMUtils.DOM
var explode = Tools.explode,
each$1 = Tools.each,
extend$2 = Tools.extend
var instanceCounter = 0,
boundGlobalEvents = false
var beforeUnloadDelegate
var legacyEditors = []
var editors = []
var isValidLegacyKey = function (id) {
return id !== 'length'
}
var globalEventDelegate = function (e) {
var type = e.type
each$1(EditorManager.get(), function (editor) {
switch (type) {
case 'scroll':
editor.fire('ScrollWindow', e)
break
case 'resize':
editor.fire('ResizeWindow', e)
break
}
})
}
var toggleGlobalEvents = function (state) {
if (state !== boundGlobalEvents) {
if (state) {
DomQuery(window).on('resize scroll', globalEventDelegate)
} else {
DomQuery(window).off('resize scroll', globalEventDelegate)
}
boundGlobalEvents = state
}
}
var removeEditorFromList = function (targetEditor) {
var oldEditors = editors
delete legacyEditors[targetEditor.id]
for (var i = 0; i < legacyEditors.length; i++) {
if (legacyEditors[i] === targetEditor) {
legacyEditors.splice(i, 1)
break
}
}
editors = filter$4(editors, function (editor) {
return targetEditor !== editor
})
if (EditorManager.activeEditor === targetEditor) {
EditorManager.activeEditor = editors.length > 0 ? editors[0] : null
}
if (EditorManager.focusedEditor === targetEditor) {
EditorManager.focusedEditor = null
}
return oldEditors.length !== editors.length
}
var purgeDestroyedEditor = function (editor) {
if (
editor &&
editor.initialized &&
!(editor.getContainer() || editor.getBody()).parentNode
) {
removeEditorFromList(editor)
editor.unbindAllNativeEvents()
editor.destroy(true)
editor.removed = true
editor = null
}
return editor
}
var isQuirksMode = document.compatMode !== 'CSS1Compat'
var EditorManager = __assign(__assign({}, Observable), {
baseURI: null,
baseURL: null,
defaultSettings: {},
documentBaseURL: null,
suffix: null,
$: DomQuery,
majorVersion: '5',
minorVersion: '10.2',
releaseDate: '2021-11-17',
editors: legacyEditors,
i18n: I18n,
activeEditor: null,
focusedEditor: null,
settings: {},
setup: function () {
var self = this
var baseURL,
documentBaseURL,
suffix = ''
documentBaseURL = URI.getDocumentBaseUrl(document.location)
if (/^[^:]+:\/\/\/?[^\/]+\//.test(documentBaseURL)) {
documentBaseURL = documentBaseURL
.replace(/[\?#].*$/, '')
.replace(/[\/\\][^\/]+$/, '')
if (!/[\/\\]$/.test(documentBaseURL)) {
documentBaseURL += '/'
}
}
var preInit = window.tinymce || window.tinyMCEPreInit
if (preInit) {
baseURL = preInit.base || preInit.baseURL
suffix = preInit.suffix
} else {
var scripts = document.getElementsByTagName('script')
for (var i = 0; i < scripts.length; i++) {
var src = scripts[i].src || ''
if (src === '') {
continue
}
var srcScript = src.substring(src.lastIndexOf('/'))
if (/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(src)) {
if (srcScript.indexOf('.min') !== -1) {
suffix = '.min'
}
baseURL = src.substring(0, src.lastIndexOf('/'))
break
}
}
if (!baseURL && document.currentScript) {
var src = document.currentScript.src
if (src.indexOf('.min') !== -1) {
suffix = '.min'
}
baseURL = src.substring(0, src.lastIndexOf('/'))
}
}
self.baseURL = new URI(documentBaseURL).toAbsolute(baseURL)
self.documentBaseURL = documentBaseURL
self.baseURI = new URI(self.baseURL)
self.suffix = suffix
setup$l(self)
},
overrideDefaults: function (defaultSettings) {
var baseUrl = defaultSettings.base_url
if (baseUrl) {
this._setBaseUrl(baseUrl)
}
var suffix = defaultSettings.suffix
if (defaultSettings.suffix) {
this.suffix = suffix
}
this.defaultSettings = defaultSettings
var pluginBaseUrls = defaultSettings.plugin_base_urls
if (pluginBaseUrls !== undefined) {
each$j(pluginBaseUrls, function (pluginBaseUrl, pluginName) {
AddOnManager.PluginManager.urls[pluginName] = pluginBaseUrl
})
}
},
init: function (settings) {
var self = this
var result
var invalidInlineTargets = Tools.makeMap(
'area base basefont br col frame hr img input isindex link meta param embed source wbr track ' +
'colgroup option table tbody tfoot thead tr th td script noscript style textarea video audio iframe object menu',
' '
)
var isInvalidInlineTarget = function (settings, elm) {
return (
settings.inline && elm.tagName.toLowerCase() in invalidInlineTargets
)
}
var createId = function (elm) {
var id = elm.id
if (!id) {
id = get$9(elm, 'name')
.filter(function (name) {
return !DOM.get(name)
})
.getOrThunk(DOM.uniqueId)
elm.setAttribute('id', id)
}
return id
}
var execCallback = function (name) {
var callback = settings[name]
if (!callback) {
return
}
return callback.apply(self, [])
}
var hasClass = function (elm, className) {
return className.constructor === RegExp
? className.test(elm.className)
: DOM.hasClass(elm, className)
}
var findTargets = function (settings) {
var targets = []
if (Env.browser.isIE() && Env.browser.version.major < 11) {
initError(
'TinyMCE does not support the browser you are using. For a list of supported' +
' browsers please see: https://www.tinymce.com/docs/get-started/system-requirements/'
)
return []
} else if (isQuirksMode) {
initError(
'Failed to initialize the editor as the document is not in standards mode. ' +
'TinyMCE requires standards mode.'
)
return []
}
if (settings.types) {
each$1(settings.types, function (type) {
targets = targets.concat(DOM.select(type.selector))
})
return targets
} else if (settings.selector) {
return DOM.select(settings.selector)
} else if (settings.target) {
return [settings.target]
}
switch (settings.mode) {
case 'exact':
var l = settings.elements || ''
if (l.length > 0) {
each$1(explode(l), function (id) {
var elm = DOM.get(id)
if (elm) {
targets.push(elm)
} else {
each$1(document.forms, function (f) {
each$1(f.elements, function (e) {
if (e.name === id) {
id = 'mce_editor_' + instanceCounter++
DOM.setAttrib(e, 'id', id)
targets.push(e)
}
})
})
}
})
}
break
case 'textareas':
case 'specific_textareas':
each$1(DOM.select('textarea'), function (elm) {
if (
settings.editor_deselector &&
hasClass(elm, settings.editor_deselector)
) {
return
}
if (
!settings.editor_selector ||
hasClass(elm, settings.editor_selector)
) {
targets.push(elm)
}
})
break
}
return targets
}
var provideResults = function (editors) {
result = editors
}
var initEditors = function () {
var initCount = 0
var editors = []
var targets
var createEditor = function (id, settings, targetElm) {
var editor = new Editor(id, settings, self)
editors.push(editor)
editor.on('init', function () {
if (++initCount === targets.length) {
provideResults(editors)
}
})
editor.targetElm = editor.targetElm || targetElm
editor.render()
}
DOM.unbind(window, 'ready', initEditors)
execCallback('onpageload')
targets = DomQuery.unique(findTargets(settings))
if (settings.types) {
each$1(settings.types, function (type) {
Tools.each(targets, function (elm) {
if (DOM.is(elm, type.selector)) {
createEditor(createId(elm), extend$2({}, settings, type), elm)
return false
}
return true
})
})
return
}
Tools.each(targets, function (elm) {
purgeDestroyedEditor(self.get(elm.id))
})
targets = Tools.grep(targets, function (elm) {
return !self.get(elm.id)
})
if (targets.length === 0) {
provideResults([])
} else {
each$1(targets, function (elm) {
if (isInvalidInlineTarget(settings, elm)) {
initError(
'Could not initialize inline editor on invalid inline target element',
elm
)
} else {
createEditor(createId(elm), settings, elm)
}
})
}
}
self.settings = settings
DOM.bind(window, 'ready', initEditors)
return new promiseObj(function (resolve) {
if (result) {
resolve(result)
} else {
provideResults = function (editors) {
resolve(editors)
}
}
})
},
get: function (id) {
if (arguments.length === 0) {
return editors.slice(0)
} else if (isString$1(id)) {
return find$3(editors, function (editor) {
return editor.id === id
}).getOr(null)
} else if (isNumber(id)) {
return editors[id] ? editors[id] : null
} else {
return null
}
},
add: function (editor) {
var self = this
var existingEditor = legacyEditors[editor.id]
if (existingEditor === editor) {
return editor
}
if (self.get(editor.id) === null) {
if (isValidLegacyKey(editor.id)) {
legacyEditors[editor.id] = editor
}
legacyEditors.push(editor)
editors.push(editor)
}
toggleGlobalEvents(true)
self.activeEditor = editor
self.fire('AddEditor', { editor: editor })
if (!beforeUnloadDelegate) {
beforeUnloadDelegate = function (e) {
var event = self.fire('BeforeUnload')
if (event.returnValue) {
e.preventDefault()
e.returnValue = event.returnValue
return event.returnValue
}
}
window.addEventListener('beforeunload', beforeUnloadDelegate)
}
return editor
},
createEditor: function (id, settings) {
return this.add(new Editor(id, settings, this))
},
remove: function (selector) {
var self = this
var i, editor
if (!selector) {
for (i = editors.length - 1; i >= 0; i--) {
self.remove(editors[i])
}
return
}
if (isString$1(selector)) {
each$1(DOM.select(selector), function (elm) {
editor = self.get(elm.id)
if (editor) {
self.remove(editor)
}
})
return
}
editor = selector
if (isNull(self.get(editor.id))) {
return null
}
if (removeEditorFromList(editor)) {
self.fire('RemoveEditor', { editor: editor })
}
if (editors.length === 0) {
window.removeEventListener('beforeunload', beforeUnloadDelegate)
}
editor.remove()
toggleGlobalEvents(editors.length > 0)
return editor
},
execCommand: function (cmd, ui, value) {
var self = this,
editor = self.get(value)
switch (cmd) {
case 'mceAddEditor':
if (!self.get(value)) {
new Editor(value, self.settings, self).render()
}
return true
case 'mceRemoveEditor':
if (editor) {
editor.remove()
}
return true
case 'mceToggleEditor':
if (!editor) {
self.execCommand('mceAddEditor', false, value)
return true
}
if (editor.isHidden()) {
editor.show()
} else {
editor.hide()
}
return true
}
if (self.activeEditor) {
return self.activeEditor.execCommand(cmd, ui, value)
}
return false
},
triggerSave: function () {
each$1(editors, function (editor) {
editor.save()
})
},
addI18n: function (code, items) {
I18n.add(code, items)
},
translate: function (text) {
return I18n.translate(text)
},
setActive: function (editor) {
var activeEditor = this.activeEditor
if (this.activeEditor !== editor) {
if (activeEditor) {
activeEditor.fire('deactivate', { relatedTarget: editor })
}
editor.fire('activate', { relatedTarget: activeEditor })
}
this.activeEditor = editor
},
_setBaseUrl: function (baseUrl) {
this.baseURL = new URI(this.documentBaseURL).toAbsolute(
baseUrl.replace(/\/+$/, '')
)
this.baseURI = new URI(this.baseURL)
},
})
EditorManager.setup()
var min$1 = Math.min,
max$1 = Math.max,
round$1 = Math.round
var relativePosition = function (rect, targetRect, rel) {
var x = targetRect.x
var y = targetRect.y
var w = rect.w
var h = rect.h
var targetW = targetRect.w
var targetH = targetRect.h
var relChars = (rel || '').split('')
if (relChars[0] === 'b') {
y += targetH
}
if (relChars[1] === 'r') {
x += targetW
}
if (relChars[0] === 'c') {
y += round$1(targetH / 2)
}
if (relChars[1] === 'c') {
x += round$1(targetW / 2)
}
if (relChars[3] === 'b') {
y -= h
}
if (relChars[4] === 'r') {
x -= w
}
if (relChars[3] === 'c') {
y -= round$1(h / 2)
}
if (relChars[4] === 'c') {
x -= round$1(w / 2)
}
return create$2(x, y, w, h)
}
var findBestRelativePosition = function (
rect,
targetRect,
constrainRect,
rels
) {
var pos, i
for (i = 0; i < rels.length; i++) {
pos = relativePosition(rect, targetRect, rels[i])
if (
pos.x >= constrainRect.x &&
pos.x + pos.w <= constrainRect.w + constrainRect.x &&
pos.y >= constrainRect.y &&
pos.y + pos.h <= constrainRect.h + constrainRect.y
) {
return rels[i]
}
}
return null
}
var inflate = function (rect, w, h) {
return create$2(rect.x - w, rect.y - h, rect.w + w * 2, rect.h + h * 2)
}
var intersect = function (rect, cropRect) {
var x1 = max$1(rect.x, cropRect.x)
var y1 = max$1(rect.y, cropRect.y)
var x2 = min$1(rect.x + rect.w, cropRect.x + cropRect.w)
var y2 = min$1(rect.y + rect.h, cropRect.y + cropRect.h)
if (x2 - x1 < 0 || y2 - y1 < 0) {
return null
}
return create$2(x1, y1, x2 - x1, y2 - y1)
}
var clamp = function (rect, clampRect, fixedSize) {
var x1 = rect.x
var y1 = rect.y
var x2 = rect.x + rect.w
var y2 = rect.y + rect.h
var cx2 = clampRect.x + clampRect.w
var cy2 = clampRect.y + clampRect.h
var underflowX1 = max$1(0, clampRect.x - x1)
var underflowY1 = max$1(0, clampRect.y - y1)
var overflowX2 = max$1(0, x2 - cx2)
var overflowY2 = max$1(0, y2 - cy2)
x1 += underflowX1
y1 += underflowY1
if (fixedSize) {
x2 += underflowX1
y2 += underflowY1
x1 -= overflowX2
y1 -= overflowY2
}
x2 -= overflowX2
y2 -= overflowY2
return create$2(x1, y1, x2 - x1, y2 - y1)
}
var create$2 = function (x, y, w, h) {
return {
x: x,
y: y,
w: w,
h: h,
}
}
var fromClientRect = function (clientRect) {
return create$2(
clientRect.left,
clientRect.top,
clientRect.width,
clientRect.height
)
}
var Rect = {
inflate: inflate,
relativePosition: relativePosition,
findBestRelativePosition: findBestRelativePosition,
intersect: intersect,
clamp: clamp,
create: create$2,
fromClientRect: fromClientRect,
}
var awaiter = function (resolveCb, rejectCb, timeout) {
if (timeout === void 0) {
timeout = 1000
}
var done = false
var timer = null
var complete = function (completer) {
return function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
if (!done) {
done = true
if (timer !== null) {
clearTimeout(timer)
timer = null
}
completer.apply(null, args)
}
}
}
var resolve = complete(resolveCb)
var reject = complete(rejectCb)
var start = function () {
var args = []
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i]
}
if (!done && timer === null) {
timer = setTimeout(function () {
return reject.apply(null, args)
}, timeout)
}
}
return {
start: start,
resolve: resolve,
reject: reject,
}
}
var create$1 = function () {
var tasks = {}
var resultFns = {}
var load = function (id, url) {
var loadErrMsg = 'Script at URL "' + url + '" failed to load'
var runErrMsg =
'Script at URL "' +
url +
'" did not call `tinymce.Resource.add(\'' +
id +
"', data)` within 1 second"
if (tasks[id] !== undefined) {
return tasks[id]
} else {
var task = new promiseObj(function (resolve, reject) {
var waiter = awaiter(resolve, reject)
resultFns[id] = waiter.resolve
ScriptLoader.ScriptLoader.loadScript(
url,
function () {
return waiter.start(runErrMsg)
},
function () {
return waiter.reject(loadErrMsg)
}
)
})
tasks[id] = task
return task
}
}
var add = function (id, data) {
if (resultFns[id] !== undefined) {
resultFns[id](data)
delete resultFns[id]
}
tasks[id] = promiseObj.resolve(data)
}
return {
load: load,
add: add,
}
}
var Resource = create$1()
var each = Tools.each,
extend$1 = Tools.extend
var extendClass, initializing
var Class = function () {}
Class.extend = extendClass = function (props) {
var self = this
var _super = self.prototype
var Class = function () {
var i, mixins, mixin
var self = this
if (!initializing) {
if (self.init) {
self.init.apply(self, arguments)
}
mixins = self.Mixins
if (mixins) {
i = mixins.length
while (i--) {
mixin = mixins[i]
if (mixin.init) {
mixin.init.apply(self, arguments)
}
}
}
}
}
var dummy = function () {
return this
}
var createMethod = function (name, fn) {
return function () {
var self = this
var tmp = self._super
self._super = _super[name]
var ret = fn.apply(self, arguments)
self._super = tmp
return ret
}
}
initializing = true
var prototype = new self()
initializing = false
if (props.Mixins) {
each(props.Mixins, function (mixin) {
for (var name_1 in mixin) {
if (name_1 !== 'init') {
props[name_1] = mixin[name_1]
}
}
})
if (_super.Mixins) {
props.Mixins = _super.Mixins.concat(props.Mixins)
}
}
if (props.Methods) {
each(props.Methods.split(','), function (name) {
props[name] = dummy
})
}
if (props.Properties) {
each(props.Properties.split(','), function (name) {
var fieldName = '_' + name
props[name] = function (value) {
var self = this
if (value !== undefined) {
self[fieldName] = value
return self
}
return self[fieldName]
}
})
}
if (props.Statics) {
each(props.Statics, function (func, name) {
Class[name] = func
})
}
if (props.Defaults && _super.Defaults) {
props.Defaults = extend$1({}, _super.Defaults, props.Defaults)
}
each$j(props, function (member, name) {
if (typeof member === 'function' && _super[name]) {
prototype[name] = createMethod(name, member)
} else {
prototype[name] = member
}
})
Class.prototype = prototype
Class.constructor = Class
Class.extend = extendClass
return Class
}
var min = Math.min,
max = Math.max,
round = Math.round
var Color = function (value) {
var self = {}
var r = 0,
g = 0,
b = 0
var rgb2hsv = function (r, g, b) {
var h, s, v
h = 0
s = 0
v = 0
r = r / 255
g = g / 255
b = b / 255
var minRGB = min(r, min(g, b))
var maxRGB = max(r, max(g, b))
if (minRGB === maxRGB) {
v = minRGB
return {
h: 0,
s: 0,
v: v * 100,
}
}
var d = r === minRGB ? g - b : b === minRGB ? r - g : b - r
h = r === minRGB ? 3 : b === minRGB ? 1 : 5
h = 60 * (h - d / (maxRGB - minRGB))
s = (maxRGB - minRGB) / maxRGB
v = maxRGB
return {
h: round(h),
s: round(s * 100),
v: round(v * 100),
}
}
var hsvToRgb = function (hue, saturation, brightness) {
hue = (parseInt(hue, 10) || 0) % 360
saturation = parseInt(saturation, 10) / 100
brightness = parseInt(brightness, 10) / 100
saturation = max(0, min(saturation, 1))
brightness = max(0, min(brightness, 1))
if (saturation === 0) {
r = g = b = round(255 * brightness)
return
}
var side = hue / 60
var chroma = brightness * saturation
var x = chroma * (1 - Math.abs((side % 2) - 1))
var match = brightness - chroma
switch (Math.floor(side)) {
case 0:
r = chroma
g = x
b = 0
break
case 1:
r = x
g = chroma
b = 0
break
case 2:
r = 0
g = chroma
b = x
break
case 3:
r = 0
g = x
b = chroma
break
case 4:
r = x
g = 0
b = chroma
break
case 5:
r = chroma
g = 0
b = x
break
default:
r = g = b = 0
}
r = round(255 * (r + match))
g = round(255 * (g + match))
b = round(255 * (b + match))
}
var toHex = function () {
var hex = function (val) {
val = parseInt(val, 10).toString(16)
return val.length > 1 ? val : '0' + val
}
return '#' + hex(r) + hex(g) + hex(b)
}
var toRgb = function () {
return {
r: r,
g: g,
b: b,
}
}
var toHsv = function () {
return rgb2hsv(r, g, b)
}
var parse = function (value) {
var matches
if (typeof value === 'object') {
if ('r' in value) {
r = value.r
g = value.g
b = value.b
} else if ('v' in value) {
hsvToRgb(value.h, value.s, value.v)
}
} else {
if (
(matches =
/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)[^\)]*\)/gi.exec(
value
))
) {
r = parseInt(matches[1], 10)
g = parseInt(matches[2], 10)
b = parseInt(matches[3], 10)
} else if (
(matches = /#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(value))
) {
r = parseInt(matches[1], 16)
g = parseInt(matches[2], 16)
b = parseInt(matches[3], 16)
} else if ((matches = /#([0-F])([0-F])([0-F])/gi.exec(value))) {
r = parseInt(matches[1] + matches[1], 16)
g = parseInt(matches[2] + matches[2], 16)
b = parseInt(matches[3] + matches[3], 16)
}
}
r = r < 0 ? 0 : r > 255 ? 255 : r
g = g < 0 ? 0 : g > 255 ? 255 : g
b = b < 0 ? 0 : b > 255 ? 255 : b
return self
}
if (value) {
parse(value)
}
self.toRgb = toRgb
self.toHsv = toHsv
self.toHex = toHex
self.parse = parse
return self
}
var serialize = function (obj) {
var data = JSON.stringify(obj)
if (!isString$1(data)) {
return data
}
return data.replace(/[\u0080-\uFFFF]/g, function (match) {
var hexCode = match.charCodeAt(0).toString(16)
return '\\u' + '0000'.substring(hexCode.length) + hexCode
})
}
var JSONUtils = {
serialize: serialize,
parse: function (text) {
try {
return JSON.parse(text)
} catch (ex) {}
},
}
var JSONP = {
callbacks: {},
count: 0,
send: function (settings) {
var self = this,
dom = DOMUtils.DOM,
count = settings.count !== undefined ? settings.count : self.count
var id = 'tinymce_jsonp_' + count
self.callbacks[count] = function (json) {
dom.remove(id)
delete self.callbacks[count]
settings.callback(json)
}
dom.add(dom.doc.body, 'script', {
id: id,
src: settings.url,
type: 'text/javascript',
})
self.count++
},
}
var XHR = __assign(__assign({}, Observable), {
send: function (settings) {
var xhr,
count = 0
var ready = function () {
if (!settings.async || xhr.readyState === 4 || count++ > 10000) {
if (settings.success && count < 10000 && xhr.status === 200) {
settings.success.call(
settings.success_scope,
'' + xhr.responseText,
xhr,
settings
)
} else if (settings.error) {
settings.error.call(
settings.error_scope,
count > 10000 ? 'TIMED_OUT' : 'GENERAL',
xhr,
settings
)
}
xhr = null
} else {
Delay.setTimeout(ready, 10)
}
}
settings.scope = settings.scope || this
settings.success_scope = settings.success_scope || settings.scope
settings.error_scope = settings.error_scope || settings.scope
settings.async = settings.async !== false
settings.data = settings.data || ''
XHR.fire('beforeInitialize', { settings: settings })
xhr = new XMLHttpRequest()
if (xhr.overrideMimeType) {
xhr.overrideMimeType(settings.content_type)
}
xhr.open(
settings.type || (settings.data ? 'POST' : 'GET'),
settings.url,
settings.async
)
if (settings.crossDomain) {
xhr.withCredentials = true
}
if (settings.content_type) {
xhr.setRequestHeader('Content-Type', settings.content_type)
}
if (settings.requestheaders) {
Tools.each(settings.requestheaders, function (header) {
xhr.setRequestHeader(header.key, header.value)
})
}
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest')
xhr = XHR.fire('beforeSend', {
xhr: xhr,
settings: settings,
}).xhr
xhr.send(settings.data)
if (!settings.async) {
return ready()
}
Delay.setTimeout(ready, 10)
},
})
var extend = Tools.extend
var JSONRequest = (function () {
function JSONRequest(settings) {
this.settings = extend({}, settings)
this.count = 0
}
JSONRequest.sendRPC = function (o) {
return new JSONRequest().send(o)
}
JSONRequest.prototype.send = function (args) {
var ecb = args.error,
scb = args.success
var xhrArgs = extend(this.settings, args)
xhrArgs.success = function (c, x) {
c = JSONUtils.parse(c)
if (typeof c === 'undefined') {
c = { error: 'JSON Parse error.' }
}
if (c.error) {
ecb.call(xhrArgs.error_scope || xhrArgs.scope, c.error, x)
} else {
scb.call(xhrArgs.success_scope || xhrArgs.scope, c.result)
}
}
xhrArgs.error = function (ty, x) {
if (ecb) {
ecb.call(xhrArgs.error_scope || xhrArgs.scope, ty, x)
}
}
xhrArgs.data = JSONUtils.serialize({
id: args.id || 'c' + this.count++,
method: args.method,
params: args.params,
})
xhrArgs.content_type = 'application/json'
XHR.send(xhrArgs)
}
return JSONRequest
})()
var create = function () {
return (function () {
var data = {}
var keys = []
var storage = {
getItem: function (key) {
var item = data[key]
return item ? item : null
},
setItem: function (key, value) {
keys.push(key)
data[key] = String(value)
},
key: function (index) {
return keys[index]
},
removeItem: function (key) {
keys = keys.filter(function (k) {
return k === key
})
delete data[key]
},
clear: function () {
keys = []
data = {}
},
length: 0,
}
Object.defineProperty(storage, 'length', {
get: function () {
return keys.length
},
configurable: false,
enumerable: false,
})
return storage
})()
}
var localStorage
try {
var test = '__storage_test__'
localStorage = window.localStorage
localStorage.setItem(test, test)
localStorage.removeItem(test)
} catch (e) {
localStorage = create()
}
var LocalStorage = localStorage
var publicApi = {
geom: { Rect: Rect },
util: {
Promise: promiseObj,
Delay: Delay,
Tools: Tools,
VK: VK,
URI: URI,
Class: Class,
EventDispatcher: EventDispatcher,
Observable: Observable,
I18n: I18n,
XHR: XHR,
JSON: JSONUtils,
JSONRequest: JSONRequest,
JSONP: JSONP,
LocalStorage: LocalStorage,
Color: Color,
ImageUploader: ImageUploader,
},
dom: {
EventUtils: EventUtils,
Sizzle: Sizzle,
DomQuery: DomQuery,
TreeWalker: DomTreeWalker,
TextSeeker: TextSeeker,
DOMUtils: DOMUtils,
ScriptLoader: ScriptLoader,
RangeUtils: RangeUtils,
Serializer: DomSerializer,
StyleSheetLoader: StyleSheetLoader,
ControlSelection: ControlSelection,
BookmarkManager: BookmarkManager,
Selection: EditorSelection,
Event: EventUtils.Event,
},
html: {
Styles: Styles,
Entities: Entities,
Node: AstNode,
Schema: Schema,
SaxParser: SaxParser,
DomParser: DomParser,
Writer: Writer,
Serializer: HtmlSerializer,
},
Env: Env,
AddOnManager: AddOnManager,
Annotator: Annotator,
Formatter: Formatter,
UndoManager: UndoManager,
EditorCommands: EditorCommands,
WindowManager: WindowManager,
NotificationManager: NotificationManager,
EditorObservable: EditorObservable,
Shortcuts: Shortcuts,
Editor: Editor,
FocusManager: FocusManager,
EditorManager: EditorManager,
DOM: DOMUtils.DOM,
ScriptLoader: ScriptLoader.ScriptLoader,
PluginManager: PluginManager,
ThemeManager: ThemeManager,
IconManager: IconManager,
Resource: Resource,
trim: Tools.trim,
isArray: Tools.isArray,
is: Tools.is,
toArray: Tools.toArray,
makeMap: Tools.makeMap,
each: Tools.each,
map: Tools.map,
grep: Tools.grep,
inArray: Tools.inArray,
extend: Tools.extend,
create: Tools.create,
walk: Tools.walk,
createNS: Tools.createNS,
resolve: Tools.resolve,
explode: Tools.explode,
_addCacheSuffix: Tools._addCacheSuffix,
isOpera: Env.opera,
isWebKit: Env.webkit,
isIE: Env.ie,
isGecko: Env.gecko,
isMac: Env.mac,
}
var tinymce = Tools.extend(EditorManager, publicApi)
var exportToModuleLoaders = function (tinymce) {
if (typeof module === 'object') {
try {
module.exports = tinymce
} catch (_) {}
}
}
var exportToWindowGlobal = function (tinymce) {
window.tinymce = tinymce
window.tinyMCE = tinymce
}
exportToWindowGlobal(tinymce)
exportToModuleLoaders(tinymce)
})()