Subversion Repositories oidplus

Rev

Rev 1422 | View as "text/javascript" | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /**
  2.  * Copyright (c) Tiny Technologies, Inc. All rights reserved.
  3.  * Licensed under the LGPL or a commercial license.
  4.  * For LGPL see License.txt in the project root for license information.
  5.  * For commercial licenses see https://www.tiny.cloud/
  6.  *
  7.  * Version: 5.10.9 (2023-11-15)
  8.  */
  9. (function () {
  10.     'use strict';
  11.  
  12.     var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
  13.  
  14.     var typeOf = function (x) {
  15.       var t = typeof x;
  16.       if (x === null) {
  17.         return 'null';
  18.       } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
  19.         return 'array';
  20.       } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
  21.         return 'string';
  22.       } else {
  23.         return t;
  24.       }
  25.     };
  26.     var isType$1 = function (type) {
  27.       return function (value) {
  28.         return typeOf(value) === type;
  29.       };
  30.     };
  31.     var isSimpleType = function (type) {
  32.       return function (value) {
  33.         return typeof value === type;
  34.       };
  35.     };
  36.     var isString = isType$1('string');
  37.     var isBoolean = isSimpleType('boolean');
  38.     var isNullable = function (a) {
  39.       return a === null || a === undefined;
  40.     };
  41.     var isNonNullable = function (a) {
  42.       return !isNullable(a);
  43.     };
  44.     var isFunction = isSimpleType('function');
  45.     var isNumber = isSimpleType('number');
  46.  
  47.     var noop = function () {
  48.     };
  49.     var compose1 = function (fbc, fab) {
  50.       return function (a) {
  51.         return fbc(fab(a));
  52.       };
  53.     };
  54.     var constant = function (value) {
  55.       return function () {
  56.         return value;
  57.       };
  58.     };
  59.     var identity = function (x) {
  60.       return x;
  61.     };
  62.     var never = constant(false);
  63.     var always = constant(true);
  64.  
  65.     var none = function () {
  66.       return NONE;
  67.     };
  68.     var NONE = function () {
  69.       var call = function (thunk) {
  70.         return thunk();
  71.       };
  72.       var id = identity;
  73.       var me = {
  74.         fold: function (n, _s) {
  75.           return n();
  76.         },
  77.         isSome: never,
  78.         isNone: always,
  79.         getOr: id,
  80.         getOrThunk: call,
  81.         getOrDie: function (msg) {
  82.           throw new Error(msg || 'error: getOrDie called on none.');
  83.         },
  84.         getOrNull: constant(null),
  85.         getOrUndefined: constant(undefined),
  86.         or: id,
  87.         orThunk: call,
  88.         map: none,
  89.         each: noop,
  90.         bind: none,
  91.         exists: never,
  92.         forall: always,
  93.         filter: function () {
  94.           return none();
  95.         },
  96.         toArray: function () {
  97.           return [];
  98.         },
  99.         toString: constant('none()')
  100.       };
  101.       return me;
  102.     }();
  103.     var some = function (a) {
  104.       var constant_a = constant(a);
  105.       var self = function () {
  106.         return me;
  107.       };
  108.       var bind = function (f) {
  109.         return f(a);
  110.       };
  111.       var me = {
  112.         fold: function (n, s) {
  113.           return s(a);
  114.         },
  115.         isSome: always,
  116.         isNone: never,
  117.         getOr: constant_a,
  118.         getOrThunk: constant_a,
  119.         getOrDie: constant_a,
  120.         getOrNull: constant_a,
  121.         getOrUndefined: constant_a,
  122.         or: self,
  123.         orThunk: self,
  124.         map: function (f) {
  125.           return some(f(a));
  126.         },
  127.         each: function (f) {
  128.           f(a);
  129.         },
  130.         bind: bind,
  131.         exists: bind,
  132.         forall: bind,
  133.         filter: function (f) {
  134.           return f(a) ? me : NONE;
  135.         },
  136.         toArray: function () {
  137.           return [a];
  138.         },
  139.         toString: function () {
  140.           return 'some(' + a + ')';
  141.         }
  142.       };
  143.       return me;
  144.     };
  145.     var from = function (value) {
  146.       return value === null || value === undefined ? NONE : some(value);
  147.     };
  148.     var Optional = {
  149.       some: some,
  150.       none: none,
  151.       from: from
  152.     };
  153.  
  154.     var map = function (xs, f) {
  155.       var len = xs.length;
  156.       var r = new Array(len);
  157.       for (var i = 0; i < len; i++) {
  158.         var x = xs[i];
  159.         r[i] = f(x, i);
  160.       }
  161.       return r;
  162.     };
  163.     var each = function (xs, f) {
  164.       for (var i = 0, len = xs.length; i < len; i++) {
  165.         var x = xs[i];
  166.         f(x, i);
  167.       }
  168.     };
  169.     var filter = function (xs, pred) {
  170.       var r = [];
  171.       for (var i = 0, len = xs.length; i < len; i++) {
  172.         var x = xs[i];
  173.         if (pred(x, i)) {
  174.           r.push(x);
  175.         }
  176.       }
  177.       return r;
  178.     };
  179.  
  180.     var DOCUMENT = 9;
  181.     var DOCUMENT_FRAGMENT = 11;
  182.     var ELEMENT = 1;
  183.     var TEXT = 3;
  184.  
  185.     var fromHtml = function (html, scope) {
  186.       var doc = scope || document;
  187.       var div = doc.createElement('div');
  188.       div.innerHTML = html;
  189.       if (!div.hasChildNodes() || div.childNodes.length > 1) {
  190.         console.error('HTML does not have a single root node', html);
  191.         throw new Error('HTML must have a single root node');
  192.       }
  193.       return fromDom(div.childNodes[0]);
  194.     };
  195.     var fromTag = function (tag, scope) {
  196.       var doc = scope || document;
  197.       var node = doc.createElement(tag);
  198.       return fromDom(node);
  199.     };
  200.     var fromText = function (text, scope) {
  201.       var doc = scope || document;
  202.       var node = doc.createTextNode(text);
  203.       return fromDom(node);
  204.     };
  205.     var fromDom = function (node) {
  206.       if (node === null || node === undefined) {
  207.         throw new Error('Node cannot be null or undefined');
  208.       }
  209.       return { dom: node };
  210.     };
  211.     var fromPoint = function (docElm, x, y) {
  212.       return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);
  213.     };
  214.     var SugarElement = {
  215.       fromHtml: fromHtml,
  216.       fromTag: fromTag,
  217.       fromText: fromText,
  218.       fromDom: fromDom,
  219.       fromPoint: fromPoint
  220.     };
  221.  
  222.     var is = function (element, selector) {
  223.       var dom = element.dom;
  224.       if (dom.nodeType !== ELEMENT) {
  225.         return false;
  226.       } else {
  227.         var elem = dom;
  228.         if (elem.matches !== undefined) {
  229.           return elem.matches(selector);
  230.         } else if (elem.msMatchesSelector !== undefined) {
  231.           return elem.msMatchesSelector(selector);
  232.         } else if (elem.webkitMatchesSelector !== undefined) {
  233.           return elem.webkitMatchesSelector(selector);
  234.         } else if (elem.mozMatchesSelector !== undefined) {
  235.           return elem.mozMatchesSelector(selector);
  236.         } else {
  237.           throw new Error('Browser lacks native selectors');
  238.         }
  239.       }
  240.     };
  241.  
  242.     typeof window !== 'undefined' ? window : Function('return this;')();
  243.  
  244.     var name = function (element) {
  245.       var r = element.dom.nodeName;
  246.       return r.toLowerCase();
  247.     };
  248.     var type = function (element) {
  249.       return element.dom.nodeType;
  250.     };
  251.     var isType = function (t) {
  252.       return function (element) {
  253.         return type(element) === t;
  254.       };
  255.     };
  256.     var isElement = isType(ELEMENT);
  257.     var isText = isType(TEXT);
  258.     var isDocument = isType(DOCUMENT);
  259.     var isDocumentFragment = isType(DOCUMENT_FRAGMENT);
  260.     var isTag = function (tag) {
  261.       return function (e) {
  262.         return isElement(e) && name(e) === tag;
  263.       };
  264.     };
  265.  
  266.     var owner = function (element) {
  267.       return SugarElement.fromDom(element.dom.ownerDocument);
  268.     };
  269.     var documentOrOwner = function (dos) {
  270.       return isDocument(dos) ? dos : owner(dos);
  271.     };
  272.     var parent = function (element) {
  273.       return Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
  274.     };
  275.     var children$2 = function (element) {
  276.       return map(element.dom.childNodes, SugarElement.fromDom);
  277.     };
  278.  
  279.     var rawSet = function (dom, key, value) {
  280.       if (isString(value) || isBoolean(value) || isNumber(value)) {
  281.         dom.setAttribute(key, value + '');
  282.       } else {
  283.         console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
  284.         throw new Error('Attribute value was not simple');
  285.       }
  286.     };
  287.     var set = function (element, key, value) {
  288.       rawSet(element.dom, key, value);
  289.     };
  290.     var remove = function (element, key) {
  291.       element.dom.removeAttribute(key);
  292.     };
  293.  
  294.     var isShadowRoot = function (dos) {
  295.       return isDocumentFragment(dos) && isNonNullable(dos.dom.host);
  296.     };
  297.     var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);
  298.     var getRootNode = supported ? function (e) {
  299.       return SugarElement.fromDom(e.dom.getRootNode());
  300.     } : documentOrOwner;
  301.     var getShadowRoot = function (e) {
  302.       var r = getRootNode(e);
  303.       return isShadowRoot(r) ? Optional.some(r) : Optional.none();
  304.     };
  305.     var getShadowHost = function (e) {
  306.       return SugarElement.fromDom(e.dom.host);
  307.     };
  308.  
  309.     var inBody = function (element) {
  310.       var dom = isText(element) ? element.dom.parentNode : element.dom;
  311.       if (dom === undefined || dom === null || dom.ownerDocument === null) {
  312.         return false;
  313.       }
  314.       var doc = dom.ownerDocument;
  315.       return getShadowRoot(SugarElement.fromDom(dom)).fold(function () {
  316.         return doc.body.contains(dom);
  317.       }, compose1(inBody, getShadowHost));
  318.     };
  319.  
  320.     var ancestor$1 = function (scope, predicate, isRoot) {
  321.       var element = scope.dom;
  322.       var stop = isFunction(isRoot) ? isRoot : never;
  323.       while (element.parentNode) {
  324.         element = element.parentNode;
  325.         var el = SugarElement.fromDom(element);
  326.         if (predicate(el)) {
  327.           return Optional.some(el);
  328.         } else if (stop(el)) {
  329.           break;
  330.         }
  331.       }
  332.       return Optional.none();
  333.     };
  334.  
  335.     var ancestor = function (scope, selector, isRoot) {
  336.       return ancestor$1(scope, function (e) {
  337.         return is(e, selector);
  338.       }, isRoot);
  339.     };
  340.  
  341.     var isSupported = function (dom) {
  342.       return dom.style !== undefined && isFunction(dom.style.getPropertyValue);
  343.     };
  344.  
  345.     var get = function (element, property) {
  346.       var dom = element.dom;
  347.       var styles = window.getComputedStyle(dom);
  348.       var r = styles.getPropertyValue(property);
  349.       return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;
  350.     };
  351.     var getUnsafeProperty = function (dom, property) {
  352.       return isSupported(dom) ? dom.style.getPropertyValue(property) : '';
  353.     };
  354.  
  355.     var getDirection = function (element) {
  356.       return get(element, 'direction') === 'rtl' ? 'rtl' : 'ltr';
  357.     };
  358.  
  359.     var children$1 = function (scope, predicate) {
  360.       return filter(children$2(scope), predicate);
  361.     };
  362.  
  363.     var children = function (scope, selector) {
  364.       return children$1(scope, function (e) {
  365.         return is(e, selector);
  366.       });
  367.     };
  368.  
  369.     var getParentElement = function (element) {
  370.       return parent(element).filter(isElement);
  371.     };
  372.     var getNormalizedBlock = function (element, isListItem) {
  373.       var normalizedElement = isListItem ? ancestor(element, 'ol,ul') : Optional.some(element);
  374.       return normalizedElement.getOr(element);
  375.     };
  376.     var isListItem = isTag('li');
  377.     var setDir = function (editor, dir) {
  378.       var selectedBlocks = editor.selection.getSelectedBlocks();
  379.       if (selectedBlocks.length > 0) {
  380.         each(selectedBlocks, function (block) {
  381.           var blockElement = SugarElement.fromDom(block);
  382.           var isBlockElementListItem = isListItem(blockElement);
  383.           var normalizedBlock = getNormalizedBlock(blockElement, isBlockElementListItem);
  384.           var normalizedBlockParent = getParentElement(normalizedBlock);
  385.           normalizedBlockParent.each(function (parent) {
  386.             var parentDirection = getDirection(parent);
  387.             if (parentDirection !== dir) {
  388.               set(normalizedBlock, 'dir', dir);
  389.             } else if (getDirection(normalizedBlock) !== dir) {
  390.               remove(normalizedBlock, 'dir');
  391.             }
  392.             if (isBlockElementListItem) {
  393.               var listItems = children(normalizedBlock, 'li[dir]');
  394.               each(listItems, function (listItem) {
  395.                 return remove(listItem, 'dir');
  396.               });
  397.             }
  398.           });
  399.         });
  400.         editor.nodeChanged();
  401.       }
  402.     };
  403.  
  404.     var register$1 = function (editor) {
  405.       editor.addCommand('mceDirectionLTR', function () {
  406.         setDir(editor, 'ltr');
  407.       });
  408.       editor.addCommand('mceDirectionRTL', function () {
  409.         setDir(editor, 'rtl');
  410.       });
  411.     };
  412.  
  413.     var getNodeChangeHandler = function (editor, dir) {
  414.       return function (api) {
  415.         var nodeChangeHandler = function (e) {
  416.           var element = SugarElement.fromDom(e.element);
  417.           api.setActive(getDirection(element) === dir);
  418.         };
  419.         editor.on('NodeChange', nodeChangeHandler);
  420.         return function () {
  421.           return editor.off('NodeChange', nodeChangeHandler);
  422.         };
  423.       };
  424.     };
  425.     var register = function (editor) {
  426.       editor.ui.registry.addToggleButton('ltr', {
  427.         tooltip: 'Left to right',
  428.         icon: 'ltr',
  429.         onAction: function () {
  430.           return editor.execCommand('mceDirectionLTR');
  431.         },
  432.         onSetup: getNodeChangeHandler(editor, 'ltr')
  433.       });
  434.       editor.ui.registry.addToggleButton('rtl', {
  435.         tooltip: 'Right to left',
  436.         icon: 'rtl',
  437.         onAction: function () {
  438.           return editor.execCommand('mceDirectionRTL');
  439.         },
  440.         onSetup: getNodeChangeHandler(editor, 'rtl')
  441.       });
  442.     };
  443.  
  444.     function Plugin () {
  445.       global.add('directionality', function (editor) {
  446.         register$1(editor);
  447.         register(editor);
  448.       });
  449.     }
  450.  
  451.     Plugin();
  452.  
  453. }());
  454.