tinymce-rails 6.2.0 → 6.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/source/tinymce/tinymce.js +808 -566
  3. data/lib/tinymce/rails/version.rb +2 -2
  4. data/vendor/assets/javascripts/tinymce/icons/default/icons.js +1 -1
  5. data/vendor/assets/javascripts/tinymce/models/dom/model.js +1 -1
  6. data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +1 -1
  7. data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.js +1 -1
  8. data/vendor/assets/javascripts/tinymce/plugins/autolink/plugin.js +1 -1
  9. data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.js +1 -1
  10. data/vendor/assets/javascripts/tinymce/plugins/autosave/plugin.js +1 -1
  11. data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.js +1 -1
  12. data/vendor/assets/javascripts/tinymce/plugins/code/plugin.js +1 -1
  13. data/vendor/assets/javascripts/tinymce/plugins/codesample/plugin.js +1 -1
  14. data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.js +1 -1
  15. data/vendor/assets/javascripts/tinymce/plugins/emoticons/plugin.js +1 -1
  16. data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.js +1 -1
  17. data/vendor/assets/javascripts/tinymce/plugins/help/plugin.js +2 -2
  18. data/vendor/assets/javascripts/tinymce/plugins/image/plugin.js +1 -1
  19. data/vendor/assets/javascripts/tinymce/plugins/importcss/plugin.js +1 -1
  20. data/vendor/assets/javascripts/tinymce/plugins/insertdatetime/plugin.js +1 -1
  21. data/vendor/assets/javascripts/tinymce/plugins/link/plugin.js +2 -2
  22. data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
  23. data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +1 -1
  24. data/vendor/assets/javascripts/tinymce/plugins/nonbreaking/plugin.js +1 -1
  25. data/vendor/assets/javascripts/tinymce/plugins/pagebreak/plugin.js +1 -1
  26. data/vendor/assets/javascripts/tinymce/plugins/preview/plugin.js +1 -1
  27. data/vendor/assets/javascripts/tinymce/plugins/quickbars/plugin.js +2 -2
  28. data/vendor/assets/javascripts/tinymce/plugins/save/plugin.js +1 -1
  29. data/vendor/assets/javascripts/tinymce/plugins/searchreplace/plugin.js +1 -1
  30. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +1 -1
  31. data/vendor/assets/javascripts/tinymce/plugins/template/plugin.js +1 -1
  32. data/vendor/assets/javascripts/tinymce/plugins/visualblocks/plugin.js +1 -1
  33. data/vendor/assets/javascripts/tinymce/plugins/visualchars/plugin.js +1 -1
  34. data/vendor/assets/javascripts/tinymce/plugins/wordcount/plugin.js +1 -1
  35. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.css +1 -1
  36. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.inline.css +1 -1
  37. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.inline.min.css +1 -1
  38. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.min.css +1 -1
  39. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/skin.css +1 -1
  40. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/skin.min.css +1 -1
  41. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.css +1 -1
  42. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.inline.css +1 -1
  43. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.inline.min.css +1 -1
  44. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.min.css +1 -1
  45. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/skin.css +1 -1
  46. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/skin.min.css +1 -1
  47. data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/content.css +1 -1
  48. data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/content.inline.css +1 -1
  49. data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/content.inline.min.css +1 -1
  50. data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/content.min.css +1 -1
  51. data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/skin.css +1 -1
  52. data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5/skin.min.css +1 -1
  53. data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/content.css +1 -1
  54. data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/content.inline.css +1 -1
  55. data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css +1 -1
  56. data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/content.min.css +1 -1
  57. data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/skin.css +1 -1
  58. data/vendor/assets/javascripts/tinymce/skins/ui/tinymce-5-dark/skin.min.css +1 -1
  59. data/vendor/assets/javascripts/tinymce/themes/silver/theme.js +2 -2
  60. data/vendor/assets/javascripts/tinymce/tinymce.d.ts +62 -17
  61. data/vendor/assets/javascripts/tinymce/tinymce.js +2 -2
  62. metadata +2 -2
@@ -1,5 +1,5 @@
1
1
  /**
2
- * TinyMCE version 6.2.0 (2022-09-08)
2
+ * TinyMCE version 6.3.0 (2022-11-23)
3
3
  */
4
4
 
5
5
  (function () {
@@ -1346,13 +1346,13 @@
1346
1346
  };
1347
1347
  const siblings = element => {
1348
1348
  const filterSelf = elements => filter$5(elements, x => !eq(element, x));
1349
- return parent(element).map(children).map(filterSelf).getOr([]);
1349
+ return parent(element).map(children$1).map(filterSelf).getOr([]);
1350
1350
  };
1351
1351
  const prevSibling = element => Optional.from(element.dom.previousSibling).map(SugarElement.fromDom);
1352
1352
  const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
1353
1353
  const prevSiblings = element => reverse(toArray(element, prevSibling));
1354
1354
  const nextSiblings = element => toArray(element, nextSibling);
1355
- const children = element => map$3(element.dom.childNodes, SugarElement.fromDom);
1355
+ const children$1 = element => map$3(element.dom.childNodes, SugarElement.fromDom);
1356
1356
  const child$1 = (element, index) => {
1357
1357
  const cs = element.dom.childNodes;
1358
1358
  return Optional.from(cs[index]).map(SugarElement.fromDom);
@@ -1508,7 +1508,7 @@
1508
1508
 
1509
1509
  const empty = element => {
1510
1510
  element.dom.textContent = '';
1511
- each$e(children(element), rogue => {
1511
+ each$e(children$1(element), rogue => {
1512
1512
  remove$6(rogue);
1513
1513
  });
1514
1514
  };
@@ -1519,9 +1519,9 @@
1519
1519
  }
1520
1520
  };
1521
1521
  const unwrap = wrapper => {
1522
- const children$1 = children(wrapper);
1523
- if (children$1.length > 0) {
1524
- after$3(wrapper, children$1);
1522
+ const children = children$1(wrapper);
1523
+ if (children.length > 0) {
1524
+ after$3(wrapper, children);
1525
1525
  }
1526
1526
  remove$6(wrapper);
1527
1527
  };
@@ -1530,7 +1530,7 @@
1530
1530
  const doc = scope || document;
1531
1531
  const div = doc.createElement('div');
1532
1532
  div.innerHTML = html;
1533
- return children(SugarElement.fromDom(div));
1533
+ return children$1(SugarElement.fromDom(div));
1534
1534
  };
1535
1535
  const fromDom$1 = nodes => map$3(nodes, SugarElement.fromDom);
1536
1536
 
@@ -1680,154 +1680,16 @@
1680
1680
  }, visualViewport => bounds(Math.max(visualViewport.pageLeft, scroll.left), Math.max(visualViewport.pageTop, scroll.top), visualViewport.width, visualViewport.height));
1681
1681
  };
1682
1682
 
1683
- const isNodeType = type => {
1684
- return node => {
1685
- return !!node && node.nodeType === type;
1686
- };
1687
- };
1688
- const isRestrictedNode = node => !!node && !Object.getPrototypeOf(node);
1689
- const isElement$6 = isNodeType(1);
1690
- const matchNodeName = name => {
1691
- const lowerCasedName = name.toLowerCase();
1692
- return node => isNonNullable(node) && node.nodeName.toLowerCase() === lowerCasedName;
1693
- };
1694
- const matchNodeNames = names => {
1695
- const lowerCasedNames = names.map(s => s.toLowerCase());
1696
- return node => {
1697
- if (node && node.nodeName) {
1698
- const nodeName = node.nodeName.toLowerCase();
1699
- return contains$2(lowerCasedNames, nodeName);
1700
- }
1701
- return false;
1702
- };
1703
- };
1704
- const matchStyleValues = (name, values) => {
1705
- const items = values.toLowerCase().split(' ');
1706
- return node => {
1707
- if (isElement$6(node)) {
1708
- const win = node.ownerDocument.defaultView;
1709
- if (win) {
1710
- for (let i = 0; i < items.length; i++) {
1711
- const computed = win.getComputedStyle(node, null);
1712
- const cssValue = computed ? computed.getPropertyValue(name) : null;
1713
- if (cssValue === items[i]) {
1714
- return true;
1715
- }
1716
- }
1717
- }
1718
- }
1719
- return false;
1720
- };
1721
- };
1722
- const hasAttribute = attrName => {
1723
- return node => {
1724
- return isElement$6(node) && node.hasAttribute(attrName);
1725
- };
1726
- };
1727
- const hasAttributeValue = (attrName, attrValue) => {
1728
- return node => {
1729
- return isElement$6(node) && node.getAttribute(attrName) === attrValue;
1730
- };
1731
- };
1732
- const isBogus$2 = node => isElement$6(node) && node.hasAttribute('data-mce-bogus');
1733
- const isBogusAll$1 = node => isElement$6(node) && node.getAttribute('data-mce-bogus') === 'all';
1734
- const isTable$2 = node => isElement$6(node) && node.tagName === 'TABLE';
1735
- const hasContentEditableState = value => {
1736
- return node => {
1737
- if (isElement$6(node)) {
1738
- if (node.contentEditable === value) {
1739
- return true;
1740
- }
1741
- if (node.getAttribute('data-mce-contenteditable') === value) {
1742
- return true;
1743
- }
1744
- }
1745
- return false;
1746
- };
1747
- };
1748
- const isTextareaOrInput = matchNodeNames([
1749
- 'textarea',
1750
- 'input'
1751
- ]);
1752
- const isText$a = isNodeType(3);
1753
- const isCData = isNodeType(4);
1754
- const isPi = isNodeType(7);
1755
- const isComment = isNodeType(8);
1756
- const isDocument$1 = isNodeType(9);
1757
- const isDocumentFragment = isNodeType(11);
1758
- const isBr$6 = matchNodeName('br');
1759
- const isImg = matchNodeName('img');
1760
- const isContentEditableTrue$3 = hasContentEditableState('true');
1761
- const isContentEditableFalse$a = hasContentEditableState('false');
1762
- const isTableCell$3 = matchNodeNames([
1763
- 'td',
1764
- 'th'
1765
- ]);
1766
- const isTableCellOrCaption = matchNodeNames([
1767
- 'td',
1768
- 'th',
1769
- 'caption'
1770
- ]);
1771
- const isMedia$2 = matchNodeNames([
1772
- 'video',
1773
- 'audio',
1774
- 'object',
1775
- 'embed'
1776
- ]);
1777
- const isListItem$2 = matchNodeName('li');
1778
-
1779
- const browser = detect$2().browser;
1780
- const firstElement = nodes => find$2(nodes, isElement$7);
1781
- const getTableCaptionDeltaY = elm => {
1782
- if (browser.isFirefox() && name(elm) === 'table') {
1783
- return firstElement(children(elm)).filter(elm => {
1784
- return name(elm) === 'caption';
1785
- }).bind(caption => {
1786
- return firstElement(nextSiblings(caption)).map(body => {
1787
- const bodyTop = body.dom.offsetTop;
1788
- const captionTop = caption.dom.offsetTop;
1789
- const captionHeight = caption.dom.offsetHeight;
1790
- return bodyTop <= captionTop ? -captionHeight : 0;
1791
- });
1792
- }).getOr(0);
1793
- } else {
1794
- return 0;
1795
- }
1796
- };
1797
- const hasChild = (elm, child) => elm.children && contains$2(elm.children, child);
1798
- const getPos = (body, elm, rootElm) => {
1799
- let x = 0, y = 0;
1800
- const doc = body.ownerDocument;
1801
- rootElm = rootElm ? rootElm : body;
1802
- if (elm) {
1803
- if (rootElm === body && elm.getBoundingClientRect && get$7(SugarElement.fromDom(body), 'position') === 'static') {
1804
- const pos = elm.getBoundingClientRect();
1805
- x = pos.left + (doc.documentElement.scrollLeft || body.scrollLeft) - doc.documentElement.clientLeft;
1806
- y = pos.top + (doc.documentElement.scrollTop || body.scrollTop) - doc.documentElement.clientTop;
1807
- return {
1808
- x,
1809
- y
1810
- };
1811
- }
1812
- let offsetParent = elm;
1813
- while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType && !hasChild(offsetParent, rootElm)) {
1814
- const castOffsetParent = offsetParent;
1815
- x += castOffsetParent.offsetLeft || 0;
1816
- y += castOffsetParent.offsetTop || 0;
1817
- offsetParent = castOffsetParent.offsetParent;
1818
- }
1819
- offsetParent = elm.parentNode;
1820
- while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType && !hasChild(offsetParent, rootElm)) {
1821
- x -= offsetParent.scrollLeft || 0;
1822
- y -= offsetParent.scrollTop || 0;
1823
- offsetParent = offsetParent.parentNode;
1683
+ const children = (scope, predicate) => filter$5(children$1(scope), predicate);
1684
+ const descendants$1 = (scope, predicate) => {
1685
+ let result = [];
1686
+ each$e(children$1(scope), x => {
1687
+ if (predicate(x)) {
1688
+ result = result.concat([x]);
1824
1689
  }
1825
- y += getTableCaptionDeltaY(SugarElement.fromDom(elm));
1826
- }
1827
- return {
1828
- x,
1829
- y
1830
- };
1690
+ result = result.concat(descendants$1(x, predicate));
1691
+ });
1692
+ return result;
1831
1693
  };
1832
1694
 
1833
1695
  var ClosestOrAncestor = (is, ancestor, scope, a, isRoot) => {
@@ -1894,157 +1756,7 @@
1894
1756
  return ClosestOrAncestor(is, ancestor$2, scope, selector, isRoot);
1895
1757
  };
1896
1758
 
1897
- const StyleSheetLoader = (documentOrShadowRoot, settings = {}) => {
1898
- let idCount = 0;
1899
- const loadedStates = {};
1900
- const edos = SugarElement.fromDom(documentOrShadowRoot);
1901
- const doc = documentOrOwner(edos);
1902
- const maxLoadTime = settings.maxLoadTime || 5000;
1903
- const _setReferrerPolicy = referrerPolicy => {
1904
- settings.referrerPolicy = referrerPolicy;
1905
- };
1906
- const addStyle = element => {
1907
- append$1(getStyleContainer(edos), element);
1908
- };
1909
- const removeStyle = id => {
1910
- const styleContainer = getStyleContainer(edos);
1911
- descendant(styleContainer, '#' + id).each(remove$6);
1912
- };
1913
- const getOrCreateState = url => get$a(loadedStates, url).getOrThunk(() => ({
1914
- id: 'mce-u' + idCount++,
1915
- passed: [],
1916
- failed: [],
1917
- count: 0
1918
- }));
1919
- const load = url => new Promise((success, failure) => {
1920
- let link;
1921
- const urlWithSuffix = Tools._addCacheSuffix(url);
1922
- const state = getOrCreateState(urlWithSuffix);
1923
- loadedStates[urlWithSuffix] = state;
1924
- state.count++;
1925
- const resolve = (callbacks, status) => {
1926
- each$e(callbacks, call);
1927
- state.status = status;
1928
- state.passed = [];
1929
- state.failed = [];
1930
- if (link) {
1931
- link.onload = null;
1932
- link.onerror = null;
1933
- link = null;
1934
- }
1935
- };
1936
- const passed = () => resolve(state.passed, 2);
1937
- const failed = () => resolve(state.failed, 3);
1938
- const wait = (testCallback, waitCallback) => {
1939
- if (!testCallback()) {
1940
- if (Date.now() - startTime < maxLoadTime) {
1941
- setTimeout(waitCallback);
1942
- } else {
1943
- failed();
1944
- }
1945
- }
1946
- };
1947
- const waitForWebKitLinkLoaded = () => {
1948
- wait(() => {
1949
- const styleSheets = documentOrShadowRoot.styleSheets;
1950
- let i = styleSheets.length;
1951
- while (i--) {
1952
- const styleSheet = styleSheets[i];
1953
- const owner = styleSheet.ownerNode;
1954
- if (owner && link && owner.id === link.id) {
1955
- passed();
1956
- return true;
1957
- }
1958
- }
1959
- return false;
1960
- }, waitForWebKitLinkLoaded);
1961
- };
1962
- if (success) {
1963
- state.passed.push(success);
1964
- }
1965
- if (failure) {
1966
- state.failed.push(failure);
1967
- }
1968
- if (state.status === 1) {
1969
- return;
1970
- }
1971
- if (state.status === 2) {
1972
- passed();
1973
- return;
1974
- }
1975
- if (state.status === 3) {
1976
- failed();
1977
- return;
1978
- }
1979
- state.status = 1;
1980
- const linkElem = SugarElement.fromTag('link', doc.dom);
1981
- setAll$1(linkElem, {
1982
- rel: 'stylesheet',
1983
- type: 'text/css',
1984
- id: state.id
1985
- });
1986
- const startTime = Date.now();
1987
- if (settings.contentCssCors) {
1988
- set$2(linkElem, 'crossOrigin', 'anonymous');
1989
- }
1990
- if (settings.referrerPolicy) {
1991
- set$2(linkElem, 'referrerpolicy', settings.referrerPolicy);
1992
- }
1993
- link = linkElem.dom;
1994
- link.onload = waitForWebKitLinkLoaded;
1995
- link.onerror = failed;
1996
- addStyle(linkElem);
1997
- set$2(linkElem, 'href', urlWithSuffix);
1998
- });
1999
- const loadAll = urls => {
2000
- const loadedUrls = Promise.allSettled(map$3(urls, url => load(url).then(constant(url))));
2001
- return loadedUrls.then(results => {
2002
- const parts = partition$2(results, r => r.status === 'fulfilled');
2003
- if (parts.fail.length > 0) {
2004
- return Promise.reject(map$3(parts.fail, result => result.reason));
2005
- } else {
2006
- return map$3(parts.pass, result => result.value);
2007
- }
2008
- });
2009
- };
2010
- const unload = url => {
2011
- const urlWithSuffix = Tools._addCacheSuffix(url);
2012
- get$a(loadedStates, urlWithSuffix).each(state => {
2013
- const count = --state.count;
2014
- if (count === 0) {
2015
- delete loadedStates[urlWithSuffix];
2016
- removeStyle(state.id);
2017
- }
2018
- });
2019
- };
2020
- const unloadAll = urls => {
2021
- each$e(urls, url => {
2022
- unload(url);
2023
- });
2024
- };
2025
- return {
2026
- load,
2027
- loadAll,
2028
- unload,
2029
- unloadAll,
2030
- _setReferrerPolicy
2031
- };
2032
- };
2033
-
2034
- const create$d = () => {
2035
- const map = new WeakMap();
2036
- const forElement = (referenceElement, settings) => {
2037
- const root = getRootNode(referenceElement);
2038
- const rootDom = root.dom;
2039
- return Optional.from(map.get(rootDom)).getOrThunk(() => {
2040
- const sl = StyleSheetLoader(rootDom, settings);
2041
- map.set(rootDom, sl);
2042
- return sl;
2043
- });
2044
- };
2045
- return { forElement };
2046
- };
2047
- const instance = create$d();
1759
+ const ancestor$1 = (scope, selector, isRoot) => ancestor$2(scope, selector, isRoot).isSome();
2048
1760
 
2049
1761
  class DomTreeWalker {
2050
1762
  constructor(startNode, rootNode) {
@@ -2115,6 +1827,134 @@
2115
1827
  }
2116
1828
  }
2117
1829
 
1830
+ const isNodeType = type => {
1831
+ return node => {
1832
+ return !!node && node.nodeType === type;
1833
+ };
1834
+ };
1835
+ const isRestrictedNode = node => !!node && !Object.getPrototypeOf(node);
1836
+ const isElement$6 = isNodeType(1);
1837
+ const matchNodeName = name => {
1838
+ const lowerCasedName = name.toLowerCase();
1839
+ return node => isNonNullable(node) && node.nodeName.toLowerCase() === lowerCasedName;
1840
+ };
1841
+ const matchNodeNames = names => {
1842
+ const lowerCasedNames = names.map(s => s.toLowerCase());
1843
+ return node => {
1844
+ if (node && node.nodeName) {
1845
+ const nodeName = node.nodeName.toLowerCase();
1846
+ return contains$2(lowerCasedNames, nodeName);
1847
+ }
1848
+ return false;
1849
+ };
1850
+ };
1851
+ const matchStyleValues = (name, values) => {
1852
+ const items = values.toLowerCase().split(' ');
1853
+ return node => {
1854
+ if (isElement$6(node)) {
1855
+ const win = node.ownerDocument.defaultView;
1856
+ if (win) {
1857
+ for (let i = 0; i < items.length; i++) {
1858
+ const computed = win.getComputedStyle(node, null);
1859
+ const cssValue = computed ? computed.getPropertyValue(name) : null;
1860
+ if (cssValue === items[i]) {
1861
+ return true;
1862
+ }
1863
+ }
1864
+ }
1865
+ }
1866
+ return false;
1867
+ };
1868
+ };
1869
+ const hasAttribute = attrName => {
1870
+ return node => {
1871
+ return isElement$6(node) && node.hasAttribute(attrName);
1872
+ };
1873
+ };
1874
+ const hasAttributeValue = (attrName, attrValue) => {
1875
+ return node => {
1876
+ return isElement$6(node) && node.getAttribute(attrName) === attrValue;
1877
+ };
1878
+ };
1879
+ const isBogus$2 = node => isElement$6(node) && node.hasAttribute('data-mce-bogus');
1880
+ const isBogusAll$1 = node => isElement$6(node) && node.getAttribute('data-mce-bogus') === 'all';
1881
+ const isTable$2 = node => isElement$6(node) && node.tagName === 'TABLE';
1882
+ const hasContentEditableState = value => {
1883
+ return node => {
1884
+ if (isElement$6(node)) {
1885
+ if (node.contentEditable === value) {
1886
+ return true;
1887
+ }
1888
+ if (node.getAttribute('data-mce-contenteditable') === value) {
1889
+ return true;
1890
+ }
1891
+ }
1892
+ return false;
1893
+ };
1894
+ };
1895
+ const isTextareaOrInput = matchNodeNames([
1896
+ 'textarea',
1897
+ 'input'
1898
+ ]);
1899
+ const isText$a = isNodeType(3);
1900
+ const isCData = isNodeType(4);
1901
+ const isPi = isNodeType(7);
1902
+ const isComment = isNodeType(8);
1903
+ const isDocument$1 = isNodeType(9);
1904
+ const isDocumentFragment = isNodeType(11);
1905
+ const isBr$6 = matchNodeName('br');
1906
+ const isImg = matchNodeName('img');
1907
+ const isContentEditableTrue$3 = hasContentEditableState('true');
1908
+ const isContentEditableFalse$a = hasContentEditableState('false');
1909
+ const isTableCell$3 = matchNodeNames([
1910
+ 'td',
1911
+ 'th'
1912
+ ]);
1913
+ const isTableCellOrCaption = matchNodeNames([
1914
+ 'td',
1915
+ 'th',
1916
+ 'caption'
1917
+ ]);
1918
+ const isMedia$2 = matchNodeNames([
1919
+ 'video',
1920
+ 'audio',
1921
+ 'object',
1922
+ 'embed'
1923
+ ]);
1924
+ const isListItem$2 = matchNodeName('li');
1925
+
1926
+ const zeroWidth = '\uFEFF';
1927
+ const nbsp = '\xA0';
1928
+ const isZwsp$1 = char => char === zeroWidth;
1929
+ const removeZwsp = s => s.replace(/\uFEFF/g, '');
1930
+
1931
+ const descendants = (scope, selector) => all(selector, scope);
1932
+
1933
+ const NodeValue = (is, name) => {
1934
+ const get = element => {
1935
+ if (!is(element)) {
1936
+ throw new Error('Can only get ' + name + ' value of a ' + name + ' node');
1937
+ }
1938
+ return getOption(element).getOr('');
1939
+ };
1940
+ const getOption = element => is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();
1941
+ const set = (element, value) => {
1942
+ if (!is(element)) {
1943
+ throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');
1944
+ }
1945
+ element.dom.nodeValue = value;
1946
+ };
1947
+ return {
1948
+ get,
1949
+ getOption,
1950
+ set
1951
+ };
1952
+ };
1953
+
1954
+ const api$1 = NodeValue(isText$b, 'text');
1955
+ const get$3 = element => api$1.get(element);
1956
+ const getOption = element => api$1.getOption(element);
1957
+
2118
1958
  const blocks = [
2119
1959
  'article',
2120
1960
  'aside',
@@ -2237,58 +2077,13 @@
2237
2077
  const isInline$1 = node => isElement$7(node) && !isBlock$2(node);
2238
2078
  const isBr$5 = node => isElement$7(node) && name(node) === 'br';
2239
2079
  const isTextBlock$2 = lazyLookup(textBlocks);
2240
- const isList = lazyLookup(lists);
2241
- const isListItem$1 = lazyLookup(listItems$1);
2242
- const isTableSection = lazyLookup(tableSections);
2243
- const isTableCell$2 = lazyLookup(tableCells);
2244
- const isWsPreserveElement = lazyLookup(wsElements);
2245
- const isWrapBlockElement = lazyLookup(wrapBlockElements);
2246
- const isWrapElement = node => isWrapBlockElement(node) || isInline$1(node);
2247
-
2248
- const ancestor$1 = (scope, selector, isRoot) => ancestor$2(scope, selector, isRoot).isSome();
2249
-
2250
- const zeroWidth = '\uFEFF';
2251
- const nbsp = '\xA0';
2252
- const isZwsp$1 = char => char === zeroWidth;
2253
- const removeZwsp = s => s.replace(/\uFEFF/g, '');
2254
-
2255
- const descendants$1 = (scope, predicate) => {
2256
- let result = [];
2257
- each$e(children(scope), x => {
2258
- if (predicate(x)) {
2259
- result = result.concat([x]);
2260
- }
2261
- result = result.concat(descendants$1(x, predicate));
2262
- });
2263
- return result;
2264
- };
2265
-
2266
- const descendants = (scope, selector) => all(selector, scope);
2267
-
2268
- const NodeValue = (is, name) => {
2269
- const get = element => {
2270
- if (!is(element)) {
2271
- throw new Error('Can only get ' + name + ' value of a ' + name + ' node');
2272
- }
2273
- return getOption(element).getOr('');
2274
- };
2275
- const getOption = element => is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();
2276
- const set = (element, value) => {
2277
- if (!is(element)) {
2278
- throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');
2279
- }
2280
- element.dom.nodeValue = value;
2281
- };
2282
- return {
2283
- get,
2284
- getOption,
2285
- set
2286
- };
2287
- };
2288
-
2289
- const api$1 = NodeValue(isText$b, 'text');
2290
- const get$3 = element => api$1.get(element);
2291
- const getOption = element => api$1.getOption(element);
2080
+ const isList = lazyLookup(lists);
2081
+ const isListItem$1 = lazyLookup(listItems$1);
2082
+ const isTableSection = lazyLookup(tableSections);
2083
+ const isTableCell$2 = lazyLookup(tableCells);
2084
+ const isWsPreserveElement = lazyLookup(wsElements);
2085
+ const isWrapBlockElement = lazyLookup(wrapBlockElements);
2086
+ const isWrapElement = node => isWrapBlockElement(node) || isInline$1(node);
2292
2087
 
2293
2088
  const getLastChildren$1 = elm => {
2294
2089
  const children = [];
@@ -2470,109 +2265,415 @@
2470
2265
  if (isNonUiContentEditableFalse(tempNode)) {
2471
2266
  return false;
2472
2267
  }
2473
- if (isContentEditableTrue$2(tempNode)) {
2474
- return true;
2268
+ if (isContentEditableTrue$2(tempNode)) {
2269
+ return true;
2270
+ }
2271
+ }
2272
+ return true;
2273
+ };
2274
+ const isAtomicContentEditableFalse = node => {
2275
+ if (!isNonUiContentEditableFalse(node)) {
2276
+ return false;
2277
+ }
2278
+ return !foldl(from(node.getElementsByTagName('*')), (result, elm) => {
2279
+ return result || isContentEditableTrue$2(elm);
2280
+ }, false);
2281
+ };
2282
+ const isAtomic$1 = node => isAtomicInline(node) || isAtomicContentEditableFalse(node);
2283
+ const isEditableCaretCandidate$1 = (node, root) => isCaretCandidate$3(node) && isInEditable(node, root);
2284
+
2285
+ const whiteSpaceRegExp = /^[ \t\r\n]*$/;
2286
+ const isWhitespaceText = text => whiteSpaceRegExp.test(text);
2287
+ const isCollapsibleWhitespace$1 = c => ' \f\t\x0B'.indexOf(c) !== -1;
2288
+ const isNewLineChar = c => c === '\n' || c === '\r';
2289
+ const isNewline = (text, idx) => idx < text.length && idx >= 0 ? isNewLineChar(text[idx]) : false;
2290
+ const normalize$4 = (text, tabSpaces = 4, isStartOfContent = true, isEndOfContent = true) => {
2291
+ const tabSpace = repeat(' ', tabSpaces);
2292
+ const normalizedText = text.replace(/\t/g, tabSpace);
2293
+ const result = foldl(normalizedText, (acc, c) => {
2294
+ if (isCollapsibleWhitespace$1(c) || c === nbsp) {
2295
+ if (acc.pcIsSpace || acc.str === '' && isStartOfContent || acc.str.length === normalizedText.length - 1 && isEndOfContent || isNewline(normalizedText, acc.str.length + 1)) {
2296
+ return {
2297
+ pcIsSpace: false,
2298
+ str: acc.str + nbsp
2299
+ };
2300
+ } else {
2301
+ return {
2302
+ pcIsSpace: true,
2303
+ str: acc.str + ' '
2304
+ };
2305
+ }
2306
+ } else {
2307
+ return {
2308
+ pcIsSpace: isNewLineChar(c),
2309
+ str: acc.str + c
2310
+ };
2311
+ }
2312
+ }, {
2313
+ pcIsSpace: false,
2314
+ str: ''
2315
+ });
2316
+ return result.str;
2317
+ };
2318
+
2319
+ const hasWhitespacePreserveParent = (node, rootNode) => {
2320
+ const rootElement = SugarElement.fromDom(rootNode);
2321
+ const startNode = SugarElement.fromDom(node);
2322
+ return ancestor$1(startNode, 'pre,code', curry(eq, rootElement));
2323
+ };
2324
+ const isWhitespace$1 = (node, rootNode) => {
2325
+ return isText$a(node) && isWhitespaceText(node.data) && !hasWhitespacePreserveParent(node, rootNode);
2326
+ };
2327
+ const isNamedAnchor = node => {
2328
+ return isElement$6(node) && node.nodeName === 'A' && !node.hasAttribute('href') && (node.hasAttribute('name') || node.hasAttribute('id'));
2329
+ };
2330
+ const isContent$1 = (node, rootNode) => {
2331
+ return isCaretCandidate$3(node) && !isWhitespace$1(node, rootNode) || isNamedAnchor(node) || isBookmark(node);
2332
+ };
2333
+ const isBookmark = hasAttribute('data-mce-bookmark');
2334
+ const isBogus$1 = hasAttribute('data-mce-bogus');
2335
+ const isBogusAll = hasAttributeValue('data-mce-bogus', 'all');
2336
+ const isEmptyNode = (targetNode, skipBogus) => {
2337
+ let brCount = 0;
2338
+ if (isContent$1(targetNode, targetNode)) {
2339
+ return false;
2340
+ } else {
2341
+ let node = targetNode.firstChild;
2342
+ if (!node) {
2343
+ return true;
2344
+ }
2345
+ const walker = new DomTreeWalker(node, targetNode);
2346
+ do {
2347
+ if (skipBogus) {
2348
+ if (isBogusAll(node)) {
2349
+ node = walker.next(true);
2350
+ continue;
2351
+ }
2352
+ if (isBogus$1(node)) {
2353
+ node = walker.next();
2354
+ continue;
2355
+ }
2356
+ }
2357
+ if (isBr$6(node)) {
2358
+ brCount++;
2359
+ node = walker.next();
2360
+ continue;
2361
+ }
2362
+ if (isContent$1(node, targetNode)) {
2363
+ return false;
2364
+ }
2365
+ node = walker.next();
2366
+ } while (node);
2367
+ return brCount <= 1;
2368
+ }
2369
+ };
2370
+ const isEmpty$2 = (elm, skipBogus = true) => isEmptyNode(elm.dom, skipBogus);
2371
+
2372
+ const transparentBlockAttr = 'data-mce-block';
2373
+ const elementNames = map => filter$5(keys(map), key => !/[A-Z]/.test(key));
2374
+ const makeSelectorFromSchemaMap = map => elementNames(map).join(',');
2375
+ const updateTransparent = (blocksSelector, transparent) => {
2376
+ if (isNonNullable(transparent.querySelector(blocksSelector))) {
2377
+ transparent.setAttribute(transparentBlockAttr, 'true');
2378
+ if (transparent.getAttribute('data-mce-selected') === 'inline-boundary') {
2379
+ transparent.removeAttribute('data-mce-selected');
2380
+ }
2381
+ return true;
2382
+ } else {
2383
+ transparent.removeAttribute(transparentBlockAttr);
2384
+ return false;
2385
+ }
2386
+ };
2387
+ const updateBlockStateOnChildren = (schema, scope) => {
2388
+ const transparentSelector = makeSelectorFromSchemaMap(schema.getTransparentElements());
2389
+ const blocksSelector = makeSelectorFromSchemaMap(schema.getBlockElements());
2390
+ return filter$5(scope.querySelectorAll(transparentSelector), transparent => updateTransparent(blocksSelector, transparent));
2391
+ };
2392
+ const trimEdge = (el, leftSide) => {
2393
+ var _a;
2394
+ const childPropertyName = leftSide ? 'lastChild' : 'firstChild';
2395
+ for (let child = el[childPropertyName]; child; child = child[childPropertyName]) {
2396
+ if (isEmpty$2(SugarElement.fromDom(child))) {
2397
+ (_a = child.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(child);
2398
+ return;
2399
+ }
2400
+ }
2401
+ };
2402
+ const split$2 = (parentElm, splitElm) => {
2403
+ const range = document.createRange();
2404
+ const parentNode = parentElm.parentNode;
2405
+ if (parentNode) {
2406
+ range.setStartBefore(parentElm);
2407
+ range.setEndBefore(splitElm);
2408
+ const beforeFragment = range.extractContents();
2409
+ trimEdge(beforeFragment, true);
2410
+ range.setStartAfter(splitElm);
2411
+ range.setEndAfter(parentElm);
2412
+ const afterFragment = range.extractContents();
2413
+ trimEdge(afterFragment, false);
2414
+ if (!isEmpty$2(SugarElement.fromDom(beforeFragment))) {
2415
+ parentNode.insertBefore(beforeFragment, parentElm);
2416
+ }
2417
+ if (!isEmpty$2(SugarElement.fromDom(splitElm))) {
2418
+ parentNode.insertBefore(splitElm, parentElm);
2419
+ }
2420
+ if (!isEmpty$2(SugarElement.fromDom(afterFragment))) {
2421
+ parentNode.insertBefore(afterFragment, parentElm);
2422
+ }
2423
+ parentNode.removeChild(parentElm);
2424
+ }
2425
+ };
2426
+ const splitInvalidChildren = (schema, scope, transparentBlocks) => {
2427
+ const blocksElements = schema.getBlockElements();
2428
+ const rootNode = SugarElement.fromDom(scope);
2429
+ const isBlock = el => name(el) in blocksElements;
2430
+ const isRoot = el => eq(el, rootNode);
2431
+ each$e(fromDom$1(transparentBlocks), transparentBlock => {
2432
+ ancestor$3(transparentBlock, isBlock, isRoot).each(parentBlock => {
2433
+ const invalidChildren = children(transparentBlock, el => isBlock(el) && !schema.isValidChild(name(parentBlock), name(el)));
2434
+ if (invalidChildren.length > 0) {
2435
+ const stateScope = parentElement(parentBlock);
2436
+ each$e(invalidChildren, child => {
2437
+ ancestor$3(child, isBlock, isRoot).each(parentBlock => {
2438
+ split$2(parentBlock.dom, child.dom);
2439
+ });
2440
+ });
2441
+ stateScope.each(scope => updateBlockStateOnChildren(schema, scope.dom));
2442
+ }
2443
+ });
2444
+ });
2445
+ };
2446
+ const updateChildren = (schema, scope) => {
2447
+ const transparentBlocks = updateBlockStateOnChildren(schema, scope);
2448
+ splitInvalidChildren(schema, scope, transparentBlocks);
2449
+ };
2450
+ const updateElement = (schema, target) => {
2451
+ if (isTransparentElement(schema, target)) {
2452
+ const blocksSelector = makeSelectorFromSchemaMap(schema.getBlockElements());
2453
+ updateTransparent(blocksSelector, target);
2454
+ }
2455
+ };
2456
+ const updateCaret = (schema, root, caretParent) => {
2457
+ const isRoot = el => eq(el, SugarElement.fromDom(root));
2458
+ const parents = parents$1(SugarElement.fromDom(caretParent), isRoot);
2459
+ get$b(parents, parents.length - 2).filter(isElement$7).fold(() => updateChildren(schema, root), scope => updateChildren(schema, scope.dom));
2460
+ };
2461
+ const hasBlockAttr = el => el.hasAttribute(transparentBlockAttr);
2462
+ const isTransparentElementName = (schema, name) => has$2(schema.getTransparentElements(), name);
2463
+ const isTransparentElement = (schema, node) => isElement$6(node) && isTransparentElementName(schema, node.nodeName);
2464
+ const isTransparentBlock = (schema, node) => isTransparentElement(schema, node) && hasBlockAttr(node);
2465
+ const isTransparentAstBlock = (schema, node) => node.type === 1 && isTransparentElementName(schema, node.name) && isString(node.attr(transparentBlockAttr));
2466
+ const isTransparentAstInline = (schema, node) => node.type === 1 && isTransparentElementName(schema, node.name) && isUndefined(node.attr(transparentBlockAttr));
2467
+
2468
+ const browser = detect$2().browser;
2469
+ const firstElement = nodes => find$2(nodes, isElement$7);
2470
+ const getTableCaptionDeltaY = elm => {
2471
+ if (browser.isFirefox() && name(elm) === 'table') {
2472
+ return firstElement(children$1(elm)).filter(elm => {
2473
+ return name(elm) === 'caption';
2474
+ }).bind(caption => {
2475
+ return firstElement(nextSiblings(caption)).map(body => {
2476
+ const bodyTop = body.dom.offsetTop;
2477
+ const captionTop = caption.dom.offsetTop;
2478
+ const captionHeight = caption.dom.offsetHeight;
2479
+ return bodyTop <= captionTop ? -captionHeight : 0;
2480
+ });
2481
+ }).getOr(0);
2482
+ } else {
2483
+ return 0;
2484
+ }
2485
+ };
2486
+ const hasChild = (elm, child) => elm.children && contains$2(elm.children, child);
2487
+ const getPos = (body, elm, rootElm) => {
2488
+ let x = 0, y = 0;
2489
+ const doc = body.ownerDocument;
2490
+ rootElm = rootElm ? rootElm : body;
2491
+ if (elm) {
2492
+ if (rootElm === body && elm.getBoundingClientRect && get$7(SugarElement.fromDom(body), 'position') === 'static') {
2493
+ const pos = elm.getBoundingClientRect();
2494
+ x = pos.left + (doc.documentElement.scrollLeft || body.scrollLeft) - doc.documentElement.clientLeft;
2495
+ y = pos.top + (doc.documentElement.scrollTop || body.scrollTop) - doc.documentElement.clientTop;
2496
+ return {
2497
+ x,
2498
+ y
2499
+ };
2500
+ }
2501
+ let offsetParent = elm;
2502
+ while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType && !hasChild(offsetParent, rootElm)) {
2503
+ const castOffsetParent = offsetParent;
2504
+ x += castOffsetParent.offsetLeft || 0;
2505
+ y += castOffsetParent.offsetTop || 0;
2506
+ offsetParent = castOffsetParent.offsetParent;
2507
+ }
2508
+ offsetParent = elm.parentNode;
2509
+ while (offsetParent && offsetParent !== rootElm && offsetParent.nodeType && !hasChild(offsetParent, rootElm)) {
2510
+ x -= offsetParent.scrollLeft || 0;
2511
+ y -= offsetParent.scrollTop || 0;
2512
+ offsetParent = offsetParent.parentNode;
2513
+ }
2514
+ y += getTableCaptionDeltaY(SugarElement.fromDom(elm));
2515
+ }
2516
+ return {
2517
+ x,
2518
+ y
2519
+ };
2520
+ };
2521
+
2522
+ const StyleSheetLoader = (documentOrShadowRoot, settings = {}) => {
2523
+ let idCount = 0;
2524
+ const loadedStates = {};
2525
+ const edos = SugarElement.fromDom(documentOrShadowRoot);
2526
+ const doc = documentOrOwner(edos);
2527
+ const maxLoadTime = settings.maxLoadTime || 5000;
2528
+ const _setReferrerPolicy = referrerPolicy => {
2529
+ settings.referrerPolicy = referrerPolicy;
2530
+ };
2531
+ const _setContentCssCors = contentCssCors => {
2532
+ settings.contentCssCors = contentCssCors;
2533
+ };
2534
+ const addStyle = element => {
2535
+ append$1(getStyleContainer(edos), element);
2536
+ };
2537
+ const removeStyle = id => {
2538
+ const styleContainer = getStyleContainer(edos);
2539
+ descendant(styleContainer, '#' + id).each(remove$6);
2540
+ };
2541
+ const getOrCreateState = url => get$a(loadedStates, url).getOrThunk(() => ({
2542
+ id: 'mce-u' + idCount++,
2543
+ passed: [],
2544
+ failed: [],
2545
+ count: 0
2546
+ }));
2547
+ const load = url => new Promise((success, failure) => {
2548
+ let link;
2549
+ const urlWithSuffix = Tools._addCacheSuffix(url);
2550
+ const state = getOrCreateState(urlWithSuffix);
2551
+ loadedStates[urlWithSuffix] = state;
2552
+ state.count++;
2553
+ const resolve = (callbacks, status) => {
2554
+ each$e(callbacks, call);
2555
+ state.status = status;
2556
+ state.passed = [];
2557
+ state.failed = [];
2558
+ if (link) {
2559
+ link.onload = null;
2560
+ link.onerror = null;
2561
+ link = null;
2562
+ }
2563
+ };
2564
+ const passed = () => resolve(state.passed, 2);
2565
+ const failed = () => resolve(state.failed, 3);
2566
+ const wait = (testCallback, waitCallback) => {
2567
+ if (!testCallback()) {
2568
+ if (Date.now() - startTime < maxLoadTime) {
2569
+ setTimeout(waitCallback);
2570
+ } else {
2571
+ failed();
2572
+ }
2573
+ }
2574
+ };
2575
+ const waitForWebKitLinkLoaded = () => {
2576
+ wait(() => {
2577
+ const styleSheets = documentOrShadowRoot.styleSheets;
2578
+ let i = styleSheets.length;
2579
+ while (i--) {
2580
+ const styleSheet = styleSheets[i];
2581
+ const owner = styleSheet.ownerNode;
2582
+ if (owner && link && owner.id === link.id) {
2583
+ passed();
2584
+ return true;
2585
+ }
2586
+ }
2587
+ return false;
2588
+ }, waitForWebKitLinkLoaded);
2589
+ };
2590
+ if (success) {
2591
+ state.passed.push(success);
2592
+ }
2593
+ if (failure) {
2594
+ state.failed.push(failure);
2475
2595
  }
2476
- }
2477
- return true;
2478
- };
2479
- const isAtomicContentEditableFalse = node => {
2480
- if (!isNonUiContentEditableFalse(node)) {
2481
- return false;
2482
- }
2483
- return !foldl(from(node.getElementsByTagName('*')), (result, elm) => {
2484
- return result || isContentEditableTrue$2(elm);
2485
- }, false);
2486
- };
2487
- const isAtomic$1 = node => isAtomicInline(node) || isAtomicContentEditableFalse(node);
2488
- const isEditableCaretCandidate$1 = (node, root) => isCaretCandidate$3(node) && isInEditable(node, root);
2489
-
2490
- const whiteSpaceRegExp = /^[ \t\r\n]*$/;
2491
- const isWhitespaceText = text => whiteSpaceRegExp.test(text);
2492
- const isCollapsibleWhitespace$1 = c => ' \f\t\x0B'.indexOf(c) !== -1;
2493
- const isNewLineChar = c => c === '\n' || c === '\r';
2494
- const isNewline = (text, idx) => idx < text.length && idx >= 0 ? isNewLineChar(text[idx]) : false;
2495
- const normalize$4 = (text, tabSpaces = 4, isStartOfContent = true, isEndOfContent = true) => {
2496
- const tabSpace = repeat(' ', tabSpaces);
2497
- const normalizedText = text.replace(/\t/g, tabSpace);
2498
- const result = foldl(normalizedText, (acc, c) => {
2499
- if (isCollapsibleWhitespace$1(c) || c === nbsp) {
2500
- if (acc.pcIsSpace || acc.str === '' && isStartOfContent || acc.str.length === normalizedText.length - 1 && isEndOfContent || isNewline(normalizedText, acc.str.length + 1)) {
2501
- return {
2502
- pcIsSpace: false,
2503
- str: acc.str + nbsp
2504
- };
2505
- } else {
2506
- return {
2507
- pcIsSpace: true,
2508
- str: acc.str + ' '
2509
- };
2510
- }
2511
- } else {
2512
- return {
2513
- pcIsSpace: isNewLineChar(c),
2514
- str: acc.str + c
2515
- };
2596
+ if (state.status === 1) {
2597
+ return;
2516
2598
  }
2517
- }, {
2518
- pcIsSpace: false,
2519
- str: ''
2520
- });
2521
- return result.str;
2522
- };
2523
-
2524
- const hasWhitespacePreserveParent = (node, rootNode) => {
2525
- const rootElement = SugarElement.fromDom(rootNode);
2526
- const startNode = SugarElement.fromDom(node);
2527
- return ancestor$1(startNode, 'pre,code', curry(eq, rootElement));
2528
- };
2529
- const isWhitespace$1 = (node, rootNode) => {
2530
- return isText$a(node) && isWhitespaceText(node.data) && !hasWhitespacePreserveParent(node, rootNode);
2531
- };
2532
- const isNamedAnchor = node => {
2533
- return isElement$6(node) && node.nodeName === 'A' && !node.hasAttribute('href') && (node.hasAttribute('name') || node.hasAttribute('id'));
2534
- };
2535
- const isContent$1 = (node, rootNode) => {
2536
- return isCaretCandidate$3(node) && !isWhitespace$1(node, rootNode) || isNamedAnchor(node) || isBookmark(node);
2537
- };
2538
- const isBookmark = hasAttribute('data-mce-bookmark');
2539
- const isBogus$1 = hasAttribute('data-mce-bogus');
2540
- const isBogusAll = hasAttributeValue('data-mce-bogus', 'all');
2541
- const isEmptyNode = (targetNode, skipBogus) => {
2542
- let brCount = 0;
2543
- if (isContent$1(targetNode, targetNode)) {
2544
- return false;
2545
- } else {
2546
- let node = targetNode.firstChild;
2547
- if (!node) {
2548
- return true;
2599
+ if (state.status === 2) {
2600
+ passed();
2601
+ return;
2549
2602
  }
2550
- const walker = new DomTreeWalker(node, targetNode);
2551
- do {
2552
- if (skipBogus) {
2553
- if (isBogusAll(node)) {
2554
- node = walker.next(true);
2555
- continue;
2556
- }
2557
- if (isBogus$1(node)) {
2558
- node = walker.next();
2559
- continue;
2560
- }
2561
- }
2562
- if (isBr$6(node)) {
2563
- brCount++;
2564
- node = walker.next();
2565
- continue;
2603
+ if (state.status === 3) {
2604
+ failed();
2605
+ return;
2606
+ }
2607
+ state.status = 1;
2608
+ const linkElem = SugarElement.fromTag('link', doc.dom);
2609
+ setAll$1(linkElem, {
2610
+ rel: 'stylesheet',
2611
+ type: 'text/css',
2612
+ id: state.id
2613
+ });
2614
+ const startTime = Date.now();
2615
+ if (settings.contentCssCors) {
2616
+ set$2(linkElem, 'crossOrigin', 'anonymous');
2617
+ }
2618
+ if (settings.referrerPolicy) {
2619
+ set$2(linkElem, 'referrerpolicy', settings.referrerPolicy);
2620
+ }
2621
+ link = linkElem.dom;
2622
+ link.onload = waitForWebKitLinkLoaded;
2623
+ link.onerror = failed;
2624
+ addStyle(linkElem);
2625
+ set$2(linkElem, 'href', urlWithSuffix);
2626
+ });
2627
+ const loadAll = urls => {
2628
+ const loadedUrls = Promise.allSettled(map$3(urls, url => load(url).then(constant(url))));
2629
+ return loadedUrls.then(results => {
2630
+ const parts = partition$2(results, r => r.status === 'fulfilled');
2631
+ if (parts.fail.length > 0) {
2632
+ return Promise.reject(map$3(parts.fail, result => result.reason));
2633
+ } else {
2634
+ return map$3(parts.pass, result => result.value);
2566
2635
  }
2567
- if (isContent$1(node, targetNode)) {
2568
- return false;
2636
+ });
2637
+ };
2638
+ const unload = url => {
2639
+ const urlWithSuffix = Tools._addCacheSuffix(url);
2640
+ get$a(loadedStates, urlWithSuffix).each(state => {
2641
+ const count = --state.count;
2642
+ if (count === 0) {
2643
+ delete loadedStates[urlWithSuffix];
2644
+ removeStyle(state.id);
2569
2645
  }
2570
- node = walker.next();
2571
- } while (node);
2572
- return brCount <= 1;
2573
- }
2646
+ });
2647
+ };
2648
+ const unloadAll = urls => {
2649
+ each$e(urls, url => {
2650
+ unload(url);
2651
+ });
2652
+ };
2653
+ return {
2654
+ load,
2655
+ loadAll,
2656
+ unload,
2657
+ unloadAll,
2658
+ _setReferrerPolicy,
2659
+ _setContentCssCors
2660
+ };
2574
2661
  };
2575
- const isEmpty$2 = (elm, skipBogus = true) => isEmptyNode(elm.dom, skipBogus);
2662
+
2663
+ const create$d = () => {
2664
+ const map = new WeakMap();
2665
+ const forElement = (referenceElement, settings) => {
2666
+ const root = getRootNode(referenceElement);
2667
+ const rootDom = root.dom;
2668
+ return Optional.from(map.get(rootDom)).getOrThunk(() => {
2669
+ const sl = StyleSheetLoader(rootDom, settings);
2670
+ map.set(rootDom, sl);
2671
+ return sl;
2672
+ });
2673
+ };
2674
+ return { forElement };
2675
+ };
2676
+ const instance = create$d();
2576
2677
 
2577
2678
  const isSpan = node => node.nodeName.toLowerCase() === 'span';
2578
2679
  const isInlineContent = (node, root) => isNonNullable(node) && (isContent$1(node, root) || isInline$1(SugarElement.fromDom(node)));
@@ -2808,8 +2909,9 @@
2808
2909
  blockContent = 'address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul';
2809
2910
  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';
2810
2911
  if (type !== 'html4') {
2912
+ const transparentContent = 'a ins del canvas map';
2811
2913
  globalAttributes += ' contenteditable contextmenu draggable dropzone ' + 'hidden spellcheck translate';
2812
- blockContent += ' article aside details dialog figure main header footer hgroup section nav';
2914
+ blockContent += ' article aside details dialog figure main header footer hgroup section nav ' + transparentContent;
2813
2915
  phrasingContent += ' audio canvas command datalist mark meter output picture ' + 'progress time wbr video ruby bdi keygen';
2814
2916
  }
2815
2917
  if (type !== 'html5-strict') {
@@ -2855,7 +2957,7 @@
2855
2957
  add('ul', '', 'li');
2856
2958
  add('li', 'value', flowContent);
2857
2959
  add('dl', '', 'dt dd');
2858
- add('a', 'href target rel media hreflang type', phrasingContent);
2960
+ add('a', 'href target rel media hreflang type', flowContent);
2859
2961
  add('q', 'cite', phrasingContent);
2860
2962
  add('ins del', 'cite datetime', flowContent);
2861
2963
  add('img', 'src sizes srcset alt usemap ismap width height');
@@ -3051,6 +3153,7 @@
3051
3153
  const 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');
3052
3154
  const 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);
3053
3155
  const textInlineElementsMap = createLookupTable('text_inline_elements', 'span strong b em i font s strike u var cite ' + 'dfn code mark q sup sub samp');
3156
+ const transparentElementsMap = createLookupTable('transparent_elements', 'a ins del canvas map');
3054
3157
  each$b('script noscript iframe noframes noembed title style textarea xmp plaintext'.split(' '), name => {
3055
3158
  specialElements[name] = new RegExp('</' + name + '[^>]*>', 'gi');
3056
3159
  });
@@ -3335,6 +3438,7 @@
3335
3438
  const getNonEmptyElements = constant(nonEmptyElementsMap);
3336
3439
  const getMoveCaretBeforeOnEnterElements = constant(moveCaretBeforeOnEnterElementsMap);
3337
3440
  const getWhitespaceElements = constant(whitespaceElementsMap);
3441
+ const getTransparentElements = constant(transparentElementsMap);
3338
3442
  const getSpecialElements = constant(Object.seal(specialElements));
3339
3443
  const isValidChild = (name, child) => {
3340
3444
  const parent = children[name.toLowerCase()];
@@ -3380,6 +3484,7 @@
3380
3484
  getNonEmptyElements,
3381
3485
  getMoveCaretBeforeOnEnterElements,
3382
3486
  getWhitespaceElements,
3487
+ getTransparentElements,
3383
3488
  getSpecialElements,
3384
3489
  isValidChild,
3385
3490
  isValid,
@@ -4033,7 +4138,7 @@
4033
4138
  if (isString(node)) {
4034
4139
  return has$2(blockElementsMap, node);
4035
4140
  } else {
4036
- return isElement$6(node) && has$2(blockElementsMap, node.nodeName);
4141
+ return isElement$6(node) && (has$2(blockElementsMap, node.nodeName) || isTransparentBlock(schema, node));
4037
4142
  }
4038
4143
  };
4039
4144
  const get = elm => elm && doc && isString(elm) ? doc.getElementById(elm) : elm;
@@ -4303,7 +4408,7 @@
4303
4408
  return run(node, n => {
4304
4409
  const $node = SugarElement.fromDom(n);
4305
4410
  if (keepChildren) {
4306
- each$e(children($node), child => {
4411
+ each$e(children$1($node), child => {
4307
4412
  if (isText$b(child) && child.dom.length === 0) {
4308
4413
  remove$6(child);
4309
4414
  } else {
@@ -5343,8 +5448,8 @@
5343
5448
  const mutate = (original, tag) => {
5344
5449
  const nu = shallowAs(original, tag);
5345
5450
  after$4(original, nu);
5346
- const children$1 = children(original);
5347
- append(nu, children$1);
5451
+ const children = children$1(original);
5452
+ append(nu, children);
5348
5453
  remove$6(original);
5349
5454
  return nu;
5350
5455
  };
@@ -8299,12 +8404,7 @@
8299
8404
  }
8300
8405
  return undefined;
8301
8406
  };
8302
- const isTextBlock$1 = (editor, name) => {
8303
- if (isNode(name)) {
8304
- name = name.nodeName;
8305
- }
8306
- return !!editor.schema.getTextBlockElements()[name.toLowerCase()];
8307
- };
8407
+ const isTextBlock$1 = (schema, node) => !!schema.getTextBlockElements()[node.nodeName.toLowerCase()] || isTransparentBlock(schema, node);
8308
8408
  const isValid = (ed, parent, child) => {
8309
8409
  return ed.schema.isValidChild(parent, child);
8310
8410
  };
@@ -8444,9 +8544,17 @@
8444
8544
  };
8445
8545
  const walkText = (start, node, offset, predicate) => {
8446
8546
  const str = node.data;
8447
- for (let i = offset; start ? i >= 0 : i < str.length; start ? i-- : i++) {
8448
- if (predicate(str.charAt(i))) {
8449
- return start ? i + 1 : i;
8547
+ if (start) {
8548
+ for (let i = offset; i > 0; i--) {
8549
+ if (predicate(str.charAt(i - 1))) {
8550
+ return i;
8551
+ }
8552
+ }
8553
+ } else {
8554
+ for (let i = offset; i < str.length; i++) {
8555
+ if (predicate(str.charAt(i))) {
8556
+ return i;
8557
+ }
8450
8558
  }
8451
8559
  }
8452
8560
  return -1;
@@ -8493,10 +8601,9 @@
8493
8601
  }
8494
8602
  return container;
8495
8603
  };
8496
- const findBlockEndPoint = (editor, formatList, container, siblingName) => {
8604
+ const findBlockEndPoint = (dom, formatList, container, siblingName) => {
8497
8605
  var _a;
8498
8606
  let node = container;
8499
- const dom = editor.dom;
8500
8607
  const root = dom.getRoot();
8501
8608
  const format = formatList[0];
8502
8609
  if (isBlockFormat(format)) {
@@ -8504,7 +8611,7 @@
8504
8611
  }
8505
8612
  if (!node) {
8506
8613
  const scopeRoot = (_a = dom.getParent(container, 'LI,TD,TH')) !== null && _a !== void 0 ? _a : root;
8507
- node = dom.getParent(isText$a(container) ? container.parentNode : container, node => node !== root && isTextBlock(editor, node), scopeRoot);
8614
+ node = dom.getParent(isText$a(container) ? container.parentNode : container, node => node !== root && isTextBlock(dom.schema, node), scopeRoot);
8508
8615
  }
8509
8616
  if (node && isBlockFormat(format) && format.wrapper) {
8510
8617
  node = getParents$1(dom, node, 'ul,ol').reverse()[0] || node;
@@ -8558,9 +8665,8 @@
8558
8665
  return container;
8559
8666
  };
8560
8667
  const isSelfOrParentBookmark = container => isBookmarkNode(container.parentNode) || isBookmarkNode(container);
8561
- const expandRng = (editor, rng, formatList, includeTrailingSpace = false) => {
8668
+ const expandRng = (dom, rng, formatList, includeTrailingSpace = false) => {
8562
8669
  let {startContainer, startOffset, endContainer, endOffset} = rng;
8563
- const dom = editor.dom;
8564
8670
  const format = formatList[0];
8565
8671
  if (isElement$6(startContainer) && startContainer.hasChildNodes()) {
8566
8672
  startContainer = getNode$1(startContainer, startOffset);
@@ -8599,12 +8705,12 @@
8599
8705
  }
8600
8706
  }
8601
8707
  if (rng.collapsed) {
8602
- const startPoint = findWordEndPoint(dom, editor.getBody(), startContainer, startOffset, true, includeTrailingSpace);
8708
+ const startPoint = findWordEndPoint(dom, dom.getRoot(), startContainer, startOffset, true, includeTrailingSpace);
8603
8709
  startPoint.each(({container, offset}) => {
8604
8710
  startContainer = container;
8605
8711
  startOffset = offset;
8606
8712
  });
8607
- const endPoint = findWordEndPoint(dom, editor.getBody(), endContainer, endOffset, false, includeTrailingSpace);
8713
+ const endPoint = findWordEndPoint(dom, dom.getRoot(), endContainer, endOffset, false, includeTrailingSpace);
8608
8714
  endPoint.each(({container, offset}) => {
8609
8715
  endContainer = container;
8610
8716
  endOffset = offset;
@@ -8623,8 +8729,8 @@
8623
8729
  endContainer = findSelectorEndPoint(dom, formatList, rng, endContainer, 'nextSibling');
8624
8730
  }
8625
8731
  if (isBlockFormat(format) || isSelectorFormat(format)) {
8626
- startContainer = findBlockEndPoint(editor, formatList, startContainer, 'previousSibling');
8627
- endContainer = findBlockEndPoint(editor, formatList, endContainer, 'nextSibling');
8732
+ startContainer = findBlockEndPoint(dom, formatList, startContainer, 'previousSibling');
8733
+ endContainer = findBlockEndPoint(dom, formatList, endContainer, 'nextSibling');
8628
8734
  if (isBlockFormat(format)) {
8629
8735
  if (!dom.isBlock(startContainer)) {
8630
8736
  startContainer = findParentContainer(dom, formatList, startContainer, startOffset, true);
@@ -8734,7 +8840,7 @@
8734
8840
  });
8735
8841
 
8736
8842
  const applyWordGrab = (editor, rng) => {
8737
- const r = expandRng(editor, rng, [{ inline: 'span' }]);
8843
+ const r = expandRng(editor.dom, rng, [{ inline: 'span' }]);
8738
8844
  rng.setStart(r.startContainer, r.startOffset);
8739
8845
  rng.setEnd(r.endContainer, r.endOffset);
8740
8846
  editor.selection.setRng(rng);
@@ -8795,8 +8901,8 @@
8795
8901
  switch (ctx) {
8796
8902
  case 'invalid-child': {
8797
8903
  finishWrapper();
8798
- const children$1 = children(elem);
8799
- processElements(children$1);
8904
+ const children = children$1(elem);
8905
+ processElements(children);
8800
8906
  finishWrapper();
8801
8907
  break;
8802
8908
  }
@@ -9863,9 +9969,20 @@
9863
9969
  return true;
9864
9970
  });
9865
9971
  };
9972
+ const expand = (rng, options = { type: 'word' }) => {
9973
+ if (options.type === 'word') {
9974
+ const rangeLike = expandRng(dom, rng, [{ inline: 'span' }]);
9975
+ const newRange = dom.createRng();
9976
+ newRange.setStart(rangeLike.startContainer, rangeLike.startOffset);
9977
+ newRange.setEnd(rangeLike.endContainer, rangeLike.endOffset);
9978
+ return newRange;
9979
+ }
9980
+ return rng;
9981
+ };
9866
9982
  return {
9867
9983
  walk,
9868
9984
  split: split$1,
9985
+ expand,
9869
9986
  normalize
9870
9987
  };
9871
9988
  };
@@ -9973,19 +10090,19 @@
9973
10090
  editor.dispatch('AfterScrollIntoView', data);
9974
10091
  };
9975
10092
  const descend = (element, offset) => {
9976
- const children$1 = children(element);
9977
- if (children$1.length === 0 || excludeFromDescend(element)) {
10093
+ const children = children$1(element);
10094
+ if (children.length === 0 || excludeFromDescend(element)) {
9978
10095
  return {
9979
10096
  element,
9980
10097
  offset
9981
10098
  };
9982
- } else if (offset < children$1.length && !excludeFromDescend(children$1[offset])) {
10099
+ } else if (offset < children.length && !excludeFromDescend(children[offset])) {
9983
10100
  return {
9984
- element: children$1[offset],
10101
+ element: children[offset],
9985
10102
  offset: 0
9986
10103
  };
9987
10104
  } else {
9988
- const last = children$1[children$1.length - 1];
10105
+ const last = children[children.length - 1];
9989
10106
  if (excludeFromDescend(last)) {
9990
10107
  return {
9991
10108
  element,
@@ -10005,7 +10122,7 @@
10005
10122
  } else {
10006
10123
  return {
10007
10124
  element: last,
10008
- offset: children(last).length
10125
+ offset: children$1(last).length
10009
10126
  };
10010
10127
  }
10011
10128
  }
@@ -10127,7 +10244,7 @@
10127
10244
  const search = element => active$1(getRootNode(element)).filter(e => element.dom.contains(e.dom));
10128
10245
 
10129
10246
  const clamp$1 = (offset, element) => {
10130
- const max = isText$b(element) ? get$3(element).length : children(element).length + 1;
10247
+ const max = isText$b(element) ? get$3(element).length : children$1(element).length + 1;
10131
10248
  if (offset > max) {
10132
10249
  return max;
10133
10250
  } else if (offset < 0) {
@@ -10138,7 +10255,7 @@
10138
10255
  const normalizeRng = rng => SimSelection.range(rng.start, clamp$1(rng.soffset, rng.start), rng.finish, clamp$1(rng.foffset, rng.finish));
10139
10256
  const isOrContains = (root, elm) => !isRestrictedNode(elm.dom) && (contains(root, elm) || eq(root, elm));
10140
10257
  const isRngInRoot = root => rng => isOrContains(root, rng.start) && isOrContains(root, rng.finish);
10141
- const shouldStore = editor => editor.inline;
10258
+ const shouldStore = editor => editor.inline || Env.browser.isFirefox();
10142
10259
  const nativeRangeToSelectionRange = r => SimSelection.range(SugarElement.fromDom(r.startContainer), r.startOffset, SugarElement.fromDom(r.endContainer), r.endOffset);
10143
10260
  const readRange = win => {
10144
10261
  const selection = win.getSelection();
@@ -10506,7 +10623,7 @@
10506
10623
  return evt.range !== range ? evt.range : range;
10507
10624
  });
10508
10625
 
10509
- const getEnd = element => name(element) === 'img' ? 1 : getOption(element).fold(() => children(element).length, v => v.length);
10626
+ const getEnd = element => name(element) === 'img' ? 1 : getOption(element).fold(() => children$1(element).length, v => v.length);
10510
10627
  const isTextNodeWithCursorPosition = el => getOption(el).filter(text => text.trim().length !== 0 || text.indexOf(nbsp) > -1).isSome();
10511
10628
  const elementsWithCursorPosition = [
10512
10629
  'img',
@@ -10521,9 +10638,9 @@
10521
10638
  const last = element => descendantRtl(element, isCursorPosition);
10522
10639
  const descendantRtl = (scope, predicate) => {
10523
10640
  const descend = element => {
10524
- const children$1 = children(element);
10525
- for (let i = children$1.length - 1; i >= 0; i--) {
10526
- const child = children$1[i];
10641
+ const children = children$1(element);
10642
+ for (let i = children.length - 1; i >= 0; i--) {
10643
+ const child = children[i];
10527
10644
  if (predicate(child)) {
10528
10645
  return Optional.some(child);
10529
10646
  }
@@ -10935,6 +11052,27 @@
10935
11052
  };
10936
11053
  const trimExternal = trimInternal;
10937
11054
 
11055
+ const cleanupBogusElements = parent => {
11056
+ const bogusElements = descendants(parent, '[data-mce-bogus]');
11057
+ each$e(bogusElements, elem => {
11058
+ const bogusValue = get$9(elem, 'data-mce-bogus');
11059
+ if (bogusValue === 'all') {
11060
+ remove$6(elem);
11061
+ } else if (isBr$5(elem)) {
11062
+ before$3(elem, SugarElement.fromText(zeroWidth));
11063
+ remove$6(elem);
11064
+ } else {
11065
+ unwrap(elem);
11066
+ }
11067
+ });
11068
+ };
11069
+ const cleanupInputNames = parent => {
11070
+ const inputs = descendants(parent, 'input');
11071
+ each$e(inputs, input => {
11072
+ remove$b(input, 'name');
11073
+ });
11074
+ };
11075
+
10938
11076
  const trimEmptyContents = (editor, html) => {
10939
11077
  const blockName = getForcedRootBlock(editor);
10940
11078
  const emptyRegExp = new RegExp(`^(<${ blockName }[^>]*>(&nbsp;|&#160;|\\s|\u00a0|<br \\/>|)<\\/${ blockName }>[\r\n]*|<br \\/>[\r\n]*)$`);
@@ -10951,18 +11089,8 @@
10951
11089
  top: '0'
10952
11090
  });
10953
11091
  set(offscreenDiv, body.innerHTML);
10954
- const bogusElements = descendants(offscreenDiv, '[data-mce-bogus]');
10955
- each$e(bogusElements, elem => {
10956
- const bogusValue = get$9(elem, 'data-mce-bogus');
10957
- if (bogusValue === 'all') {
10958
- remove$6(elem);
10959
- } else if (isBr$5(elem)) {
10960
- before$3(elem, SugarElement.fromText(zeroWidth));
10961
- remove$6(elem);
10962
- } else {
10963
- unwrap(elem);
10964
- }
10965
- });
11092
+ cleanupBogusElements(offscreenDiv);
11093
+ cleanupInputNames(offscreenDiv);
10966
11094
  const root = getContentContainer(dos);
10967
11095
  append$1(root, offscreenDiv);
10968
11096
  const content = trim$1(offscreenDiv.dom.innerText);
@@ -11580,7 +11708,7 @@
11580
11708
  const strongRtl = /[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/;
11581
11709
  const hasStrongRtl = text => strongRtl.test(text);
11582
11710
 
11583
- const isInlineTarget = (editor, elm) => is$1(SugarElement.fromDom(elm), getInlineBoundarySelector(editor));
11711
+ const isInlineTarget = (editor, elm) => is$1(SugarElement.fromDom(elm), getInlineBoundarySelector(editor)) && !isTransparentBlock(editor.schema, elm);
11584
11712
  const isRtl = element => {
11585
11713
  var _a;
11586
11714
  return DOMUtils.DOM.getStyle(element, 'direction', true) === 'rtl' || hasStrongRtl((_a = element.textContent) !== null && _a !== void 0 ? _a : '');
@@ -11677,7 +11805,7 @@
11677
11805
  }
11678
11806
  if (!eq(root, lastBlock)) {
11679
11807
  const additionalCleanupNodes = is$2(parent(lastBlock), root) ? [] : siblings(lastBlock);
11680
- each$e(additionalCleanupNodes.concat(children(root)), node => {
11808
+ each$e(additionalCleanupNodes.concat(children$1(root)), node => {
11681
11809
  if (!eq(node, lastBlock) && !contains(node, lastBlock) && isEmpty$2(node)) {
11682
11810
  remove$6(node);
11683
11811
  }
@@ -12087,8 +12215,8 @@
12087
12215
  runFilters(matches, args);
12088
12216
  };
12089
12217
 
12090
- const paddEmptyNode = (settings, args, blockElements, node) => {
12091
- if (args.insert && blockElements[node.name]) {
12218
+ const paddEmptyNode = (args, isBlock, node) => {
12219
+ if (args.insert && isBlock(node)) {
12092
12220
  const astNode = new AstNode('br', 1);
12093
12221
  astNode.attr('data-mce-bogus', '1');
12094
12222
  node.empty().append(astNode);
@@ -12109,7 +12237,7 @@
12109
12237
  return (rule === null || rule === void 0 ? void 0 : rule.paddEmpty) === true;
12110
12238
  };
12111
12239
  const isEmpty = (schema, nonEmptyElements, whitespaceElements, node) => node.isEmpty(nonEmptyElements, whitespaceElements, node => isPadded(schema, node));
12112
- const isLineBreakNode = (node, blockElements) => isNonNullable(node) && (node.name in blockElements || node.name === 'br');
12240
+ const isLineBreakNode = (node, isBlock) => isNonNullable(node) && (isBlock(node) || node.name === 'br');
12113
12241
 
12114
12242
  const removeOrUnwrapInvalidNode = (node, schema, originalNodeParent = node.parent) => {
12115
12243
  if (schema.getSpecialElements()[node.name]) {
@@ -12218,6 +12346,25 @@
12218
12346
  }
12219
12347
  }
12220
12348
  };
12349
+ const hasClosest = (node, parentName) => {
12350
+ let tempNode = node;
12351
+ while (tempNode) {
12352
+ if (tempNode.name === parentName) {
12353
+ return true;
12354
+ }
12355
+ tempNode = tempNode.parent;
12356
+ }
12357
+ return false;
12358
+ };
12359
+ const isInvalid = (schema, node, parent = node.parent) => {
12360
+ if (parent && schema.children[node.name] && !schema.isValidChild(parent.name, node.name)) {
12361
+ return true;
12362
+ } else if (parent && node.name === 'a' && hasClosest(parent, 'a')) {
12363
+ return true;
12364
+ } else {
12365
+ return false;
12366
+ }
12367
+ };
12221
12368
 
12222
12369
  const createRange = (sc, so, ec, eo) => {
12223
12370
  const rng = document.createRange();
@@ -12525,12 +12672,14 @@
12525
12672
  const startCell = dom.getParent(rng.startContainer, isTableCell);
12526
12673
  if (isTableCellContentSelected(dom, rng, startCell)) {
12527
12674
  deleteCellContents(editor, rng, SugarElement.fromDom(startCell));
12675
+ } else if (rng.startContainer === rng.endContainer && rng.endOffset - rng.startOffset === 1 && isText$a(rng.startContainer.childNodes[rng.startOffset])) {
12676
+ rng.deleteContents();
12528
12677
  } else {
12529
12678
  editor.getDoc().execCommand('Delete', false);
12530
12679
  }
12531
12680
  };
12532
12681
  const insertHtmlAtCaret = (editor, value, details) => {
12533
- var _a, _b, _c;
12682
+ var _a, _b;
12534
12683
  const selection = editor.selection;
12535
12684
  const dom = editor.dom;
12536
12685
  const parser = editor.parser;
@@ -12612,9 +12761,9 @@
12612
12761
  }
12613
12762
  }
12614
12763
  const toExtract = fragment.children();
12615
- const parent = (_c = (_b = fragment.parent) === null || _b === void 0 ? void 0 : _b.name) !== null && _c !== void 0 ? _c : root.name;
12764
+ const parent = (_b = fragment.parent) !== null && _b !== void 0 ? _b : root;
12616
12765
  fragment.unwrap();
12617
- const invalidChildren = filter$5(toExtract, node => !editor.schema.isValidChild(parent, node.name));
12766
+ const invalidChildren = filter$5(toExtract, node => isInvalid(editor.schema, node, parent));
12618
12767
  cleanInvalidNodes(invalidChildren, editor.schema);
12619
12768
  filter$2(parser.getNodeFilters(), parser.getAttributeFilters(), root);
12620
12769
  value = serializer.serialize(root);
@@ -12628,6 +12777,7 @@
12628
12777
  moveSelectionToMarker(editor, dom.get('mce_marker'));
12629
12778
  unmarkFragmentElements(editor.getBody());
12630
12779
  trimBrsFromTableCell(dom, selection.getStart());
12780
+ updateCaret(editor.schema, editor.getBody(), selection.getStart());
12631
12781
  return value;
12632
12782
  };
12633
12783
 
@@ -12980,7 +13130,7 @@
12980
13130
  const insertCaretContainerNode = (editor, caretContainer, formatNode) => {
12981
13131
  var _a, _b;
12982
13132
  const dom = editor.dom;
12983
- const block = dom.getParent(formatNode, curry(isTextBlock$1, editor));
13133
+ const block = dom.getParent(formatNode, curry(isTextBlock$1, editor.schema));
12984
13134
  if (block && dom.isEmpty(block)) {
12985
13135
  (_a = formatNode.parentNode) === null || _a === void 0 ? void 0 : _a.replaceChild(caretContainer, formatNode);
12986
13136
  } else {
@@ -13036,7 +13186,7 @@
13036
13186
  if (text && offset > 0 && offset < text.length && wordcharRegex.test(text.charAt(offset)) && wordcharRegex.test(text.charAt(offset - 1))) {
13037
13187
  const bookmark = selection.getBookmark();
13038
13188
  selectionRng.collapse(true);
13039
- let rng = expandRng(editor, selectionRng, formatList);
13189
+ let rng = expandRng(editor.dom, selectionRng, formatList);
13040
13190
  rng = split(rng);
13041
13191
  editor.formatter.apply(name, vars, rng);
13042
13192
  selection.moveToBookmark(bookmark);
@@ -13091,7 +13241,7 @@
13091
13241
  if (hasContentAfter) {
13092
13242
  const bookmark = selection.getBookmark();
13093
13243
  rng.collapse(true);
13094
- let expandedRng = expandRng(editor, rng, formatList, true);
13244
+ let expandedRng = expandRng(dom, rng, formatList, true);
13095
13245
  expandedRng = split(expandedRng);
13096
13246
  editor.formatter.remove(name, vars, expandedRng, similar);
13097
13247
  selection.moveToBookmark(bookmark);
@@ -13169,7 +13319,7 @@
13169
13319
  append(SugarElement.fromDom(pre1), [
13170
13320
  SugarElement.fromTag('br', doc),
13171
13321
  SugarElement.fromTag('br', doc),
13172
- ...children(sPre2)
13322
+ ...children$1(sPre2)
13173
13323
  ]);
13174
13324
  };
13175
13325
  if (!rng.collapsed) {
@@ -13438,6 +13588,11 @@
13438
13588
  const removeFormatInternal = (ed, format, vars, node, compareNode) => {
13439
13589
  const dom = ed.dom;
13440
13590
  const elementUtils = ElementUtils(ed);
13591
+ const schema = ed.schema;
13592
+ if (isInlineFormat(format) && isTransparentElementName(schema, format.inline) && isTransparentBlock(schema, node) && node.parentElement === ed.getBody()) {
13593
+ removeNode(ed, node, format);
13594
+ return removeResult.removed();
13595
+ }
13441
13596
  if (!format.ceFalseOverride && node && dom.getContentEditableParent(node) === 'false') {
13442
13597
  return removeResult.keep();
13443
13598
  }
@@ -13633,7 +13788,7 @@
13633
13788
  const removeRngStyle = rng => {
13634
13789
  let startContainer;
13635
13790
  let endContainer;
13636
- let expandedRng = expandRng(ed, rng, formatList, rng.collapsed);
13791
+ let expandedRng = expandRng(dom, rng, formatList, rng.collapsed);
13637
13792
  if (format.split) {
13638
13793
  expandedRng = split(expandedRng);
13639
13794
  startContainer = getContainer(ed, expandedRng, true);
@@ -13855,8 +14010,8 @@
13855
14010
  const wrapName = format.inline || format.block;
13856
14011
  const wrapElm = createWrapElement(wrapName);
13857
14012
  const isMatchingWrappingBlock = node => isWrappingBlockFormat(format) && matchNode(ed, node, name, vars);
13858
- const canRenameBlock = (nodeName, parentName, isEditableDescendant) => {
13859
- const isValidBlockFormatForNode = isNonWrappingBlockFormat(format) && isTextBlock$1(ed, nodeName) && isValid(ed, parentName, wrapName);
14013
+ const canRenameBlock = (node, parentName, isEditableDescendant) => {
14014
+ const isValidBlockFormatForNode = isNonWrappingBlockFormat(format) && isTextBlock$1(ed.schema, node) && isValid(ed, parentName, wrapName);
13860
14015
  return isEditableDescendant && isValidBlockFormatForNode;
13861
14016
  };
13862
14017
  const canWrapNode = (node, parentName, isEditableDescendant, isWrappableNoneditableElm) => {
@@ -13873,7 +14028,6 @@
13873
14028
  let hasContentEditableState = false;
13874
14029
  let lastContentEditable = contentEditable;
13875
14030
  let isWrappableNoneditableElm = false;
13876
- const nodeName = node.nodeName.toLowerCase();
13877
14031
  const parentNode = node.parentNode;
13878
14032
  const parentName = parentNode.nodeName.toLowerCase();
13879
14033
  const contentEditableValue = dom.getContentEditable(node);
@@ -13895,7 +14049,7 @@
13895
14049
  currentWrapElm = null;
13896
14050
  return;
13897
14051
  }
13898
- if (canRenameBlock(nodeName, parentName, isEditableDescendant)) {
14052
+ if (canRenameBlock(node, parentName, isEditableDescendant)) {
13899
14053
  const elm = dom.rename(node, wrapName);
13900
14054
  setElementFormat(elm);
13901
14055
  newWrappers.push(elm);
@@ -13996,7 +14150,7 @@
13996
14150
  const rng = dom.createRng();
13997
14151
  rng.setStartBefore(node);
13998
14152
  rng.setEndAfter(node);
13999
- applyRngStyle(dom, expandRng(ed, rng, formatList), true);
14153
+ applyRngStyle(dom, expandRng(dom, rng, formatList), true);
14000
14154
  }
14001
14155
  } else {
14002
14156
  applyRngStyle(dom, node, true);
@@ -14006,7 +14160,7 @@
14006
14160
  selection.setRng(normalize(selection.getRng()));
14007
14161
  preserveSelection(ed, () => {
14008
14162
  runOnRanges(ed, (selectionRng, fake) => {
14009
- const expandedRng = fake ? selectionRng : expandRng(ed, selectionRng, formatList);
14163
+ const expandedRng = fake ? selectionRng : expandRng(dom, selectionRng, formatList);
14010
14164
  applyRngStyle(dom, expandedRng, false);
14011
14165
  });
14012
14166
  }, always);
@@ -15959,6 +16113,7 @@
15959
16113
  const nonEmptyElements = schema.getNonEmptyElements();
15960
16114
  const whitespaceElements = schema.getWhitespaceElements();
15961
16115
  blockElements.body = 1;
16116
+ const isBlock = node => node.name in blockElements && isTransparentAstInline(schema, node);
15962
16117
  for (let i = 0, l = nodes.length; i < l; i++) {
15963
16118
  let node = nodes[i];
15964
16119
  let parent = node.parent;
@@ -15982,7 +16137,7 @@
15982
16137
  if (elementRule.removeEmpty) {
15983
16138
  parent.remove();
15984
16139
  } else if (elementRule.paddEmpty) {
15985
- paddEmptyNode(settings, args, blockElements, parent);
16140
+ paddEmptyNode(args, isBlock, parent);
15986
16141
  }
15987
16142
  }
15988
16143
  }
@@ -16582,12 +16737,13 @@
16582
16737
  }
16583
16738
  return false;
16584
16739
  };
16740
+ const isBlock = node => node.name in blockElements && !isTransparentAstInline(schema, node);
16585
16741
  const isAtEdgeOfBlock = (node, start) => {
16586
16742
  const neighbour = start ? node.prev : node.next;
16587
16743
  if (isNonNullable(neighbour) || isNullable(node.parent)) {
16588
16744
  return false;
16589
16745
  }
16590
- return node.parent.name in blockElements && (node.parent !== root || args.isRootContent === true);
16746
+ return isBlock(node.parent) && (node.parent !== root || args.isRootContent === true);
16591
16747
  };
16592
16748
  const preprocess = node => {
16593
16749
  var _a;
@@ -16595,7 +16751,7 @@
16595
16751
  if (!hasWhitespaceParent(node)) {
16596
16752
  let text = (_a = node.value) !== null && _a !== void 0 ? _a : '';
16597
16753
  text = text.replace(allWhiteSpaceRegExp, ' ');
16598
- if (isLineBreakNode(node.prev, blockElements) || isAtEdgeOfBlock(node, true)) {
16754
+ if (isLineBreakNode(node.prev, isBlock) || isAtEdgeOfBlock(node, true)) {
16599
16755
  text = text.replace(startWhiteSpaceRegExp, '');
16600
16756
  }
16601
16757
  if (text.length === 0) {
@@ -16613,21 +16769,21 @@
16613
16769
  if (validate && elementRule) {
16614
16770
  const isNodeEmpty = isEmpty(schema, nonEmptyElements, whitespaceElements, node);
16615
16771
  if (elementRule.paddInEmptyBlock && isNodeEmpty && isTextRootBlockEmpty(node)) {
16616
- paddEmptyNode(settings, args, blockElements, node);
16772
+ paddEmptyNode(args, isBlock, node);
16617
16773
  } else if (elementRule.removeEmpty && isNodeEmpty) {
16618
- if (blockElements[node.name]) {
16774
+ if (isBlock(node)) {
16619
16775
  node.remove();
16620
16776
  } else {
16621
16777
  node.unwrap();
16622
16778
  }
16623
16779
  } else if (elementRule.paddEmpty && (isNodeEmpty || isPaddedWithNbsp(node))) {
16624
- paddEmptyNode(settings, args, blockElements, node);
16780
+ paddEmptyNode(args, isBlock, node);
16625
16781
  }
16626
16782
  }
16627
16783
  } else if (node.type === 3) {
16628
16784
  if (!hasWhitespaceParent(node)) {
16629
16785
  let text = (_a = node.value) !== null && _a !== void 0 ? _a : '';
16630
- if (node.next && blockElements[node.next.name] || isAtEdgeOfBlock(node, false)) {
16786
+ if (node.next && isBlock(node.next) || isAtEdgeOfBlock(node, false)) {
16631
16787
  text = text.replace(endWhiteSpaceRegExp, '');
16632
16788
  }
16633
16789
  if (text.length === 0) {
@@ -16681,11 +16837,15 @@
16681
16837
  const getAttributeFilters = attributeFilterRegistry.getFilters;
16682
16838
  const removeAttributeFilter = attributeFilterRegistry.removeFilter;
16683
16839
  const findInvalidChildren = (node, invalidChildren) => {
16684
- const parent = node.parent;
16685
- if (parent && schema.children[node.name] && !schema.isValidChild(parent.name, node.name)) {
16840
+ if (isInvalid(schema, node)) {
16686
16841
  invalidChildren.push(node);
16687
16842
  }
16688
16843
  };
16844
+ const isWrappableNode = (blockElements, node) => {
16845
+ const isInternalElement = isString(node.attr(internalElementAttr));
16846
+ const isInlineElement = node.type === 1 && (!has$2(blockElements, node.name) && !isTransparentAstBlock(schema, node));
16847
+ return node.type === 3 || isInlineElement && !isInternalElement;
16848
+ };
16689
16849
  const addRootBlocks = (rootNode, rootBlockName) => {
16690
16850
  const blockElements = extend$1(makeMap('script,style,head,html,body,title,meta,param'), schema.getBlockElements());
16691
16851
  const startWhiteSpaceRegExp = /^[ \t\r\n]+/;
@@ -16709,7 +16869,7 @@
16709
16869
  }
16710
16870
  while (node) {
16711
16871
  const next = node.next;
16712
- if (node.type === 3 || node.type === 1 && node.name !== 'p' && !blockElements[node.name] && !node.attr(internalElementAttr)) {
16872
+ if (isWrappableNode(blockElements, node)) {
16713
16873
  if (!rootBlockNode) {
16714
16874
  rootBlockNode = new AstNode(rootBlockName, 1);
16715
16875
  rootBlockNode.attr(defaultedSettings.forced_root_block_attrs);
@@ -16731,8 +16891,10 @@
16731
16891
  const validate = defaultedSettings.validate;
16732
16892
  const rootName = (_a = args.context) !== null && _a !== void 0 ? _a : defaultedSettings.root_name;
16733
16893
  const element = parseAndSanitizeWithContext(html, rootName, args.format);
16894
+ updateChildren(schema, element);
16734
16895
  const rootNode = new AstNode(rootName, 11);
16735
16896
  transferChildren(rootNode, element, schema.getSpecialElements());
16897
+ element.innerHTML = '';
16736
16898
  const [whitespacePre, whitespacePost] = whitespaceCleaner(rootNode, schema, defaultedSettings, args);
16737
16899
  const invalidChildren = [];
16738
16900
  const invalidFinder = validate ? node => findInvalidChildren(node, invalidChildren) : noop;
@@ -17036,10 +17198,13 @@
17036
17198
  const parentBlockOpt = Optional.from(editor.dom.getParent(rng.commonAncestorContainer, editor.dom.isBlock));
17037
17199
  const body = editor.getBody();
17038
17200
  const contextNodeName = getContextNodeName(parentBlockOpt);
17201
+ const rangeContentClone = SugarElement.fromDom(rng.cloneContents());
17202
+ cleanupBogusElements(rangeContentClone);
17203
+ cleanupInputNames(rangeContentClone);
17039
17204
  const bin = editor.dom.add(body, contextNodeName, {
17040
17205
  'data-mce-bogus': 'all',
17041
17206
  'style': 'overflow: hidden; opacity: 0;'
17042
- }, rng.cloneContents());
17207
+ }, rangeContentClone.dom);
17043
17208
  const text = getInnerText(bin);
17044
17209
  const nonRenderedText = trim$1((_a = bin.textContent) !== null && _a !== void 0 ? _a : '');
17045
17210
  editor.dom.remove(bin);
@@ -17317,6 +17482,7 @@
17317
17482
  }
17318
17483
  if (bookmark) {
17319
17484
  editor.selection.moveToBookmark(bookmark);
17485
+ editor.selection.scrollIntoView();
17320
17486
  }
17321
17487
  };
17322
17488
  const getLevelContent = level => {
@@ -18091,11 +18257,13 @@
18091
18257
  win = selectedRange = explicitRange = null;
18092
18258
  controlSelection.destroy();
18093
18259
  };
18260
+ const expand = (options = { type: 'word' }) => setRng(RangeUtils(dom).expand(getRng$1(), options));
18094
18261
  const exports = {
18095
18262
  dom,
18096
18263
  win,
18097
18264
  serializer,
18098
18265
  editor,
18266
+ expand,
18099
18267
  collapse,
18100
18268
  setCursorLocation,
18101
18269
  getContent,
@@ -18264,7 +18432,7 @@
18264
18432
  }
18265
18433
  });
18266
18434
  });
18267
- 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', (nodes, name) => {
18435
+ htmlParser.addAttributeFilter('data-mce-src,data-mce-href,data-mce-style,' + 'data-mce-selected,data-mce-expando,data-mce-block,' + 'data-mce-type,data-mce-resize,data-mce-placeholder', (nodes, name) => {
18268
18436
  let i = nodes.length;
18269
18437
  while (i--) {
18270
18438
  nodes[i].attr(name, null);
@@ -20390,8 +20558,20 @@
20390
20558
  return getParentBlock$2(rootElm, containerElm).map(block => blockPosition(block, pos));
20391
20559
  };
20392
20560
  const isDifferentBlocks = blockBoundary => !eq(blockBoundary.from.block, blockBoundary.to.block);
20393
- const hasSameParent = blockBoundary => parent(blockBoundary.from.block).bind(parent1 => parent(blockBoundary.to.block).filter(parent2 => eq(parent1, parent2))).isSome();
20561
+ const getClosestHost = (root, scope) => {
20562
+ const isRoot = node => eq(node, root);
20563
+ const isHost = node => isTableCell$2(node) || isContentEditableTrue$3(node.dom);
20564
+ return closest$4(scope, isHost, isRoot).filter(isElement$7).getOr(root);
20565
+ };
20566
+ const hasSameHost = (rootNode, blockBoundary) => {
20567
+ const root = SugarElement.fromDom(rootNode);
20568
+ return eq(getClosestHost(root, blockBoundary.from.block), getClosestHost(root, blockBoundary.to.block));
20569
+ };
20394
20570
  const isEditable$2 = blockBoundary => isContentEditableFalse$a(blockBoundary.from.block.dom) === false && isContentEditableFalse$a(blockBoundary.to.block.dom) === false;
20571
+ const hasValidBlocks = blockBoundary => {
20572
+ const isValidBlock = block => isTextBlock$2(block) || hasBlockAttr(block.dom);
20573
+ return isValidBlock(blockBoundary.from.block) && isValidBlock(blockBoundary.to.block);
20574
+ };
20395
20575
  const skipLastBr = (rootNode, forward, blockPosition) => {
20396
20576
  if (isBr$6(blockPosition.position.getNode()) && !isEmpty$2(blockPosition.block)) {
20397
20577
  return positionIn(false, blockPosition.block.dom).bind(lastPositionInBlock => {
@@ -20408,13 +20588,13 @@
20408
20588
  const readFromRange = (rootNode, forward, rng) => {
20409
20589
  const fromBlockPos = getBlockPosition(rootNode, CaretPosition.fromRangeStart(rng));
20410
20590
  const toBlockPos = fromBlockPos.bind(blockPos => fromPosition(forward, rootNode, blockPos.position).bind(to => getBlockPosition(rootNode, to).map(blockPos => skipLastBr(rootNode, forward, blockPos))));
20411
- return lift2(fromBlockPos, toBlockPos, blockBoundary).filter(blockBoundary => isDifferentBlocks(blockBoundary) && hasSameParent(blockBoundary) && isEditable$2(blockBoundary));
20591
+ return lift2(fromBlockPos, toBlockPos, blockBoundary).filter(blockBoundary => isDifferentBlocks(blockBoundary) && hasSameHost(rootNode, blockBoundary) && isEditable$2(blockBoundary) && hasValidBlocks(blockBoundary));
20412
20592
  };
20413
20593
  const read$1 = (rootNode, forward, rng) => rng.collapsed ? readFromRange(rootNode, forward, rng) : Optional.none();
20414
20594
 
20415
20595
  const getChildrenUntilBlockBoundary = block => {
20416
- const children$1 = children(block);
20417
- return findIndex$2(children$1, isBlock$2).fold(constant(children$1), index => children$1.slice(0, index));
20596
+ const children = children$1(block);
20597
+ return findIndex$2(children, isBlock$2).fold(constant(children), index => children.slice(0, index));
20418
20598
  };
20419
20599
  const extractChildren = block => {
20420
20600
  const children = getChildrenUntilBlockBoundary(block);
@@ -21674,11 +21854,11 @@
21674
21854
  };
21675
21855
 
21676
21856
  const isBlockElement = (blockElements, node) => has$2(blockElements, node.nodeName);
21677
- const isValidTarget = (blockElements, node) => {
21857
+ const isValidTarget = (schema, node) => {
21678
21858
  if (isText$a(node)) {
21679
21859
  return true;
21680
21860
  } else if (isElement$6(node)) {
21681
- return !isBlockElement(blockElements, node) && !isBookmarkNode$1(node);
21861
+ return !isBlockElement(schema.getBlockElements(), node) && !isBookmarkNode$1(node) && !isTransparentBlock(schema, node);
21682
21862
  } else {
21683
21863
  return false;
21684
21864
  }
@@ -21701,7 +21881,8 @@
21701
21881
  const createRootBlock = editor => editor.dom.create(getForcedRootBlock(editor), getForcedRootBlockAttrs(editor));
21702
21882
  const addRootBlocks = editor => {
21703
21883
  const dom = editor.dom, selection = editor.selection;
21704
- const schema = editor.schema, blockElements = schema.getBlockElements();
21884
+ const schema = editor.schema;
21885
+ const blockElements = schema.getBlockElements();
21705
21886
  const startNode = selection.getStart();
21706
21887
  const rootNode = editor.getBody();
21707
21888
  let rootBlockNode;
@@ -21720,7 +21901,10 @@
21720
21901
  const restoreSelection = hasFocus(editor);
21721
21902
  let node = rootNode.firstChild;
21722
21903
  while (node) {
21723
- if (isValidTarget(blockElements, node)) {
21904
+ if (isElement$6(node)) {
21905
+ updateElement(schema, node);
21906
+ }
21907
+ if (isValidTarget(schema, node)) {
21724
21908
  if (shouldRemoveTextNode(blockElements, node)) {
21725
21909
  tempNode = node;
21726
21910
  node = node.nextSibling;
@@ -22028,7 +22212,7 @@
22028
22212
  return filterFirstLayer(scope, selector, always);
22029
22213
  };
22030
22214
  const filterFirstLayer = (scope, selector, predicate) => {
22031
- return bind$3(children(scope), x => {
22215
+ return bind$3(children$1(scope), x => {
22032
22216
  if (is$1(x, selector)) {
22033
22217
  return predicate(x) ? [x] : [];
22034
22218
  } else {
@@ -25171,8 +25355,10 @@
25171
25355
  };
25172
25356
  const traverseUp = (rootElm, scope, clientX, clientY) => {
25173
25357
  const helper = (scope, prevScope) => {
25174
- return prevScope.fold(() => closestChildCaretCandidateNodeRect(from(scope.dom.childNodes), clientX, clientY), prevScope => {
25175
- const uncheckedChildren = filter$5(from(scope.dom.childNodes), node => node !== prevScope.dom);
25358
+ const isDragGhostContainer = node => isElement$6(node) && node.classList.contains('mce-drag-container');
25359
+ const childNodesWithoutGhost = filter$5(scope.dom.childNodes, not(isDragGhostContainer));
25360
+ return prevScope.fold(() => closestChildCaretCandidateNodeRect(childNodesWithoutGhost, clientX, clientY), prevScope => {
25361
+ const uncheckedChildren = filter$5(childNodesWithoutGhost, node => node !== prevScope.dom);
25176
25362
  return closestChildCaretCandidateNodeRect(uncheckedChildren, clientX, clientY);
25177
25363
  }).orThunk(() => {
25178
25364
  const parent = eq(scope, rootElm) ? Optional.none() : parentElement(scope);
@@ -25315,7 +25501,7 @@
25315
25501
  const scrollRight = scrollEditor('left', scrollPixelsPerInterval);
25316
25502
  const scrollUp = scrollEditor('top', -scrollPixelsPerInterval);
25317
25503
  const scrollDown = scrollEditor('top', scrollPixelsPerInterval);
25318
- const moveGhost = (ghostElm, position, width, height, maxX, maxY, mouseY, mouseX, contentAreaContainer, win, state) => {
25504
+ const moveGhost = (ghostElm, position, width, height, maxX, maxY, mouseY, mouseX, contentAreaContainer, win, state, mouseEventOriginatedFromWithinTheEditor) => {
25319
25505
  let overflowX = 0, overflowY = 0;
25320
25506
  ghostElm.style.left = position.pageX + 'px';
25321
25507
  ghostElm.style.top = position.pageY + 'px';
@@ -25333,7 +25519,7 @@
25333
25519
  const outerMouseX = mouseX + contentAreaContainer.getBoundingClientRect().left;
25334
25520
  state.on(state => {
25335
25521
  state.intervalId.clear();
25336
- if (state.dragging) {
25522
+ if (state.dragging && mouseEventOriginatedFromWithinTheEditor) {
25337
25523
  if (mouseY + mouseRangeToTriggerScrollInsideEditor >= clientHeight) {
25338
25524
  state.intervalId.set(scrollDown(win));
25339
25525
  } else if (mouseY - mouseRangeToTriggerScrollInsideEditor <= 0) {
@@ -25391,7 +25577,14 @@
25391
25577
  const move = (state, editor) => {
25392
25578
  const throttledPlaceCaretAt = first$1((clientX, clientY) => {
25393
25579
  editor._selectionOverrides.hideFakeCaret();
25394
- editor.selection.placeCaretAt(clientX, clientY);
25580
+ closestFakeCaretCandidate(editor.getBody(), clientX, clientY).fold(() => editor.selection.placeCaretAt(clientX, clientY), caretInfo => {
25581
+ const range = editor._selectionOverrides.showCaret(1, caretInfo.node, caretInfo.position === FakeCaretPosition.Before, false);
25582
+ if (range) {
25583
+ editor.selection.setRng(range);
25584
+ } else {
25585
+ editor.selection.placeCaretAt(clientX, clientY);
25586
+ }
25587
+ });
25395
25588
  }, 0);
25396
25589
  editor.on('remove', throttledPlaceCaretAt.cancel);
25397
25590
  const state_ = state;
@@ -25406,9 +25599,10 @@
25406
25599
  editor.focus();
25407
25600
  }
25408
25601
  if (state.dragging) {
25602
+ const mouseEventOriginatedFromWithinTheEditor = e.currentTarget === editor.getDoc().documentElement;
25409
25603
  const targetPos = applyRelPos(state, calc(editor, e));
25410
25604
  appendGhostToBody(state.ghost, editor.getBody());
25411
- moveGhost(state.ghost, targetPos, state.width, state.height, state.maxX, state.maxY, e.clientY, e.clientX, editor.getContentAreaContainer(), editor.getWin(), state_);
25605
+ moveGhost(state.ghost, targetPos, state.width, state.height, state.maxX, state.maxY, e.clientY, e.clientX, editor.getContentAreaContainer(), editor.getWin(), state_, mouseEventOriginatedFromWithinTheEditor);
25412
25606
  throttledPlaceCaretAt.throttle(e.clientX, e.clientY);
25413
25607
  }
25414
25608
  });
@@ -25781,12 +25975,28 @@
25781
25975
  const dir = forward ? 1 : -1;
25782
25976
  const caretPosition = getNormalizedRangeEndPoint(dir, rootNode, range);
25783
25977
  const beforeNode = caretPosition.getNode(!forward);
25784
- if (isFakeCaretTarget(beforeNode)) {
25785
- return showCaret(dir, beforeNode, forward ? !caretPosition.isAtEnd() : false, false);
25978
+ if (isNonNullable(beforeNode)) {
25979
+ if (isFakeCaretTarget(beforeNode)) {
25980
+ return showCaret(dir, beforeNode, forward ? !caretPosition.isAtEnd() : false, false);
25981
+ }
25982
+ if (isCaretContainerInline(beforeNode) && isContentEditableFalse$a(beforeNode.nextSibling)) {
25983
+ const rng = dom.createRng();
25984
+ rng.setStart(beforeNode, 0);
25985
+ rng.setEnd(beforeNode, 0);
25986
+ return rng;
25987
+ }
25786
25988
  }
25787
25989
  const afterNode = caretPosition.getNode(forward);
25788
- if (isFakeCaretTarget(afterNode)) {
25789
- return showCaret(dir, afterNode, forward ? false : !caretPosition.isAtEnd(), false);
25990
+ if (isNonNullable(afterNode)) {
25991
+ if (isFakeCaretTarget(afterNode)) {
25992
+ return showCaret(dir, afterNode, forward ? false : !caretPosition.isAtEnd(), false);
25993
+ }
25994
+ if (isCaretContainerInline(afterNode) && isContentEditableFalse$a(afterNode.previousSibling)) {
25995
+ const rng = dom.createRng();
25996
+ rng.setStart(afterNode, 1);
25997
+ rng.setEnd(afterNode, 1);
25998
+ return rng;
25999
+ }
25790
26000
  }
25791
26001
  }
25792
26002
  return null;
@@ -25975,9 +26185,9 @@
25975
26185
  });
25976
26186
  return true;
25977
26187
  };
25978
- const sortPatterns = patterns => sort(patterns, (a, b) => b.start.length - a.start.length);
26188
+ const sortPatterns$1 = patterns => sort(patterns, (a, b) => b.start.length - a.start.length);
25979
26189
  const findPattern$1 = (patterns, text) => {
25980
- const sortedPatterns = sortPatterns(patterns);
26190
+ const sortedPatterns = sortPatterns$1(patterns);
25981
26191
  const nuText = text.replace(nbsp, ' ');
25982
26192
  return find$2(sortedPatterns, pattern => text.indexOf(pattern.start) === 0 || nuText.indexOf(pattern.start) === 0);
25983
26193
  };
@@ -26055,7 +26265,10 @@
26055
26265
  const startPattern = pattern.start;
26056
26266
  const startSpot = repeatLeft(dom, spot.container, spot.offset, matchesPattern(startPattern), block);
26057
26267
  return startSpot.bind(spot => {
26058
- if (spot.offset >= startPattern.length) {
26268
+ var _a, _b;
26269
+ const startPatternIndex = (_b = (_a = block.textContent) === null || _a === void 0 ? void 0 : _a.indexOf(startPattern)) !== null && _b !== void 0 ? _b : -1;
26270
+ const isCompleteMatch = startPatternIndex !== -1 && spot.offset >= startPatternIndex + startPattern.length;
26271
+ if (isCompleteMatch) {
26059
26272
  const rng = dom.createRng();
26060
26273
  rng.setStart(spot.container, spot.offset - startPattern.length);
26061
26274
  rng.setEnd(spot.container, spot.offset);
@@ -26148,6 +26361,9 @@
26148
26361
  remainingPatterns: patternsWithoutCurrent,
26149
26362
  position: endSpot
26150
26363
  }, normalizedMatches);
26364
+ if (result.isNone() && offset > 0) {
26365
+ return findPatternsRec(editor, patterns, node, offset - 1, block, normalizedMatches);
26366
+ }
26151
26367
  if (result.isSome()) {
26152
26368
  return result;
26153
26369
  }
@@ -26202,7 +26418,23 @@
26202
26418
  }]);
26203
26419
  }, []);
26204
26420
  };
26205
- const findPatterns = (editor, block, node, offset, patternSet, normalizedMatches) => findPatternsRec(editor, patternSet.inlinePatterns, node, offset, block, normalizedMatches).fold(() => [], result => result.matches);
26421
+ const sortPatterns = patterns => sort(patterns, (a, b) => b.end.length - a.end.length);
26422
+ const getBestMatches = (matches, matchesWithSortedPatterns) => {
26423
+ const hasSameMatches = forall(matches, match => exists(matchesWithSortedPatterns, sortedMatch => match.pattern.start === sortedMatch.pattern.start && match.pattern.end === sortedMatch.pattern.end));
26424
+ if (matches.length === matchesWithSortedPatterns.length) {
26425
+ if (hasSameMatches) {
26426
+ return matches;
26427
+ } else {
26428
+ return matchesWithSortedPatterns;
26429
+ }
26430
+ }
26431
+ return matches.length > matchesWithSortedPatterns.length ? matches : matchesWithSortedPatterns;
26432
+ };
26433
+ const findPatterns = (editor, block, node, offset, patternSet, normalizedMatches) => {
26434
+ const matches = findPatternsRec(editor, patternSet.inlinePatterns, node, offset, block, normalizedMatches).fold(() => [], result => result.matches);
26435
+ const matchesWithSortedPatterns = findPatternsRec(editor, sortPatterns(patternSet.inlinePatterns), node, offset, block, normalizedMatches).fold(() => [], result => result.matches);
26436
+ return getBestMatches(matches, matchesWithSortedPatterns);
26437
+ };
26206
26438
  const applyMatches = (editor, matches) => {
26207
26439
  if (matches.length === 0) {
26208
26440
  return;
@@ -26546,7 +26778,7 @@
26546
26778
  };
26547
26779
  const addBrAfterLastLinks = () => {
26548
26780
  const fixLinks = () => {
26549
- each(dom.select('a'), node => {
26781
+ each(dom.select('a:not([data-mce-block])'), node => {
26550
26782
  var _a;
26551
26783
  let parentNode = node.parentNode;
26552
26784
  const root = dom.getRoot();
@@ -28019,6 +28251,8 @@
28019
28251
  registerExecCommands(editor);
28020
28252
  };
28021
28253
 
28254
+ const selectionSafeCommands = ['toggleview'];
28255
+ const isSelectionSafeCommand = command => contains$2(selectionSafeCommands, command.toLowerCase());
28022
28256
  class EditorCommands {
28023
28257
  constructor(editor) {
28024
28258
  this.commands = {
@@ -28063,7 +28297,7 @@
28063
28297
  return false;
28064
28298
  }
28065
28299
  queryCommandState(command) {
28066
- if (this.editor.quirks.isHidden() || this.editor.removed) {
28300
+ if (!isSelectionSafeCommand(command) && this.editor.quirks.isHidden() || this.editor.removed) {
28067
28301
  return false;
28068
28302
  }
28069
28303
  const lowerCaseCommand = command.toLowerCase();
@@ -28074,7 +28308,7 @@
28074
28308
  return false;
28075
28309
  }
28076
28310
  queryCommandValue(command) {
28077
- if (this.editor.quirks.isHidden() || this.editor.removed) {
28311
+ if (!isSelectionSafeCommand(command) && this.editor.quirks.isHidden() || this.editor.removed) {
28078
28312
  return '';
28079
28313
  }
28080
28314
  const lowerCaseCommand = command.toLowerCase();
@@ -28913,6 +29147,7 @@
28913
29147
  const contextMenus = {};
28914
29148
  const contextToolbars = {};
28915
29149
  const sidebars = {};
29150
+ const views = {};
28916
29151
  const add = (collection, type) => (name, spec) => {
28917
29152
  collection[name.toLowerCase()] = {
28918
29153
  ...spec,
@@ -28934,6 +29169,7 @@
28934
29169
  addContextToolbar: add(contextToolbars, 'contexttoolbar'),
28935
29170
  addContextForm: add(contextToolbars, 'contextform'),
28936
29171
  addSidebar: add(sidebars, 'sidebar'),
29172
+ addView: add(views, 'views'),
28937
29173
  addIcon,
28938
29174
  getAll: () => ({
28939
29175
  buttons,
@@ -28942,7 +29178,8 @@
28942
29178
  popups,
28943
29179
  contextMenus,
28944
29180
  contextToolbars,
28945
- sidebars
29181
+ sidebars,
29182
+ views
28946
29183
  })
28947
29184
  };
28948
29185
  };
@@ -28964,6 +29201,7 @@
28964
29201
  addToggleButton: bridge.addToggleButton,
28965
29202
  addGroupToolbarButton: bridge.addGroupToolbarButton,
28966
29203
  addToggleMenuItem: bridge.addToggleMenuItem,
29204
+ addView: bridge.addView,
28967
29205
  getAll: bridge.getAll
28968
29206
  };
28969
29207
  };
@@ -29015,6 +29253,10 @@
29015
29253
  ScriptLoader.ScriptLoader._setReferrerPolicy(referrerPolicy);
29016
29254
  DOMUtils.DOM.styleSheetLoader._setReferrerPolicy(referrerPolicy);
29017
29255
  }
29256
+ const contentCssCors = hasContentCssCors(self);
29257
+ if (isNonNullable(contentCssCors)) {
29258
+ DOMUtils.DOM.styleSheetLoader._setContentCssCors(contentCssCors);
29259
+ }
29018
29260
  AddOnManager.languageLoad = getOption('language_load');
29019
29261
  AddOnManager.baseURL = editorManager.baseURL;
29020
29262
  this.setDirty(false);
@@ -29385,8 +29627,8 @@
29385
29627
  documentBaseURL: null,
29386
29628
  suffix: null,
29387
29629
  majorVersion: '6',
29388
- minorVersion: '2.0',
29389
- releaseDate: '2022-09-08',
29630
+ minorVersion: '3.0',
29631
+ releaseDate: '2022-11-23',
29390
29632
  i18n: I18n,
29391
29633
  activeEditor: null,
29392
29634
  focusedEditor: null,