From d2d85ee20d0c400e75dd6cffbb072bfb71644f3e Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Thu, 4 Jan 2018 23:45:37 +0300 Subject: [PATCH 1/6] Sanitizer docs --- docs/caret.md | 4 +--- docs/sanitizer.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 docs/sanitizer.md diff --git a/docs/caret.md b/docs/caret.md index b03dd5a9..dd68e53f 100644 --- a/docs/caret.md +++ b/docs/caret.md @@ -4,7 +4,7 @@ The `Caret` module contains methods working with caret. Uses [Range](https://dev between blocks. Caret class implements basic Module class that holds User configuration -and default CodeXEditor instances +and default CodeX Editor instances You can read more about Module class [here]() @@ -12,14 +12,12 @@ You can read more about Module class [here]() ## Methods - ### setToBlock ```javascript Caret.setToBlock(block, offset, atEnd) ``` - > Method gets Block instance and puts caret to the text node with offset #### params diff --git a/docs/sanitizer.md b/docs/sanitizer.md new file mode 100644 index 00000000..bb3e88f4 --- /dev/null +++ b/docs/sanitizer.md @@ -0,0 +1,45 @@ +# CodeX Editor Sanitizer Module + +The `Sanitizer` module represents a set via methods that clears taint string. +Uses lightweight npm package with simple API [html-janitor](https://www.npmjs.com/package/html-janitor) + +Sanitizer class implements basic Module class that holds User configuration +and default CodeX Editor instances + +You can read more about Module class [here]() + +## Properties + +Default Editor sanitizer configuration according to the html-janitor API +```javascript +defaultConfig +``` + +Custom User configuration which passed on editor initialization. Data type must be according to the html-janitor API +```javascript +sanitizerConfig +``` + + +Property that holds an instance used in module +```javascript +sanitizerInstance +``` + +## Methods + +### clean + +```javascript +clean(taintString, customConfig) +``` + +> Cleans up the passed taint string + +#### params + +| Param | Type | Description| +| -------------|------ |:-------------:| +| taintString | String | string that needs to be cleaned| +| customConfig | Object | Can be passed new config per usage (Default: uses default configuration)| + From be575a19f34e654e8e048ff5d46906eba04063d6 Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Fri, 5 Jan 2018 18:52:57 +0300 Subject: [PATCH 2/6] up docs --- docs/sanitizer.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/sanitizer.md b/docs/sanitizer.md index bb3e88f4..31081ac3 100644 --- a/docs/sanitizer.md +++ b/docs/sanitizer.md @@ -1,6 +1,6 @@ # CodeX Editor Sanitizer Module -The `Sanitizer` module represents a set via methods that clears taint string. +The `Sanitizer` module represents a set of methods that clears taint strings. Uses lightweight npm package with simple API [html-janitor](https://www.npmjs.com/package/html-janitor) Sanitizer class implements basic Module class that holds User configuration @@ -10,18 +10,18 @@ You can read more about Module class [here]() ## Properties -Default Editor sanitizer configuration according to the html-janitor API +Default Editor Sanitizer configuration according to the html-janitor API ```javascript defaultConfig ``` -Custom User configuration which passed on editor initialization. Data type must be according to the html-janitor API +Custom User configuration which passed on Editor initialization. Data type must be according to the html-janitor API ```javascript sanitizerConfig ``` -Property that holds an instance used in module +Property that holds an instance used in Module ```javascript sanitizerInstance ``` From 9dd05d216fa7e501fc28a21c34aadf58f0826064 Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Fri, 5 Jan 2018 19:56:47 +0300 Subject: [PATCH 3/6] Listeners Module: initial --- build/codex-editor.js | 269 +++++++++++++++++++++++-- build/codex-editor.js.map | 2 +- src/components/modules/_listeners.js | 192 ------------------ src/components/modules/blockManager.js | 2 +- src/components/modules/listeners.js | 195 ++++++++++++++++++ 5 files changed, 444 insertions(+), 216 deletions(-) delete mode 100644 src/components/modules/_listeners.js create mode 100644 src/components/modules/listeners.js diff --git a/build/codex-editor.js b/build/codex-editor.js index 8226c33e..87d1de28 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -881,7 +881,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons * Require Editor modules places in components/modules dir */ // eslint-disable-next-line -var modules = ["blockManager.js","caret.js","events.js","renderer.js","sanitizer.js","saver.js","toolbar.js","toolbox.js","tools.js","ui.js"].map(function (module) { +var modules = ["blockManager.js","caret.js","events.js","listeners.js","renderer.js","sanitizer.js","saver.js","toolbar.js","toolbox.js","tools.js","ui.js"].map(function (module) { return __webpack_require__(6)("./" + module); }); @@ -1291,13 +1291,14 @@ var map = { "./blockManager.js": 7, "./caret.js": 9, "./events.js": 10, - "./renderer.js": 11, - "./sanitizer.js": 12, - "./saver.js": 14, - "./toolbar.js": 15, - "./toolbox.js": 16, - "./tools.js": 17, - "./ui.js": 18 + "./listeners.js": 11, + "./renderer.js": 12, + "./sanitizer.js": 13, + "./saver.js": 15, + "./toolbar.js": 16, + "./toolbox.js": 17, + "./tools.js": 18, + "./ui.js": 19 }; function webpackContext(req) { return __webpack_require__(webpackContextResolve(req)); @@ -1469,9 +1470,9 @@ var BlockManager = function (_Module) { * keydown on block * @todo move to the keydown module */ - block.pluginsContent.addEventListener('keydown', function (event) { + this.Editor.Listeners.on(block.pluginsContent, 'keydown', function (event) { return _this3.keyDownOnBlock(event); - }, false); + }); } /** @@ -2554,6 +2555,230 @@ module.exports = exports["default"]; /* 11 */ /***/ (function(module, exports, __webpack_require__) { +"use strict"; +/* WEBPACK VAR INJECTION */(function(Module) { + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } + +function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +/** + * Codex Editor Listeners module + * + * @module Listeners + * + * Module-decorator for event listeners assignment + * + * @author Codex Team + * @version 2.0.0 + */ + +/** + * @typedef {Listeners} Listeners + * @property {Array} allListeners + */ + +var Listeners = function (_Module) { + _inherits(Listeners, _Module); + + /** + * @constructor + * @param {EditorConfig} config + */ + function Listeners(_ref) { + var config = _ref.config; + + _classCallCheck(this, Listeners); + + var _this = _possibleConstructorReturn(this, (Listeners.__proto__ || Object.getPrototypeOf(Listeners)).call(this, { config: config })); + + _this.allListeners = []; + + return _this; + } + + /** + * Assigns event listener on element + * + * @param {Element} element - DOM element that needs to be listened + * @param {String} eventType - event type + * @param {Function} handler - method that will be fired on event + * @param {Boolean} useCapture - use event bubbling + */ + + + _createClass(Listeners, [{ + key: "on", + value: function on(element, eventType, handler) { + var useCapture = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + + var assignedEventData = { + element: element, + eventType: eventType, + handler: handler, + useCapture: useCapture + }; + + var alreadyExist = this.findOne(element, eventType, handler); + + if (alreadyExist) return; + + this.allListeners.push(assignedEventData); + element.addEventListener(eventType, handler, useCapture); + } + + /** + * Removes event listener from element + * + * @param {Element} element - DOM element that we removing listener + * @param {String} eventType - event type + * @param {Function} handler - remove handler, if element listens several handlers on the same event type + * @param {Boolean} useCapture - use event bubbling + */ + + }, { + key: "off", + value: function off(element, eventType, handler) { + var useCapture = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + + + var existingListeners = this.findAll(element, eventType, handler); + + for (var i = 0; i < existingListeners.length; i++) { + + var index = this.allListeners.indexOf(existingListeners[i]); + + if (index > 0) { + + this.allListeners.splice(index, 1); + } + } + + element.removeEventListener(eventType, handler, useCapture); + } + + /** + * Search methods + * + * byElement, byType and byHandler returns array of suitable listeners + * one and all takes element, eventType, and handler and returns first (all) suitable listener + */ + + }, { + key: "findByElement", + value: function findByElement(element) { + + var listenersOnElement = []; + + for (var i = 0; i < this.allListeners.length; i++) { + + var listener = this.allListeners[i]; + + if (listener.element === element) { + + listenersOnElement.push(listener); + } + } + + return listenersOnElement; + } + }, { + key: "findByType", + value: function findByType(eventType) { + + var listenersWithType = []; + + for (var i = 0; i < this.allListeners.length; i++) { + + var listener = this.allListeners[i]; + + if (listener.type === eventType) { + + listenersWithType.push(listener); + } + } + + return listenersWithType; + } + }, { + key: "findByHandler", + value: function findByHandler(handler) { + + var listenersWithHandler = []; + + for (var i = 0; i < this.allListeners.length; i++) { + + var listener = this.allListeners[i]; + + if (listener.handler === handler) { + + listenersWithHandler.push(listener); + } + } + + return listenersWithHandler; + } + }, { + key: "findOne", + value: function findOne(element, eventType, handler) { + + var foundListeners = []; + + if (element) foundListeners = this.byElement(element); + + if (eventType) foundListeners = foundListeners.concat(this.byType(eventType)); + + if (handler) foundListeners = foundListeners.concat(this.byHandler(handler)); + + return foundListeners[0]; + } + }, { + key: "findAll", + value: function findAll(element, eventType, handler) { + + var foundListeners = []; + + if (element) foundListeners = this.byElement(element); + + if (eventType) foundListeners = foundListeners.concat(this.byType(eventType)); + + if (handler) foundListeners = foundListeners.concat(this.byHandler(handler)); + + return foundListeners; + } + }, { + key: "removeAll", + value: function removeAll() { + var _this2 = this; + + this.allListeners.map(function (current) { + + _this2.off(current.element, current.type, current.handler); + }); + } + }]); + + return Listeners; +}(Module); + +Listeners.displayName = "Listeners"; +exports.default = Listeners; +module.exports = exports["default"]; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0))) + +/***/ }), +/* 12 */ +/***/ (function(module, exports, __webpack_require__) { + "use strict"; /* WEBPACK VAR INJECTION */(function(Module, _) { @@ -2679,7 +2904,7 @@ module.exports = exports["default"]; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(1))) /***/ }), -/* 12 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2757,7 +2982,7 @@ var Sanitizer = function (_Module) { _this.sanitizerConfig = config.settings ? config.settings.sanitizer : {}; /** HTML Janitor library */ - _this.sanitizerInstance = __webpack_require__(13); + _this.sanitizerInstance = __webpack_require__(14); return _this; } @@ -2860,7 +3085,7 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(1))) /***/ }), -/* 13 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) { @@ -3055,7 +3280,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (roo /***/ }), -/* 14 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3346,7 +3571,7 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0))) /***/ }), -/* 15 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3675,7 +3900,7 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(2))) /***/ }), -/* 16 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3940,7 +4165,7 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(2), __webpack_require__(1))) /***/ }), -/* 17 */ +/* 18 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4239,7 +4464,7 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(1))) /***/ }), -/* 18 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4438,7 +4663,7 @@ var UI = function (_Module) { /** * Load CSS */ - var styles = __webpack_require__(19); + var styles = __webpack_require__(20); /** * Make tag @@ -4856,10 +5081,10 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(2))) /***/ }), -/* 19 */ +/* 20 */ /***/ (function(module, exports, __webpack_require__) { -exports = module.exports = __webpack_require__(20)(undefined); +exports = module.exports = __webpack_require__(21)(undefined); // imports @@ -4870,7 +5095,7 @@ exports.push([module.i, ":root {\n\n /**\n * Toolbar buttons\n */\n\n /***/ }), -/* 20 */ +/* 21 */ /***/ (function(module, exports) { /* diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index de9e9f9e..f2283d4f 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap e8f8d51dcfb1fb6e5682","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/Selection.js","webpack:///./src/codex.js","webpack:///./src/components/polyfills.js","webpack:///./src/components/modules nonrecursive [^_](blockManager.js|caret.js|events.js|renderer.js|sanitizer.js|saver.js|toolbar.js|toolbox.js|tools.js|ui.js)$","webpack:///./src/components/modules/blockManager.js","webpack:///./src/components/block.js","webpack:///./src/components/modules/caret.js","webpack:///./src/components/modules/events.js","webpack:///./src/components/modules/renderer.js","webpack:///./src/components/modules/sanitizer.js","webpack:///./node_modules/html-janitor/src/html-janitor.js","webpack:///./src/components/modules/saver.js","webpack:///./src/components/modules/toolbar.js","webpack:///./src/components/modules/toolbox.js","webpack:///./src/components/modules/tools.js","webpack:///./src/components/modules/ui.js","webpack:///./src/styles/main.css","webpack:///./node_modules/css-loader/lib/css-base.js"],"names":["Module","config","new","target","TypeError","Editor","Util","msg","type","args","window","console","e","chains","success","fallback","Promise","resolve","reduce","previousValue","currentValue","iteration","then","waitNextBlock","length","chainData","successCallback","fallbackCallback","function","data","catch","collection","Array","prototype","slice","call","object","Object","keys","constructor","element","contentEditable","method","timeout","context","arguments","setTimeout","apply","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","Dom","tagName","classNames","attributes","el","document","createElement","isArray","classList","add","attrName","content","createTextNode","parent","elements","forEach","appendChild","selector","querySelector","querySelectorAll","node","atLast","childNodes","isElement","isNativeInput","emptyTextNode","text","childsLength","last","getDeepestNode","nodeType","Node","ELEMENT_NODE","nativeInputs","includes","nodeText","value","textContent","replace","trim","treeWalker","leafs","push","isLeaf","nextSibling","shift","firstChild","every","isNodeEmpty","leaf","Selection","instance","selection","getSelection","anchorNode","anchorOffset","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","log","error","constructModules","configureModules","displayName","name","state","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","render","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","_","isEmpty","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","toolName","toolInstance","construct","block","bindEvents","pluginsContent","addEventListener","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","navigateNext","navigatePrevious","lastTextNode","$","currentBlock","textNodeLength","getAnchorNode","getAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","firstLevelBlock","CSS","wrapper","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","array","selected","workingArea","html","remove","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","isNaN","Number","Block","tool","_html","compose","make","contentNode","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","offset","atEnd","focus","nodeToSet","delay","range","createRange","setStart","setEnd","removeAllRanges","addRange","lastBlock","Events","subscribers","eventName","callback","previousData","currentHandler","newData","i","insertBlock","sequence","item","Sanitizer","defaultConfig","_sanitizerInstance","sanitizerConfig","settings","sanitizerInstance","require","taintString","customConfig","clean","library","tags","href","rel","newInstance","Saver","output","blocksData","all","allExtractedData","makeOutput","outputData","totalTime","groupCollapsed","extraction","groupEnd","Date","version","VERSION","Toolbar","actions","plusButton","settingsToggler","removeBlockButton","pluginSettings","defaultSettings","toolbar","append","plusButtonClicked","Toolbox","makeRemoveBlockButton","makeBlockSettingsPanel","close","defaultToolbarHeight","defaultOffset","newYCoordinate","offsetTop","style","transform","Math","floor","toolbarOpened","toggle","hide","plusButtonHidden","show","toolbox","buttons","opened","addTools","toolsAvailable","addTool","displayInToolbox","iconClassName","button","toolboxButton","title","dataset","buttonClicked","toolButton","toolClasses","irreplaceable","move","toolboxOpened","open","toolsUnavailable","enableLineBreaks","hasOwnProperty","reject","sequenceData","getListOfPrepareFunctions","toolPreparationList","toolClass","plugin","available","holder","loadStyles","getElementById","editorWrapper","editorZone","styles","tag","toString","head","redactorClicked","clickedNode","setCurrentBlockByChildNode","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock"],"mappings":"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EAAgB;;AAElB,uBAAOA,UAAP;AAEH,aANE,CAAP;AAQH;;AAED;;;;;;;;mCAKWF,gB,EAAkB;;AAEzB,gBAAItJ,QAAQ,EAAZ;AAAA,gBACIyJ,YAAY,CADhB;;AAGA9R,oBAAQ+R,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBzN,OAAjB,CAAyB,UAAC8N,UAAD,EAAahG,KAAb,EAAuB;;AAE5C;AACAhM,wBAAQoH,GAAR,UAAgB4K,WAAWvE,IAA3B,uBAAgDuE,UAAhD;AACAF,6BAAaE,WAAWxD,IAAxB;AACAnG,sBAAMxC,IAAN,CAAWmM,WAAW9Q,IAAtB;AAEH,aAPD;;AASAlB,oBAAQoH,GAAR,CAAY,OAAZ,EAAqB0K,SAArB;AACA9R,oBAAQiS,QAAR;;AAEA,mBAAO;AACHzD,sBAAU,CAAC,IAAI0D,IAAJ,EADR;AAEH7J,uBAAUA,KAFP;AAGH8J,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8B/S,M;;AA0EnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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A;;AAEA;;;AAGA,WAAKxV,MAAL,CAAY2S,OAAZ,CAAoBE,UAApB,CAA+BsB,IAA/B;;AAEA;;;;;AAKA,UAAI6C,iBAAiB,KAAKhX,MAAL,CAAYsI,KAAZ,CAAkB2O,SAAlB,CAA4B,KAAKjX,MAAL,CAAYwI,YAAZ,CAAyBmD,YAAzB,CAAsCoC,IAAlE,CAArB;AAAA,UACImJ,eAAe,KAAKlX,MAAL,CAAYwI,YAAZ,CAAyBmD,YAAzB,CAAsCpC,OADzD;;AAGA,UAAIyN,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAKlX,MAAL,CAAY2S,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;AAEH;AAEJ;;;wBA3OS;;AAEN,aAAO;AACHiC,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2B5W,M;;AA+ShC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBApgBqB4I,E;;;;;;;;ACrDrB;AACA;;;AAGA;AACA,gCAAiC,sLAAsL,4CAA4C,yBAAyB,6BAA6B,oBAAoB,6BAA6B,GAAG,uBAAuB,wBAAwB,OAAO,2BAA2B,gCAAgC,OAAO,eAAe,uBAAuB,YAAY,aAAa,WAAW,iBAAiB,2BAA2B,qCAAqC,oCAAoC,kBAAkB,GAAG,uBAAuB,qBAAqB,mBAAmB,8BAA8B,OAAO,wBAAwB,uBAAuB,qBAAqB,yBAAyB,KAAK,qBAAqB,yBAAyB,+BAA+B,4BAA4B,gCAAgC,kBAAkB,mBAAmB,wBAAwB,yBAAyB,6BAA6B,4BAA4B,mBAAmB,sBAAsB,qBAAqB,uBAAuB,yBAAyB,KAAK,6BAA6B,sBAAsB,KAAK,eAAe,yBAAyB,qCAAqC,2BAA2B,GAAG,uBAAuB,qBAAqB,8BAA8B,OAAO,uBAAuB,gCAAgC,2BAA2B,oBAAoB,8BAA8B,sBAAsB,uBAAuB,8BAA8B,2BAA2B,6BAA6B,kCAAkC,+BAA+B,2BAA2B,sBAAsB,uBAAuB,0BAA0B,wDAAwD,wDAAwD,wCAAwC,2BAA2B,uBAAuB,4BAA4B,KAAK,aAAa,4BAA4B,kBAAkB,GAAG,uBAAuB,gCAAgC,KAAK,sBAAsB,uBAAuB,qBAAqB,KAAK;;AAEp1E;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD,IAAI;AACJ;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;;AAElE;AACA","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e8f8d51dcfb1fb6e5682","/**\n * @abstract\n * @class Module\n * @classdesc All modules inherits from this class.\n *\n * @typedef {Module} Module\n * @property {Object} config - Editor user settings\n * @property {Object} Editor - List of Editor modules\n */\nexport default class Module {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({ config } = {}) {\n\n if (new.target === Module) {\n\n throw new TypeError('Constructors for abstract class Module are not allowed.');\n\n }\n\n /**\n * @type {EditorConfig}\n */\n this.config = config;\n\n /**\n * @type {EditorComponents}\n */\n this.Editor = null;\n\n }\n\n /**\n * Editor modules setter\n *\n * @param Editor\n * @param Editor.modules {@link CodexEditor#moduleInstances}\n * @param Editor.config {@link CodexEditor#configuration}\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/__module.js","/**\n * Codex Editor Util\n */\nexport default class Util {\n\n /**\n * Custom logger\n *\n * @param {string} msg - message\n * @param {string} type - logging type 'log'|'warn'|'error'|'info'\n * @param {*} args - argument to log with a message\n */\n static log(msg, type, args) {\n\n type = type || 'log';\n\n if (!args) {\n\n args = msg || 'undefined';\n msg = '[codex-editor]: %o';\n\n } else {\n\n msg = '[codex-editor]: ' + msg;\n\n }\n\n try{\n\n if ( 'console' in window && window.console[ type ] ) {\n\n if ( args ) window.console[ type ]( msg, args );\n else window.console[ type ]( msg );\n\n }\n\n } catch(e) {\n // do nothing\n }\n\n }\n\n /**\n * Returns basic keycodes as constants\n * @return {{}}\n */\n static get keyCodes() {\n\n return {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n SHIFT: 16,\n CTRL: 17,\n ALT: 18,\n ESC: 27,\n SPACE: 32,\n LEFT: 37,\n UP: 38,\n DOWN: 40,\n RIGHT: 39,\n DELETE: 46,\n META: 91\n };\n\n }\n\n /**\n * @typedef {Object} ChainData\n * @property {Object} data - data that will be passed to the success or fallback\n * @property {Function} function - function's that must be called asynchronically\n */\n\n /**\n * Fires a promise sequence asyncronically\n *\n * @param {Object[]} chains - list or ChainData's\n * @param {Function} success - success callback\n * @param {Function} fallback - callback that fires in case of errors\n *\n * @return {Promise}\n */\n static sequence(chains, success = () => {}, fallback = () => {}) {\n\n return new Promise(function (resolve) {\n\n /**\n * pluck each element from queue\n * First, send resolved Promise as previous value\n * Each plugins \"prepare\" method returns a Promise, that's why\n * reduce current element will not be able to continue while can't get\n * a resolved Promise\n */\n chains.reduce(function (previousValue, currentValue, iteration) {\n\n return previousValue\n .then(() => waitNextBlock(currentValue, success, fallback))\n .then(() => {\n\n // finished\n if (iteration === chains.length - 1) {\n\n resolve();\n\n }\n\n });\n\n }, Promise.resolve());\n\n });\n\n /**\n * Decorator\n *\n * @param {ChainData} chainData\n *\n * @param {Function} successCallback\n * @param {Function} fallbackCallback\n *\n * @return {Promise}\n */\n function waitNextBlock(chainData, successCallback, fallbackCallback) {\n\n return new Promise(function (resolve) {\n\n chainData.function()\n .then(() => {\n\n successCallback(chainData.data || {});\n\n })\n .then(resolve)\n .catch(function () {\n\n fallbackCallback(chainData.data || {});\n\n // anyway, go ahead even it falls\n resolve();\n\n });\n\n });\n\n }\n\n }\n\n /**\n * Make array from array-like collection\n *\n * @param {*} collection\n *\n * @return {Array}\n */\n static array(collection) {\n\n return Array.prototype.slice.call(collection);\n\n }\n\n /**\n * Checks if object is empty\n *\n * @param {Object} object\n * @return {boolean}\n */\n static isEmpty(object) {\n\n return Object.keys(object).length === 0 && object.constructor === Object;\n\n }\n\n /**\n * Check if passed object is a Promise\n * @param {*} object - object to check\n * @return {Boolean}\n */\n static isPromise(object) {\n\n return Promise.resolve(object) === object;\n\n }\n\n /**\n * Check if passed element is contenteditable\n * @param element\n * @return {boolean}\n */\n static isContentEditable(element) {\n\n return element.contentEditable === 'true';\n\n }\n\n /**\n * Delays method execution\n *\n * @param method\n * @param timeout\n */\n static delay(method, timeout) {\n\n return function () {\n\n let context = this,\n args = arguments;\n\n window.setTimeout(() => method.apply(context, args), timeout);\n\n };\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/utils.js","/**\n * DOM manipulations helper\n */\nexport default class Dom {\n\n /**\n * Helper for making Elements with classname and attributes\n *\n * @param {string} tagName - new Element tag name\n * @param {array|string} classNames - list or name of CSS classname(s)\n * @param {Object} attributes - any attributes\n * @return {Element}\n */\n static make(tagName, classNames = null, attributes = {}) {\n\n let el = document.createElement(tagName);\n\n if ( Array.isArray(classNames) ) {\n\n el.classList.add(...classNames);\n\n } else if( classNames ) {\n\n el.classList.add(classNames);\n\n }\n\n for (let attrName in attributes) {\n\n el[attrName] = attributes[attrName];\n\n }\n\n return el;\n\n }\n\n /**\n * Creates Text Node with the passed content\n * @param {String} content - text content\n * @return {Text}\n */\n static text(content) {\n\n return document.createTextNode(content);\n\n }\n\n /**\n * Append one or several elements to the parent\n *\n * @param {Element} parent - where to append\n * @param {Element|Element[]} - element ore elements list\n */\n static append(parent, elements) {\n\n if ( Array.isArray(elements) ) {\n\n elements.forEach( el => parent.appendChild(el) );\n\n } else {\n\n parent.appendChild(elements);\n\n }\n\n }\n\n /**\n * Selector Decorator\n *\n * Returns first match\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n *\n * @returns {Element}\n */\n static find(el = document, selector) {\n\n return el.querySelector(selector);\n\n }\n\n /**\n * Selector Decorator.\n *\n * Returns all matches\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n * @returns {NodeList}\n */\n static findAll(el = document, selector) {\n\n return el.querySelectorAll(selector);\n\n }\n\n /**\n * Search for deepest node which is Leaf.\n * Leaf is the vertex that doesn't have any child nodes\n *\n * @description Method recursively goes throw the all Node until it finds the Leaf\n *\n * @param {Element} node - root Node. From this vertex we start Deep-first search {@link https://en.wikipedia.org/wiki/Depth-first_search}\n * @param {Boolean} atLast - find last text node\n * @return {Node} - it can be text Node or Element Node, so that caret will able to work with it\n */\n static getDeepestNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return an empty text node\n * But caret will not be placed in empty textNode, so we need textNode with zero-width char\n */\n if (this.isElement(node) && !this.isNativeInput(node)) {\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\n return node;\n\n }\n\n let childsLength = node.childNodes.length,\n last = childsLength - 1;\n\n if (atLast) {\n\n return this.getDeepestNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestNode(node.childNodes[0], false);\n\n }\n\n }\n\n /**\n * Check if object is DOM node\n *\n * @param {Object} node\n * @returns {boolean}\n */\n static isElement(node) {\n\n return node && typeof node === 'object' && node.nodeType && node.nodeType === Node.ELEMENT_NODE;\n\n }\n\n /**\n * Checks target if it is native input\n * @param {Element|String} target - HTML element or string\n * @return {Boolean}\n */\n static isNativeInput(target) {\n\n let nativeInputs = [\n 'INPUT',\n 'TEXTAREA'\n ];\n\n return target ? nativeInputs.includes(target.tagName) : false;\n\n }\n\n /**\n * Checks node if it is empty\n *\n * @description Method checks simple Node without any childs for emptiness\n * If you have Node with 2 or more children id depth, you better use {@link Dom#isEmpty} method\n *\n * @param {Node} node\n * @return {Boolean} true if it is empty\n */\n static isNodeEmpty(node) {\n\n let nodeText;\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n nodeText = node.value;\n\n } else {\n\n nodeText = node.textContent.replace('\\u200B', '');\n\n }\n\n return nodeText.trim().length === 0;\n\n }\n\n /**\n * checks node if it is doesn't have any child nodes\n * @param {Node} node\n * @return {boolean}\n */\n static isLeaf(node) {\n\n if (!node) {\n\n return false;\n\n }\n\n return node.childNodes.length === 0;\n\n }\n\n /**\n * breadth-first search (BFS)\n * {@link https://en.wikipedia.org/wiki/Breadth-first_search}\n *\n * @description Pushes to stack all DOM leafs and checks for emptiness\n *\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n leafs = [];\n\n if (!node) {\n\n return false;\n\n }\n\n treeWalker.push(node);\n\n while ( treeWalker.length > 0 ) {\n\n if ( this.isLeaf(node) ) {\n\n leafs.push(node);\n\n }\n\n while ( node && node.nextSibling ) {\n\n node = node.nextSibling;\n\n if (!node) continue;\n\n treeWalker.push(node);\n\n }\n\n node = treeWalker.shift();\n\n if (!node) continue;\n\n node = node.firstChild;\n treeWalker.push(node);\n\n }\n\n return leafs.every( leaf => this.isNodeEmpty(leaf)) ;\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.js","/**\n * Working with selection\n */\nexport default class Selection {\n\n /**\n * @constructor\n */\n constructor() {\n\n this.instance = null;\n this.selection = null;\n\n }\n\n /**\n * Returns window Selection\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Window/getSelection}\n * @return {Selection}\n */\n static get() {\n\n return window.getSelection();\n\n }\n\n /**\n * Returns selected anchor\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorNode}\n * @return {Node}\n */\n static getAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n /**\n * Returns selection offset according to the anchor node\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorOffset}\n * @return {Number}\n */\n static getAnchorOffset() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorOffset;\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/Selection.js","/**\n * Codex Editor\n *\n * Short Description (눈_눈;)\n * @version 2.0.0\n *\n * How to start?\n * Example:\n * new CodexEditor({\n * holderId : 'codex-editor',\n * initialBlock : 'text',\n * placeholder : 'Write your story....',\n * tools: {\n * quote: Quote,\n * anotherTool : AnotherTool\n * },\n * toolsConfig: {\n * quote: {\n * iconClassname : 'quote-icon',\n * displayInToolbox : true,\n * enableLineBreaks : true\n * },\n * anotherTool: {\n * iconClassname : 'tool-icon'\n * }\n * }\n * });\n *\n * - tools is an object: {\n * pluginName: PluginClass,\n * .....\n * }\n * - toolsConfig is an additional configuration that uses Codex Editor API\n * iconClassname - CSS classname of toolbox icon\n * displayInToolbox - if you want to see your Tool in toolbox hided in \"plus\" button, than set \"True\". By default : \"False\"\n * enableLineBreaks - by default enter creates new block that set as initialblock, but if you set this property \"True\", enter will break the lines in current block\n *\n * @author CodeX-Team \n *\n */\n\n/**\n * @typedef {CodexEditor} CodexEditor - editor class\n */\n\n/**\n * @typedef {Object} EditorConfig\n * @property {String} holderId - Element to append Editor\n * @property {Array} data - Blocks list in JSON-format\n * @property {Object} tools - Map for used Tools in format { name : Class, ... }\n * @property {String} initialBlock - This Tool will be added by default\n * @property {String} placeholder - First Block placeholder\n * @property {Object} sanitizer - @todo fill desc\n * @property {Boolean} hideToolbar - @todo fill desc\n * @property {Object} toolsConfig - tools configuration {@link Tools#ToolsConfig}\n */\n\n/**\n * Dynamically imported utils\n *\n * @typedef {Dom} $ - {@link components/dom.js}\n * @typedef {Util} _ - {@link components/utils.js}\n */\n\n'use strict';\n\n/**\n * Apply polyfills\n */\nimport 'components/polyfills';\n\n/**\n * Require Editor modules places in components/modules dir\n */\n// eslint-disable-next-line\nlet modules = editorModules.map( module => require('./components/modules/' + module ));\n\n/**\n * @class\n *\n * @classdesc CodeX Editor base class\n *\n * @property this.config - all settings\n * @property this.moduleInstances - constructed editor components\n *\n * @type {CodexEditor}\n */\nmodule.exports = class CodexEditor {\n\n /** Editor version */\n static get version() {\n\n return VERSION;\n\n }\n\n /**\n * @param {EditorConfig} config - user configuration\n *\n */\n constructor(config) {\n\n /**\n * Configuration object\n * @type {EditorConfig}\n */\n this.config = {};\n\n /**\n * @typedef {Object} EditorComponents\n * @property {BlockManager} BlockManager\n * @property {Tools} Tools\n * @property {Events} Events\n * @property {UI} UI\n * @property {Toolbar} Toolbar\n * @property {Toolbox} Toolbox\n * @property {Renderer} Renderer\n */\n this.moduleInstances = {};\n\n Promise.resolve()\n .then(() => {\n\n this.configuration = config;\n\n })\n .then(() => this.init())\n .then(() => this.start())\n .then(() => {\n\n console.log('CodeX Editor is ready!');\n\n })\n .catch(error => {\n\n console.log('CodeX Editor does not ready because of %o', error);\n\n });\n\n }\n\n /**\n * Setting for configuration\n * @param {EditorConfig} config\n */\n set configuration(config) {\n\n /**\n * Initlai block type\n * Uses in case when there is no items passed\n * @type {{type: (*), data: {text: null}}}\n */\n let initialBlock = {\n type : config.initialBlock,\n data : {}\n };\n\n this.config.holderId = config.holderId;\n this.config.placeholder = config.placeholder || 'write your story...';\n this.config.sanitizer = config.sanitizer || {\n p: true,\n b: true,\n a: true\n };\n\n this.config.hideToolbar = config.hideToolbar ? config.hideToolbar : false;\n this.config.tools = config.tools || {};\n this.config.toolsConfig = config.toolsConfig || {};\n this.config.data = config.data || {};\n\n /**\n * Initialize items to pass data to the Renderer\n */\n if (_.isEmpty(this.config.data)) {\n\n this.config.data = {};\n this.config.data.items = [ initialBlock ];\n\n } else {\n\n if (!this.config.data.items || this.config.data.items.length === 0) {\n\n this.config.data.items = [ initialBlock ];\n\n }\n\n }\n\n /**\n * If initial Block's Tool was not passed, use the first Tool in config.tools\n */\n if (!config.initialBlock) {\n\n for (this.config.initialBlock in this.config.tools) break;\n\n } else {\n\n this.config.initialBlock = config.initialBlock;\n\n }\n\n }\n\n /**\n * Returns private property\n * @returns {EditorConfig}\n */\n get configuration() {\n\n return this.config;\n\n }\n\n /**\n * Initializes modules:\n * - make and save instances\n * - configure\n */\n init() {\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n this.constructModules();\n\n /**\n * Modules configuration\n */\n this.configureModules();\n\n }\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n constructModules() {\n\n modules.forEach( Module => {\n\n try {\n\n /**\n * We use class name provided by displayName property\n *\n * On build, Babel will transform all Classes to the Functions so, name will always be 'Function'\n * To prevent this, we use 'babel-plugin-class-display-name' plugin\n * @see https://www.npmjs.com/package/babel-plugin-class-display-name\n */\n this.moduleInstances[Module.displayName] = new Module({\n config : this.configuration\n });\n\n } catch ( e ) {\n\n console.log('Module %o skipped because %o', Module, e);\n\n }\n\n });\n\n }\n\n /**\n * Modules instances configuration:\n * - pass other modules to the 'state' property\n * - ...\n */\n configureModules() {\n\n for(let name in this.moduleInstances) {\n\n /**\n * Module does not need self-instance\n */\n this.moduleInstances[name].state = this.getModulesDiff( name );\n\n }\n\n }\n\n /**\n * Return modules without passed name\n */\n getModulesDiff( name ) {\n\n let diff = {};\n\n for(let moduleName in this.moduleInstances) {\n\n /**\n * Skip module with passed name\n */\n if (moduleName === name) {\n\n continue;\n\n }\n diff[moduleName] = this.moduleInstances[moduleName];\n\n }\n\n return diff;\n\n }\n\n /**\n * Start Editor!\n *\n * Get list of modules that needs to be prepared and return a sequence (Promise)\n * @return {Promise}\n */\n start() {\n\n let prepareDecorator = module => module.prepare();\n\n return Promise.resolve()\n .then(prepareDecorator(this.moduleInstances.Tools))\n .then(prepareDecorator(this.moduleInstances.UI))\n .then(prepareDecorator(this.moduleInstances.BlockManager))\n .then(() => {\n\n return this.moduleInstances.Renderer.render(this.config.data.items);\n\n\n });\n\n }\n\n};\n\n// module.exports = (function (editor) {\n//\n// 'use strict';\n//\n// editor.version = VERSION;\n// editor.scriptPrefix = 'cdx-script-';\n//\n// var init = function () {\n//\n// editor.core = require('./modules/core');\n// editor.tools = require('./modules/tools');\n// editor.ui = require('./modules/ui');\n// editor.transport = require('./modules/transport');\n// editor.renderer = require('./modules/renderer');\n// editor.saver = require('./modules/saver');\n// editor.content = require('./modules/content');\n// editor.toolbar = require('./modules/toolbar/toolbar');\n// editor.callback = require('./modules/callbacks');\n// editor.draw = require('./modules/draw');\n// editor.caret = require('./modules/caret');\n// editor.notifications = require('./modules/notifications');\n// editor.parser = require('./modules/parser');\n// editor.sanitizer = require('./modules/sanitizer');\n// editor.listeners = require('./modules/listeners');\n// editor.destroyer = require('./modules/destroyer');\n// editor.paste = require('./modules/paste');\n//\n// };\n//\n// /**\n// * @public\n// * holds initial settings\n// */\n// editor.settings = {\n// tools : ['text', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n// holderId : 'codex-editor',\n//\n// // Type of block showing on empty editor\n// initialBlockPlugin: 'text'\n// };\n//\n// /**\n// * public\n// *\n// * Static nodes\n// */\n// editor.nodes = {\n// holder : null,\n// wrapper : null,\n// toolbar : null,\n// inlineToolbar : {\n// wrapper : null,\n// buttons : null,\n// actions : null\n// },\n// toolbox : null,\n// notifications : null,\n// plusButton : null,\n// showSettingsButton: null,\n// showTrashButton : null,\n// blockSettings : null,\n// pluginSettings : null,\n// defaultSettings : null,\n// toolbarButtons : {}, // { type : DomEl, ... }\n// redactor : null\n// };\n//\n// /**\n// * @public\n// *\n// * Output state\n// */\n// editor.state = {\n// jsonOutput : [],\n// blocks : [],\n// inputs : []\n// };\n//\n// /**\n// * @public\n// * Editor plugins\n// */\n// editor.tools = {};\n//\n// editor.start = function (userSettings) {\n//\n// init();\n//\n// editor.core.prepare(userSettings)\n//\n// // If all ok, make UI, bind events and parse initial-content\n// .then(editor.ui.prepare)\n// .then(editor.tools.prepare)\n// .then(editor.sanitizer.prepare)\n// .then(editor.paste.prepare)\n// .then(editor.transport.prepare)\n// .then(editor.renderer.makeBlocksFromData)\n// .then(editor.ui.saveInputs)\n// .catch(function (error) {\n//\n// editor.core.log('Initialization failed with error: %o', 'warn', error);\n//\n// });\n//\n// };\n//\n// return editor;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/codex.js","/**\n * Element.closest()\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\n */\nif (!Element.prototype.matches)\n Element.prototype.matches = Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n\nif (!Element.prototype.closest)\n Element.prototype.closest = function (s) {\n\n var el = this;\n\n if (!document.documentElement.contains(el)) return null;\n do {\n\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n\n } while (el !== null);\n return null;\n\n };\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/polyfills.js","var map = {\n\t\"./blockManager.js\": 7,\n\t\"./caret.js\": 9,\n\t\"./events.js\": 10,\n\t\"./renderer.js\": 11,\n\t\"./sanitizer.js\": 12,\n\t\"./saver.js\": 14,\n\t\"./toolbar.js\": 15,\n\t\"./toolbox.js\": 16,\n\t\"./tools.js\": 17,\n\t\"./ui.js\": 18\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 6;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/modules nonrecursive [^_](blockManager.js|caret.js|events.js|renderer.js|sanitizer.js|saver.js|toolbar.js|toolbox.js|tools.js|ui.js)$\n// module id = 6\n// module chunks = 0","/**\n * @class BlockManager\n * @classdesc Manage editor`s blocks storage and appearance\n *\n * @module BlockManager\n *\n * @version 2.0.0\n */\n\nimport Block from '../block';\nimport Selection from '../Selection';\n\n/**\n * @typedef {BlockManager} BlockManager\n * @property {Number} currentBlockIndex - Index of current working block\n * @property {Proxy} _blocks - Proxy for Blocks instance {@link Blocks}\n */\nexport default class BlockManager extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n /**\n * Proxy for Blocks instance {@link Blocks}\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = null;\n\n /**\n * Index of current working block\n *\n * @type {number}\n * @private\n */\n this.currentBlockIndex = -1;\n\n }\n\n /**\n * Should be called after Editor.UI preparation\n * Define this._blocks property\n *\n * @returns {Promise}\n */\n prepare() {\n\n return new Promise(resolve => {\n\n let blocks = new Blocks(this.Editor.UI.nodes.redactor);\n\n /**\n * We need to use Proxy to overload set/get [] operator.\n * So we can use array-like syntax to access blocks\n *\n * @example\n * this._blocks[0] = new Block(...);\n *\n * block = this._blocks[0];\n *\n * @todo proxy the enumerate method\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = new Proxy(blocks, {\n set: Blocks.set,\n get: Blocks.get\n });\n\n resolve();\n\n });\n\n }\n\n /**\n * Creates Block instance by tool name\n *\n * @param {String} toolName - tools passed in editor config {@link EditorConfig#tools}\n * @param {Object} data - constructor params\n *\n * @return {Block}\n */\n composeBlock(toolName, data) {\n\n let toolInstance = this.Editor.Tools.construct(toolName, data),\n block = new Block(toolName, toolInstance);\n\n this.bindEvents(block);\n\n /**\n * Apply callback before inserting html\n */\n block.call('appendCallback', {});\n\n return block;\n\n }\n\n /**\n * Bind Events\n * @param {Object} block\n */\n bindEvents(block) {\n\n /**\n * keydown on block\n * @todo move to the keydown module\n */\n block.pluginsContent.addEventListener('keydown', (event) => this.keyDownOnBlock(event), false);\n\n }\n\n /**\n * @todo move to the keydown module\n * @param {MouseEvent} event\n */\n keyDownOnBlock(event) {\n\n switch(event.keyCode) {\n\n case _.keyCodes.ENTER:\n this.enterPressedOnPluginsContent(event);\n break;\n case _.keyCodes.DOWN:\n case _.keyCodes.RIGHT:\n this.navigateNext();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.navigatePrevious();\n break;\n\n }\n\n }\n\n /**\n * Set's caret to the next Block\n * Before moving caret, we should check if caret position is at the end of Plugins node\n * Using {@link Dom#getDeepestNode} to get a last node and match with current selection\n */\n navigateNext() {\n\n let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getAnchorOffset() === textNodeLength) {\n\n let nextBlock = this.nextBlock;\n\n if (!nextBlock) return;\n\n this.Editor.Caret.setToBlock( nextBlock );\n\n }\n\n }\n\n /**\n * Set's caret to the previous Block\n * Before moving caret, we should check if caret position is at the end of Plugins node\n * Using {@link Dom#getDeepestNode} to get a last node and match with current selection\n */\n navigatePrevious() {\n\n let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n if (Selection.getAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getAnchorOffset() === 0) {\n\n let previousBlock = this.previousBlock;\n\n if (!previousBlock) return;\n\n this.Editor.Caret.setToBlock( previousBlock, textNodeLength, true );\n\n }\n\n }\n\n /**\n * Insert new block into _blocks\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n insert(toolName, data = {}) {\n\n\n let block = this.composeBlock(toolName, data);\n\n this._blocks[++this.currentBlockIndex] = block;\n this.Editor.Caret.setToBlock(block);\n\n }\n\n /**\n * Replace current working block\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n replace(toolName, data = {}) {\n\n let block = this.composeBlock(toolName, data);\n\n this._blocks.insert(this.currentBlockIndex, block, true);\n\n }\n\n /**\n * returns last Block\n * @return {Block}\n */\n get lastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n * Returns Block by passed index\n * @param {Number} index\n * @return {Block}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Get Block instance by html element\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`),\n index = nodes.indexOf(firstLevelBlock);\n\n if (index >= 0) {\n\n return this._blocks[index];\n\n }\n\n }\n\n /**\n * Get current Block instance\n *\n * @return {Block}\n */\n get currentBlock() {\n\n return this._blocks[this.currentBlockIndex];\n\n }\n\n /**\n * Returns next Block instance\n * @return {Block|null}\n */\n get nextBlock() {\n\n let isLastBlock = this.currentBlockIndex === (this._blocks.length - 1);\n\n if (isLastBlock) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex + 1];\n\n }\n\n /**\n * Returns previous Block instance\n * @return {Block|null}\n */\n get previousBlock() {\n\n let isFirstBlock = this.currentBlockIndex === 0;\n\n if (isFirstBlock) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex - 1];\n\n }\n\n /**\n * Get working html element\n *\n * @return {HTMLElement}\n */\n get currentNode() {\n\n return this._blocks.nodes[this.currentBlockIndex];\n\n }\n\n /**\n * Set currentBlockIndex to passed block\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes,\n firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`);\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(firstLevelBlock);\n\n /**\n * Remove previous selected Block's state\n */\n this._blocks.array.forEach( block => block.selected = false);\n\n /**\n * Mark current Block as selected\n * @type {boolean}\n */\n this.currentBlock.selected = true;\n\n }\n\n /**\n * Get array of Block instances\n *\n * @returns {Block[]} {@link Blocks#array}\n */\n get blocks() {\n\n return this._blocks.array;\n\n }\n\n /**\n * 1) Find first-level Block from passed child Node\n * 2) Mark it as current\n *\n * @param {Element|Text} childNode - look ahead from this node.\n * @throws Error - when passed Node is not included at the Block\n */\n setCurrentBlockByChildNode(childNode) {\n\n /**\n * If node is Text TextNode\n */\n if (!$.isElement(childNode)) {\n\n childNode = childNode.parentNode;\n\n }\n\n let parentFirstLevelBlock = childNode.closest(`.${Block.CSS.wrapper}`);\n\n if (parentFirstLevelBlock) {\n\n this.currentNode = parentFirstLevelBlock;\n\n } else {\n\n throw new Error('Can not find a Block from this child Node');\n\n }\n\n }\n\n}\n\n/**\n * @class Blocks\n * @classdesc Class to work with Block instances array\n *\n * @private\n *\n * @property {HTMLElement} workingArea — editor`s working node\n *\n */\nclass Blocks {\n\n /**\n * @constructor\n *\n * @param {HTMLElement} workingArea — editor`s working node\n */\n constructor(workingArea) {\n\n this.blocks = [];\n this.workingArea = workingArea;\n\n }\n\n /**\n * Push back new Block\n *\n * @param {Block} block\n */\n push(block) {\n\n this.blocks.push(block);\n this.workingArea.appendChild(block.html);\n\n }\n\n /**\n * Insert new Block at passed index\n *\n * @param {Number} index — index to insert Block\n * @param {Block} block — Block to insert\n * @param {Boolean} replace — it true, replace block on given index\n */\n insert(index, block, replace = false) {\n\n if (!this.length) {\n\n this.push(block);\n return;\n\n }\n\n if (index > this.length) {\n\n index = this.length;\n\n }\n\n if (replace) {\n\n this.blocks[index].html.remove();\n\n }\n\n let deleteCount = replace ? 1 : 0;\n\n this.blocks.splice(index, deleteCount, block);\n\n if (index > 0) {\n\n let previousBlock = this.blocks[index - 1];\n\n previousBlock.html.insertAdjacentElement('afterend', block.html);\n\n } else {\n\n let nextBlock = this.blocks[index + 1];\n\n if (nextBlock) {\n\n nextBlock.html.insertAdjacentElement('beforebegin', block.html);\n\n } else {\n\n this.workingArea.appendChild(block.html);\n\n }\n\n }\n\n }\n\n /**\n * Insert Block after passed target\n *\n * @todo decide if this method is necessary\n *\n * @param {Block} targetBlock — target after wich Block should be inserted\n * @param {Block} newBlock — Block to insert\n */\n insertAfter(targetBlock, newBlock) {\n\n let index = this.blocks.indexOf(targetBlock);\n\n this.insert(index + 1, newBlock);\n\n }\n\n /**\n * Get Block by index\n *\n * @param {Number} index — Block index\n * @returns {Block}\n */\n get(index) {\n\n return this.blocks[index];\n\n }\n\n /**\n * Return index of passed Block\n *\n * @param {Block} block\n * @returns {Number}\n */\n indexOf(block) {\n\n return this.blocks.indexOf(block);\n\n }\n\n /**\n * Get length of Block instances array\n *\n * @returns {Number}\n */\n get length() {\n\n return this.blocks.length;\n\n }\n\n /**\n * Get Block instances array\n *\n * @returns {Block[]}\n */\n get array() {\n\n return this.blocks;\n\n }\n\n /**\n * Get blocks html elements array\n *\n * @returns {HTMLElement[]}\n */\n get nodes() {\n\n return _.array(this.workingArea.children);\n\n }\n\n /**\n * Proxy trap to implement array-like setter\n *\n * @example\n * blocks[0] = new Block(...)\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — block index\n * @param {Block} block — Block to set\n * @returns {Boolean}\n */\n static set(instance, index, block) {\n\n if (isNaN(Number(index))) {\n\n return false;\n\n }\n\n instance.insert(index, block);\n\n return true;\n\n }\n\n /**\n * Proxy trap to implement array-like getter\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — Block index\n * @returns {Block|*}\n */\n static get(instance, index) {\n\n if (isNaN(Number(index))) {\n\n return instance[index];\n\n }\n\n return instance.get(index);\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/blockManager.js","/**\n *\n * @class Block\n * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool\n *\n * @property {Tool} tool — current block tool (Paragraph, for example)\n * @property {Object} CSS — block`s css classes\n *\n */\n\n/**\n * @classdesc Abstract Block class that contains Block information, Tool name and Tool class instance\n *\n * @property tool - Tool instance\n * @property html - Returns HTML content of plugin\n * @property wrapper - Div element that wraps block content with Tool's content. Has `ce-block` CSS class\n * @property contentNode - Div element that wraps Tool's content. Has `ce-block__content` CSS class\n * @property pluginsContent - HTML content that returns by Tool's render function\n */\nexport default class Block {\n\n /**\n * @constructor\n * @param {String} toolName - Tool name that passed on initialization\n * @param {Object} toolInstance — passed Tool`s instance that rendered the Block\n */\n constructor(toolName, toolInstance) {\n\n this.name = toolName;\n this.tool = toolInstance;\n this._html = this.compose();\n\n }\n\n /**\n * CSS classes for the Block\n * @return {{wrapper: string, content: string}}\n */\n static get CSS() {\n\n return {\n wrapper: 'ce-block',\n content: 'ce-block__content',\n selected: 'ce-block--selected'\n };\n\n }\n\n /**\n * Make default Block wrappers and put Tool`s content there\n * @returns {HTMLDivElement}\n */\n compose() {\n\n this.wrapper = $.make('div', Block.CSS.wrapper);\n this.contentNode = $.make('div', Block.CSS.content);\n this.pluginsContent = this.tool.render();\n\n this.contentNode.appendChild(this.pluginsContent);\n this.wrapper.appendChild(this.contentNode);\n\n return this.wrapper;\n\n }\n\n /**\n * Calls Tool's method\n *\n * Method checks tool property {MethodName}. Fires method with passes params If it is instance of Function\n *\n * @param {String} methodName\n * @param {Object} params\n */\n call(methodName, params) {\n\n /**\n * call Tool's method with the instance context\n */\n if (this.tool[methodName] && this.tool[methodName] instanceof Function) {\n\n this.tool[methodName].call(this.tool, params);\n\n }\n\n }\n\n /**\n * Get Block`s HTML\n * @returns {HTMLElement}\n */\n get html() {\n\n return this._html;\n\n }\n\n /**\n * Get Block's JSON data\n * @return {Object}\n */\n get data() {\n\n return this.save();\n\n }\n\n /**\n * Extracts data from Block\n * Groups Tool's save processing time\n * @return {Object}\n */\n save() {\n\n let extractedBlock = this.tool.save(this.pluginsContent);\n\n /** Measuring execution time*/\n let measuringStart = window.performance.now(),\n measuringEnd;\n\n return Promise.resolve(extractedBlock)\n .then((finishedExtraction) => {\n\n /** measure promise execution */\n measuringEnd = window.performance.now();\n\n return {\n tool: this.name,\n data: finishedExtraction,\n time : measuringEnd - measuringStart\n };\n\n })\n .catch(function (error) {\n\n _.log(`Saving proccess for ${this.tool.name} tool failed due to the ${error}`, 'log', 'red');\n\n });\n\n }\n\n /**\n * Uses Tool's validation method to check the correctness of output data\n * Tool's validation method is optional\n *\n * @description Method also can return data if it passed the validation\n *\n * @param {Object} data\n * @returns {Boolean|Object} valid\n */\n validateData(data) {\n\n let isValid = true;\n\n if (this.tool.validate instanceof Function) {\n\n isValid = this.tool.validate(data);\n\n }\n\n if (!isValid) {\n\n return false;\n\n }\n\n return data;\n\n }\n\n /**\n * Check block for emptiness\n * @return {Boolean}\n */\n get isEmpty() {\n\n /**\n * Allow Tool to represent decorative contentless blocks: for example \"* * *\"-tool\n * That Tools are not empty\n */\n if (this.tool.contentless) {\n\n return false;\n\n }\n\n let emptyText = $.isEmpty(this.pluginsContent),\n emptyMedia = !this.hasMedia;\n\n return emptyText && emptyMedia;\n\n }\n\n /**\n * Check if block has a media content such as images, iframes and other\n * @return {Boolean}\n */\n get hasMedia() {\n\n /**\n * This tags represents media-content\n * @type {string[]}\n */\n const mediaTags = [\n 'img',\n 'iframe',\n 'video',\n 'audio',\n 'source',\n 'input',\n 'textarea',\n 'twitterwidget'\n ];\n\n return !!this._html.querySelector(mediaTags.join(','));\n\n }\n\n /**\n * Set selected state\n * @param {Boolean} state - 'true' to select, 'false' to remove selection\n */\n set selected(state) {\n\n /**\n * We don't need to mark Block as Selected when it is not empty\n */\n if (state === true && !this.isEmpty) {\n\n this._html.classList.add(Block.CSS.selected);\n\n } else {\n\n this._html.classList.remove(Block.CSS.selected);\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/block.js","/**\n * @class Caret\n * @classdesc Contains methods for working Caret\n *\n * Uses Range methods to manipulate with caret\n *\n * @module Caret\n *\n * @version 2.0.0\n */\n\n/**\n * @typedef {Caret} Caret\n */\nimport Selection from '../Selection';\n\nexport default class Caret extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * Method gets Block instance and puts caret to the text node with offset\n * There two ways that method applies caret position:\n * - first found text node: sets at the beginning, but you can pass an offset\n * - last found text node: sets at the end of the node. Also, you can customize the behaviour\n *\n * @param {Block} block - Block class\n * @param {Number} offset - caret offset regarding to the text node\n * @param {Boolean} atEnd - put caret at the end of the text node or not\n */\n setToBlock(block, offset = 0, atEnd = false) {\n\n let element = block.pluginsContent;\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestNode(element, atEnd);\n\n if (atEnd || offset > nodeToSet.length) {\n\n offset = nodeToSet.length;\n\n }\n\n /** if found deepest node is native input */\n if ($.isNativeInput(nodeToSet)) {\n\n nodeToSet.focus();\n return;\n\n }\n\n /**\n * @todo try to fix via Promises or use querySelectorAll to not to use timeout\n */\n _.delay( () => this.set(nodeToSet, offset), 20)();\n\n this.Editor.BlockManager.currentNode = block.wrapper;\n\n }\n\n /**\n * Creates Document Range and sets caret to the element with offset\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n */\n set( element, offset = 0) {\n\n let range = document.createRange(),\n selection = Selection.get();\n\n range.setStart(element, offset);\n range.setEnd(element, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n };\n\n /**\n * Set Caret to the last Block\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let lastBlock = this.Editor.BlockManager.lastBlock;\n\n if (!lastBlock) return;\n\n /**\n * If last block is empty and it is an initialBlock, set to that.\n * Otherwise, append new empty block and set to that\n */\n if (lastBlock.isEmpty) {\n\n this.setToBlock(lastBlock);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/caret.js","/**\n * @module eventDispatcher\n *\n * Has two important methods:\n * - {Function} on - appends subscriber to the event. If event doesn't exist - creates new one\n * - {Function} emit - fires all subscribers with data\n *\n * @version 1.0.0\n *\n * @typedef {Events} Events\n * @property {Object} subscribers - all subscribers grouped by event name\n */\nexport default class Events extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n this.subscribers = {};\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Function} callback - subscriber\n */\n on(eventName, callback) {\n\n if (!(eventName in this.subscribers)) {\n\n this.subscribers[eventName] = [];\n\n }\n\n // group by events\n this.subscribers[eventName].push(callback);\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Object} data - subscribers get this data when they were fired\n */\n emit(eventName, data) {\n\n this.subscribers[eventName].reduce(function (previousData, currentHandler) {\n\n let newData = currentHandler(previousData);\n\n return newData ? newData : previousData;\n\n }, data);\n\n }\n\n /**\n * Destroyer\n * clears subsribers list\n */\n destroy() {\n\n this.subscribers = null;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/events.js","/**\n * Codex Editor Renderer Module\n *\n * @module Renderer\n * @author CodeX Team\n *\n * @version 2.0.0\n */\nexport default class Renderer extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * @typedef {Object} RendererItems\n * @property {String} type - tool name\n * @property {Object} data - tool data\n */\n\n /**\n * @example\n *\n * items: [\n * {\n * type : 'paragraph',\n * data : {\n * text : 'Hello from Codex!'\n * }\n * },\n * {\n * type : 'paragraph',\n * data : {\n * text : 'Leave feedback if you like it!'\n * }\n * },\n * ]\n *\n */\n\n /**\n * Make plugin blocks from array of plugin`s data\n * @param {RendererItems[]} items\n */\n render(items) {\n\n let chainData = [];\n\n for (let i = 0; i < items.length; i++) {\n\n chainData.push({\n function: () => this.insertBlock(items[i])\n });\n\n }\n\n return _.sequence(chainData);\n\n }\n\n /**\n * Get plugin instance\n * Add plugin instance to BlockManager\n * Insert block to working zone\n *\n * @param {Object} item\n * @returns {Promise.}\n * @private\n */\n insertBlock(item) {\n\n let tool = item.type,\n data = item.data;\n\n this.Editor.BlockManager.insert(tool, data);\n\n return Promise.resolve();\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/renderer.js","/**\n * CodeX Sanitizer\n *\n * @module Sanitizer\n * Clears HTML from taint tags\n *\n * @version 2.0.0\n *\n * @example\n * Module can be used within two ways:\n * 1) When you have an instance\n * - this.Editor.Sanitizer.clean(yourTaintString);\n * 2) As static method\n * - CodexEditor.Sanitizer.clean(yourTaintString, yourCustomConfiguration);\n *\n * {@link SanitizerConfig}\n */\n\n\n/**\n * @typedef {Object} SanitizerConfig\n * @property {Object} tags - define tags restrictions\n *\n * @example\n *\n * tags : {\n * p: true,\n * a: {\n * href: true,\n * rel: \"nofollow\",\n * target: \"_blank\"\n * }\n * }\n */\nexport default class Sanitizer extends Module {\n\n /**\n * Initializes Sanitizer module\n * Sets default configuration if custom not exists\n *\n * @property {SanitizerConfig} this.defaultConfig\n * @property {HTMLJanitor} this._sanitizerInstance - Sanitizer library\n *\n * @param {SanitizerConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n // default config\n this.defaultConfig = null;\n this._sanitizerInstance = null;\n\n /** Custom configuration */\n this.sanitizerConfig = config.settings ? config.settings.sanitizer : {};\n\n /** HTML Janitor library */\n this.sanitizerInstance = require('html-janitor');\n\n }\n\n /**\n * If developer uses editor's API, then he can customize sanitize restrictions.\n * Or, sanitizing config can be defined globally in editors initialization. That config will be used everywhere\n * At least, if there is no config overrides, that API uses Default configuration\n *\n * @uses https://www.npmjs.com/package/html-janitor\n *\n * @param {HTMLJanitor} library - sanitizer extension\n */\n set sanitizerInstance(library) {\n\n this._sanitizerInstance = new library(this.defaultConfig);\n\n }\n\n /**\n * Sets sanitizer configuration. Uses default config if user didn't pass the restriction\n * @param {SanitizerConfig} config\n */\n set sanitizerConfig(config) {\n\n if (_.isEmpty(config)) {\n\n this.defaultConfig = {\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: 'nofollow'\n }\n }\n };\n\n } else {\n\n this.defaultConfig = config;\n\n }\n\n }\n\n /**\n * Cleans string from unwanted tags\n * @param {String} taintString - HTML string\n * @param {Object} customConfig - custom sanitizer configuration. Method uses default if param is empty\n * @return {String} clean HTML\n */\n clean(taintString, customConfig = {}) {\n\n if (_.isEmpty(customConfig)) {\n\n return this._sanitizerInstance.clean(taintString);\n\n } else {\n\n return Sanitizer.clean(taintString, customConfig);\n\n }\n\n\n }\n\n /**\n * Cleans string from unwanted tags\n * @static\n *\n * Method allows to use default config\n *\n * @param {String} taintString - taint string\n * @param {SanitizerConfig} customConfig - allowed tags\n *\n * @return {String} clean HTML\n */\n static clean(taintString, customConfig) {\n\n let newInstance = Sanitizer(customConfig);\n\n return newInstance.clean(taintString);\n\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/sanitizer.js","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('html-janitor', factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.HTMLJanitor = factory();\n }\n}(this, function () {\n\n /**\n * @param {Object} config.tags Dictionary of allowed tags.\n * @param {boolean} config.keepNestedBlockElements Default false.\n */\n function HTMLJanitor(config) {\n\n var tagDefinitions = config['tags'];\n var tags = Object.keys(tagDefinitions);\n\n var validConfigValues = tags\n .map(function(k) { return typeof tagDefinitions[k]; })\n .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });\n\n if(!validConfigValues) {\n throw new Error(\"The configuration was invalid\");\n }\n\n this.config = config;\n }\n\n // TODO: not exhaustive?\n var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];\n function isBlockElement(node) {\n return blockElementNames.indexOf(node.nodeName) !== -1;\n }\n\n var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];\n function isInlineElement(node) {\n return inlineElementNames.indexOf(node.nodeName) !== -1;\n }\n\n HTMLJanitor.prototype.clean = function (html) {\n var sandbox = document.createElement('div');\n sandbox.innerHTML = html;\n\n this._sanitize(sandbox);\n\n return sandbox.innerHTML;\n };\n\n HTMLJanitor.prototype._sanitize = function (parentNode) {\n var treeWalker = createTreeWalker(parentNode);\n var node = treeWalker.firstChild();\n if (!node) { return; }\n\n do {\n // Ignore nodes that have already been sanitized\n if (node._sanitized) {\n continue;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // If this text node is just whitespace and the previous or next element\n // sibling is a block element, remove it\n // N.B.: This heuristic could change. Very specific to a bug with\n // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output\n // FIXME: make this an option?\n if (node.data.trim() === ''\n && ((node.previousElementSibling && isBlockElement(node.previousElementSibling))\n || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n } else {\n continue;\n }\n }\n\n // Remove all comments\n if (node.nodeType === Node.COMMENT_NODE) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n }\n\n var isInline = isInlineElement(node);\n var containsBlockElement;\n if (isInline) {\n containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);\n }\n\n // Block elements should not be nested (e.g.
  • ...); if\n // they are, we want to unwrap the inner block element.\n var isNotTopContainer = !! parentNode.parentNode;\n var isNestedBlockElement =\n isBlockElement(parentNode) &&\n isBlockElement(node) &&\n isNotTopContainer;\n\n var nodeName = node.nodeName.toLowerCase();\n\n var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);\n\n var isInvalid = isInline && containsBlockElement;\n\n // Drop tag entirely according to the whitelist *and* if the markup\n // is invalid.\n if (isInvalid || shouldRejectNode(node, allowedAttrs)\n || (!this.config.keepNestedBlockElements && isNestedBlockElement)) {\n // Do not keep the inner text of SCRIPT/STYLE elements.\n if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {\n while (node.childNodes.length > 0) {\n parentNode.insertBefore(node.childNodes[0], node);\n }\n }\n parentNode.removeChild(node);\n\n this._sanitize(parentNode);\n break;\n }\n\n // Sanitize attributes\n for (var a = 0; a < node.attributes.length; a += 1) {\n var attr = node.attributes[a];\n\n if (shouldRejectAttr(attr, allowedAttrs, node)) {\n node.removeAttribute(attr.name);\n // Shift the array to continue looping.\n a = a - 1;\n }\n }\n\n // Sanitize children\n this._sanitize(node);\n\n // Mark node as sanitized so it's ignored in future runs\n node._sanitized = true;\n } while ((node = treeWalker.nextSibling()));\n };\n\n function createTreeWalker(node) {\n return document.createTreeWalker(node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,\n null, false);\n }\n\n function getAllowedAttrs(config, nodeName, node){\n if (typeof config.tags[nodeName] === 'function') {\n return config.tags[nodeName](node);\n } else {\n return config.tags[nodeName];\n }\n }\n\n function shouldRejectNode(node, allowedAttrs){\n if (typeof allowedAttrs === 'undefined') {\n return true;\n } else if (typeof allowedAttrs === 'boolean') {\n return !allowedAttrs;\n }\n\n return false;\n }\n\n function shouldRejectAttr(attr, allowedAttrs, node){\n var attrName = attr.name.toLowerCase();\n\n if (allowedAttrs === true){\n return false;\n } else if (typeof allowedAttrs[attrName] === 'function'){\n return !allowedAttrs[attrName](attr.value, node);\n } else if (typeof allowedAttrs[attrName] === 'undefined'){\n return true;\n } else if (allowedAttrs[attrName] === false) {\n return true;\n } else if (typeof allowedAttrs[attrName] === 'string') {\n return (allowedAttrs[attrName] !== attr.value);\n }\n\n return false;\n }\n\n return HTMLJanitor;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html-janitor/src/html-janitor.js\n// module id = 13\n// module chunks = 0","/**\n * Codex Editor Saver\n *\n * @module Saver\n * @author Codex Team\n * @version 2.0.0\n */\n\n/**\n * @typedef {Object} SavedData\n * @property {Date} time - saving proccess time\n * @property {Object} items - extracted data\n * @property {String} version - CodexEditor version\n */\n\n/**\n * @classdesc This method reduces all Blocks asyncronically and calls Block's save method to extract data\n *\n * @typedef {Saver} Saver\n * @property {Element} html - Editor HTML content\n * @property {String} json - Editor JSON output\n */\n\nexport default class Saver extends Module {\n\n /**\n * @constructor\n * @param config\n */\n constructor({config}) {\n\n super({config});\n\n this.output = null;\n this.blocksData = [];\n\n }\n\n /**\n * Composes new chain of Promises to fire them alternatelly\n * @return {SavedData}\n */\n save() {\n\n let blocks = this.Editor.BlockManager.blocks,\n chainData = [];\n\n blocks.forEach((block) => {\n\n chainData.push(block.data);\n\n });\n\n return Promise.all(chainData)\n .then((allExtractedData) => this.makeOutput(allExtractedData))\n .then((outputData) => {\n\n return outputData;\n\n });\n\n }\n\n /**\n * Creates output object with saved data, time and version of editor\n * @param {Object} allExtractedData\n * @return {SavedData}\n */\n makeOutput(allExtractedData) {\n\n let items = [],\n totalTime = 0;\n\n console.groupCollapsed('[CodexEditor saving]:');\n\n allExtractedData.forEach((extraction, index) => {\n\n /** Group process info */\n console.log(`«${extraction.tool}» saving info`, extraction);\n totalTime += extraction.time;\n items.push(extraction.data);\n\n });\n\n console.log('Total', totalTime);\n console.groupEnd();\n\n return {\n time : +new Date(),\n items : items,\n version : VERSION,\n };\n\n }\n\n}\n\n// module.exports = (function (saver) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * @public\n// * Save blocks\n// */\n// saver.save = function () {\n//\n// /** Save html content of redactor to memory */\n// editor.state.html = editor.nodes.redactor.innerHTML;\n//\n// /** Clean jsonOutput state */\n// editor.state.jsonOutput = [];\n//\n// return saveBlocks(editor.nodes.redactor.childNodes);\n//\n// };\n//\n// /**\n// * @private\n// * Save each block data\n// *\n// * @param blocks\n// * @returns {Promise.}\n// */\n// let saveBlocks = function (blocks) {\n//\n// let data = [];\n//\n// for(let index = 0; index < blocks.length; index++) {\n//\n// data.push(getBlockData(blocks[index]));\n//\n// }\n//\n// return Promise.all(data)\n// .then(makeOutput)\n// .catch(editor.core.log);\n//\n// };\n//\n// /** Save and validate block data */\n// let getBlockData = function (block) {\n//\n// return saveBlockData(block)\n// .then(validateBlockData)\n// .catch(editor.core.log);\n//\n// };\n//\n// /**\n// * @private\n// * Call block`s plugin save method and return saved data\n// *\n// * @param block\n// * @returns {Object}\n// */\n// let saveBlockData = function (block) {\n//\n// let pluginName = block.dataset.tool;\n//\n// /** Check for plugin existence */\n// if (!editor.tools[pluginName]) {\n//\n// editor.core.log(`Plugin «${pluginName}» not found`, 'error');\n// return {data: null, pluginName: null};\n//\n// }\n//\n// /** Check for plugin having save method */\n// if (typeof editor.tools[pluginName].save !== 'function') {\n//\n// editor.core.log(`Plugin «${pluginName}» must have save method`, 'error');\n// return {data: null, pluginName: null};\n//\n// }\n//\n// /** Result saver */\n// let blockContent = block.childNodes[0],\n// pluginsContent = blockContent.childNodes[0],\n// position = pluginsContent.dataset.inputPosition;\n//\n// /** If plugin wasn't available then return data from cache */\n// if ( editor.tools[pluginName].available === false ) {\n//\n// return Promise.resolve({data: codex.editor.state.blocks.items[position].data, pluginName});\n//\n// }\n//\n// return Promise.resolve(pluginsContent)\n// .then(editor.tools[pluginName].save)\n// .then(data => Object({data, pluginName}));\n//\n// };\n//\n// /**\n// * Call plugin`s validate method. Return false if validation failed\n// *\n// * @param data\n// * @param pluginName\n// * @returns {Object|Boolean}\n// */\n// let validateBlockData = function ({data, pluginName}) {\n//\n// if (!data || !pluginName) {\n//\n// return false;\n//\n// }\n//\n// if (editor.tools[pluginName].validate) {\n//\n// let result = editor.tools[pluginName].validate(data);\n//\n// /**\n// * Do not allow invalid data\n// */\n// if (!result) {\n//\n// return false;\n//\n// }\n//\n// }\n//\n// return {data, pluginName};\n//\n//\n// };\n//\n// /**\n// * Compile article output\n// *\n// * @param savedData\n// * @returns {{time: number, version, items: (*|Array)}}\n// */\n// let makeOutput = function (savedData) {\n//\n// savedData = savedData.filter(blockData => blockData);\n//\n// let items = savedData.map(blockData => Object({type: blockData.pluginName, data: blockData.data}));\n//\n// editor.state.jsonOutput = items;\n//\n// return {\n// id: editor.state.blocks.id || null,\n// time: +new Date(),\n// version: editor.version,\n// items\n// };\n//\n// };\n//\n// return saver;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/saver.js","/**\n *\n * «Toolbar» is the node that moves up/down over current block\n *\n * ______________________________________ Toolbar ____________________________________________\n * | |\n * | ..................... Content .................... ......... Block Actions .......... |\n * | . . . . |\n * | . . . [Open Settings] [Remove Block] . |\n * | . [Plus Button] [Toolbox: {Tool1}, {Tool2}] . . . |\n * | . . . [Settings Panel] . |\n * | .................................................. .................................. |\n * | |\n * |___________________________________________________________________________________________|\n *\n *\n * Toolbox — its an Element contains tools buttons. Can be shown by Plus Button.\n *\n * _______________ Toolbox _______________\n * | |\n * | [Header] [Image] [List] [Quote] ... |\n * |_______________________________________|\n *\n *\n * Settings Panel — is an Element with block settings:\n *\n * ____ Settings Panel ____\n * | ...................... |\n * | . Tool Settings . |\n * | ...................... |\n * | . Default Settings . |\n * | ...................... |\n * |________________________|\n *\n *\n * @class\n * @classdesc Toolbar module\n *\n * @typedef {Toolbar} Toolbar\n * @property {Object} nodes\n * @property {Element} nodes.wrapper - Toolbar main element\n * @property {Element} nodes.content - Zone with Plus button and toolbox.\n * @property {Element} nodes.actions - Zone with Block Settings and Remove Button\n * @property {Element} nodes.plusButton - Button that opens or closes Toolbox\n * @property {Element} nodes.toolbox - Container for tools\n * @property {Element} nodes.settingsToggler - open/close Settings Panel button\n * @property {Element} nodes.removeBlockButton - Remove Block button\n * @property {Element} nodes.settings - Settings Panel\n * @property {Element} nodes.pluginSettings - Plugin Settings section of Settings Panel\n * @property {Element} nodes.defaultSettings - Default Settings section of Settings Panel\n */\nexport default class Toolbar extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n wrapper : null,\n content : null,\n actions : null,\n\n // Content Zone\n plusButton : null,\n\n // Actions Zone\n settingsToggler : null,\n removeBlockButton: null,\n settings: null,\n\n // Settings Zone: Plugin Settings and Default Settings\n pluginSettings: null,\n defaultSettings: null,\n };\n\n }\n\n /**\n * CSS styles\n * @return {Object}\n * @constructor\n */\n static get CSS() {\n\n return {\n toolbar: 'ce-toolbar',\n content: 'ce-toolbar__content',\n actions: 'ce-toolbar__actions',\n\n toolbarOpened: 'ce-toolbar--opened',\n\n // Content Zone\n plusButton: 'ce-toolbar__plus',\n plusButtonHidden: 'ce-toolbar__plus--hidden',\n\n // Actions Zone\n settingsToggler: 'ce-toolbar__settings-btn',\n removeBlockButton: 'ce-toolbar__remove-btn',\n\n // Settings Panel\n settings: 'ce-settings',\n defaultSettings: 'ce-settings_default',\n pluginSettings: 'ce-settings_plugin',\n };\n\n }\n\n /**\n * Makes toolbar\n */\n make() {\n\n this.nodes.wrapper = $.make('div', Toolbar.CSS.toolbar);\n\n /**\n * Make Content Zone and Actions Zone\n */\n ['content', 'actions'].forEach( el => {\n\n this.nodes[el] = $.make('div', Toolbar.CSS[el]);\n $.append(this.nodes.wrapper, this.nodes[el]);\n\n });\n\n\n /**\n * Fill Content Zone:\n * - Plus Button\n * - Toolbox\n */\n this.nodes.plusButton = $.make('div', Toolbar.CSS.plusButton);\n $.append(this.nodes.content, this.nodes.plusButton);\n this.nodes.plusButton.addEventListener('click', event => this.plusButtonClicked(event), false);\n\n\n /**\n * Make a Toolbox\n */\n this.Editor.Toolbox.make();\n\n /**\n * Fill Actions Zone:\n * - Settings Toggler\n * - Remove Block Button\n * - Settings Panel\n */\n this.nodes.settingsToggler = $.make('span', Toolbar.CSS.settingsToggler);\n this.nodes.removeBlockButton = this.makeRemoveBlockButton();\n\n $.append(this.nodes.actions, [this.nodes.settingsToggler, this.nodes.removeBlockButton]);\n\n /**\n * Make and append Settings Panel\n */\n this.makeBlockSettingsPanel();\n\n /**\n * Append toolbar to the Editor\n */\n $.append(this.Editor.UI.nodes.wrapper, this.nodes.wrapper);\n\n }\n\n /**\n * Panel with block settings with 2 sections:\n *\n * @return {Element}\n */\n makeBlockSettingsPanel() {\n\n this.nodes.settings = $.make('div', Toolbar.CSS.settings);\n\n this.nodes.pluginSettings = $.make('div', Toolbar.CSS.pluginSettings);\n this.nodes.defaultSettings = $.make('div', Toolbar.CSS.defaultSettings);\n\n $.append(this.nodes.settings, [this.nodes.pluginSettings, this.nodes.defaultSettings]);\n $.append(this.nodes.actions, this.nodes.settings);\n\n }\n\n /**\n * Makes Remove Block button, and confirmation panel\n * @return {Element} wrapper with button and panel\n */\n makeRemoveBlockButton() {\n\n /**\n * @todo add confirmation panel and handlers\n * @see {@link settings#makeRemoveBlockButton}\n */\n return $.make('span', Toolbar.CSS.removeBlockButton);\n\n }\n\n /**\n * Move Toolbar to the Current Block\n */\n move() {\n\n /** Close Toolbox when we move toolbar */\n this.Editor.Toolbox.close();\n\n let currentNode = this.Editor.BlockManager.currentNode;\n\n /**\n * If no one Block selected as a Current\n */\n if (!currentNode) {\n\n return;\n\n }\n\n /**\n * @todo Compute dynamically on prepare\n * @type {number}\n */\n const defaultToolbarHeight = 49;\n const defaultOffset = 34;\n\n var newYCoordinate = currentNode.offsetTop - (defaultToolbarHeight / 2) + defaultOffset;\n\n this.nodes.wrapper.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n // editor.toolbar.settings.hideRemoveActions();\n\n }\n\n /**\n * Open Toolbar with Plus Button\n */\n open() {\n\n this.nodes.wrapper.classList.add(Toolbar.CSS.toolbarOpened);\n\n }\n\n /**\n * Close the Toolbar\n */\n close() {\n\n this.nodes.wrapper.classList.remove(Toolbar.CSS.toolbarOpened);\n\n }\n\n /**\n * Plus Button public methods\n * @return {{hide: function(): void, show: function(): void}}\n */\n get plusButton() {\n\n return {\n hide: () => this.nodes.plusButton.classList.add(Toolbar.CSS.plusButtonHidden),\n show: () => this.nodes.plusButton.classList.remove(Toolbar.CSS.plusButtonHidden)\n };\n\n }\n\n /**\n * Handler for Plus Button\n * @param {MouseEvent} event\n */\n plusButtonClicked(event) {\n\n this.Editor.Toolbox.toggle();\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar.js","/**\n * @class Toolbox\n * @classdesc Holder for Tools\n *\n * @typedef {Toolbox} Toolbox\n * @property {Boolean} opened - opening state\n * @property {Object} nodes - Toolbox nodes\n * @property {Object} CSS - CSS class names\n *\n */\nexport default class Toolbox extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n toolbox: null,\n buttons: []\n };\n\n /**\n * Opening state\n * @type {boolean}\n */\n this.opened = false;\n\n }\n\n /**\n * CSS styles\n * @return {{toolbox: string, toolboxButton: string, toolboxOpened: string}}\n */\n static get CSS() {\n\n return {\n toolbox: 'ce-toolbox',\n toolboxButton: 'ce-toolbox__button',\n toolboxOpened: 'ce-toolbox--opened',\n };\n\n }\n\n /**\n * Makes the Toolbox\n */\n make() {\n\n this.nodes.toolbox = $.make('div', Toolbox.CSS.toolbox);\n $.append(this.Editor.Toolbar.nodes.content, this.nodes.toolbox);\n\n this.addTools();\n\n }\n\n /**\n * Iterates available tools and appends them to the Toolbox\n */\n addTools() {\n\n let tools = this.Editor.Tools.toolsAvailable;\n\n for (let toolName in tools) {\n\n this.addTool(toolName, tools[toolName]);\n\n }\n\n }\n\n /**\n * Append Tool to the Toolbox\n *\n * @param {string} toolName - tool name\n * @param {Tool} tool - tool class\n */\n addTool(toolName, tool) {\n\n if (tool.displayInToolbox && !tool.iconClassName) {\n\n _.log('Toolbar icon class name is missed. Tool %o skipped', 'warn', toolName);\n return;\n\n }\n\n /**\n * @todo Add checkup for the render method\n */\n // if (typeof tool.render !== 'function') {\n //\n // _.log('render method missed. Tool %o skipped', 'warn', tool);\n // return;\n //\n // }\n\n /**\n * Skip tools that pass 'displayInToolbox=false'\n */\n if (!tool.displayInToolbox) {\n\n return;\n\n }\n\n let button = $.make('li', [Toolbox.CSS.toolboxButton, tool.iconClassName], {\n title: toolName\n });\n\n /**\n * Save tool's name in the button data-name\n */\n button.dataset.name = toolName;\n\n $.append(this.nodes.toolbox, button);\n\n this.nodes.toolbox.appendChild(button);\n this.nodes.buttons.push(button);\n\n /**\n * @todo add event with module Listeners\n */\n // this.Editor.Listeners.add();\n button.addEventListener('click', event => {\n\n this.buttonClicked(event);\n\n }, false);\n\n }\n\n /**\n * Toolbox button click listener\n * 1) if block is empty -> replace\n * 2) if block is not empty -> add new block below\n *\n * @param {MouseEvent} event\n */\n buttonClicked(event) {\n\n let toolButton = event.target,\n toolName = toolButton.dataset.name,\n tool = this.Editor.Tools.toolClasses[toolName];\n\n /**\n * @type {Block}\n */\n let currentBlock = this.Editor.BlockManager.currentBlock;\n\n /**\n * We do replace if:\n * - block is empty\n * - block is not irreplaceable\n * @type {Array}\n */\n if (!tool.irreplaceable && currentBlock.isEmpty) {\n\n this.Editor.BlockManager.replace(toolName);\n\n } else {\n\n this.Editor.BlockManager.insert(toolName);\n\n }\n\n /**\n * @todo set caret to the new block\n */\n\n // window.setTimeout(function () {\n\n /** Set caret to current block */\n // editor.caret.setToBlock(currentInputIndex);\n\n // }, 10);\n\n /**\n * Move toolbar when node is changed\n */\n this.Editor.Toolbar.move();\n\n }\n\n /**\n * Open Toolbox with Tools\n */\n open() {\n\n this.nodes.toolbox.classList.add(Toolbox.CSS.toolboxOpened);\n this.opened = true;\n\n }\n\n /**\n * Close Toolbox\n */\n close() {\n\n this.nodes.toolbox.classList.remove(Toolbox.CSS.toolboxOpened);\n this.opened = false;\n\n }\n\n /**\n * Close Toolbox\n */\n toggle() {\n\n if (!this.opened) {\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbox.js","/**\n * @module Codex Editor Tools Submodule\n *\n * Creates Instances from Plugins and binds external config to the instances\n */\n\n/**\n * Each Tool must contain the following important objects:\n *\n * @typedef {Object} ToolConfig {@link docs/tools.md}\n * @property {String} iconClassname - this a icon in toolbar\n * @property {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @property {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n * @property render @todo add description\n * @property save @todo add description\n * @property settings @todo add description\n * @property validate - method that validates output data before saving\n */\n\n/**\n * @typedef {Function} Tool {@link docs/tools.md}\n * @property {Boolean} displayInToolbox - By default, tools won't be added in the Toolbox. Pass true to add.\n * @property {String} iconClassName - CSS class name for the Toolbox button\n * @property {Boolean} irreplaceable - Toolbox behaviour: replace or add new block below\n * @property render\n * @property save\n * @property settings\n * @property validate\n *\n * @todo update according to current API\n * @todo describe Tool in the {@link docs/tools.md}\n */\n\n/**\n * Class properties:\n *\n * @typedef {Tools} Tools\n * @property {Tools[]} toolsAvailable - available Tools\n * @property {Tools[]} toolsUnavailable - unavailable Tools\n * @property {Object} toolsClasses - all classes\n * @property {EditorConfig} config - Editor config\n */\nexport default class Tools extends Module {\n\n /**\n * Returns available Tools\n * @return {Tool[]}\n */\n get available() {\n\n return this.toolsAvailable;\n\n }\n\n /**\n * Returns unavailable Tools\n * @return {Tool[]}\n */\n get unavailable() {\n\n return this.toolsUnavailable;\n\n }\n\n /**\n * Static getter for default Tool config fields\n *\n * @usage Tools.defaultConfig.displayInToolbox\n * @return {ToolConfig}\n */\n static get defaultConfig() {\n\n return {\n iconClassName : '',\n displayInToolbox : false,\n enableLineBreaks : false,\n irreplaceable : false\n };\n\n }\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n /**\n * Map {name: Class, ...} where:\n * name — block type name in JSON. Got from EditorConfig.tools keys\n * @type {Object}\n */\n this.toolClasses = {};\n\n /**\n * Available tools list\n * {name: Class, ...}\n * @type {Object}\n */\n this.toolsAvailable = {};\n\n /**\n * Tools that rejected a prepare method\n * {name: Class, ... }\n * @type {Object}\n */\n this.toolsUnavailable = {};\n\n }\n\n /**\n * Creates instances via passed or default configuration\n * @return {Promise}\n */\n prepare() {\n\n if (!this.config.hasOwnProperty('tools')) {\n\n return Promise.reject(\"Can't start without tools\");\n\n }\n\n for(let toolName in this.config.tools) {\n\n this.toolClasses[toolName] = this.config.tools[toolName];\n\n }\n\n /**\n * getting classes that has prepare method\n */\n let sequenceData = this.getListOfPrepareFunctions();\n\n /**\n * if sequence data contains nothing then resolve current chain and run other module prepare\n */\n if (sequenceData.length === 0) {\n\n return Promise.resolve();\n\n }\n\n /**\n * to see how it works {@link Util#sequence}\n */\n return _.sequence(sequenceData, (data) => {\n\n this.success(data);\n\n }, (data) => {\n\n this.fallback(data);\n\n });\n\n }\n\n /**\n * Binds prepare function of plugins with user or default config\n * @return {Array} list of functions that needs to be fired sequentially\n */\n getListOfPrepareFunctions() {\n\n let toolPreparationList = [];\n\n for(let toolName in this.toolClasses) {\n\n let toolClass = this.toolClasses[toolName];\n\n if (typeof toolClass.prepare === 'function') {\n\n toolPreparationList.push({\n function : toolClass.prepare,\n data : {\n toolName\n }\n });\n\n } else {\n\n /**\n * If Tool hasn't a prepare method, mark it as available\n */\n this.toolsAvailable[toolName] = toolClass;\n\n }\n\n }\n\n return toolPreparationList;\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to available list\n */\n success(data) {\n\n this.toolsAvailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to unavailable list\n */\n fallback(data) {\n\n this.toolsUnavailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * Return tool`a instance\n *\n * @param {String} tool — tool name\n * @param {Object} data — initial data\n *\n * @todo throw exceptions if tool doesnt exist\n *\n */\n construct(tool, data) {\n\n let plugin = this.toolClasses[tool],\n config = this.config.toolsConfig[tool];\n\n if (!config) {\n\n config = this.defaultConfig;\n\n }\n\n let instance = new plugin(data, config);\n\n return instance;\n\n }\n\n /**\n * Check if passed Tool is an instance of Initial Block Tool\n * @param {Tool} tool - Tool to check\n * @return {Boolean}\n */\n isInitial(tool) {\n\n return tool instanceof this.available[this.config.initialBlock];\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/tools.js","/**\n * Module UI\n *\n * @type {UI}\n */\n// let className = {\n\n/**\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\n */\n// BLOCK_CLASSNAME : 'ce-block',\n\n/**\n * @const {String} wrapper for plugins content\n */\n// BLOCK_CONTENT : 'ce-block__content',\n\n/**\n * @const {String} BLOCK_STRETCHED - makes block stretched\n */\n// BLOCK_STRETCHED : 'ce-block--stretched',\n\n/**\n * @const {String} BLOCK_HIGHLIGHTED - adds background\n */\n// BLOCK_HIGHLIGHTED : 'ce-block--focused',\n\n/**\n * @const {String} - for all default settings\n */\n// SETTINGS_ITEM : 'ce-settings__item'\n// };\n\n// import Block from '../block';\n\n/**\n * @class\n *\n * @classdesc Makes CodeX Editor UI:\n * \n * \n * \n * \n * \n *\n * @typedef {UI} UI\n * @property {EditorConfig} config - editor configuration {@link CodexEditor#configuration}\n * @property {Object} Editor - available editor modules {@link CodexEditor#moduleInstances}\n * @property {Object} nodes -\n * @property {Element} nodes.holder - element where we need to append redactor\n * @property {Element} nodes.wrapper - \n * @property {Element} nodes.redactor - \n */\nexport default class UI extends Module {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n holder: null,\n wrapper: null,\n redactor: null\n };\n\n }\n\n /**\n * Making main interface\n */\n prepare() {\n\n return this.make()\n /**\n * Make toolbar\n */\n .then(() => this.Editor.Toolbar.make())\n /**\n * Load and append CSS\n */\n .then(() => this.loadStyles())\n /**\n * Bind events for the UI elements\n */\n .then(() => this.bindEvents())\n\n /** Make container for inline toolbar */\n // .then(makeInlineToolbar_)\n\n /** Add inline toolbar tools */\n // .then(addInlineToolbarTools_)\n\n /** Draw wrapper for notifications */\n // .then(makeNotificationHolder_)\n\n /** Add eventlisteners to redactor elements */\n // .then(bindEvents_)\n\n .catch(e => {\n\n console.error(e);\n\n // editor.core.log(\"Can't draw editor interface\");\n\n });\n\n }\n\n /**\n * CodeX Editor UI CSS class names\n * @return {{editorWrapper: string, editorZone: string, block: string}}\n */\n get CSS() {\n\n return {\n editorWrapper : 'codex-editor',\n editorZone : 'codex-editor__redactor',\n };\n\n }\n\n /**\n * Makes CodeX Editor interface\n * @return {Promise}\n */\n make() {\n\n return new Promise( (resolve, reject) => {\n\n /**\n * Element where we need to append CodeX Editor\n * @type {Element}\n */\n this.nodes.holder = document.getElementById(this.config.holderId);\n\n if (!this.nodes.holder) {\n\n reject(Error(\"Holder wasn't found by ID: #\" + this.config.holderId));\n return;\n\n }\n\n /**\n * Create and save main UI elements\n */\n this.nodes.wrapper = $.make('div', this.CSS.editorWrapper);\n this.nodes.redactor = $.make('div', this.CSS.editorZone);\n\n this.nodes.wrapper.appendChild(this.nodes.redactor);\n this.nodes.holder.appendChild(this.nodes.wrapper);\n\n resolve();\n\n });\n\n }\n\n /**\n * Appends CSS\n */\n loadStyles() {\n\n /**\n * Load CSS\n */\n let styles = require('../../styles/main.css');\n\n /**\n * Make tag\n */\n let tag = $.make('style', null, {\n textContent: styles.toString()\n });\n\n /**\n * Append styles\n */\n $.append(document.head, tag);\n\n }\n\n /**\n * Bind events on the CodeX Editor interface\n */\n bindEvents() {\n\n /**\n * @todo bind events with the Listeners module\n */\n this.nodes.redactor.addEventListener('click', event => this.redactorClicked(event), false );\n\n }\n\n /**\n * All clicks on the redactor zone\n *\n * @param {MouseEvent} event\n *\n * @description\n * 1. Save clicked Block as a current {@link BlockManager#currentNode}\n * it uses for the following:\n * - add CSS modifier for the selected Block\n * - on Enter press, we make a new Block under that\n *\n * 2. Move and show the Toolbar\n *\n * 3. Set a Caret\n *\n * 4. By clicks on the Editor's bottom zone:\n * - if last Block is empty, set a Caret to this\n * - otherwise, add a new empty Block and set a Caret to that\n *\n * 5. Hide the Inline Toolbar\n *\n * @see selectClickedBlock\n *\n */\n redactorClicked(event) {\n\n let clickedNode = event.target;\n\n /**\n * Select clicked Block as Current\n */\n try {\n\n this.Editor.BlockManager.setCurrentBlockByChildNode(clickedNode);\n\n /**\n * If clicked outside first-level Blocks, set Caret to the last empty Block\n */\n\n } catch (e) {\n\n this.Editor.Caret.setToTheLastBlock();\n\n }\n\n\n\n\n /**\n * @todo hide the Inline Toolbar\n */\n // var selectedText = editor.toolbar.inline.getSelectionText(),\n // firstLevelBlock;\n\n /** If selection range took off, then we hide inline toolbar */\n // if (selectedText.length === 0) {\n\n // editor.toolbar.inline.close();\n\n // }\n\n /**\n *\n\n /** Update current input index in memory when caret focused into existed input */\n // if (event.target.contentEditable == 'true') {\n //\n // editor.caret.saveCurrentInputIndex();\n //\n // }\n\n // if (editor.content.currentNode === null) {\n //\n // /**\n // * If inputs in redactor does not exits, then we put input index 0 not -1\n // */\n // var indexOfLastInput = editor.state.inputs.length > 0 ? editor.state.inputs.length - 1 : 0;\n //\n // /** If we have any inputs */\n // if (editor.state.inputs.length) {\n //\n // /** getting firstlevel parent of input */\n // firstLevelBlock = editor.content.getFirstLevelBlock(editor.state.inputs[indexOfLastInput]);\n //\n // }\n //\n // /** If input is empty, then we set caret to the last input */\n // if (editor.state.inputs.length && editor.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == editor.settings.initialBlockPlugin) {\n //\n // editor.caret.setToBlock(indexOfLastInput);\n //\n // } else {\n //\n // /** Create new input when caret clicked in redactors area */\n // var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n //\n // editor.content.insertBlock({\n // type : NEW_BLOCK_TYPE,\n // block : editor.tools[NEW_BLOCK_TYPE].render()\n // });\n //\n // /** If there is no inputs except inserted */\n // if (editor.state.inputs.length === 1) {\n //\n // editor.caret.setToBlock(indexOfLastInput);\n //\n // } else {\n //\n // /** Set caret to this appended input */\n // editor.caret.setToNextBlock(indexOfLastInput);\n //\n // }\n //\n // }\n //\n // } else {\n //\n // /** Close all panels */\n // editor.toolbar.settings.close();\n // editor.toolbar.toolbox.close();\n //\n // }\n //\n /**\n * Move toolbar and open\n */\n this.Editor.Toolbar.move();\n this.Editor.Toolbar.open();\n //\n // var inputIsEmpty = !editor.content.currentNode.textContent.trim(),\n // currentNodeType = editor.content.currentNode.dataset.tool,\n // isInitialType = currentNodeType == editor.settings.initialBlockPlugin;\n //\n //\n\n /**\n * Hide the Plus Button\n * */\n this.Editor.Toolbar.plusButton.hide();\n\n /**\n * Show the Plus Button if:\n * - Block is an initial-block (Text)\n * - Block is empty\n */\n let isInitialBlock = this.Editor.Tools.isInitial(this.Editor.BlockManager.currentBlock.tool),\n isEmptyBlock = this.Editor.BlockManager.currentBlock.isEmpty;\n\n if (isInitialBlock && isEmptyBlock) {\n\n this.Editor.Toolbar.plusButton.show();\n\n }\n\n }\n\n}\n\n// /**\n// * Codex Editor UI module\n// *\n// * @author Codex Team\n// * @version 1.2.0\n// */\n//\n// module.exports = (function (ui) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * Basic editor classnames\n// */\n// ui.prepare = function () {\n//\n\n//\n// };\n//\n// /** Draw notifications holder */\n// var makeNotificationHolder_ = function () {\n//\n// /** Append block with notifications to the document */\n// editor.nodes.notifications = editor.notifications.createHolder();\n//\n// };\n//\n//\n// var addInlineToolbarTools_ = function () {\n//\n// var tools = {\n//\n// bold: {\n// icon : 'ce-icon-bold',\n// command : 'bold'\n// },\n//\n// italic: {\n// icon : 'ce-icon-italic',\n// command : 'italic'\n// },\n//\n// link: {\n// icon : 'ce-icon-link',\n// command : 'createLink'\n// }\n// };\n//\n// var toolButton,\n// tool;\n//\n// for(var name in tools) {\n//\n// tool = tools[name];\n//\n// toolButton = editor.draw.toolbarButtonInline(name, tool.icon);\n//\n// editor.nodes.inlineToolbar.buttons.appendChild(toolButton);\n// /**\n// * Add callbacks to this buttons\n// */\n// editor.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n//\n// }\n//\n// };\n//\n// /**\n// * @private\n// * Bind editor UI events\n// */\n// var bindEvents_ = function () {\n//\n// editor.core.log('ui.bindEvents fired', 'info');\n//\n// // window.addEventListener('error', function (errorMsg, url, lineNumber) {\n// // editor.notifications.errorThrown(errorMsg, event);\n// // }, false );\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keydown', editor.callback.globalKeydown, false);\n//\n// /** All keydowns on Redactor zone */\n// editor.listeners.add(editor.nodes.redactor, 'keydown', editor.callback.redactorKeyDown, false);\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keyup', editor.callback.globalKeyup, false );\n//\n// /**\n// * Mouse click to radactor\n// */\n// editor.listeners.add(editor.nodes.redactor, 'click', editor.callback.redactorClicked, false );\n//\n// /**\n// * Clicks to the Plus button\n// */\n// editor.listeners.add(editor.nodes.plusButton, 'click', editor.callback.plusButtonClicked, false);\n//\n// /**\n// * Clicks to SETTINGS button in toolbar\n// */\n// editor.listeners.add(editor.nodes.showSettingsButton, 'click', editor.callback.showSettingsButtonClicked, false );\n//\n// /** Bind click listeners on toolbar buttons */\n// for (var button in editor.nodes.toolbarButtons) {\n//\n// editor.listeners.add(editor.nodes.toolbarButtons[button], 'click', editor.callback.toolbarButtonClicked, false);\n//\n// }\n//\n// };\n//\n// ui.addBlockHandlers = function (block) {\n//\n// if (!block) return;\n//\n// /**\n// * Block keydowns\n// */\n// editor.listeners.add(block, 'keydown', editor.callback.blockKeydown, false);\n//\n// /**\n// * Pasting content from another source\n// * We have two type of sanitization\n// * First - uses deep-first search algorithm to get sub nodes,\n// * sanitizes whole Block_content and replaces cleared nodes\n// * This method is deprecated\n// * Method is used in editor.callback.blockPaste(event)\n// *\n// * Secont - uses Mutation observer.\n// * Observer \"observe\" DOM changes and send changings to callback.\n// * Callback gets changed node, not whole Block_content.\n// * Inserted or changed node, which we've gotten have been cleared and replaced with diry node\n// *\n// * Method is used in editor.callback.blockPasteViaSanitize(event)\n// *\n// * @uses html-janitor\n// * @example editor.callback.blockPasteViaSanitize(event), the second method.\n// *\n// */\n// editor.listeners.add(block, 'paste', editor.paste.blockPasteCallback, false);\n//\n// /**\n// * Show inline toolbar for selected text\n// */\n// editor.listeners.add(block, 'mouseup', editor.toolbar.inline.show, false);\n// editor.listeners.add(block, 'keyup', editor.toolbar.inline.show, false);\n//\n// };\n//\n// /** getting all contenteditable elements */\n// ui.saveInputs = function () {\n//\n// var redactor = editor.nodes.redactor;\n//\n// editor.state.inputs = [];\n//\n// /** Save all inputs in global variable state */\n// var inputs = redactor.querySelectorAll('[contenteditable], input, textarea');\n//\n// Array.prototype.map.call(inputs, function (current) {\n//\n// if (!current.type || current.type == 'text' || current.type == 'textarea') {\n//\n// editor.state.inputs.push(current);\n//\n// }\n//\n// });\n//\n// };\n//\n// /**\n// * Adds first initial block on empty redactor\n// */\n// ui.addInitialBlock = function () {\n//\n// var initialBlockType = editor.settings.initialBlockPlugin,\n// initialBlock;\n//\n// if ( !editor.tools[initialBlockType] ) {\n//\n// editor.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n// return;\n//\n// }\n//\n// initialBlock = editor.tools[initialBlockType].render();\n//\n// initialBlock.setAttribute('data-placeholder', editor.settings.placeholder);\n//\n// editor.content.insertBlock({\n// type : initialBlockType,\n// block : initialBlock\n// });\n//\n// editor.content.workingNodeChanged(initialBlock);\n//\n// };\n//\n// ui.setInlineToolbarButtonBehaviour = function (button, type) {\n//\n// editor.listeners.add(button, 'mousedown', function (event) {\n//\n// editor.toolbar.inline.toolClicked(event, type);\n//\n// }, false);\n//\n// };\n//\n// return ui;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/ui.js","exports = module.exports = require(\"../../node_modules/css-loader/lib/css-base.js\")(undefined);\n// imports\n\n\n// module\nexports.push([module.id, \":root {\\n\\n /**\\n * Toolbar buttons\\n */\\n\\n /**\\n * Block content width\\n */\\n\\n /**\\n * Toolbar Plus Button and Toolbox buttons height and width\\n */\\n\\n}\\n/**\\n* Editor wrapper\\n*/\\n.codex-editor {\\n position: relative;\\n border: 1px solid #ccc;\\n padding: 10px;\\n box-sizing: border-box;\\n}\\n.codex-editor .hide {\\n display: none;\\n }\\n.codex-editor__redactor {\\n padding-bottom: 300px;\\n }\\n.ce-toolbar {\\n position: absolute;\\n left: 0;\\n right: 0;\\n top: 0;\\n /*opacity: 0;*/\\n /*visibility: hidden;*/\\n transition: opacity 100ms ease;\\n will-change: opacity, transform;\\n display: none;\\n}\\n.ce-toolbar--opened {\\n display: block;\\n /*opacity: 1;*/\\n /*visibility: visible;*/\\n }\\n.ce-toolbar__content {\\n max-width: 650px;\\n margin: 0 auto;\\n position: relative;\\n }\\n.ce-toolbar__plus {\\n position: absolute;\\n left: calc(-34px - 10px);\\n display: inline-block;\\n background-color: #eff2f5;\\n width: 34px;\\n height: 34px;\\n line-height: 34px;\\n text-align: center;\\n border-radius: 50%\\n }\\n.ce-toolbar__plus::after {\\n content: '+';\\n font-size: 26px;\\n display: block;\\n margin-top: -2px;\\n margin-right: -2px;\\n\\n}\\n.ce-toolbar__plus--hidden {\\n display: none;\\n\\n}\\n.ce-toolbox {\\n visibility: hidden;\\n transition: opacity 100ms ease;\\n will-change: opacity;\\n}\\n.ce-toolbox--opened {\\n opacity: 1;\\n visibility: visible;\\n }\\n.ce-toolbox__button {\\n display: inline-block;\\n list-style: none;\\n margin: 0;\\n background: #eff2f5;\\n width: 34px;\\n height: 34px;\\n border-radius: 30px;\\n overflow: hidden;\\n text-align: center;\\n line-height: 34px\\n }\\n.ce-toolbox__button::before {\\n content: attr(title);\\n font-size: 22px;\\n font-weight: 500;\\n letter-spacing: 1em;\\n -webkit-font-feature-settings: \\\"smcp\\\", \\\"c2sc\\\";\\n font-feature-settings: \\\"smcp\\\", \\\"c2sc\\\";\\n font-variant-caps: all-small-caps;\\n padding-left: 11.5px;\\n margin-top: -1px;\\n display: inline-block;\\n\\n}\\n.ce-block {\\n border: 1px dotted #ccc;\\n margin: 2px 0;\\n}\\n.ce-block--selected {\\n background-color: #eff2f5;\\n }\\n.ce-block__content {\\n max-width: 650px;\\n margin: 0 auto;\\n }\\n\", \"\"]);\n\n// exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/styles/main.css\n// module id = 19\n// module chunks = 0","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t// when a module is imported multiple times with different media queries.\n\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/css-loader/lib/css-base.js\n// module id = 20\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap bb65f22814c0579e597b","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/Selection.js","webpack:///./src/codex.js","webpack:///./src/components/polyfills.js","webpack:///./src/components/modules nonrecursive [^_](blockManager.js|caret.js|events.js|listeners.js|renderer.js|sanitizer.js|saver.js|toolbar.js|toolbox.js|tools.js|ui.js)$","webpack:///./src/components/modules/blockManager.js","webpack:///./src/components/block.js","webpack:///./src/components/modules/caret.js","webpack:///./src/components/modules/events.js","webpack:///./src/components/modules/listeners.js","webpack:///./src/components/modules/renderer.js","webpack:///./src/components/modules/sanitizer.js","webpack:///./node_modules/html-janitor/src/html-janitor.js","webpack:///./src/components/modules/saver.js","webpack:///./src/components/modules/toolbar.js","webpack:///./src/components/modules/toolbox.js","webpack:///./src/components/modules/tools.js","webpack:///./src/components/modules/ui.js","webpack:///./src/styles/main.css","webpack:///./node_modules/css-loader/lib/css-base.js"],"names":["Module","config","new","target","TypeError","Editor","Util","msg","type","args","window","console","e","chains","success","fallback","Promise","resolve","reduce","previousValue","currentValue","iteration","then","waitNextBlock","length","chainData","successCallback","fallbackCallback","function","data","catch","collection","Array","prototype","slice","call","object","Object","keys","constructor","element","contentEditable","method","timeout","context","arguments","setTimeout","apply","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","Dom","tagName","classNames","attributes","el","document","createElement","isArray","classList","add","attrName","content","createTextNode","parent","elements","forEach","appendChild","selector","querySelector","querySelectorAll","node","atLast","childNodes","isElement","isNativeInput","emptyTextNode","text","childsLength","last","getDeepestNode","nodeType","Node","ELEMENT_NODE","nativeInputs","includes","nodeText","value","textContent","replace","trim","treeWalker","leafs","push","isLeaf","nextSibling","shift","firstChild","every","isNodeEmpty","leaf","Selection","instance","selection","getSelection","anchorNode","anchorOffset","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","log","error","constructModules","configureModules","displayName","name","state","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","render","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","_","isEmpty","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","toolName","toolInstance","construct","block","bindEvents","Listeners","on","pluginsContent","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","navigateNext","navigatePrevious","lastTextNode","$","currentBlock","textNodeLength","getAnchorNode","getAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","firstLevelBlock","CSS","wrapper","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","array","selected","workingArea","html","remove","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","isNaN","Number","Block","tool","_html","compose","make","contentNode","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","offset","atEnd","focus","nodeToSet","delay","range","createRange","setStart","setEnd","removeAllRanges","addRange","lastBlock","Events","subscribers","eventName","callback","previousData","currentHandler","newData","allListeners","eventType","handler","useCapture","assignedEventData","alreadyExist","findOne","addEventListener","existingListeners","findAll","i","removeEventListener","listenersOnElement","listener","listenersWithType","listenersWithHandler","foundListeners","byElement","concat","byType","byHandler","current","off","insertBlock","sequence","item","Sanitizer","defaultConfig","_sanitizerInstance","sanitizerConfig","settings","sanitizerInstance","require","taintString","customConfig","clean","library","tags","href","rel","newInstance","Saver","output","blocksData","all","allExtractedData","makeOutput","outputData","totalTime","groupCollapsed","extraction","groupEnd","Date","version","VERSION","Toolbar","actions","plusButton","settingsToggler","removeBlockButton","pluginSettings","defaultSettings","toolbar","append","plusButtonClicked","Toolbox","makeRemoveBlockButton","makeBlockSettingsPanel","close","defaultToolbarHeight","defaultOffset","newYCoordinate","offsetTop","style","transform","Math","floor","toolbarOpened","toggle","hide","plusButtonHidden","show","toolbox","buttons","opened","addTools","toolsAvailable","addTool","displayInToolbox","iconClassName","button","toolboxButton","title","dataset","buttonClicked","toolButton","toolClasses","irreplaceable","move","toolboxOpened","open","toolsUnavailable","enableLineBreaks","hasOwnProperty","reject","sequenceData","getListOfPrepareFunctions","toolPreparationList","toolClass","plugin","available","holder","loadStyles","getElementById","editorWrapper","editorZone","styles","tag","toString","head","redactorClicked","clickedNode","setCurrentBlockByChildNode","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock"],"mappings":"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AAP;AAEH;;;;EA3GkCjT,M;;;kBAAlB0S,S;;;;;;;;AClCrB;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA;;AAEA;AACA;;AAEA;AACA,wBAAwB,iCAAiC,EAAE;AAC3D,6BAA6B,uEAAuE,EAAE;;AAEtG;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,QAAQ;;AAExB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,qBAAqB,4BAA4B;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;;;;;;;;;;;ACxLD;;;;;;;;AAQA;;;;;;;AAOA;;;;;;;;IAQqBe,K;;;AAEjB;;;;AAIA,yBAAsB;AAAA,YAATxT,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,cAAKyT,MAAL,GAAc,IAAd;AACA,cAAKC,UAAL,GAAkB,EAAlB;;AALkB;AAOrB;;AAED;;;;;;;;+BAIO;AAAA;;AAEH,gBAAIlJ,SAAS,KAAKpK,MAAL,CAAYwI,YAAZ,CAAyB4B,MAAtC;AAAA,gBACIhJ,YAAY,EADhB;;AAGAgJ,mBAAO5F,OAAP,CAAe,UAACsG,KAAD,EAAW;;AAEtB1J,0BAAU+E,IAAV,CAAe2E,MAAMtJ,IAArB;AAEH,aAJD;;AAMA,mBAAOb,QAAQ4S,GAAR,CAAYnS,SAAZ,EACFH,IADE,CACG,UAACuS,gBAAD;AAAA,uBAAsB,OAAKC,UAAL,CAAgBD,gBAAhB,CAAtB;AAAA,aADH,EAEFvS,IAFE,CAEG,UAACyS,UAAD,EAAgB;;AAElB,uBAAOA,UAAP;AAEH,aANE,CAAP;AAQH;;AAED;;;;;;;;mCAKWF,gB,EAAkB;;AAEzB,gBAAI7K,QAAQ,EAAZ;AAAA,gBACIgL,YAAY,CADhB;;AAGArT,oBAAQsT,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBhP,OAAjB,CAAyB,UAACqP,UAAD,EAAatH,KAAb,EAAuB;;AAE5C;AACAjM,wBAAQoH,GAAR,UAAgBmM,WAAW7F,IAA3B,uBAAgD6F,UAAhD;AACAF,6BAAaE,WAAW9E,IAAxB;AACApG,sBAAMxC,IAAN,CAAW0N,WAAWrS,IAAtB;AAEH,aAPD;;AASAlB,oBAAQoH,GAAR,CAAY,OAAZ,EAAqBiM,SAArB;AACArT,oBAAQwT,QAAR;;AAEA,mBAAO;AACH/E,sBAAU,CAAC,IAAIgF,IAAJ,EADR;AAEHpL,uBAAUA,KAFP;AAGHqL,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8BtU,M;;AA0EnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAvOqByT,K;;;;;;;;;;;;;;;;;;;;;;;ACvBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmDqBc,O;;;AAEjB;;;AAGA,yBAAsB;AAAA,QAATtU,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAK0K,KAAL,GAAa;AACToC,eAAU,IADD;AAETtI,eAAU,IAFD;AAGT+P,eAAU,IAHD;;AAKT;AACAC,kBAAa,IANJ;;AAQT;AACAC,uBAAkB,IATT;AAUTC,yBAAmB,IAVV;AAWT7B,gBAAU,IAXD;;AAaT;AACA8B,sBAAgB,IAdP;AAeTC,uBAAiB;AAfR,KAAb;;AAJkB;AAsBrB;;AAED;;;;;;;;;;;AA8BA;;;2BAGO;AAAA;;AAEH,WAAKlK,KAAL,CAAWoC,OAAX,GAAqBf,EAAEwC,IAAF,CAAO,KAAP,EAAc+F,QAAQzH,GAAR,CAAYgI,OAA1B,CAArB;;AAEA;;;AAGA,OAAC,SAAD,EAAa,SAAb,EAAwBjQ,OAAxB,CAAiC,cAAM;;AAEnC,eAAK8F,KAAL,CAAWzG,EAAX,IAAiB8H,EAAEwC,IAAF,CAAO,KAAP,EAAc+F,QAAQzH,GAAR,CAAY5I,EAAZ,CAAd,CAAjB;AACA8H,UAAE+I,MAAF,CAAS,OAAKpK,KAAL,CAAWoC,OAApB,EAA6B,OAAKpC,KAAL,CAAWzG,EAAX,CAA7B;AAEH,OALD;;AAQA;;;;;AAKA,WAAKyG,KAAL,CAAW8J,UAAX,GAAwBzI,EAAEwC,IAAF,CAAO,KAAP,EAAc+F,QAAQzH,GAAR,CAAY2H,UAA1B,CAAxB;AACAzI,QAAE+I,MAAF,CAAS,KAAKpK,KAAL,CAAWlG,OAApB,EAA6B,KAAKkG,KAAL,CAAW8J,UAAxC;AACA,WAAK9J,KAAL,CAAW8J,UAAX,CAAsBlD,gBAAtB,CAAuC,OAAvC,EAAgD;AAAA,eAAS,OAAKyD,iBAAL,CAAuBxJ,KAAvB,CAAT;AAAA,OAAhD,EAAwF,KAAxF;;AAGA;;;AAGA,WAAKnL,MAAL,CAAY4U,OAAZ,CAAoBzG,IAApB;;AAEA;;;;;;AAMA,WAAK7D,KAAL,CAAW+J,eAAX,GAA8B1I,EAAEwC,IAAF,CAAO,MAAP,EAAe+F,QAAQzH,GAAR,CAAY4H,eAA3B,CAA9B;AACA,WAAK/J,KAAL,CAAWgK,iBAAX,GAA+B,KAAKO,qBAAL,EAA/B;;AAEAlJ,QAAE+I,MAAF,CAAS,KAAKpK,KAAL,CAAW6J,OAApB,EAA6B,CAAC,KAAK7J,KAAL,CAAW+J,eAAZ,EAA6B,KAAK/J,KAAL,CAAWgK,iBAAxC,CAA7B;;AAEA;;;AAGA,WAAKQ,sBAAL;;AAEA;;;AAGAnJ,QAAE+I,MAAF,CAAS,KAAK1U,MAAL,CAAYuI,EAAZ,CAAe+B,KAAf,CAAqBoC,OAA9B,EAAuC,KAAKpC,KAAL,CAAWoC,OAAlD;AAEH;;AAED;;;;;;;;6CAKyB;;AAErB,WAAKpC,KAAL,CAAWmI,QAAX,GAAsB9G,EAAEwC,IAAF,CAAO,KAAP,EAAc+F,QAAQzH,GAAR,CAAYgG,QAA1B,CAAtB;;AAEA,WAAKnI,KAAL,CAAWiK,cAAX,GAA4B5I,EAAEwC,IAAF,CAAO,KAAP,EAAc+F,QAAQzH,GAAR,CAAY8H,cAA1B,CAA5B;AACA,WAAKjK,KAAL,CAAWkK,eAAX,GAA6B7I,EAAEwC,IAAF,CAAO,KAAP,EAAc+F,QAAQzH,GAAR,CAAY+H,eAA1B,CAA7B;;AAEA7I,QAAE+I,MAAF,CAAS,KAAKpK,KAAL,CAAWmI,QAApB,EAA8B,CAAC,KAAKnI,KAAL,CAAWiK,cAAZ,EAA4B,KAAKjK,KAAL,CAAWkK,eAAvC,CAA9B;AACA7I,QAAE+I,MAAF,CAAS,KAAKpK,KAAL,CAAW6J,OAApB,EAA6B,KAAK7J,KAAL,CAAWmI,QAAxC;AAEH;;AAED;;;;;;;4CAIwB;;AAEpB;;;;AAIA,aAAO9G,EAAEwC,IAAF,CAAO,MAAP,EAAe+F,QAAQzH,GAAR,CAAY6H,iBAA3B,CAAP;AAEH;;AAED;;;;;;2BAGO;;AAEH;AACA,WAAKtU,MAAL,CAAY4U,OAAZ,CAAoBG,KAApB;;AAEA,UAAIjI,cAAc,KAAK9M,MAAL,CAAYwI,YAAZ,CAAyBsE,WAA3C;;AAEA;;;AAGA,UAAI,CAACA,WAAL,EAAkB;;AAEd;AAEH;;AAED;;;;AAIA,UAAMkI,uBAAuB,EAA7B;AACA,UAAMC,gBAAgB,EAAtB;;AAEA,UAAIC,iBAAiBpI,YAAYqI,SAAZ,GAAyBH,uBAAuB,CAAhD,GAAqDC,aAA1E;;AAEA,WAAK3K,KAAL,CAAWoC,OAAX,CAAmB0I,KAAnB,CAAyBC,SAAzB,uBAAuDC,KAAKC,KAAL,CAAWL,cAAX,CAAvD;;AAEA;AACA;AAEH;;AAED;;;;;;2BAGO;;AAEH,WAAK5K,KAAL,CAAWoC,OAAX,CAAmBzI,SAAnB,CAA6BC,GAA7B,CAAiCgQ,QAAQzH,GAAR,CAAY+I,aAA7C;AAEH;;AAED;;;;;;4BAGQ;;AAEJ,WAAKlL,KAAL,CAAWoC,OAAX,CAAmBzI,SAAnB,CAA6BqJ,MAA7B,CAAoC4G,QAAQzH,GAAR,CAAY+I,aAAhD;AAEH;;AAED;;;;;;;;;AAaA;;;;sCAIkBrK,K,EAAO;;AAErB,WAAKnL,MAAL,CAAY4U,OAAZ,CAAoBa,MAApB;AAEH;;;wBAjBgB;AAAA;;AAEb,aAAO;AACHC,cAAM;AAAA,iBAAM,OAAKpL,KAAL,CAAW8J,UAAX,CAAsBnQ,SAAtB,CAAgCC,GAAhC,CAAoCgQ,QAAQzH,GAAR,CAAYkJ,gBAAhD,CAAN;AAAA,SADH;AAEHC,cAAM;AAAA,iBAAM,OAAKtL,KAAL,CAAW8J,UAAX,CAAsBnQ,SAAtB,CAAgCqJ,MAAhC,CAAuC4G,QAAQzH,GAAR,CAAYkJ,gBAAnD,CAAN;AAAA;AAFH,OAAP;AAKH;;;wBAhLgB;;AAEb,aAAO;AACHlB,iBAAS,YADN;AAEHrQ,iBAAS,qBAFN;AAGH+P,iBAAS,qBAHN;;AAKHqB,uBAAe,oBALZ;;AAOH;AACApB,oBAAY,kBART;AASHuB,0BAAkB,0BATf;;AAWH;AACAtB,yBAAiB,0BAZd;AAaHC,2BAAmB,wBAbhB;;AAeH;AACA7B,kBAAU,aAhBP;AAiBH+B,yBAAiB,qBAjBd;AAkBHD,wBAAgB;AAlBb,OAAP;AAqBH;;;;EAzDgC5U,M;;;kBAAhBuU,O;;;;;;;;;;;;;;;;;;;;;;;ACnDrB;;;;;;;;;;IAUqBU,O;;;AAEjB;;;AAGA,2BAAsB;AAAA,YAAThV,MAAS,QAATA,MAAS;;AAAA;;AAAA,sHAEZ,EAACA,cAAD,EAFY;;AAIlB,cAAK0K,KAAL,GAAa;AACTuL,qBAAS,IADA;AAETC,qBAAS;AAFA,SAAb;;AAKA;;;;AAIA,cAAKC,MAAL,GAAc,KAAd;;AAbkB;AAerB;;AAED;;;;;;;;;;AAcA;;;+BAGO;;AAEH,iBAAKzL,KAAL,CAAWuL,OAAX,GAAqBlK,EAAEwC,IAAF,CAAO,KAAP,EAAcyG,QAAQnI,GAAR,CAAYoJ,OAA1B,CAArB;AACAlK,cAAE+I,MAAF,CAAS,KAAK1U,MAAL,CAAYkU,OAAZ,CAAoB5J,KAApB,CAA0BlG,OAAnC,EAA4C,KAAKkG,KAAL,CAAWuL,OAAvD;;AAEA,iBAAKG,QAAL;AAEH;;AAED;;;;;;mCAGW;;AAEP,gBAAI5M,QAAQ,KAAKpJ,MAAL,CAAYsI,KAAZ,CAAkB2N,cAA9B;;AAEA,iBAAK,IAAItL,QAAT,IAAqBvB,KAArB,EAA4B;;AAExB,qBAAK8M,OAAL,CAAavL,QAAb,EAAuBvB,MAAMuB,QAAN,CAAvB;AAEH;AAEJ;;AAED;;;;;;;;;gCAMQA,Q,EAAUqD,I,EAAM;AAAA;;AAEpB,gBAAIA,KAAKmI,gBAAL,IAAyB,CAACnI,KAAKoI,aAAnC,EAAkD;;AAE9C9M,kBAAE5B,GAAF,CAAM,oDAAN,EAA4D,MAA5D,EAAoEiD,QAApE;AACA;AAEH;;AAED;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA,gBAAI,CAACqD,KAAKmI,gBAAV,EAA4B;;AAExB;AAEH;;AAED,gBAAIE,SAAS1K,EAAEwC,IAAF,CAAO,IAAP,EAAa,CAACyG,QAAQnI,GAAR,CAAY6J,aAAb,EAA4BtI,KAAKoI,aAAjC,CAAb,EAA8D;AACvEG,uBAAO5L;AADgE,aAA9D,CAAb;;AAIA;;;AAGA0L,mBAAOG,OAAP,CAAezO,IAAf,GAAsB4C,QAAtB;;AAEAgB,cAAE+I,MAAF,CAAS,KAAKpK,KAAL,CAAWuL,OAApB,EAA6BQ,MAA7B;;AAEA,iBAAK/L,KAAL,CAAWuL,OAAX,CAAmBpR,WAAnB,CAA+B4R,MAA/B;AACA,iBAAK/L,KAAL,CAAWwL,OAAX,CAAmB3P,IAAnB,CAAwBkQ,MAAxB;;AAEA;;;AAGA;AACAA,mBAAOnF,gBAAP,CAAwB,OAAxB,EAAiC,iBAAS;;AAEtC,uBAAKuF,aAAL,CAAmBtL,KAAnB;AAEH,aAJD,EAIG,KAJH;AAMH;;AAED;;;;;;;;;;sCAOcA,K,EAAO;;AAEjB,gBAAIuL,aAAavL,MAAMrL,MAAvB;AAAA,gBACI6K,WAAW+L,WAAWF,OAAX,CAAmBzO,IADlC;AAAA,gBAEIiG,OAAO,KAAKhO,MAAL,CAAYsI,KAAZ,CAAkBqO,WAAlB,CAA8BhM,QAA9B,CAFX;;AAIA;;;AAGA,gBAAIiB,eAAe,KAAK5L,MAAL,CAAYwI,YAAZ,CAAyBoD,YAA5C;;AAEA;;;;;;AAMA,gBAAI,CAACoC,KAAK4I,aAAN,IAAuBhL,aAAarC,OAAxC,EAAiD;;AAE7C,qBAAKvJ,MAAL,CAAYwI,YAAZ,CAAyBzC,OAAzB,CAAiC4E,QAAjC;AAEH,aAJD,MAIO;;AAEH,qBAAK3K,MAAL,CAAYwI,YAAZ,CAAyB8D,MAAzB,CAAgC3B,QAAhC;AAEH;;AAED;;;;AAIA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA,iBAAK3K,MAAL,CAAYkU,OAAZ,CAAoB2C,IAApB;AAEH;;AAED;;;;;;+BAGO;;AAEH,iBAAKvM,KAAL,CAAWuL,OAAX,CAAmB5R,SAAnB,CAA6BC,GAA7B,CAAiC0Q,QAAQnI,GAAR,CAAYqK,aAA7C;AACA,iBAAKf,MAAL,GAAc,IAAd;AAEH;;AAED;;;;;;gCAGQ;;AAEJ,iBAAKzL,KAAL,CAAWuL,OAAX,CAAmB5R,SAAnB,CAA6BqJ,MAA7B,CAAoCsH,QAAQnI,GAAR,CAAYqK,aAAhD;AACA,iBAAKf,MAAL,GAAc,KAAd;AAEH;;AAED;;;;;;iCAGS;;AAEL,gBAAI,CAAC,KAAKA,MAAV,EAAkB;;AAEd,qBAAKgB,IAAL;AAEH,aAJD,MAIO;;AAEH,qBAAKhC,KAAL;AAEH;AAEJ;;;4BAxLgB;;AAEb,mBAAQ;AACJc,yBAAS,YADL;AAEJS,+BAAe,oBAFX;AAGJQ,+BAAe;AAHX,aAAR;AAMH;;;;EAlCgCnX,M;;;kBAAhBiV,O;;;;;;;;;;;;;;;;;;;;;;;ACVrB;;;;;;AAMA;;;;;;;;;;;;;AAaA;;;;;;;;;;;;;;AAcA;;;;;;;;;IASqBtM,K;;;;;;;AAEjB;;;;4BAIgB;;AAEZ,mBAAO,KAAK2N,cAAZ;AAEH;;AAED;;;;;;;4BAIkB;;AAEd,mBAAO,KAAKe,gBAAZ;AAEH;;AAED;;;;;;;;;4BAM2B;;AAEvB,mBAAO;AACHZ,+BAAgB,EADb;AAEHD,kCAAmB,KAFhB;AAGHc,kCAAmB,KAHhB;AAIHL,+BAAgB;AAJb,aAAP;AAOH;;AAED;;;;;;;;AAKA,yBAAsB;AAAA,YAAThX,MAAS,QAATA,MAAS;;AAAA;;AAIlB;;;;;AAJkB,kHAEZ,EAACA,cAAD,EAFY;;AASlB,cAAK+W,WAAL,GAAmB,EAAnB;;AAEA;;;;;AAKA,cAAKV,cAAL,GAAsB,EAAtB;;AAEA;;;;;AAKA,cAAKe,gBAAL,GAAwB,EAAxB;;AAvBkB;AAyBrB;;AAED;;;;;;;;kCAIU;AAAA;;AAEN,gBAAI,CAAC,KAAKpX,MAAL,CAAYsX,cAAZ,CAA2B,OAA3B,CAAL,EAA0C;;AAEtC,uBAAOvW,QAAQwW,MAAR,CAAe,2BAAf,CAAP;AAEH;;AAED,iBAAI,IAAIxM,QAAR,IAAoB,KAAK/K,MAAL,CAAYwJ,KAAhC,EAAuC;;AAEnC,qBAAKuN,WAAL,CAAiBhM,QAAjB,IAA6B,KAAK/K,MAAL,CAAYwJ,KAAZ,CAAkBuB,QAAlB,CAA7B;AAEH;;AAED;;;AAGA,gBAAIyM,eAAe,KAAKC,yBAAL,EAAnB;;AAEA;;;AAGA,gBAAID,aAAajW,MAAb,KAAwB,CAA5B,EAA+B;;AAE3B,uBAAOR,QAAQC,OAAR,EAAP;AAEH;;AAED;;;AAGA,mBAAO0I,EAAE6I,QAAF,CAAWiF,YAAX,EAAyB,UAAC5V,IAAD,EAAU;;AAEtC,uBAAKf,OAAL,CAAae,IAAb;AAEH,aAJM,EAIJ,UAACA,IAAD,EAAU;;AAET,uBAAKd,QAAL,CAAcc,IAAd;AAEH,aARM,CAAP;AAUH;;AAED;;;;;;;oDAI4B;;AAExB,gBAAI8V,sBAAsB,EAA1B;;AAEA,iBAAI,IAAI3M,QAAR,IAAoB,KAAKgM,WAAzB,EAAsC;;AAElC,oBAAIY,YAAY,KAAKZ,WAAL,CAAiBhM,QAAjB,CAAhB;;AAEA,oBAAI,OAAO4M,UAAUlP,OAAjB,KAA6B,UAAjC,EAA6C;;AAEzCiP,wCAAoBnR,IAApB,CAAyB;AACrB5E,kCAAWgW,UAAUlP,OADA;AAErB7G,8BAAO;AACHmJ;AADG;AAFc,qBAAzB;AAOH,iBATD,MASO;;AAEH;;;AAGA,yBAAKsL,cAAL,CAAoBtL,QAApB,IAAgC4M,SAAhC;AAEH;AAEJ;;AAED,mBAAOD,mBAAP;AAEH;;AAED;;;;;;gCAGQ9V,I,EAAM;;AAEV,iBAAKyU,cAAL,CAAoBzU,KAAKmJ,QAAzB,IAAqC,KAAKgM,WAAL,CAAiBnV,KAAKmJ,QAAtB,CAArC;AAEH;;AAED;;;;;;iCAGSnJ,I,EAAM;;AAEX,iBAAKwV,gBAAL,CAAsBxV,KAAKmJ,QAA3B,IAAuC,KAAKgM,WAAL,CAAiBnV,KAAKmJ,QAAtB,CAAvC;AAEH;;AAED;;;;;;;;;;;;kCASUqD,I,EAAMxM,I,EAAM;;AAElB,gBAAIgW,SAAS,KAAKb,WAAL,CAAiB3I,IAAjB,CAAb;AAAA,gBACIpO,SAAS,KAAKA,MAAL,CAAYyJ,WAAZ,CAAwB2E,IAAxB,CADb;;AAGA,gBAAI,CAACpO,MAAL,EAAa;;AAETA,yBAAS,KAAK0S,aAAd;AAEH;;AAED,gBAAI1L,WAAW,IAAI4Q,MAAJ,CAAWhW,IAAX,EAAiB5B,MAAjB,CAAf;;AAEA,mBAAOgH,QAAP;AAEH;;AAED;;;;;;;;kCAKUoH,I,EAAM;;AAEZ,mBAAOA,gBAAgB,KAAKyJ,SAAL,CAAe,KAAK7X,MAAL,CAAYgJ,YAA3B,CAAvB;AAEH;;;;EA/M8BjJ,M;;;kBAAd2I,K;;;;;;;;;;;;;;;;;;;;;;;AC1CrB;;;;;AAKA;;AAEA;;;AAGA;;AAEA;;;AAGA;;AAEA;;;AAGA;;AAEA;;;AAGA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA;;;;;;;;;;;;;;;;;;IAkBqBC,E;;;AAEjB;;;;;AAKA,oBAAsB;AAAA,QAAT3I,MAAS,QAATA,MAAS;;AAAA;;AAAA,wGAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAK0K,KAAL,GAAa;AACToN,cAAQ,IADC;AAEThL,eAAS,IAFA;AAGTnC,gBAAU;AAHD,KAAb;;AAJkB;AAUrB;;AAED;;;;;;;8BAGU;AAAA;;AAEN,aAAO,KAAK4D,IAAL;AACH;;;AADG,OAIFlN,IAJE,CAIG;AAAA,eAAM,OAAKjB,MAAL,CAAYkU,OAAZ,CAAoB/F,IAApB,EAAN;AAAA,OAJH;AAKH;;;AALG,OAQFlN,IARE,CAQG;AAAA,eAAM,OAAK0W,UAAL,EAAN;AAAA,OARH;AASH;;;AATG,OAYF1W,IAZE,CAYG;AAAA,eAAM,OAAK8J,UAAL,EAAN;AAAA,OAZH;;AAcP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAxBO,OA0BFtJ,KA1BE,CA0BI,aAAK;;AAERnB,gBAAQqH,KAAR,CAAcpH,CAAd;;AAEJ;AAEC,OAhCE,CAAP;AAkCH;;AAED;;;;;;;;;AAaA;;;;2BAIO;AAAA;;AAEH,aAAO,IAAII,OAAJ,CAAa,UAACC,OAAD,EAAUuW,MAAV,EAAqB;;AAErC;;;;AAIA,eAAK7M,KAAL,CAAWoN,MAAX,GAAoB5T,SAAS8T,cAAT,CAAwB,OAAKhY,MAAL,CAAYiJ,QAApC,CAApB;;AAEA,YAAI,CAAC,OAAKyB,KAAL,CAAWoN,MAAhB,EAAwB;;AAEpBP,iBAAOpK,MAAM,iCAAiC,OAAKnN,MAAL,CAAYiJ,QAAnD,CAAP;AACA;AAEH;;AAED;;;AAGA,eAAKyB,KAAL,CAAWoC,OAAX,GAAsBf,EAAEwC,IAAF,CAAO,KAAP,EAAc,OAAK1B,GAAL,CAASoL,aAAvB,CAAtB;AACA,eAAKvN,KAAL,CAAWC,QAAX,GAAsBoB,EAAEwC,IAAF,CAAO,KAAP,EAAc,OAAK1B,GAAL,CAASqL,UAAvB,CAAtB;;AAEA,eAAKxN,KAAL,CAAWoC,OAAX,CAAmBjI,WAAnB,CAA+B,OAAK6F,KAAL,CAAWC,QAA1C;AACA,eAAKD,KAAL,CAAWoN,MAAX,CAAkBjT,WAAlB,CAA8B,OAAK6F,KAAL,CAAWoC,OAAzC;;AAEA9L;AAEH,OA1BM,CAAP;AA4BH;;AAED;;;;;;iCAGa;;AAET;;;AAGA,UAAImX,SAAS,mBAAApF,CAAQ,EAAR,CAAb;;AAEA;;;AAGA,UAAIqF,MAAMrM,EAAEwC,IAAF,CAAO,OAAP,EAAgB,IAAhB,EAAsB;AAC5BrI,qBAAaiS,OAAOE,QAAP;AADe,OAAtB,CAAV;;AAIA;;;AAGAtM,QAAE+I,MAAF,CAAS5Q,SAASoU,IAAlB,EAAwBF,GAAxB;AAEH;;AAED;;;;;;iCAGa;AAAA;;AAET;;;AAGA,WAAK1N,KAAL,CAAWC,QAAX,CAAoB2G,gBAApB,CAAqC,OAArC,EAA8C;AAAA,eAAS,OAAKiH,eAAL,CAAqBhN,KAArB,CAAT;AAAA,OAA9C,EAAoF,KAApF;AAEH;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAwBgBA,K,EAAO;;AAEnB,UAAIiN,cAAcjN,MAAMrL,MAAxB;;AAEA;;;AAGA,UAAI;;AAEA,aAAKE,MAAL,CAAYwI,YAAZ,CAAyB6P,0BAAzB,CAAoDD,WAApD;;AAEJ;;;AAIC,OARD,CAQE,OAAO7X,CAAP,EAAU;;AAER,aAAKP,MAAL,CAAYiM,KAAZ,CAAkBqM,iBAAlB;AAEH;;AAKD;;;AAGA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,WAAKtY,MAAL,CAAYkU,OAAZ,CAAoB2C,IAApB;AACA,WAAK7W,MAAL,CAAYkU,OAAZ,CAAoB6C,IAApB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA,WAAK/W,MAAL,CAAYkU,OAAZ,CAAoBE,UAApB,CAA+BsB,IAA/B;;AAEA;;;;;AAKA,UAAI6C,iBAAiB,KAAKvY,MAAL,CAAYsI,KAAZ,CAAkBkQ,SAAlB,CAA4B,KAAKxY,MAAL,CAAYwI,YAAZ,CAAyBoD,YAAzB,CAAsCoC,IAAlE,CAArB;AAAA,UACIyK,eAAe,KAAKzY,MAAL,CAAYwI,YAAZ,CAAyBoD,YAAzB,CAAsCrC,OADzD;;AAGA,UAAIgP,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAKzY,MAAL,CAAYkU,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;AAEH;AAEJ;;;wBA3OS;;AAEN,aAAO;AACHiC,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2BnY,M;;AA+ShC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBApgBqB4I,E;;;;;;;;ACrDrB;AACA;;;AAGA;AACA,gCAAiC,sLAAsL,4CAA4C,yBAAyB,6BAA6B,oBAAoB,6BAA6B,GAAG,uBAAuB,wBAAwB,OAAO,2BAA2B,gCAAgC,OAAO,eAAe,uBAAuB,YAAY,aAAa,WAAW,iBAAiB,2BAA2B,qCAAqC,oCAAoC,kBAAkB,GAAG,uBAAuB,qBAAqB,mBAAmB,8BAA8B,OAAO,wBAAwB,uBAAuB,qBAAqB,yBAAyB,KAAK,qBAAqB,yBAAyB,+BAA+B,4BAA4B,gCAAgC,kBAAkB,mBAAmB,wBAAwB,yBAAyB,6BAA6B,4BAA4B,mBAAmB,sBAAsB,qBAAqB,uBAAuB,yBAAyB,KAAK,6BAA6B,sBAAsB,KAAK,eAAe,yBAAyB,qCAAqC,2BAA2B,GAAG,uBAAuB,qBAAqB,8BAA8B,OAAO,uBAAuB,gCAAgC,2BAA2B,oBAAoB,8BAA8B,sBAAsB,uBAAuB,8BAA8B,2BAA2B,6BAA6B,kCAAkC,+BAA+B,2BAA2B,sBAAsB,uBAAuB,0BAA0B,wDAAwD,wDAAwD,wCAAwC,2BAA2B,uBAAuB,4BAA4B,KAAK,aAAa,4BAA4B,kBAAkB,GAAG,uBAAuB,gCAAgC,KAAK,sBAAsB,uBAAuB,qBAAqB,KAAK;;AAEp1E;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD,IAAI;AACJ;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;;AAElE;AACA","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap bb65f22814c0579e597b","/**\n * @abstract\n * @class Module\n * @classdesc All modules inherits from this class.\n *\n * @typedef {Module} Module\n * @property {Object} config - Editor user settings\n * @property {Object} Editor - List of Editor modules\n */\nexport default class Module {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({ config } = {}) {\n\n if (new.target === Module) {\n\n throw new TypeError('Constructors for abstract class Module are not allowed.');\n\n }\n\n /**\n * @type {EditorConfig}\n */\n this.config = config;\n\n /**\n * @type {EditorComponents}\n */\n this.Editor = null;\n\n }\n\n /**\n * Editor modules setter\n *\n * @param Editor\n * @param Editor.modules {@link CodexEditor#moduleInstances}\n * @param Editor.config {@link CodexEditor#configuration}\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/__module.js","/**\n * Codex Editor Util\n */\nexport default class Util {\n\n /**\n * Custom logger\n *\n * @param {string} msg - message\n * @param {string} type - logging type 'log'|'warn'|'error'|'info'\n * @param {*} args - argument to log with a message\n */\n static log(msg, type, args) {\n\n type = type || 'log';\n\n if (!args) {\n\n args = msg || 'undefined';\n msg = '[codex-editor]: %o';\n\n } else {\n\n msg = '[codex-editor]: ' + msg;\n\n }\n\n try{\n\n if ( 'console' in window && window.console[ type ] ) {\n\n if ( args ) window.console[ type ]( msg, args );\n else window.console[ type ]( msg );\n\n }\n\n } catch(e) {\n // do nothing\n }\n\n }\n\n /**\n * Returns basic keycodes as constants\n * @return {{}}\n */\n static get keyCodes() {\n\n return {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n SHIFT: 16,\n CTRL: 17,\n ALT: 18,\n ESC: 27,\n SPACE: 32,\n LEFT: 37,\n UP: 38,\n DOWN: 40,\n RIGHT: 39,\n DELETE: 46,\n META: 91\n };\n\n }\n\n /**\n * @typedef {Object} ChainData\n * @property {Object} data - data that will be passed to the success or fallback\n * @property {Function} function - function's that must be called asynchronically\n */\n\n /**\n * Fires a promise sequence asyncronically\n *\n * @param {Object[]} chains - list or ChainData's\n * @param {Function} success - success callback\n * @param {Function} fallback - callback that fires in case of errors\n *\n * @return {Promise}\n */\n static sequence(chains, success = () => {}, fallback = () => {}) {\n\n return new Promise(function (resolve) {\n\n /**\n * pluck each element from queue\n * First, send resolved Promise as previous value\n * Each plugins \"prepare\" method returns a Promise, that's why\n * reduce current element will not be able to continue while can't get\n * a resolved Promise\n */\n chains.reduce(function (previousValue, currentValue, iteration) {\n\n return previousValue\n .then(() => waitNextBlock(currentValue, success, fallback))\n .then(() => {\n\n // finished\n if (iteration === chains.length - 1) {\n\n resolve();\n\n }\n\n });\n\n }, Promise.resolve());\n\n });\n\n /**\n * Decorator\n *\n * @param {ChainData} chainData\n *\n * @param {Function} successCallback\n * @param {Function} fallbackCallback\n *\n * @return {Promise}\n */\n function waitNextBlock(chainData, successCallback, fallbackCallback) {\n\n return new Promise(function (resolve) {\n\n chainData.function()\n .then(() => {\n\n successCallback(chainData.data || {});\n\n })\n .then(resolve)\n .catch(function () {\n\n fallbackCallback(chainData.data || {});\n\n // anyway, go ahead even it falls\n resolve();\n\n });\n\n });\n\n }\n\n }\n\n /**\n * Make array from array-like collection\n *\n * @param {*} collection\n *\n * @return {Array}\n */\n static array(collection) {\n\n return Array.prototype.slice.call(collection);\n\n }\n\n /**\n * Checks if object is empty\n *\n * @param {Object} object\n * @return {boolean}\n */\n static isEmpty(object) {\n\n return Object.keys(object).length === 0 && object.constructor === Object;\n\n }\n\n /**\n * Check if passed object is a Promise\n * @param {*} object - object to check\n * @return {Boolean}\n */\n static isPromise(object) {\n\n return Promise.resolve(object) === object;\n\n }\n\n /**\n * Check if passed element is contenteditable\n * @param element\n * @return {boolean}\n */\n static isContentEditable(element) {\n\n return element.contentEditable === 'true';\n\n }\n\n /**\n * Delays method execution\n *\n * @param method\n * @param timeout\n */\n static delay(method, timeout) {\n\n return function () {\n\n let context = this,\n args = arguments;\n\n window.setTimeout(() => method.apply(context, args), timeout);\n\n };\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/utils.js","/**\n * DOM manipulations helper\n */\nexport default class Dom {\n\n /**\n * Helper for making Elements with classname and attributes\n *\n * @param {string} tagName - new Element tag name\n * @param {array|string} classNames - list or name of CSS classname(s)\n * @param {Object} attributes - any attributes\n * @return {Element}\n */\n static make(tagName, classNames = null, attributes = {}) {\n\n let el = document.createElement(tagName);\n\n if ( Array.isArray(classNames) ) {\n\n el.classList.add(...classNames);\n\n } else if( classNames ) {\n\n el.classList.add(classNames);\n\n }\n\n for (let attrName in attributes) {\n\n el[attrName] = attributes[attrName];\n\n }\n\n return el;\n\n }\n\n /**\n * Creates Text Node with the passed content\n * @param {String} content - text content\n * @return {Text}\n */\n static text(content) {\n\n return document.createTextNode(content);\n\n }\n\n /**\n * Append one or several elements to the parent\n *\n * @param {Element} parent - where to append\n * @param {Element|Element[]} - element ore elements list\n */\n static append(parent, elements) {\n\n if ( Array.isArray(elements) ) {\n\n elements.forEach( el => parent.appendChild(el) );\n\n } else {\n\n parent.appendChild(elements);\n\n }\n\n }\n\n /**\n * Selector Decorator\n *\n * Returns first match\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n *\n * @returns {Element}\n */\n static find(el = document, selector) {\n\n return el.querySelector(selector);\n\n }\n\n /**\n * Selector Decorator.\n *\n * Returns all matches\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n * @returns {NodeList}\n */\n static findAll(el = document, selector) {\n\n return el.querySelectorAll(selector);\n\n }\n\n /**\n * Search for deepest node which is Leaf.\n * Leaf is the vertex that doesn't have any child nodes\n *\n * @description Method recursively goes throw the all Node until it finds the Leaf\n *\n * @param {Element} node - root Node. From this vertex we start Deep-first search {@link https://en.wikipedia.org/wiki/Depth-first_search}\n * @param {Boolean} atLast - find last text node\n * @return {Node} - it can be text Node or Element Node, so that caret will able to work with it\n */\n static getDeepestNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return an empty text node\n * But caret will not be placed in empty textNode, so we need textNode with zero-width char\n */\n if (this.isElement(node) && !this.isNativeInput(node)) {\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\n return node;\n\n }\n\n let childsLength = node.childNodes.length,\n last = childsLength - 1;\n\n if (atLast) {\n\n return this.getDeepestNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestNode(node.childNodes[0], false);\n\n }\n\n }\n\n /**\n * Check if object is DOM node\n *\n * @param {Object} node\n * @returns {boolean}\n */\n static isElement(node) {\n\n return node && typeof node === 'object' && node.nodeType && node.nodeType === Node.ELEMENT_NODE;\n\n }\n\n /**\n * Checks target if it is native input\n * @param {Element|String} target - HTML element or string\n * @return {Boolean}\n */\n static isNativeInput(target) {\n\n let nativeInputs = [\n 'INPUT',\n 'TEXTAREA'\n ];\n\n return target ? nativeInputs.includes(target.tagName) : false;\n\n }\n\n /**\n * Checks node if it is empty\n *\n * @description Method checks simple Node without any childs for emptiness\n * If you have Node with 2 or more children id depth, you better use {@link Dom#isEmpty} method\n *\n * @param {Node} node\n * @return {Boolean} true if it is empty\n */\n static isNodeEmpty(node) {\n\n let nodeText;\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n nodeText = node.value;\n\n } else {\n\n nodeText = node.textContent.replace('\\u200B', '');\n\n }\n\n return nodeText.trim().length === 0;\n\n }\n\n /**\n * checks node if it is doesn't have any child nodes\n * @param {Node} node\n * @return {boolean}\n */\n static isLeaf(node) {\n\n if (!node) {\n\n return false;\n\n }\n\n return node.childNodes.length === 0;\n\n }\n\n /**\n * breadth-first search (BFS)\n * {@link https://en.wikipedia.org/wiki/Breadth-first_search}\n *\n * @description Pushes to stack all DOM leafs and checks for emptiness\n *\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n leafs = [];\n\n if (!node) {\n\n return false;\n\n }\n\n treeWalker.push(node);\n\n while ( treeWalker.length > 0 ) {\n\n if ( this.isLeaf(node) ) {\n\n leafs.push(node);\n\n }\n\n while ( node && node.nextSibling ) {\n\n node = node.nextSibling;\n\n if (!node) continue;\n\n treeWalker.push(node);\n\n }\n\n node = treeWalker.shift();\n\n if (!node) continue;\n\n node = node.firstChild;\n treeWalker.push(node);\n\n }\n\n return leafs.every( leaf => this.isNodeEmpty(leaf)) ;\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.js","/**\n * Working with selection\n */\nexport default class Selection {\n\n /**\n * @constructor\n */\n constructor() {\n\n this.instance = null;\n this.selection = null;\n\n }\n\n /**\n * Returns window Selection\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Window/getSelection}\n * @return {Selection}\n */\n static get() {\n\n return window.getSelection();\n\n }\n\n /**\n * Returns selected anchor\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorNode}\n * @return {Node}\n */\n static getAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n /**\n * Returns selection offset according to the anchor node\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorOffset}\n * @return {Number}\n */\n static getAnchorOffset() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorOffset;\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/Selection.js","/**\n * Codex Editor\n *\n * Short Description (눈_눈;)\n * @version 2.0.0\n *\n * How to start?\n * Example:\n * new CodexEditor({\n * holderId : 'codex-editor',\n * initialBlock : 'text',\n * placeholder : 'Write your story....',\n * tools: {\n * quote: Quote,\n * anotherTool : AnotherTool\n * },\n * toolsConfig: {\n * quote: {\n * iconClassname : 'quote-icon',\n * displayInToolbox : true,\n * enableLineBreaks : true\n * },\n * anotherTool: {\n * iconClassname : 'tool-icon'\n * }\n * }\n * });\n *\n * - tools is an object: {\n * pluginName: PluginClass,\n * .....\n * }\n * - toolsConfig is an additional configuration that uses Codex Editor API\n * iconClassname - CSS classname of toolbox icon\n * displayInToolbox - if you want to see your Tool in toolbox hided in \"plus\" button, than set \"True\". By default : \"False\"\n * enableLineBreaks - by default enter creates new block that set as initialblock, but if you set this property \"True\", enter will break the lines in current block\n *\n * @author CodeX-Team \n *\n */\n\n/**\n * @typedef {CodexEditor} CodexEditor - editor class\n */\n\n/**\n * @typedef {Object} EditorConfig\n * @property {String} holderId - Element to append Editor\n * @property {Array} data - Blocks list in JSON-format\n * @property {Object} tools - Map for used Tools in format { name : Class, ... }\n * @property {String} initialBlock - This Tool will be added by default\n * @property {String} placeholder - First Block placeholder\n * @property {Object} sanitizer - @todo fill desc\n * @property {Boolean} hideToolbar - @todo fill desc\n * @property {Object} toolsConfig - tools configuration {@link Tools#ToolsConfig}\n */\n\n/**\n * Dynamically imported utils\n *\n * @typedef {Dom} $ - {@link components/dom.js}\n * @typedef {Util} _ - {@link components/utils.js}\n */\n\n'use strict';\n\n/**\n * Apply polyfills\n */\nimport 'components/polyfills';\n\n/**\n * Require Editor modules places in components/modules dir\n */\n// eslint-disable-next-line\nlet modules = editorModules.map( module => require('./components/modules/' + module ));\n\n/**\n * @class\n *\n * @classdesc CodeX Editor base class\n *\n * @property this.config - all settings\n * @property this.moduleInstances - constructed editor components\n *\n * @type {CodexEditor}\n */\nmodule.exports = class CodexEditor {\n\n /** Editor version */\n static get version() {\n\n return VERSION;\n\n }\n\n /**\n * @param {EditorConfig} config - user configuration\n *\n */\n constructor(config) {\n\n /**\n * Configuration object\n * @type {EditorConfig}\n */\n this.config = {};\n\n /**\n * @typedef {Object} EditorComponents\n * @property {BlockManager} BlockManager\n * @property {Tools} Tools\n * @property {Events} Events\n * @property {UI} UI\n * @property {Toolbar} Toolbar\n * @property {Toolbox} Toolbox\n * @property {Renderer} Renderer\n */\n this.moduleInstances = {};\n\n Promise.resolve()\n .then(() => {\n\n this.configuration = config;\n\n })\n .then(() => this.init())\n .then(() => this.start())\n .then(() => {\n\n console.log('CodeX Editor is ready!');\n\n })\n .catch(error => {\n\n console.log('CodeX Editor does not ready because of %o', error);\n\n });\n\n }\n\n /**\n * Setting for configuration\n * @param {EditorConfig} config\n */\n set configuration(config) {\n\n /**\n * Initlai block type\n * Uses in case when there is no items passed\n * @type {{type: (*), data: {text: null}}}\n */\n let initialBlock = {\n type : config.initialBlock,\n data : {}\n };\n\n this.config.holderId = config.holderId;\n this.config.placeholder = config.placeholder || 'write your story...';\n this.config.sanitizer = config.sanitizer || {\n p: true,\n b: true,\n a: true\n };\n\n this.config.hideToolbar = config.hideToolbar ? config.hideToolbar : false;\n this.config.tools = config.tools || {};\n this.config.toolsConfig = config.toolsConfig || {};\n this.config.data = config.data || {};\n\n /**\n * Initialize items to pass data to the Renderer\n */\n if (_.isEmpty(this.config.data)) {\n\n this.config.data = {};\n this.config.data.items = [ initialBlock ];\n\n } else {\n\n if (!this.config.data.items || this.config.data.items.length === 0) {\n\n this.config.data.items = [ initialBlock ];\n\n }\n\n }\n\n /**\n * If initial Block's Tool was not passed, use the first Tool in config.tools\n */\n if (!config.initialBlock) {\n\n for (this.config.initialBlock in this.config.tools) break;\n\n } else {\n\n this.config.initialBlock = config.initialBlock;\n\n }\n\n }\n\n /**\n * Returns private property\n * @returns {EditorConfig}\n */\n get configuration() {\n\n return this.config;\n\n }\n\n /**\n * Initializes modules:\n * - make and save instances\n * - configure\n */\n init() {\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n this.constructModules();\n\n /**\n * Modules configuration\n */\n this.configureModules();\n\n }\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n constructModules() {\n\n modules.forEach( Module => {\n\n try {\n\n /**\n * We use class name provided by displayName property\n *\n * On build, Babel will transform all Classes to the Functions so, name will always be 'Function'\n * To prevent this, we use 'babel-plugin-class-display-name' plugin\n * @see https://www.npmjs.com/package/babel-plugin-class-display-name\n */\n this.moduleInstances[Module.displayName] = new Module({\n config : this.configuration\n });\n\n } catch ( e ) {\n\n console.log('Module %o skipped because %o', Module, e);\n\n }\n\n });\n\n }\n\n /**\n * Modules instances configuration:\n * - pass other modules to the 'state' property\n * - ...\n */\n configureModules() {\n\n for(let name in this.moduleInstances) {\n\n /**\n * Module does not need self-instance\n */\n this.moduleInstances[name].state = this.getModulesDiff( name );\n\n }\n\n }\n\n /**\n * Return modules without passed name\n */\n getModulesDiff( name ) {\n\n let diff = {};\n\n for(let moduleName in this.moduleInstances) {\n\n /**\n * Skip module with passed name\n */\n if (moduleName === name) {\n\n continue;\n\n }\n diff[moduleName] = this.moduleInstances[moduleName];\n\n }\n\n return diff;\n\n }\n\n /**\n * Start Editor!\n *\n * Get list of modules that needs to be prepared and return a sequence (Promise)\n * @return {Promise}\n */\n start() {\n\n let prepareDecorator = module => module.prepare();\n\n return Promise.resolve()\n .then(prepareDecorator(this.moduleInstances.Tools))\n .then(prepareDecorator(this.moduleInstances.UI))\n .then(prepareDecorator(this.moduleInstances.BlockManager))\n .then(() => {\n\n return this.moduleInstances.Renderer.render(this.config.data.items);\n\n\n });\n\n }\n\n};\n\n// module.exports = (function (editor) {\n//\n// 'use strict';\n//\n// editor.version = VERSION;\n// editor.scriptPrefix = 'cdx-script-';\n//\n// var init = function () {\n//\n// editor.core = require('./modules/core');\n// editor.tools = require('./modules/tools');\n// editor.ui = require('./modules/ui');\n// editor.transport = require('./modules/transport');\n// editor.renderer = require('./modules/renderer');\n// editor.saver = require('./modules/saver');\n// editor.content = require('./modules/content');\n// editor.toolbar = require('./modules/toolbar/toolbar');\n// editor.callback = require('./modules/callbacks');\n// editor.draw = require('./modules/draw');\n// editor.caret = require('./modules/caret');\n// editor.notifications = require('./modules/notifications');\n// editor.parser = require('./modules/parser');\n// editor.sanitizer = require('./modules/sanitizer');\n// editor.listeners = require('./modules/listeners');\n// editor.destroyer = require('./modules/destroyer');\n// editor.paste = require('./modules/paste');\n//\n// };\n//\n// /**\n// * @public\n// * holds initial settings\n// */\n// editor.settings = {\n// tools : ['text', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n// holderId : 'codex-editor',\n//\n// // Type of block showing on empty editor\n// initialBlockPlugin: 'text'\n// };\n//\n// /**\n// * public\n// *\n// * Static nodes\n// */\n// editor.nodes = {\n// holder : null,\n// wrapper : null,\n// toolbar : null,\n// inlineToolbar : {\n// wrapper : null,\n// buttons : null,\n// actions : null\n// },\n// toolbox : null,\n// notifications : null,\n// plusButton : null,\n// showSettingsButton: null,\n// showTrashButton : null,\n// blockSettings : null,\n// pluginSettings : null,\n// defaultSettings : null,\n// toolbarButtons : {}, // { type : DomEl, ... }\n// redactor : null\n// };\n//\n// /**\n// * @public\n// *\n// * Output state\n// */\n// editor.state = {\n// jsonOutput : [],\n// blocks : [],\n// inputs : []\n// };\n//\n// /**\n// * @public\n// * Editor plugins\n// */\n// editor.tools = {};\n//\n// editor.start = function (userSettings) {\n//\n// init();\n//\n// editor.core.prepare(userSettings)\n//\n// // If all ok, make UI, bind events and parse initial-content\n// .then(editor.ui.prepare)\n// .then(editor.tools.prepare)\n// .then(editor.sanitizer.prepare)\n// .then(editor.paste.prepare)\n// .then(editor.transport.prepare)\n// .then(editor.renderer.makeBlocksFromData)\n// .then(editor.ui.saveInputs)\n// .catch(function (error) {\n//\n// editor.core.log('Initialization failed with error: %o', 'warn', error);\n//\n// });\n//\n// };\n//\n// return editor;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/codex.js","/**\n * Element.closest()\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\n */\nif (!Element.prototype.matches)\n Element.prototype.matches = Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n\nif (!Element.prototype.closest)\n Element.prototype.closest = function (s) {\n\n var el = this;\n\n if (!document.documentElement.contains(el)) return null;\n do {\n\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n\n } while (el !== null);\n return null;\n\n };\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/polyfills.js","var map = {\n\t\"./blockManager.js\": 7,\n\t\"./caret.js\": 9,\n\t\"./events.js\": 10,\n\t\"./listeners.js\": 11,\n\t\"./renderer.js\": 12,\n\t\"./sanitizer.js\": 13,\n\t\"./saver.js\": 15,\n\t\"./toolbar.js\": 16,\n\t\"./toolbox.js\": 17,\n\t\"./tools.js\": 18,\n\t\"./ui.js\": 19\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 6;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/modules nonrecursive [^_](blockManager.js|caret.js|events.js|listeners.js|renderer.js|sanitizer.js|saver.js|toolbar.js|toolbox.js|tools.js|ui.js)$\n// module id = 6\n// module chunks = 0","/**\n * @class BlockManager\n * @classdesc Manage editor`s blocks storage and appearance\n *\n * @module BlockManager\n *\n * @version 2.0.0\n */\n\nimport Block from '../block';\nimport Selection from '../Selection';\n\n/**\n * @typedef {BlockManager} BlockManager\n * @property {Number} currentBlockIndex - Index of current working block\n * @property {Proxy} _blocks - Proxy for Blocks instance {@link Blocks}\n */\nexport default class BlockManager extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n /**\n * Proxy for Blocks instance {@link Blocks}\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = null;\n\n /**\n * Index of current working block\n *\n * @type {number}\n * @private\n */\n this.currentBlockIndex = -1;\n\n }\n\n /**\n * Should be called after Editor.UI preparation\n * Define this._blocks property\n *\n * @returns {Promise}\n */\n prepare() {\n\n return new Promise(resolve => {\n\n let blocks = new Blocks(this.Editor.UI.nodes.redactor);\n\n /**\n * We need to use Proxy to overload set/get [] operator.\n * So we can use array-like syntax to access blocks\n *\n * @example\n * this._blocks[0] = new Block(...);\n *\n * block = this._blocks[0];\n *\n * @todo proxy the enumerate method\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = new Proxy(blocks, {\n set: Blocks.set,\n get: Blocks.get\n });\n\n resolve();\n\n });\n\n }\n\n /**\n * Creates Block instance by tool name\n *\n * @param {String} toolName - tools passed in editor config {@link EditorConfig#tools}\n * @param {Object} data - constructor params\n *\n * @return {Block}\n */\n composeBlock(toolName, data) {\n\n let toolInstance = this.Editor.Tools.construct(toolName, data),\n block = new Block(toolName, toolInstance);\n\n this.bindEvents(block);\n\n /**\n * Apply callback before inserting html\n */\n block.call('appendCallback', {});\n\n return block;\n\n }\n\n /**\n * Bind Events\n * @param {Object} block\n */\n bindEvents(block) {\n\n /**\n * keydown on block\n * @todo move to the keydown module\n */\n this.Editor.Listeners.on(block.pluginsContent, 'keydown', (event) => this.keyDownOnBlock(event));\n\n }\n\n /**\n * @todo move to the keydown module\n * @param {MouseEvent} event\n */\n keyDownOnBlock(event) {\n\n switch(event.keyCode) {\n\n case _.keyCodes.ENTER:\n this.enterPressedOnPluginsContent(event);\n break;\n case _.keyCodes.DOWN:\n case _.keyCodes.RIGHT:\n this.navigateNext();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.navigatePrevious();\n break;\n\n }\n\n }\n\n /**\n * Set's caret to the next Block\n * Before moving caret, we should check if caret position is at the end of Plugins node\n * Using {@link Dom#getDeepestNode} to get a last node and match with current selection\n */\n navigateNext() {\n\n let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getAnchorOffset() === textNodeLength) {\n\n let nextBlock = this.nextBlock;\n\n if (!nextBlock) return;\n\n this.Editor.Caret.setToBlock( nextBlock );\n\n }\n\n }\n\n /**\n * Set's caret to the previous Block\n * Before moving caret, we should check if caret position is at the end of Plugins node\n * Using {@link Dom#getDeepestNode} to get a last node and match with current selection\n */\n navigatePrevious() {\n\n let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n if (Selection.getAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getAnchorOffset() === 0) {\n\n let previousBlock = this.previousBlock;\n\n if (!previousBlock) return;\n\n this.Editor.Caret.setToBlock( previousBlock, textNodeLength, true );\n\n }\n\n }\n\n /**\n * Insert new block into _blocks\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n insert(toolName, data = {}) {\n\n\n let block = this.composeBlock(toolName, data);\n\n this._blocks[++this.currentBlockIndex] = block;\n this.Editor.Caret.setToBlock(block);\n\n }\n\n /**\n * Replace current working block\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n replace(toolName, data = {}) {\n\n let block = this.composeBlock(toolName, data);\n\n this._blocks.insert(this.currentBlockIndex, block, true);\n\n }\n\n /**\n * returns last Block\n * @return {Block}\n */\n get lastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n * Returns Block by passed index\n * @param {Number} index\n * @return {Block}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Get Block instance by html element\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`),\n index = nodes.indexOf(firstLevelBlock);\n\n if (index >= 0) {\n\n return this._blocks[index];\n\n }\n\n }\n\n /**\n * Get current Block instance\n *\n * @return {Block}\n */\n get currentBlock() {\n\n return this._blocks[this.currentBlockIndex];\n\n }\n\n /**\n * Returns next Block instance\n * @return {Block|null}\n */\n get nextBlock() {\n\n let isLastBlock = this.currentBlockIndex === (this._blocks.length - 1);\n\n if (isLastBlock) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex + 1];\n\n }\n\n /**\n * Returns previous Block instance\n * @return {Block|null}\n */\n get previousBlock() {\n\n let isFirstBlock = this.currentBlockIndex === 0;\n\n if (isFirstBlock) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex - 1];\n\n }\n\n /**\n * Get working html element\n *\n * @return {HTMLElement}\n */\n get currentNode() {\n\n return this._blocks.nodes[this.currentBlockIndex];\n\n }\n\n /**\n * Set currentBlockIndex to passed block\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes,\n firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`);\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(firstLevelBlock);\n\n /**\n * Remove previous selected Block's state\n */\n this._blocks.array.forEach( block => block.selected = false);\n\n /**\n * Mark current Block as selected\n * @type {boolean}\n */\n this.currentBlock.selected = true;\n\n }\n\n /**\n * Get array of Block instances\n *\n * @returns {Block[]} {@link Blocks#array}\n */\n get blocks() {\n\n return this._blocks.array;\n\n }\n\n /**\n * 1) Find first-level Block from passed child Node\n * 2) Mark it as current\n *\n * @param {Element|Text} childNode - look ahead from this node.\n * @throws Error - when passed Node is not included at the Block\n */\n setCurrentBlockByChildNode(childNode) {\n\n /**\n * If node is Text TextNode\n */\n if (!$.isElement(childNode)) {\n\n childNode = childNode.parentNode;\n\n }\n\n let parentFirstLevelBlock = childNode.closest(`.${Block.CSS.wrapper}`);\n\n if (parentFirstLevelBlock) {\n\n this.currentNode = parentFirstLevelBlock;\n\n } else {\n\n throw new Error('Can not find a Block from this child Node');\n\n }\n\n }\n\n}\n\n/**\n * @class Blocks\n * @classdesc Class to work with Block instances array\n *\n * @private\n *\n * @property {HTMLElement} workingArea — editor`s working node\n *\n */\nclass Blocks {\n\n /**\n * @constructor\n *\n * @param {HTMLElement} workingArea — editor`s working node\n */\n constructor(workingArea) {\n\n this.blocks = [];\n this.workingArea = workingArea;\n\n }\n\n /**\n * Push back new Block\n *\n * @param {Block} block\n */\n push(block) {\n\n this.blocks.push(block);\n this.workingArea.appendChild(block.html);\n\n }\n\n /**\n * Insert new Block at passed index\n *\n * @param {Number} index — index to insert Block\n * @param {Block} block — Block to insert\n * @param {Boolean} replace — it true, replace block on given index\n */\n insert(index, block, replace = false) {\n\n if (!this.length) {\n\n this.push(block);\n return;\n\n }\n\n if (index > this.length) {\n\n index = this.length;\n\n }\n\n if (replace) {\n\n this.blocks[index].html.remove();\n\n }\n\n let deleteCount = replace ? 1 : 0;\n\n this.blocks.splice(index, deleteCount, block);\n\n if (index > 0) {\n\n let previousBlock = this.blocks[index - 1];\n\n previousBlock.html.insertAdjacentElement('afterend', block.html);\n\n } else {\n\n let nextBlock = this.blocks[index + 1];\n\n if (nextBlock) {\n\n nextBlock.html.insertAdjacentElement('beforebegin', block.html);\n\n } else {\n\n this.workingArea.appendChild(block.html);\n\n }\n\n }\n\n }\n\n /**\n * Insert Block after passed target\n *\n * @todo decide if this method is necessary\n *\n * @param {Block} targetBlock — target after wich Block should be inserted\n * @param {Block} newBlock — Block to insert\n */\n insertAfter(targetBlock, newBlock) {\n\n let index = this.blocks.indexOf(targetBlock);\n\n this.insert(index + 1, newBlock);\n\n }\n\n /**\n * Get Block by index\n *\n * @param {Number} index — Block index\n * @returns {Block}\n */\n get(index) {\n\n return this.blocks[index];\n\n }\n\n /**\n * Return index of passed Block\n *\n * @param {Block} block\n * @returns {Number}\n */\n indexOf(block) {\n\n return this.blocks.indexOf(block);\n\n }\n\n /**\n * Get length of Block instances array\n *\n * @returns {Number}\n */\n get length() {\n\n return this.blocks.length;\n\n }\n\n /**\n * Get Block instances array\n *\n * @returns {Block[]}\n */\n get array() {\n\n return this.blocks;\n\n }\n\n /**\n * Get blocks html elements array\n *\n * @returns {HTMLElement[]}\n */\n get nodes() {\n\n return _.array(this.workingArea.children);\n\n }\n\n /**\n * Proxy trap to implement array-like setter\n *\n * @example\n * blocks[0] = new Block(...)\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — block index\n * @param {Block} block — Block to set\n * @returns {Boolean}\n */\n static set(instance, index, block) {\n\n if (isNaN(Number(index))) {\n\n return false;\n\n }\n\n instance.insert(index, block);\n\n return true;\n\n }\n\n /**\n * Proxy trap to implement array-like getter\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — Block index\n * @returns {Block|*}\n */\n static get(instance, index) {\n\n if (isNaN(Number(index))) {\n\n return instance[index];\n\n }\n\n return instance.get(index);\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/blockManager.js","/**\n *\n * @class Block\n * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool\n *\n * @property {Tool} tool — current block tool (Paragraph, for example)\n * @property {Object} CSS — block`s css classes\n *\n */\n\n/**\n * @classdesc Abstract Block class that contains Block information, Tool name and Tool class instance\n *\n * @property tool - Tool instance\n * @property html - Returns HTML content of plugin\n * @property wrapper - Div element that wraps block content with Tool's content. Has `ce-block` CSS class\n * @property contentNode - Div element that wraps Tool's content. Has `ce-block__content` CSS class\n * @property pluginsContent - HTML content that returns by Tool's render function\n */\nexport default class Block {\n\n /**\n * @constructor\n * @param {String} toolName - Tool name that passed on initialization\n * @param {Object} toolInstance — passed Tool`s instance that rendered the Block\n */\n constructor(toolName, toolInstance) {\n\n this.name = toolName;\n this.tool = toolInstance;\n this._html = this.compose();\n\n }\n\n /**\n * CSS classes for the Block\n * @return {{wrapper: string, content: string}}\n */\n static get CSS() {\n\n return {\n wrapper: 'ce-block',\n content: 'ce-block__content',\n selected: 'ce-block--selected'\n };\n\n }\n\n /**\n * Make default Block wrappers and put Tool`s content there\n * @returns {HTMLDivElement}\n */\n compose() {\n\n this.wrapper = $.make('div', Block.CSS.wrapper);\n this.contentNode = $.make('div', Block.CSS.content);\n this.pluginsContent = this.tool.render();\n\n this.contentNode.appendChild(this.pluginsContent);\n this.wrapper.appendChild(this.contentNode);\n\n return this.wrapper;\n\n }\n\n /**\n * Calls Tool's method\n *\n * Method checks tool property {MethodName}. Fires method with passes params If it is instance of Function\n *\n * @param {String} methodName\n * @param {Object} params\n */\n call(methodName, params) {\n\n /**\n * call Tool's method with the instance context\n */\n if (this.tool[methodName] && this.tool[methodName] instanceof Function) {\n\n this.tool[methodName].call(this.tool, params);\n\n }\n\n }\n\n /**\n * Get Block`s HTML\n * @returns {HTMLElement}\n */\n get html() {\n\n return this._html;\n\n }\n\n /**\n * Get Block's JSON data\n * @return {Object}\n */\n get data() {\n\n return this.save();\n\n }\n\n /**\n * Extracts data from Block\n * Groups Tool's save processing time\n * @return {Object}\n */\n save() {\n\n let extractedBlock = this.tool.save(this.pluginsContent);\n\n /** Measuring execution time*/\n let measuringStart = window.performance.now(),\n measuringEnd;\n\n return Promise.resolve(extractedBlock)\n .then((finishedExtraction) => {\n\n /** measure promise execution */\n measuringEnd = window.performance.now();\n\n return {\n tool: this.name,\n data: finishedExtraction,\n time : measuringEnd - measuringStart\n };\n\n })\n .catch(function (error) {\n\n _.log(`Saving proccess for ${this.tool.name} tool failed due to the ${error}`, 'log', 'red');\n\n });\n\n }\n\n /**\n * Uses Tool's validation method to check the correctness of output data\n * Tool's validation method is optional\n *\n * @description Method also can return data if it passed the validation\n *\n * @param {Object} data\n * @returns {Boolean|Object} valid\n */\n validateData(data) {\n\n let isValid = true;\n\n if (this.tool.validate instanceof Function) {\n\n isValid = this.tool.validate(data);\n\n }\n\n if (!isValid) {\n\n return false;\n\n }\n\n return data;\n\n }\n\n /**\n * Check block for emptiness\n * @return {Boolean}\n */\n get isEmpty() {\n\n /**\n * Allow Tool to represent decorative contentless blocks: for example \"* * *\"-tool\n * That Tools are not empty\n */\n if (this.tool.contentless) {\n\n return false;\n\n }\n\n let emptyText = $.isEmpty(this.pluginsContent),\n emptyMedia = !this.hasMedia;\n\n return emptyText && emptyMedia;\n\n }\n\n /**\n * Check if block has a media content such as images, iframes and other\n * @return {Boolean}\n */\n get hasMedia() {\n\n /**\n * This tags represents media-content\n * @type {string[]}\n */\n const mediaTags = [\n 'img',\n 'iframe',\n 'video',\n 'audio',\n 'source',\n 'input',\n 'textarea',\n 'twitterwidget'\n ];\n\n return !!this._html.querySelector(mediaTags.join(','));\n\n }\n\n /**\n * Set selected state\n * @param {Boolean} state - 'true' to select, 'false' to remove selection\n */\n set selected(state) {\n\n /**\n * We don't need to mark Block as Selected when it is not empty\n */\n if (state === true && !this.isEmpty) {\n\n this._html.classList.add(Block.CSS.selected);\n\n } else {\n\n this._html.classList.remove(Block.CSS.selected);\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/block.js","/**\n * @class Caret\n * @classdesc Contains methods for working Caret\n *\n * Uses Range methods to manipulate with caret\n *\n * @module Caret\n *\n * @version 2.0.0\n */\n\n/**\n * @typedef {Caret} Caret\n */\nimport Selection from '../Selection';\n\nexport default class Caret extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * Method gets Block instance and puts caret to the text node with offset\n * There two ways that method applies caret position:\n * - first found text node: sets at the beginning, but you can pass an offset\n * - last found text node: sets at the end of the node. Also, you can customize the behaviour\n *\n * @param {Block} block - Block class\n * @param {Number} offset - caret offset regarding to the text node\n * @param {Boolean} atEnd - put caret at the end of the text node or not\n */\n setToBlock(block, offset = 0, atEnd = false) {\n\n let element = block.pluginsContent;\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestNode(element, atEnd);\n\n if (atEnd || offset > nodeToSet.length) {\n\n offset = nodeToSet.length;\n\n }\n\n /** if found deepest node is native input */\n if ($.isNativeInput(nodeToSet)) {\n\n nodeToSet.focus();\n return;\n\n }\n\n /**\n * @todo try to fix via Promises or use querySelectorAll to not to use timeout\n */\n _.delay( () => this.set(nodeToSet, offset), 20)();\n\n this.Editor.BlockManager.currentNode = block.wrapper;\n\n }\n\n /**\n * Creates Document Range and sets caret to the element with offset\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n */\n set( element, offset = 0) {\n\n let range = document.createRange(),\n selection = Selection.get();\n\n range.setStart(element, offset);\n range.setEnd(element, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n };\n\n /**\n * Set Caret to the last Block\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let lastBlock = this.Editor.BlockManager.lastBlock;\n\n if (!lastBlock) return;\n\n /**\n * If last block is empty and it is an initialBlock, set to that.\n * Otherwise, append new empty block and set to that\n */\n if (lastBlock.isEmpty) {\n\n this.setToBlock(lastBlock);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/caret.js","/**\n * @module eventDispatcher\n *\n * Has two important methods:\n * - {Function} on - appends subscriber to the event. If event doesn't exist - creates new one\n * - {Function} emit - fires all subscribers with data\n *\n * @version 1.0.0\n *\n * @typedef {Events} Events\n * @property {Object} subscribers - all subscribers grouped by event name\n */\nexport default class Events extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n this.subscribers = {};\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Function} callback - subscriber\n */\n on(eventName, callback) {\n\n if (!(eventName in this.subscribers)) {\n\n this.subscribers[eventName] = [];\n\n }\n\n // group by events\n this.subscribers[eventName].push(callback);\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Object} data - subscribers get this data when they were fired\n */\n emit(eventName, data) {\n\n this.subscribers[eventName].reduce(function (previousData, currentHandler) {\n\n let newData = currentHandler(previousData);\n\n return newData ? newData : previousData;\n\n }, data);\n\n }\n\n /**\n * Destroyer\n * clears subsribers list\n */\n destroy() {\n\n this.subscribers = null;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/events.js","/**\n * Codex Editor Listeners module\n *\n * @module Listeners\n *\n * Module-decorator for event listeners assignment\n *\n * @author Codex Team\n * @version 2.0.0\n */\n\n/**\n * @typedef {Listeners} Listeners\n * @property {Array} allListeners\n */\n\nexport default class Listeners extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n this.allListeners = [];\n\n }\n\n /**\n * Assigns event listener on element\n *\n * @param {Element} element - DOM element that needs to be listened\n * @param {String} eventType - event type\n * @param {Function} handler - method that will be fired on event\n * @param {Boolean} useCapture - use event bubbling\n */\n on(element, eventType, handler, useCapture = false) {\n\n let assignedEventData = {\n element,\n eventType,\n handler,\n useCapture\n };\n\n let alreadyExist = this.findOne(element, eventType, handler);\n\n if (alreadyExist) return;\n\n this.allListeners.push(assignedEventData);\n element.addEventListener(eventType, handler, useCapture);\n\n }\n\n /**\n * Removes event listener from element\n *\n * @param {Element} element - DOM element that we removing listener\n * @param {String} eventType - event type\n * @param {Function} handler - remove handler, if element listens several handlers on the same event type\n * @param {Boolean} useCapture - use event bubbling\n */\n off(element, eventType, handler, useCapture = false) {\n\n let existingListeners = this.findAll(element, eventType, handler);\n\n for (let i = 0; i < existingListeners.length; i++) {\n\n let index = this.allListeners.indexOf(existingListeners[i]);\n\n if (index > 0) {\n\n this.allListeners.splice(index, 1);\n\n }\n\n }\n\n element.removeEventListener(eventType, handler, useCapture);\n\n\n }\n\n /**\n * Search methods\n *\n * byElement, byType and byHandler returns array of suitable listeners\n * one and all takes element, eventType, and handler and returns first (all) suitable listener\n */\n findByElement(element) {\n\n let listenersOnElement = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.element === element) {\n\n listenersOnElement.push(listener);\n\n }\n\n }\n\n return listenersOnElement;\n\n }\n\n findByType(eventType) {\n\n let listenersWithType = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.type === eventType) {\n\n listenersWithType.push(listener);\n\n }\n\n }\n\n return listenersWithType;\n\n }\n\n findByHandler(handler) {\n\n let listenersWithHandler = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.handler === handler) {\n\n listenersWithHandler.push(listener);\n\n }\n\n }\n\n return listenersWithHandler;\n\n }\n\n findOne(element, eventType, handler) {\n\n let foundListeners = [];\n\n if (element)\n foundListeners = this.byElement(element);\n\n if (eventType)\n foundListeners = foundListeners.concat(this.byType(eventType));\n\n if (handler)\n foundListeners = foundListeners.concat(this.byHandler(handler));\n\n return foundListeners[0];\n\n }\n\n findAll(element, eventType, handler) {\n\n let foundListeners = [];\n\n if (element)\n foundListeners = this.byElement(element);\n\n if (eventType)\n foundListeners = foundListeners.concat(this.byType(eventType));\n\n if (handler)\n foundListeners = foundListeners.concat(this.byHandler(handler));\n\n return foundListeners;\n\n }\n\n removeAll() {\n\n this.allListeners.map( (current) => {\n\n this.off(current.element, current.type, current.handler);\n\n });\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/listeners.js","/**\n * Codex Editor Renderer Module\n *\n * @module Renderer\n * @author CodeX Team\n *\n * @version 2.0.0\n */\nexport default class Renderer extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * @typedef {Object} RendererItems\n * @property {String} type - tool name\n * @property {Object} data - tool data\n */\n\n /**\n * @example\n *\n * items: [\n * {\n * type : 'paragraph',\n * data : {\n * text : 'Hello from Codex!'\n * }\n * },\n * {\n * type : 'paragraph',\n * data : {\n * text : 'Leave feedback if you like it!'\n * }\n * },\n * ]\n *\n */\n\n /**\n * Make plugin blocks from array of plugin`s data\n * @param {RendererItems[]} items\n */\n render(items) {\n\n let chainData = [];\n\n for (let i = 0; i < items.length; i++) {\n\n chainData.push({\n function: () => this.insertBlock(items[i])\n });\n\n }\n\n return _.sequence(chainData);\n\n }\n\n /**\n * Get plugin instance\n * Add plugin instance to BlockManager\n * Insert block to working zone\n *\n * @param {Object} item\n * @returns {Promise.}\n * @private\n */\n insertBlock(item) {\n\n let tool = item.type,\n data = item.data;\n\n this.Editor.BlockManager.insert(tool, data);\n\n return Promise.resolve();\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/renderer.js","/**\n * CodeX Sanitizer\n *\n * @module Sanitizer\n * Clears HTML from taint tags\n *\n * @version 2.0.0\n *\n * @example\n * Module can be used within two ways:\n * 1) When you have an instance\n * - this.Editor.Sanitizer.clean(yourTaintString);\n * 2) As static method\n * - CodexEditor.Sanitizer.clean(yourTaintString, yourCustomConfiguration);\n *\n * {@link SanitizerConfig}\n */\n\n\n/**\n * @typedef {Object} SanitizerConfig\n * @property {Object} tags - define tags restrictions\n *\n * @example\n *\n * tags : {\n * p: true,\n * a: {\n * href: true,\n * rel: \"nofollow\",\n * target: \"_blank\"\n * }\n * }\n */\nexport default class Sanitizer extends Module {\n\n /**\n * Initializes Sanitizer module\n * Sets default configuration if custom not exists\n *\n * @property {SanitizerConfig} this.defaultConfig\n * @property {HTMLJanitor} this._sanitizerInstance - Sanitizer library\n *\n * @param {SanitizerConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n // default config\n this.defaultConfig = null;\n this._sanitizerInstance = null;\n\n /** Custom configuration */\n this.sanitizerConfig = config.settings ? config.settings.sanitizer : {};\n\n /** HTML Janitor library */\n this.sanitizerInstance = require('html-janitor');\n\n }\n\n /**\n * If developer uses editor's API, then he can customize sanitize restrictions.\n * Or, sanitizing config can be defined globally in editors initialization. That config will be used everywhere\n * At least, if there is no config overrides, that API uses Default configuration\n *\n * @uses https://www.npmjs.com/package/html-janitor\n *\n * @param {HTMLJanitor} library - sanitizer extension\n */\n set sanitizerInstance(library) {\n\n this._sanitizerInstance = new library(this.defaultConfig);\n\n }\n\n /**\n * Sets sanitizer configuration. Uses default config if user didn't pass the restriction\n * @param {SanitizerConfig} config\n */\n set sanitizerConfig(config) {\n\n if (_.isEmpty(config)) {\n\n this.defaultConfig = {\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: 'nofollow'\n }\n }\n };\n\n } else {\n\n this.defaultConfig = config;\n\n }\n\n }\n\n /**\n * Cleans string from unwanted tags\n * @param {String} taintString - HTML string\n * @param {Object} customConfig - custom sanitizer configuration. Method uses default if param is empty\n * @return {String} clean HTML\n */\n clean(taintString, customConfig = {}) {\n\n if (_.isEmpty(customConfig)) {\n\n return this._sanitizerInstance.clean(taintString);\n\n } else {\n\n return Sanitizer.clean(taintString, customConfig);\n\n }\n\n\n }\n\n /**\n * Cleans string from unwanted tags\n * @static\n *\n * Method allows to use default config\n *\n * @param {String} taintString - taint string\n * @param {SanitizerConfig} customConfig - allowed tags\n *\n * @return {String} clean HTML\n */\n static clean(taintString, customConfig) {\n\n let newInstance = Sanitizer(customConfig);\n\n return newInstance.clean(taintString);\n\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/sanitizer.js","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('html-janitor', factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.HTMLJanitor = factory();\n }\n}(this, function () {\n\n /**\n * @param {Object} config.tags Dictionary of allowed tags.\n * @param {boolean} config.keepNestedBlockElements Default false.\n */\n function HTMLJanitor(config) {\n\n var tagDefinitions = config['tags'];\n var tags = Object.keys(tagDefinitions);\n\n var validConfigValues = tags\n .map(function(k) { return typeof tagDefinitions[k]; })\n .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });\n\n if(!validConfigValues) {\n throw new Error(\"The configuration was invalid\");\n }\n\n this.config = config;\n }\n\n // TODO: not exhaustive?\n var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];\n function isBlockElement(node) {\n return blockElementNames.indexOf(node.nodeName) !== -1;\n }\n\n var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];\n function isInlineElement(node) {\n return inlineElementNames.indexOf(node.nodeName) !== -1;\n }\n\n HTMLJanitor.prototype.clean = function (html) {\n var sandbox = document.createElement('div');\n sandbox.innerHTML = html;\n\n this._sanitize(sandbox);\n\n return sandbox.innerHTML;\n };\n\n HTMLJanitor.prototype._sanitize = function (parentNode) {\n var treeWalker = createTreeWalker(parentNode);\n var node = treeWalker.firstChild();\n if (!node) { return; }\n\n do {\n // Ignore nodes that have already been sanitized\n if (node._sanitized) {\n continue;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // If this text node is just whitespace and the previous or next element\n // sibling is a block element, remove it\n // N.B.: This heuristic could change. Very specific to a bug with\n // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output\n // FIXME: make this an option?\n if (node.data.trim() === ''\n && ((node.previousElementSibling && isBlockElement(node.previousElementSibling))\n || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n } else {\n continue;\n }\n }\n\n // Remove all comments\n if (node.nodeType === Node.COMMENT_NODE) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n }\n\n var isInline = isInlineElement(node);\n var containsBlockElement;\n if (isInline) {\n containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);\n }\n\n // Block elements should not be nested (e.g.

  • ...); if\n // they are, we want to unwrap the inner block element.\n var isNotTopContainer = !! parentNode.parentNode;\n var isNestedBlockElement =\n isBlockElement(parentNode) &&\n isBlockElement(node) &&\n isNotTopContainer;\n\n var nodeName = node.nodeName.toLowerCase();\n\n var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);\n\n var isInvalid = isInline && containsBlockElement;\n\n // Drop tag entirely according to the whitelist *and* if the markup\n // is invalid.\n if (isInvalid || shouldRejectNode(node, allowedAttrs)\n || (!this.config.keepNestedBlockElements && isNestedBlockElement)) {\n // Do not keep the inner text of SCRIPT/STYLE elements.\n if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {\n while (node.childNodes.length > 0) {\n parentNode.insertBefore(node.childNodes[0], node);\n }\n }\n parentNode.removeChild(node);\n\n this._sanitize(parentNode);\n break;\n }\n\n // Sanitize attributes\n for (var a = 0; a < node.attributes.length; a += 1) {\n var attr = node.attributes[a];\n\n if (shouldRejectAttr(attr, allowedAttrs, node)) {\n node.removeAttribute(attr.name);\n // Shift the array to continue looping.\n a = a - 1;\n }\n }\n\n // Sanitize children\n this._sanitize(node);\n\n // Mark node as sanitized so it's ignored in future runs\n node._sanitized = true;\n } while ((node = treeWalker.nextSibling()));\n };\n\n function createTreeWalker(node) {\n return document.createTreeWalker(node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,\n null, false);\n }\n\n function getAllowedAttrs(config, nodeName, node){\n if (typeof config.tags[nodeName] === 'function') {\n return config.tags[nodeName](node);\n } else {\n return config.tags[nodeName];\n }\n }\n\n function shouldRejectNode(node, allowedAttrs){\n if (typeof allowedAttrs === 'undefined') {\n return true;\n } else if (typeof allowedAttrs === 'boolean') {\n return !allowedAttrs;\n }\n\n return false;\n }\n\n function shouldRejectAttr(attr, allowedAttrs, node){\n var attrName = attr.name.toLowerCase();\n\n if (allowedAttrs === true){\n return false;\n } else if (typeof allowedAttrs[attrName] === 'function'){\n return !allowedAttrs[attrName](attr.value, node);\n } else if (typeof allowedAttrs[attrName] === 'undefined'){\n return true;\n } else if (allowedAttrs[attrName] === false) {\n return true;\n } else if (typeof allowedAttrs[attrName] === 'string') {\n return (allowedAttrs[attrName] !== attr.value);\n }\n\n return false;\n }\n\n return HTMLJanitor;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html-janitor/src/html-janitor.js\n// module id = 14\n// module chunks = 0","/**\n * Codex Editor Saver\n *\n * @module Saver\n * @author Codex Team\n * @version 2.0.0\n */\n\n/**\n * @typedef {Object} SavedData\n * @property {Date} time - saving proccess time\n * @property {Object} items - extracted data\n * @property {String} version - CodexEditor version\n */\n\n/**\n * @classdesc This method reduces all Blocks asyncronically and calls Block's save method to extract data\n *\n * @typedef {Saver} Saver\n * @property {Element} html - Editor HTML content\n * @property {String} json - Editor JSON output\n */\n\nexport default class Saver extends Module {\n\n /**\n * @constructor\n * @param config\n */\n constructor({config}) {\n\n super({config});\n\n this.output = null;\n this.blocksData = [];\n\n }\n\n /**\n * Composes new chain of Promises to fire them alternatelly\n * @return {SavedData}\n */\n save() {\n\n let blocks = this.Editor.BlockManager.blocks,\n chainData = [];\n\n blocks.forEach((block) => {\n\n chainData.push(block.data);\n\n });\n\n return Promise.all(chainData)\n .then((allExtractedData) => this.makeOutput(allExtractedData))\n .then((outputData) => {\n\n return outputData;\n\n });\n\n }\n\n /**\n * Creates output object with saved data, time and version of editor\n * @param {Object} allExtractedData\n * @return {SavedData}\n */\n makeOutput(allExtractedData) {\n\n let items = [],\n totalTime = 0;\n\n console.groupCollapsed('[CodexEditor saving]:');\n\n allExtractedData.forEach((extraction, index) => {\n\n /** Group process info */\n console.log(`«${extraction.tool}» saving info`, extraction);\n totalTime += extraction.time;\n items.push(extraction.data);\n\n });\n\n console.log('Total', totalTime);\n console.groupEnd();\n\n return {\n time : +new Date(),\n items : items,\n version : VERSION,\n };\n\n }\n\n}\n\n// module.exports = (function (saver) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * @public\n// * Save blocks\n// */\n// saver.save = function () {\n//\n// /** Save html content of redactor to memory */\n// editor.state.html = editor.nodes.redactor.innerHTML;\n//\n// /** Clean jsonOutput state */\n// editor.state.jsonOutput = [];\n//\n// return saveBlocks(editor.nodes.redactor.childNodes);\n//\n// };\n//\n// /**\n// * @private\n// * Save each block data\n// *\n// * @param blocks\n// * @returns {Promise.}\n// */\n// let saveBlocks = function (blocks) {\n//\n// let data = [];\n//\n// for(let index = 0; index < blocks.length; index++) {\n//\n// data.push(getBlockData(blocks[index]));\n//\n// }\n//\n// return Promise.all(data)\n// .then(makeOutput)\n// .catch(editor.core.log);\n//\n// };\n//\n// /** Save and validate block data */\n// let getBlockData = function (block) {\n//\n// return saveBlockData(block)\n// .then(validateBlockData)\n// .catch(editor.core.log);\n//\n// };\n//\n// /**\n// * @private\n// * Call block`s plugin save method and return saved data\n// *\n// * @param block\n// * @returns {Object}\n// */\n// let saveBlockData = function (block) {\n//\n// let pluginName = block.dataset.tool;\n//\n// /** Check for plugin existence */\n// if (!editor.tools[pluginName]) {\n//\n// editor.core.log(`Plugin «${pluginName}» not found`, 'error');\n// return {data: null, pluginName: null};\n//\n// }\n//\n// /** Check for plugin having save method */\n// if (typeof editor.tools[pluginName].save !== 'function') {\n//\n// editor.core.log(`Plugin «${pluginName}» must have save method`, 'error');\n// return {data: null, pluginName: null};\n//\n// }\n//\n// /** Result saver */\n// let blockContent = block.childNodes[0],\n// pluginsContent = blockContent.childNodes[0],\n// position = pluginsContent.dataset.inputPosition;\n//\n// /** If plugin wasn't available then return data from cache */\n// if ( editor.tools[pluginName].available === false ) {\n//\n// return Promise.resolve({data: codex.editor.state.blocks.items[position].data, pluginName});\n//\n// }\n//\n// return Promise.resolve(pluginsContent)\n// .then(editor.tools[pluginName].save)\n// .then(data => Object({data, pluginName}));\n//\n// };\n//\n// /**\n// * Call plugin`s validate method. Return false if validation failed\n// *\n// * @param data\n// * @param pluginName\n// * @returns {Object|Boolean}\n// */\n// let validateBlockData = function ({data, pluginName}) {\n//\n// if (!data || !pluginName) {\n//\n// return false;\n//\n// }\n//\n// if (editor.tools[pluginName].validate) {\n//\n// let result = editor.tools[pluginName].validate(data);\n//\n// /**\n// * Do not allow invalid data\n// */\n// if (!result) {\n//\n// return false;\n//\n// }\n//\n// }\n//\n// return {data, pluginName};\n//\n//\n// };\n//\n// /**\n// * Compile article output\n// *\n// * @param savedData\n// * @returns {{time: number, version, items: (*|Array)}}\n// */\n// let makeOutput = function (savedData) {\n//\n// savedData = savedData.filter(blockData => blockData);\n//\n// let items = savedData.map(blockData => Object({type: blockData.pluginName, data: blockData.data}));\n//\n// editor.state.jsonOutput = items;\n//\n// return {\n// id: editor.state.blocks.id || null,\n// time: +new Date(),\n// version: editor.version,\n// items\n// };\n//\n// };\n//\n// return saver;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/saver.js","/**\n *\n * «Toolbar» is the node that moves up/down over current block\n *\n * ______________________________________ Toolbar ____________________________________________\n * | |\n * | ..................... Content .................... ......... Block Actions .......... |\n * | . . . . |\n * | . . . [Open Settings] [Remove Block] . |\n * | . [Plus Button] [Toolbox: {Tool1}, {Tool2}] . . . |\n * | . . . [Settings Panel] . |\n * | .................................................. .................................. |\n * | |\n * |___________________________________________________________________________________________|\n *\n *\n * Toolbox — its an Element contains tools buttons. Can be shown by Plus Button.\n *\n * _______________ Toolbox _______________\n * | |\n * | [Header] [Image] [List] [Quote] ... |\n * |_______________________________________|\n *\n *\n * Settings Panel — is an Element with block settings:\n *\n * ____ Settings Panel ____\n * | ...................... |\n * | . Tool Settings . |\n * | ...................... |\n * | . Default Settings . |\n * | ...................... |\n * |________________________|\n *\n *\n * @class\n * @classdesc Toolbar module\n *\n * @typedef {Toolbar} Toolbar\n * @property {Object} nodes\n * @property {Element} nodes.wrapper - Toolbar main element\n * @property {Element} nodes.content - Zone with Plus button and toolbox.\n * @property {Element} nodes.actions - Zone with Block Settings and Remove Button\n * @property {Element} nodes.plusButton - Button that opens or closes Toolbox\n * @property {Element} nodes.toolbox - Container for tools\n * @property {Element} nodes.settingsToggler - open/close Settings Panel button\n * @property {Element} nodes.removeBlockButton - Remove Block button\n * @property {Element} nodes.settings - Settings Panel\n * @property {Element} nodes.pluginSettings - Plugin Settings section of Settings Panel\n * @property {Element} nodes.defaultSettings - Default Settings section of Settings Panel\n */\nexport default class Toolbar extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n wrapper : null,\n content : null,\n actions : null,\n\n // Content Zone\n plusButton : null,\n\n // Actions Zone\n settingsToggler : null,\n removeBlockButton: null,\n settings: null,\n\n // Settings Zone: Plugin Settings and Default Settings\n pluginSettings: null,\n defaultSettings: null,\n };\n\n }\n\n /**\n * CSS styles\n * @return {Object}\n * @constructor\n */\n static get CSS() {\n\n return {\n toolbar: 'ce-toolbar',\n content: 'ce-toolbar__content',\n actions: 'ce-toolbar__actions',\n\n toolbarOpened: 'ce-toolbar--opened',\n\n // Content Zone\n plusButton: 'ce-toolbar__plus',\n plusButtonHidden: 'ce-toolbar__plus--hidden',\n\n // Actions Zone\n settingsToggler: 'ce-toolbar__settings-btn',\n removeBlockButton: 'ce-toolbar__remove-btn',\n\n // Settings Panel\n settings: 'ce-settings',\n defaultSettings: 'ce-settings_default',\n pluginSettings: 'ce-settings_plugin',\n };\n\n }\n\n /**\n * Makes toolbar\n */\n make() {\n\n this.nodes.wrapper = $.make('div', Toolbar.CSS.toolbar);\n\n /**\n * Make Content Zone and Actions Zone\n */\n ['content', 'actions'].forEach( el => {\n\n this.nodes[el] = $.make('div', Toolbar.CSS[el]);\n $.append(this.nodes.wrapper, this.nodes[el]);\n\n });\n\n\n /**\n * Fill Content Zone:\n * - Plus Button\n * - Toolbox\n */\n this.nodes.plusButton = $.make('div', Toolbar.CSS.plusButton);\n $.append(this.nodes.content, this.nodes.plusButton);\n this.nodes.plusButton.addEventListener('click', event => this.plusButtonClicked(event), false);\n\n\n /**\n * Make a Toolbox\n */\n this.Editor.Toolbox.make();\n\n /**\n * Fill Actions Zone:\n * - Settings Toggler\n * - Remove Block Button\n * - Settings Panel\n */\n this.nodes.settingsToggler = $.make('span', Toolbar.CSS.settingsToggler);\n this.nodes.removeBlockButton = this.makeRemoveBlockButton();\n\n $.append(this.nodes.actions, [this.nodes.settingsToggler, this.nodes.removeBlockButton]);\n\n /**\n * Make and append Settings Panel\n */\n this.makeBlockSettingsPanel();\n\n /**\n * Append toolbar to the Editor\n */\n $.append(this.Editor.UI.nodes.wrapper, this.nodes.wrapper);\n\n }\n\n /**\n * Panel with block settings with 2 sections:\n *\n * @return {Element}\n */\n makeBlockSettingsPanel() {\n\n this.nodes.settings = $.make('div', Toolbar.CSS.settings);\n\n this.nodes.pluginSettings = $.make('div', Toolbar.CSS.pluginSettings);\n this.nodes.defaultSettings = $.make('div', Toolbar.CSS.defaultSettings);\n\n $.append(this.nodes.settings, [this.nodes.pluginSettings, this.nodes.defaultSettings]);\n $.append(this.nodes.actions, this.nodes.settings);\n\n }\n\n /**\n * Makes Remove Block button, and confirmation panel\n * @return {Element} wrapper with button and panel\n */\n makeRemoveBlockButton() {\n\n /**\n * @todo add confirmation panel and handlers\n * @see {@link settings#makeRemoveBlockButton}\n */\n return $.make('span', Toolbar.CSS.removeBlockButton);\n\n }\n\n /**\n * Move Toolbar to the Current Block\n */\n move() {\n\n /** Close Toolbox when we move toolbar */\n this.Editor.Toolbox.close();\n\n let currentNode = this.Editor.BlockManager.currentNode;\n\n /**\n * If no one Block selected as a Current\n */\n if (!currentNode) {\n\n return;\n\n }\n\n /**\n * @todo Compute dynamically on prepare\n * @type {number}\n */\n const defaultToolbarHeight = 49;\n const defaultOffset = 34;\n\n var newYCoordinate = currentNode.offsetTop - (defaultToolbarHeight / 2) + defaultOffset;\n\n this.nodes.wrapper.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n // editor.toolbar.settings.hideRemoveActions();\n\n }\n\n /**\n * Open Toolbar with Plus Button\n */\n open() {\n\n this.nodes.wrapper.classList.add(Toolbar.CSS.toolbarOpened);\n\n }\n\n /**\n * Close the Toolbar\n */\n close() {\n\n this.nodes.wrapper.classList.remove(Toolbar.CSS.toolbarOpened);\n\n }\n\n /**\n * Plus Button public methods\n * @return {{hide: function(): void, show: function(): void}}\n */\n get plusButton() {\n\n return {\n hide: () => this.nodes.plusButton.classList.add(Toolbar.CSS.plusButtonHidden),\n show: () => this.nodes.plusButton.classList.remove(Toolbar.CSS.plusButtonHidden)\n };\n\n }\n\n /**\n * Handler for Plus Button\n * @param {MouseEvent} event\n */\n plusButtonClicked(event) {\n\n this.Editor.Toolbox.toggle();\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar.js","/**\n * @class Toolbox\n * @classdesc Holder for Tools\n *\n * @typedef {Toolbox} Toolbox\n * @property {Boolean} opened - opening state\n * @property {Object} nodes - Toolbox nodes\n * @property {Object} CSS - CSS class names\n *\n */\nexport default class Toolbox extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n toolbox: null,\n buttons: []\n };\n\n /**\n * Opening state\n * @type {boolean}\n */\n this.opened = false;\n\n }\n\n /**\n * CSS styles\n * @return {{toolbox: string, toolboxButton: string, toolboxOpened: string}}\n */\n static get CSS() {\n\n return {\n toolbox: 'ce-toolbox',\n toolboxButton: 'ce-toolbox__button',\n toolboxOpened: 'ce-toolbox--opened',\n };\n\n }\n\n /**\n * Makes the Toolbox\n */\n make() {\n\n this.nodes.toolbox = $.make('div', Toolbox.CSS.toolbox);\n $.append(this.Editor.Toolbar.nodes.content, this.nodes.toolbox);\n\n this.addTools();\n\n }\n\n /**\n * Iterates available tools and appends them to the Toolbox\n */\n addTools() {\n\n let tools = this.Editor.Tools.toolsAvailable;\n\n for (let toolName in tools) {\n\n this.addTool(toolName, tools[toolName]);\n\n }\n\n }\n\n /**\n * Append Tool to the Toolbox\n *\n * @param {string} toolName - tool name\n * @param {Tool} tool - tool class\n */\n addTool(toolName, tool) {\n\n if (tool.displayInToolbox && !tool.iconClassName) {\n\n _.log('Toolbar icon class name is missed. Tool %o skipped', 'warn', toolName);\n return;\n\n }\n\n /**\n * @todo Add checkup for the render method\n */\n // if (typeof tool.render !== 'function') {\n //\n // _.log('render method missed. Tool %o skipped', 'warn', tool);\n // return;\n //\n // }\n\n /**\n * Skip tools that pass 'displayInToolbox=false'\n */\n if (!tool.displayInToolbox) {\n\n return;\n\n }\n\n let button = $.make('li', [Toolbox.CSS.toolboxButton, tool.iconClassName], {\n title: toolName\n });\n\n /**\n * Save tool's name in the button data-name\n */\n button.dataset.name = toolName;\n\n $.append(this.nodes.toolbox, button);\n\n this.nodes.toolbox.appendChild(button);\n this.nodes.buttons.push(button);\n\n /**\n * @todo add event with module Listeners\n */\n // this.Editor.Listeners.add();\n button.addEventListener('click', event => {\n\n this.buttonClicked(event);\n\n }, false);\n\n }\n\n /**\n * Toolbox button click listener\n * 1) if block is empty -> replace\n * 2) if block is not empty -> add new block below\n *\n * @param {MouseEvent} event\n */\n buttonClicked(event) {\n\n let toolButton = event.target,\n toolName = toolButton.dataset.name,\n tool = this.Editor.Tools.toolClasses[toolName];\n\n /**\n * @type {Block}\n */\n let currentBlock = this.Editor.BlockManager.currentBlock;\n\n /**\n * We do replace if:\n * - block is empty\n * - block is not irreplaceable\n * @type {Array}\n */\n if (!tool.irreplaceable && currentBlock.isEmpty) {\n\n this.Editor.BlockManager.replace(toolName);\n\n } else {\n\n this.Editor.BlockManager.insert(toolName);\n\n }\n\n /**\n * @todo set caret to the new block\n */\n\n // window.setTimeout(function () {\n\n /** Set caret to current block */\n // editor.caret.setToBlock(currentInputIndex);\n\n // }, 10);\n\n /**\n * Move toolbar when node is changed\n */\n this.Editor.Toolbar.move();\n\n }\n\n /**\n * Open Toolbox with Tools\n */\n open() {\n\n this.nodes.toolbox.classList.add(Toolbox.CSS.toolboxOpened);\n this.opened = true;\n\n }\n\n /**\n * Close Toolbox\n */\n close() {\n\n this.nodes.toolbox.classList.remove(Toolbox.CSS.toolboxOpened);\n this.opened = false;\n\n }\n\n /**\n * Close Toolbox\n */\n toggle() {\n\n if (!this.opened) {\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbox.js","/**\n * @module Codex Editor Tools Submodule\n *\n * Creates Instances from Plugins and binds external config to the instances\n */\n\n/**\n * Each Tool must contain the following important objects:\n *\n * @typedef {Object} ToolConfig {@link docs/tools.md}\n * @property {String} iconClassname - this a icon in toolbar\n * @property {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @property {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n * @property render @todo add description\n * @property save @todo add description\n * @property settings @todo add description\n * @property validate - method that validates output data before saving\n */\n\n/**\n * @typedef {Function} Tool {@link docs/tools.md}\n * @property {Boolean} displayInToolbox - By default, tools won't be added in the Toolbox. Pass true to add.\n * @property {String} iconClassName - CSS class name for the Toolbox button\n * @property {Boolean} irreplaceable - Toolbox behaviour: replace or add new block below\n * @property render\n * @property save\n * @property settings\n * @property validate\n *\n * @todo update according to current API\n * @todo describe Tool in the {@link docs/tools.md}\n */\n\n/**\n * Class properties:\n *\n * @typedef {Tools} Tools\n * @property {Tools[]} toolsAvailable - available Tools\n * @property {Tools[]} toolsUnavailable - unavailable Tools\n * @property {Object} toolsClasses - all classes\n * @property {EditorConfig} config - Editor config\n */\nexport default class Tools extends Module {\n\n /**\n * Returns available Tools\n * @return {Tool[]}\n */\n get available() {\n\n return this.toolsAvailable;\n\n }\n\n /**\n * Returns unavailable Tools\n * @return {Tool[]}\n */\n get unavailable() {\n\n return this.toolsUnavailable;\n\n }\n\n /**\n * Static getter for default Tool config fields\n *\n * @usage Tools.defaultConfig.displayInToolbox\n * @return {ToolConfig}\n */\n static get defaultConfig() {\n\n return {\n iconClassName : '',\n displayInToolbox : false,\n enableLineBreaks : false,\n irreplaceable : false\n };\n\n }\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n /**\n * Map {name: Class, ...} where:\n * name — block type name in JSON. Got from EditorConfig.tools keys\n * @type {Object}\n */\n this.toolClasses = {};\n\n /**\n * Available tools list\n * {name: Class, ...}\n * @type {Object}\n */\n this.toolsAvailable = {};\n\n /**\n * Tools that rejected a prepare method\n * {name: Class, ... }\n * @type {Object}\n */\n this.toolsUnavailable = {};\n\n }\n\n /**\n * Creates instances via passed or default configuration\n * @return {Promise}\n */\n prepare() {\n\n if (!this.config.hasOwnProperty('tools')) {\n\n return Promise.reject(\"Can't start without tools\");\n\n }\n\n for(let toolName in this.config.tools) {\n\n this.toolClasses[toolName] = this.config.tools[toolName];\n\n }\n\n /**\n * getting classes that has prepare method\n */\n let sequenceData = this.getListOfPrepareFunctions();\n\n /**\n * if sequence data contains nothing then resolve current chain and run other module prepare\n */\n if (sequenceData.length === 0) {\n\n return Promise.resolve();\n\n }\n\n /**\n * to see how it works {@link Util#sequence}\n */\n return _.sequence(sequenceData, (data) => {\n\n this.success(data);\n\n }, (data) => {\n\n this.fallback(data);\n\n });\n\n }\n\n /**\n * Binds prepare function of plugins with user or default config\n * @return {Array} list of functions that needs to be fired sequentially\n */\n getListOfPrepareFunctions() {\n\n let toolPreparationList = [];\n\n for(let toolName in this.toolClasses) {\n\n let toolClass = this.toolClasses[toolName];\n\n if (typeof toolClass.prepare === 'function') {\n\n toolPreparationList.push({\n function : toolClass.prepare,\n data : {\n toolName\n }\n });\n\n } else {\n\n /**\n * If Tool hasn't a prepare method, mark it as available\n */\n this.toolsAvailable[toolName] = toolClass;\n\n }\n\n }\n\n return toolPreparationList;\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to available list\n */\n success(data) {\n\n this.toolsAvailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to unavailable list\n */\n fallback(data) {\n\n this.toolsUnavailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * Return tool`a instance\n *\n * @param {String} tool — tool name\n * @param {Object} data — initial data\n *\n * @todo throw exceptions if tool doesnt exist\n *\n */\n construct(tool, data) {\n\n let plugin = this.toolClasses[tool],\n config = this.config.toolsConfig[tool];\n\n if (!config) {\n\n config = this.defaultConfig;\n\n }\n\n let instance = new plugin(data, config);\n\n return instance;\n\n }\n\n /**\n * Check if passed Tool is an instance of Initial Block Tool\n * @param {Tool} tool - Tool to check\n * @return {Boolean}\n */\n isInitial(tool) {\n\n return tool instanceof this.available[this.config.initialBlock];\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/tools.js","/**\n * Module UI\n *\n * @type {UI}\n */\n// let className = {\n\n/**\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\n */\n// BLOCK_CLASSNAME : 'ce-block',\n\n/**\n * @const {String} wrapper for plugins content\n */\n// BLOCK_CONTENT : 'ce-block__content',\n\n/**\n * @const {String} BLOCK_STRETCHED - makes block stretched\n */\n// BLOCK_STRETCHED : 'ce-block--stretched',\n\n/**\n * @const {String} BLOCK_HIGHLIGHTED - adds background\n */\n// BLOCK_HIGHLIGHTED : 'ce-block--focused',\n\n/**\n * @const {String} - for all default settings\n */\n// SETTINGS_ITEM : 'ce-settings__item'\n// };\n\n// import Block from '../block';\n\n/**\n * @class\n *\n * @classdesc Makes CodeX Editor UI:\n * \n * \n * \n * \n * \n *\n * @typedef {UI} UI\n * @property {EditorConfig} config - editor configuration {@link CodexEditor#configuration}\n * @property {Object} Editor - available editor modules {@link CodexEditor#moduleInstances}\n * @property {Object} nodes -\n * @property {Element} nodes.holder - element where we need to append redactor\n * @property {Element} nodes.wrapper - \n * @property {Element} nodes.redactor - \n */\nexport default class UI extends Module {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n holder: null,\n wrapper: null,\n redactor: null\n };\n\n }\n\n /**\n * Making main interface\n */\n prepare() {\n\n return this.make()\n /**\n * Make toolbar\n */\n .then(() => this.Editor.Toolbar.make())\n /**\n * Load and append CSS\n */\n .then(() => this.loadStyles())\n /**\n * Bind events for the UI elements\n */\n .then(() => this.bindEvents())\n\n /** Make container for inline toolbar */\n // .then(makeInlineToolbar_)\n\n /** Add inline toolbar tools */\n // .then(addInlineToolbarTools_)\n\n /** Draw wrapper for notifications */\n // .then(makeNotificationHolder_)\n\n /** Add eventlisteners to redactor elements */\n // .then(bindEvents_)\n\n .catch(e => {\n\n console.error(e);\n\n // editor.core.log(\"Can't draw editor interface\");\n\n });\n\n }\n\n /**\n * CodeX Editor UI CSS class names\n * @return {{editorWrapper: string, editorZone: string, block: string}}\n */\n get CSS() {\n\n return {\n editorWrapper : 'codex-editor',\n editorZone : 'codex-editor__redactor',\n };\n\n }\n\n /**\n * Makes CodeX Editor interface\n * @return {Promise}\n */\n make() {\n\n return new Promise( (resolve, reject) => {\n\n /**\n * Element where we need to append CodeX Editor\n * @type {Element}\n */\n this.nodes.holder = document.getElementById(this.config.holderId);\n\n if (!this.nodes.holder) {\n\n reject(Error(\"Holder wasn't found by ID: #\" + this.config.holderId));\n return;\n\n }\n\n /**\n * Create and save main UI elements\n */\n this.nodes.wrapper = $.make('div', this.CSS.editorWrapper);\n this.nodes.redactor = $.make('div', this.CSS.editorZone);\n\n this.nodes.wrapper.appendChild(this.nodes.redactor);\n this.nodes.holder.appendChild(this.nodes.wrapper);\n\n resolve();\n\n });\n\n }\n\n /**\n * Appends CSS\n */\n loadStyles() {\n\n /**\n * Load CSS\n */\n let styles = require('../../styles/main.css');\n\n /**\n * Make tag\n */\n let tag = $.make('style', null, {\n textContent: styles.toString()\n });\n\n /**\n * Append styles\n */\n $.append(document.head, tag);\n\n }\n\n /**\n * Bind events on the CodeX Editor interface\n */\n bindEvents() {\n\n /**\n * @todo bind events with the Listeners module\n */\n this.nodes.redactor.addEventListener('click', event => this.redactorClicked(event), false );\n\n }\n\n /**\n * All clicks on the redactor zone\n *\n * @param {MouseEvent} event\n *\n * @description\n * 1. Save clicked Block as a current {@link BlockManager#currentNode}\n * it uses for the following:\n * - add CSS modifier for the selected Block\n * - on Enter press, we make a new Block under that\n *\n * 2. Move and show the Toolbar\n *\n * 3. Set a Caret\n *\n * 4. By clicks on the Editor's bottom zone:\n * - if last Block is empty, set a Caret to this\n * - otherwise, add a new empty Block and set a Caret to that\n *\n * 5. Hide the Inline Toolbar\n *\n * @see selectClickedBlock\n *\n */\n redactorClicked(event) {\n\n let clickedNode = event.target;\n\n /**\n * Select clicked Block as Current\n */\n try {\n\n this.Editor.BlockManager.setCurrentBlockByChildNode(clickedNode);\n\n /**\n * If clicked outside first-level Blocks, set Caret to the last empty Block\n */\n\n } catch (e) {\n\n this.Editor.Caret.setToTheLastBlock();\n\n }\n\n\n\n\n /**\n * @todo hide the Inline Toolbar\n */\n // var selectedText = editor.toolbar.inline.getSelectionText(),\n // firstLevelBlock;\n\n /** If selection range took off, then we hide inline toolbar */\n // if (selectedText.length === 0) {\n\n // editor.toolbar.inline.close();\n\n // }\n\n /**\n *\n\n /** Update current input index in memory when caret focused into existed input */\n // if (event.target.contentEditable == 'true') {\n //\n // editor.caret.saveCurrentInputIndex();\n //\n // }\n\n // if (editor.content.currentNode === null) {\n //\n // /**\n // * If inputs in redactor does not exits, then we put input index 0 not -1\n // */\n // var indexOfLastInput = editor.state.inputs.length > 0 ? editor.state.inputs.length - 1 : 0;\n //\n // /** If we have any inputs */\n // if (editor.state.inputs.length) {\n //\n // /** getting firstlevel parent of input */\n // firstLevelBlock = editor.content.getFirstLevelBlock(editor.state.inputs[indexOfLastInput]);\n //\n // }\n //\n // /** If input is empty, then we set caret to the last input */\n // if (editor.state.inputs.length && editor.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == editor.settings.initialBlockPlugin) {\n //\n // editor.caret.setToBlock(indexOfLastInput);\n //\n // } else {\n //\n // /** Create new input when caret clicked in redactors area */\n // var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n //\n // editor.content.insertBlock({\n // type : NEW_BLOCK_TYPE,\n // block : editor.tools[NEW_BLOCK_TYPE].render()\n // });\n //\n // /** If there is no inputs except inserted */\n // if (editor.state.inputs.length === 1) {\n //\n // editor.caret.setToBlock(indexOfLastInput);\n //\n // } else {\n //\n // /** Set caret to this appended input */\n // editor.caret.setToNextBlock(indexOfLastInput);\n //\n // }\n //\n // }\n //\n // } else {\n //\n // /** Close all panels */\n // editor.toolbar.settings.close();\n // editor.toolbar.toolbox.close();\n //\n // }\n //\n /**\n * Move toolbar and open\n */\n this.Editor.Toolbar.move();\n this.Editor.Toolbar.open();\n //\n // var inputIsEmpty = !editor.content.currentNode.textContent.trim(),\n // currentNodeType = editor.content.currentNode.dataset.tool,\n // isInitialType = currentNodeType == editor.settings.initialBlockPlugin;\n //\n //\n\n /**\n * Hide the Plus Button\n * */\n this.Editor.Toolbar.plusButton.hide();\n\n /**\n * Show the Plus Button if:\n * - Block is an initial-block (Text)\n * - Block is empty\n */\n let isInitialBlock = this.Editor.Tools.isInitial(this.Editor.BlockManager.currentBlock.tool),\n isEmptyBlock = this.Editor.BlockManager.currentBlock.isEmpty;\n\n if (isInitialBlock && isEmptyBlock) {\n\n this.Editor.Toolbar.plusButton.show();\n\n }\n\n }\n\n}\n\n// /**\n// * Codex Editor UI module\n// *\n// * @author Codex Team\n// * @version 1.2.0\n// */\n//\n// module.exports = (function (ui) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * Basic editor classnames\n// */\n// ui.prepare = function () {\n//\n\n//\n// };\n//\n// /** Draw notifications holder */\n// var makeNotificationHolder_ = function () {\n//\n// /** Append block with notifications to the document */\n// editor.nodes.notifications = editor.notifications.createHolder();\n//\n// };\n//\n//\n// var addInlineToolbarTools_ = function () {\n//\n// var tools = {\n//\n// bold: {\n// icon : 'ce-icon-bold',\n// command : 'bold'\n// },\n//\n// italic: {\n// icon : 'ce-icon-italic',\n// command : 'italic'\n// },\n//\n// link: {\n// icon : 'ce-icon-link',\n// command : 'createLink'\n// }\n// };\n//\n// var toolButton,\n// tool;\n//\n// for(var name in tools) {\n//\n// tool = tools[name];\n//\n// toolButton = editor.draw.toolbarButtonInline(name, tool.icon);\n//\n// editor.nodes.inlineToolbar.buttons.appendChild(toolButton);\n// /**\n// * Add callbacks to this buttons\n// */\n// editor.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n//\n// }\n//\n// };\n//\n// /**\n// * @private\n// * Bind editor UI events\n// */\n// var bindEvents_ = function () {\n//\n// editor.core.log('ui.bindEvents fired', 'info');\n//\n// // window.addEventListener('error', function (errorMsg, url, lineNumber) {\n// // editor.notifications.errorThrown(errorMsg, event);\n// // }, false );\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keydown', editor.callback.globalKeydown, false);\n//\n// /** All keydowns on Redactor zone */\n// editor.listeners.add(editor.nodes.redactor, 'keydown', editor.callback.redactorKeyDown, false);\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keyup', editor.callback.globalKeyup, false );\n//\n// /**\n// * Mouse click to radactor\n// */\n// editor.listeners.add(editor.nodes.redactor, 'click', editor.callback.redactorClicked, false );\n//\n// /**\n// * Clicks to the Plus button\n// */\n// editor.listeners.add(editor.nodes.plusButton, 'click', editor.callback.plusButtonClicked, false);\n//\n// /**\n// * Clicks to SETTINGS button in toolbar\n// */\n// editor.listeners.add(editor.nodes.showSettingsButton, 'click', editor.callback.showSettingsButtonClicked, false );\n//\n// /** Bind click listeners on toolbar buttons */\n// for (var button in editor.nodes.toolbarButtons) {\n//\n// editor.listeners.add(editor.nodes.toolbarButtons[button], 'click', editor.callback.toolbarButtonClicked, false);\n//\n// }\n//\n// };\n//\n// ui.addBlockHandlers = function (block) {\n//\n// if (!block) return;\n//\n// /**\n// * Block keydowns\n// */\n// editor.listeners.add(block, 'keydown', editor.callback.blockKeydown, false);\n//\n// /**\n// * Pasting content from another source\n// * We have two type of sanitization\n// * First - uses deep-first search algorithm to get sub nodes,\n// * sanitizes whole Block_content and replaces cleared nodes\n// * This method is deprecated\n// * Method is used in editor.callback.blockPaste(event)\n// *\n// * Secont - uses Mutation observer.\n// * Observer \"observe\" DOM changes and send changings to callback.\n// * Callback gets changed node, not whole Block_content.\n// * Inserted or changed node, which we've gotten have been cleared and replaced with diry node\n// *\n// * Method is used in editor.callback.blockPasteViaSanitize(event)\n// *\n// * @uses html-janitor\n// * @example editor.callback.blockPasteViaSanitize(event), the second method.\n// *\n// */\n// editor.listeners.add(block, 'paste', editor.paste.blockPasteCallback, false);\n//\n// /**\n// * Show inline toolbar for selected text\n// */\n// editor.listeners.add(block, 'mouseup', editor.toolbar.inline.show, false);\n// editor.listeners.add(block, 'keyup', editor.toolbar.inline.show, false);\n//\n// };\n//\n// /** getting all contenteditable elements */\n// ui.saveInputs = function () {\n//\n// var redactor = editor.nodes.redactor;\n//\n// editor.state.inputs = [];\n//\n// /** Save all inputs in global variable state */\n// var inputs = redactor.querySelectorAll('[contenteditable], input, textarea');\n//\n// Array.prototype.map.call(inputs, function (current) {\n//\n// if (!current.type || current.type == 'text' || current.type == 'textarea') {\n//\n// editor.state.inputs.push(current);\n//\n// }\n//\n// });\n//\n// };\n//\n// /**\n// * Adds first initial block on empty redactor\n// */\n// ui.addInitialBlock = function () {\n//\n// var initialBlockType = editor.settings.initialBlockPlugin,\n// initialBlock;\n//\n// if ( !editor.tools[initialBlockType] ) {\n//\n// editor.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n// return;\n//\n// }\n//\n// initialBlock = editor.tools[initialBlockType].render();\n//\n// initialBlock.setAttribute('data-placeholder', editor.settings.placeholder);\n//\n// editor.content.insertBlock({\n// type : initialBlockType,\n// block : initialBlock\n// });\n//\n// editor.content.workingNodeChanged(initialBlock);\n//\n// };\n//\n// ui.setInlineToolbarButtonBehaviour = function (button, type) {\n//\n// editor.listeners.add(button, 'mousedown', function (event) {\n//\n// editor.toolbar.inline.toolClicked(event, type);\n//\n// }, false);\n//\n// };\n//\n// return ui;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/ui.js","exports = module.exports = require(\"../../node_modules/css-loader/lib/css-base.js\")(undefined);\n// imports\n\n\n// module\nexports.push([module.id, \":root {\\n\\n /**\\n * Toolbar buttons\\n */\\n\\n /**\\n * Block content width\\n */\\n\\n /**\\n * Toolbar Plus Button and Toolbox buttons height and width\\n */\\n\\n}\\n/**\\n* Editor wrapper\\n*/\\n.codex-editor {\\n position: relative;\\n border: 1px solid #ccc;\\n padding: 10px;\\n box-sizing: border-box;\\n}\\n.codex-editor .hide {\\n display: none;\\n }\\n.codex-editor__redactor {\\n padding-bottom: 300px;\\n }\\n.ce-toolbar {\\n position: absolute;\\n left: 0;\\n right: 0;\\n top: 0;\\n /*opacity: 0;*/\\n /*visibility: hidden;*/\\n transition: opacity 100ms ease;\\n will-change: opacity, transform;\\n display: none;\\n}\\n.ce-toolbar--opened {\\n display: block;\\n /*opacity: 1;*/\\n /*visibility: visible;*/\\n }\\n.ce-toolbar__content {\\n max-width: 650px;\\n margin: 0 auto;\\n position: relative;\\n }\\n.ce-toolbar__plus {\\n position: absolute;\\n left: calc(-34px - 10px);\\n display: inline-block;\\n background-color: #eff2f5;\\n width: 34px;\\n height: 34px;\\n line-height: 34px;\\n text-align: center;\\n border-radius: 50%\\n }\\n.ce-toolbar__plus::after {\\n content: '+';\\n font-size: 26px;\\n display: block;\\n margin-top: -2px;\\n margin-right: -2px;\\n\\n}\\n.ce-toolbar__plus--hidden {\\n display: none;\\n\\n}\\n.ce-toolbox {\\n visibility: hidden;\\n transition: opacity 100ms ease;\\n will-change: opacity;\\n}\\n.ce-toolbox--opened {\\n opacity: 1;\\n visibility: visible;\\n }\\n.ce-toolbox__button {\\n display: inline-block;\\n list-style: none;\\n margin: 0;\\n background: #eff2f5;\\n width: 34px;\\n height: 34px;\\n border-radius: 30px;\\n overflow: hidden;\\n text-align: center;\\n line-height: 34px\\n }\\n.ce-toolbox__button::before {\\n content: attr(title);\\n font-size: 22px;\\n font-weight: 500;\\n letter-spacing: 1em;\\n -webkit-font-feature-settings: \\\"smcp\\\", \\\"c2sc\\\";\\n font-feature-settings: \\\"smcp\\\", \\\"c2sc\\\";\\n font-variant-caps: all-small-caps;\\n padding-left: 11.5px;\\n margin-top: -1px;\\n display: inline-block;\\n\\n}\\n.ce-block {\\n border: 1px dotted #ccc;\\n margin: 2px 0;\\n}\\n.ce-block--selected {\\n background-color: #eff2f5;\\n }\\n.ce-block__content {\\n max-width: 650px;\\n margin: 0 auto;\\n }\\n\", \"\"]);\n\n// exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/styles/main.css\n// module id = 20\n// module chunks = 0","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t// when a module is imported multiple times with different media queries.\n\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/css-loader/lib/css-base.js\n// module id = 21\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/src/components/modules/_listeners.js b/src/components/modules/_listeners.js deleted file mode 100644 index 6b353ae2..00000000 --- a/src/components/modules/_listeners.js +++ /dev/null @@ -1,192 +0,0 @@ -/** - * Codex Editor Listeners module - * - * @author Codex Team - * @version 1.0 - */ - -/** - * Module-decorator for event listeners assignment - */ -module.exports = function (listeners) { - - var allListeners = []; - - /** - * Search methods - * - * byElement, byType and byHandler returns array of suitable listeners - * one and all takes element, eventType, and handler and returns first (all) suitable listener - * - */ - listeners.search = function () { - - var byElement = function (element, context) { - - var listenersOnElement = []; - - context = context || allListeners; - - for (var i = 0; i < context.length; i++) { - - var listener = context[i]; - - if (listener.element === element) { - - listenersOnElement.push(listener); - - } - - } - - return listenersOnElement; - - }; - - var byType = function (eventType, context) { - - var listenersWithType = []; - - context = context || allListeners; - - for (var i = 0; i < context.length; i++) { - - var listener = context[i]; - - if (listener.type === eventType) { - - listenersWithType.push(listener); - - } - - } - - return listenersWithType; - - }; - - var byHandler = function (handler, context) { - - var listenersWithHandler = []; - - context = context || allListeners; - - for (var i = 0; i < context.length; i++) { - - var listener = context[i]; - - if (listener.handler === handler) { - - listenersWithHandler.push(listener); - - } - - } - - return listenersWithHandler; - - }; - - var one = function (element, eventType, handler) { - - var result = allListeners; - - if (element) - result = byElement(element, result); - - if (eventType) - result = byType(eventType, result); - - if (handler) - result = byHandler(handler, result); - - return result[0]; - - }; - - var all = function (element, eventType, handler) { - - var result = allListeners; - - if (element) - result = byElement(element, result); - - if (eventType) - result = byType(eventType, result); - - if (handler) - result = byHandler(handler, result); - - return result; - - }; - - return { - byElement : byElement, - byType : byType, - byHandler : byHandler, - one : one, - all : all - }; - - }(); - - listeners.add = function (element, eventType, handler, isCapture) { - - element.addEventListener(eventType, handler, isCapture); - - var data = { - element: element, - type: eventType, - handler: handler - }; - - var alreadyAddedListener = listeners.search.one(element, eventType, handler); - - if (!alreadyAddedListener) { - - allListeners.push(data); - - } - - }; - - listeners.remove = function (element, eventType, handler) { - - element.removeEventListener(eventType, handler); - - var existingListeners = listeners.search.all(element, eventType, handler); - - for (var i = 0; i < existingListeners.length; i++) { - - var index = allListeners.indexOf(existingListeners[i]); - - if (index > 0) { - - allListeners.splice(index, 1); - - } - - } - - }; - - listeners.removeAll = function () { - - allListeners.map(function (current) { - - listeners.remove(current.element, current.type, current.handler); - - }); - - }; - - listeners.get = function (element, eventType, handler) { - - return listeners.search.all(element, eventType, handler); - - }; - - return listeners; - -}({}); \ No newline at end of file diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index fc5c4e5f..7adf4443 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -114,7 +114,7 @@ export default class BlockManager extends Module { * keydown on block * @todo move to the keydown module */ - block.pluginsContent.addEventListener('keydown', (event) => this.keyDownOnBlock(event), false); + this.Editor.Listeners.on(block.pluginsContent, 'keydown', (event) => this.keyDownOnBlock(event)); } diff --git a/src/components/modules/listeners.js b/src/components/modules/listeners.js new file mode 100644 index 00000000..996ceb40 --- /dev/null +++ b/src/components/modules/listeners.js @@ -0,0 +1,195 @@ +/** + * Codex Editor Listeners module + * + * @module Listeners + * + * Module-decorator for event listeners assignment + * + * @author Codex Team + * @version 2.0.0 + */ + +/** + * @typedef {Listeners} Listeners + * @property {Array} allListeners + */ + +export default class Listeners extends Module { + + /** + * @constructor + * @param {EditorConfig} config + */ + constructor({config}) { + + super({config}); + this.allListeners = []; + + } + + /** + * Assigns event listener on element + * + * @param {Element} element - DOM element that needs to be listened + * @param {String} eventType - event type + * @param {Function} handler - method that will be fired on event + * @param {Boolean} useCapture - use event bubbling + */ + on(element, eventType, handler, useCapture = false) { + + let assignedEventData = { + element, + eventType, + handler, + useCapture + }; + + let alreadyExist = this.findOne(element, eventType, handler); + + if (alreadyExist) return; + + this.allListeners.push(assignedEventData); + element.addEventListener(eventType, handler, useCapture); + + } + + /** + * Removes event listener from element + * + * @param {Element} element - DOM element that we removing listener + * @param {String} eventType - event type + * @param {Function} handler - remove handler, if element listens several handlers on the same event type + * @param {Boolean} useCapture - use event bubbling + */ + off(element, eventType, handler, useCapture = false) { + + let existingListeners = this.findAll(element, eventType, handler); + + for (let i = 0; i < existingListeners.length; i++) { + + let index = this.allListeners.indexOf(existingListeners[i]); + + if (index > 0) { + + this.allListeners.splice(index, 1); + + } + + } + + element.removeEventListener(eventType, handler, useCapture); + + + } + + /** + * Search methods + * + * byElement, byType and byHandler returns array of suitable listeners + * one and all takes element, eventType, and handler and returns first (all) suitable listener + */ + findByElement(element) { + + let listenersOnElement = []; + + for (let i = 0; i < this.allListeners.length; i++) { + + let listener = this.allListeners[i]; + + if (listener.element === element) { + + listenersOnElement.push(listener); + + } + + } + + return listenersOnElement; + + } + + findByType(eventType) { + + let listenersWithType = []; + + for (let i = 0; i < this.allListeners.length; i++) { + + let listener = this.allListeners[i]; + + if (listener.type === eventType) { + + listenersWithType.push(listener); + + } + + } + + return listenersWithType; + + } + + findByHandler(handler) { + + let listenersWithHandler = []; + + for (let i = 0; i < this.allListeners.length; i++) { + + let listener = this.allListeners[i]; + + if (listener.handler === handler) { + + listenersWithHandler.push(listener); + + } + + } + + return listenersWithHandler; + + } + + findOne(element, eventType, handler) { + + let foundListeners = []; + + if (element) + foundListeners = this.byElement(element); + + if (eventType) + foundListeners = foundListeners.concat(this.byType(eventType)); + + if (handler) + foundListeners = foundListeners.concat(this.byHandler(handler)); + + return foundListeners[0]; + + } + + findAll(element, eventType, handler) { + + let foundListeners = []; + + if (element) + foundListeners = this.byElement(element); + + if (eventType) + foundListeners = foundListeners.concat(this.byType(eventType)); + + if (handler) + foundListeners = foundListeners.concat(this.byHandler(handler)); + + return foundListeners; + + } + + removeAll() { + + this.allListeners.map( (current) => { + + this.off(current.element, current.type, current.handler); + + }); + + } + +} \ No newline at end of file From 87c94d73727db3377282f4c005ece3941d3188fd Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Fri, 5 Jan 2018 20:14:47 +0300 Subject: [PATCH 4/6] listener module updates --- build/codex-editor.js | 71 +++++++++++++++++++------- build/codex-editor.js.map | 2 +- docs/listeners.md | 1 + src/codex.js | 2 +- src/components/modules/blockManager.js | 2 +- src/components/modules/listeners.js | 60 ++++++++++++++-------- 6 files changed, 96 insertions(+), 42 deletions(-) create mode 100644 docs/listeners.md diff --git a/build/codex-editor.js b/build/codex-editor.js index 87d1de28..88de6f91 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -855,7 +855,7 @@ module.exports = exports["default"]; * @property {String} placeholder - First Block placeholder * @property {Object} sanitizer - @todo fill desc * @property {Boolean} hideToolbar - @todo fill desc - * @property {Object} toolsConfig - tools configuration {@link Tools#ToolsConfig} + * @property {Object} toolsConfig - tools configuration {@link tools#ToolConfig} */ /** @@ -1487,7 +1487,7 @@ var BlockManager = function (_Module) { switch (event.keyCode) { case _.keyCodes.ENTER: - this.enterPressedOnPluginsContent(event); + // this.enterPressedOnPluginsContent(event); break; case _.keyCodes.DOWN: case _.keyCodes.RIGHT: @@ -2667,10 +2667,9 @@ var Listeners = function (_Module) { } /** - * Search methods - * - * byElement, byType and byHandler returns array of suitable listeners - * one and all takes element, eventType, and handler and returns first (all) suitable listener + * Search method: looks for listener by passed element + * @param {Element} element - searching element + * @returns {Array} listeners that found on element */ }, { @@ -2691,6 +2690,13 @@ var Listeners = function (_Module) { return listenersOnElement; } + + /** + * Search method: looks for listener by passed event type + * @param {String} eventType + * @return {Array} listeners that found on element + */ + }, { key: "findByType", value: function findByType(eventType) { @@ -2709,6 +2715,13 @@ var Listeners = function (_Module) { return listenersWithType; } + + /** + * Search method: looks for listener by passed handler + * @param {Function} handler + * @return {Array} listeners that found on element + */ + }, { key: "findByHandler", value: function findByHandler(handler) { @@ -2727,34 +2740,54 @@ var Listeners = function (_Module) { return listenersWithHandler; } + + /** + * @param {Element} element + * @param {String} eventType + * @param {Function} handler + * @return {Element|null} + */ + }, { key: "findOne", value: function findOne(element, eventType, handler) { - var foundListeners = []; + var foundListeners = this.findAll(element, eventType, handler); - if (element) foundListeners = this.byElement(element); - - if (eventType) foundListeners = foundListeners.concat(this.byType(eventType)); - - if (handler) foundListeners = foundListeners.concat(this.byHandler(handler)); - - return foundListeners[0]; + return foundListeners.length > 0 ? foundListeners[0] : null; } + + /** + * @param {Element} element + * @param {String} eventType + * @param {Function} handler + * @return {Array} + */ + }, { key: "findAll", value: function findAll(element, eventType, handler) { - var foundListeners = []; + var foundAllListeners = void 0, + foundByElements = [], + foundByEventType = [], + foundByHandler = []; - if (element) foundListeners = this.byElement(element); + if (element) foundByElements = this.findByElement(element); - if (eventType) foundListeners = foundListeners.concat(this.byType(eventType)); + if (eventType) foundByEventType = this.findByType(eventType); - if (handler) foundListeners = foundListeners.concat(this.byHandler(handler)); + if (handler) foundByHandler = this.findByHandler(handler); - return foundListeners; + foundAllListeners = foundByElements.concat(foundByEventType, foundByHandler); + + return foundAllListeners; } + + /** + * Removes all listeners + */ + }, { key: "removeAll", value: function removeAll() { diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index f2283d4f..53ee59da 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap bb65f22814c0579e597b","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/Selection.js","webpack:///./src/codex.js","webpack:///./src/components/polyfills.js","webpack:///./src/components/modules nonrecursive [^_](blockManager.js|caret.js|events.js|listeners.js|renderer.js|sanitizer.js|saver.js|toolbar.js|toolbox.js|tools.js|ui.js)$","webpack:///./src/components/modules/blockManager.js","webpack:///./src/components/block.js","webpack:///./src/components/modules/caret.js","webpack:///./src/components/modules/events.js","webpack:///./src/components/modules/listeners.js","webpack:///./src/components/modules/renderer.js","webpack:///./src/components/modules/sanitizer.js","webpack:///./node_modules/html-janitor/src/html-janitor.js","webpack:///./src/components/modules/saver.js","webpack:///./src/components/modules/toolbar.js","webpack:///./src/components/modules/toolbox.js","webpack:///./src/components/modules/tools.js","webpack:///./src/components/modules/ui.js","webpack:///./src/styles/main.css","webpack:///./node_modules/css-loader/lib/css-base.js"],"names":["Module","config","new","target","TypeError","Editor","Util","msg","type","args","window","console","e","chains","success","fallback","Promise","resolve","reduce","previousValue","currentValue","iteration","then","waitNextBlock","length","chainData","successCallback","fallbackCallback","function","data","catch","collection","Array","prototype","slice","call","object","Object","keys","constructor","element","contentEditable","method","timeout","context","arguments","setTimeout","apply","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","Dom","tagName","classNames","attributes","el","document","createElement","isArray","classList","add","attrName","content","createTextNode","parent","elements","forEach","appendChild","selector","querySelector","querySelectorAll","node","atLast","childNodes","isElement","isNativeInput","emptyTextNode","text","childsLength","last","getDeepestNode","nodeType","Node","ELEMENT_NODE","nativeInputs","includes","nodeText","value","textContent","replace","trim","treeWalker","leafs","push","isLeaf","nextSibling","shift","firstChild","every","isNodeEmpty","leaf","Selection","instance","selection","getSelection","anchorNode","anchorOffset","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","log","error","constructModules","configureModules","displayName","name","state","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","render","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","_","isEmpty","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","toolName","toolInstance","construct","block","bindEvents","Listeners","on","pluginsContent","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","navigateNext","navigatePrevious","lastTextNode","$","currentBlock","textNodeLength","getAnchorNode","getAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","firstLevelBlock","CSS","wrapper","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","array","selected","workingArea","html","remove","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","isNaN","Number","Block","tool","_html","compose","make","contentNode","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","offset","atEnd","focus","nodeToSet","delay","range","createRange","setStart","setEnd","removeAllRanges","addRange","lastBlock","Events","subscribers","eventName","callback","previousData","currentHandler","newData","allListeners","eventType","handler","useCapture","assignedEventData","alreadyExist","findOne","addEventListener","existingListeners","findAll","i","removeEventListener","listenersOnElement","listener","listenersWithType","listenersWithHandler","foundListeners","byElement","concat","byType","byHandler","current","off","insertBlock","sequence","item","Sanitizer","defaultConfig","_sanitizerInstance","sanitizerConfig","settings","sanitizerInstance","require","taintString","customConfig","clean","library","tags","href","rel","newInstance","Saver","output","blocksData","all","allExtractedData","makeOutput","outputData","totalTime","groupCollapsed","extraction","groupEnd","Date","version","VERSION","Toolbar","actions","plusButton","settingsToggler","removeBlockButton","pluginSettings","defaultSettings","toolbar","append","plusButtonClicked","Toolbox","makeRemoveBlockButton","makeBlockSettingsPanel","close","defaultToolbarHeight","defaultOffset","newYCoordinate","offsetTop","style","transform","Math","floor","toolbarOpened","toggle","hide","plusButtonHidden","show","toolbox","buttons","opened","addTools","toolsAvailable","addTool","displayInToolbox","iconClassName","button","toolboxButton","title","dataset","buttonClicked","toolButton","toolClasses","irreplaceable","move","toolboxOpened","open","toolsUnavailable","enableLineBreaks","hasOwnProperty","reject","sequenceData","getListOfPrepareFunctions","toolPreparationList","toolClass","plugin","available","holder","loadStyles","getElementById","editorWrapper","editorZone","styles","tag","toString","head","redactorClicked","clickedNode","setCurrentBlockByChildNode","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock"],"mappings":"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AAP;AAEH;;;;EA3GkCjT,M;;;kBAAlB0S,S;;;;;;;;AClCrB;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA;;AAEA;AACA;;AAEA;AACA,wBAAwB,iCAAiC,EAAE;AAC3D,6BAA6B,uEAAuE,EAAE;;AAEtG;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,QAAQ;;AAExB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,qBAAqB,4BAA4B;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;;;;;;;;;;;ACxLD;;;;;;;;AAQA;;;;;;;AAOA;;;;;;;;IAQqBe,K;;;AAEjB;;;;AAIA,yBAAsB;AAAA,YAATxT,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,cAAKyT,MAAL,GAAc,IAAd;AACA,cAAKC,UAAL,GAAkB,EAAlB;;AALkB;AAOrB;;AAED;;;;;;;;+BAIO;AAAA;;AAEH,gBAAIlJ,SAAS,KAAKpK,MAAL,CAAYwI,YAAZ,CAAyB4B,MAAtC;AAAA,gBACIhJ,YAAY,EADhB;;AAGAgJ,mBAAO5F,OAAP,CAAe,UAACsG,KAAD,EAAW;;AAEtB1J,0BAAU+E,IAAV,CAAe2E,MAAMtJ,IAArB;AAEH,aAJD;;AAMA,mBAAOb,QAAQ4S,GAAR,CAAYnS,SAAZ,EACFH,IADE,CACG,UAACuS,gBAAD;AAAA,uBAAsB,OAAKC,UAAL,CAAgBD,gBAAhB,CAAtB;AAAA,aADH,EAEFvS,IAFE,CAEG,UAACyS,UAAD,EAAgB;;AAElB,uBAAOA,UAAP;AAEH,aANE,CAAP;AAQH;;AAED;;;;;;;;mCAKWF,gB,EAAkB;;AAEzB,gBAAI7K,QAAQ,EAAZ;AAAA,gBACIgL,YAAY,CADhB;;AAGArT,oBAAQsT,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBhP,OAAjB,CAAyB,UAACqP,UAAD,EAAatH,KAAb,EAAuB;;AAE5C;AACAjM,wBAAQoH,GAAR,UAAgBmM,WAAW7F,IAA3B,uBAAgD6F,UAAhD;AACAF,6BAAaE,WAAW9E,IAAxB;AACApG,sBAAMxC,IAAN,CAAW0N,WAAWrS,IAAtB;AAEH,aAPD;;AASAlB,oBAAQoH,GAAR,CAAY,OAAZ,EAAqBiM,SAArB;AACArT,oBAAQwT,QAAR;;AAEA,mBAAO;AACH/E,sBAAU,CAAC,IAAIgF,IAAJ,EADR;AAEHpL,uBAAUA,KAFP;AAGHqL,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8BtU,M;;AA0EnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAvOqByT,K;;;;;;;;;;;;;;;;;;;;;;;ACvBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmDqBc,O;;;AAEjB;;;AAGA,yBAAsB;AAAA,QAATtU,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAK0K,KAAL,GAAa;AACToC,eAAU,IADD;AAETtI,eAAU,IAFD;AAGT+P,eAAU,IAHD;;AAKT;AACAC,kBAAa,IANJ;;AAQT;AACAC,uBAAkB,IATT;AAUTC,yBAAmB,IAVV;AAWT7B,gBAAU,IAXD;;AAaT;AACA8B,sBAAgB,IAdP;AAeTC,uBAAiB;AAfR,KAAb;;AAJkB;AAsBrB;;AAED;;;;;;;;;;;AA8BA;;;2BAGO;AAAA;;AAEH,WAAKlK,KAAL,CAAWoC,OAAX,GAAqBf,EAAEwC,IAAF,CAAO,KAAP,EAAc+F,QAAQzH,GAAR,CAAYgI,OAA1B,CAArB;;AAEA;;;AAGA,OAAC,SAAD,EAAa,SAAb,EAAwBjQ,OAAxB,CAAiC,cAAM;;AAEnC,eAAK8F,KAAL,CAAWzG,EAAX,IAAiB8H,EAAEwC,IAAF,CAAO,KAAP,EAAc+F,QAAQzH,GAAR,CAAY5I,EAAZ,CAAd,CAAjB;AACA8H,UAAE+I,MAAF,CAAS,OAAKpK,KAAL,CAAWoC,OAApB,EAA6B,OAAKpC,KAAL,CAAWzG,EAAX,CAA7B;AAEH,OALD;;AAQA;;;;;AAKA,WAAKyG,KAAL,CAAW8J,UAAX,GAAwBzI,EAAEwC,IAAF,CAAO,KAAP,EAAc+F,QAAQzH,GAAR,CAAY2H,UAA1B,CAAxB;AACAzI,QAAE+I,MAAF,CAAS,KAAKpK,KAAL,CAAWlG,OAApB,EAA6B,KAAKkG,KAAL,CAAW8J,UAAxC;AACA,WAAK9J,KAAL,CAAW8J,UAAX,CAAsBlD,gBAAtB,CAAuC,OAAvC,EAAgD;AAAA,eAAS,OAAKyD,iBAAL,CAAuBxJ,KAAvB,CAAT;AAAA,OAAhD,EAAwF,KAAxF;;AAGA;;;AAGA,WAAKnL,MAAL,CAAY4U,OAAZ,CAAoBzG,IAApB;;AAEA;;;;;;AAMA,WAAK7D,KAAL,CAAW+J,eAAX,GAA8B1I,EAAEwC,IAAF,CAAO,MAAP,EAAe+F,QAAQzH,GAAR,CAAY4H,eAA3B,CAA9B;AACA,WAAK/J,KAAL,CAAWgK,iBAAX,GAA+B,KAAKO,qBAAL,EAA/B;;AAEAlJ,QAAE+I,MAAF,CAAS,KAAKpK,KAAL,CAAW6J,OAApB,EAA6B,CAAC,KAAK7J,KAAL,CAAW+J,eAAZ,EAA6B,KAAK/J,KAAL,CAAWgK,iBAAxC,CAA7B;;AAEA;;;AAGA,WAAKQ,sBAAL;;AAEA;;;AAGAnJ,QAAE+I,MAAF,CAAS,KAAK1U,MAAL,CAAYuI,EAAZ,CAAe+B,KAAf,CAAqBoC,OAA9B,EAAuC,KAAKpC,KAAL,CAAWoC,OAAlD;AAEH;;AAED;;;;;;;;6CAKyB;;AAErB,WAAKpC,KAAL,CAAWmI,QAAX,GAAsB9G,EAAEwC,IAAF,CAAO,KAAP,EAAc+F,QAAQzH,GAAR,CAAYgG,QAA1B,CAAtB;;AAEA,WAAKnI,KAAL,CAAWiK,cAAX,GAA4B5I,EAAEwC,IAAF,CAAO,KAAP,EAAc+F,QAAQzH,GAAR,CAAY8H,cAA1B,CAA5B;AACA,WAAKjK,KAAL,CAAWkK,eAAX,GAA6B7I,EAAEwC,IAAF,CAAO,KAAP,EAAc+F,QAAQzH,GAAR,CAAY+H,eAA1B,CAA7B;;AAEA7I,QAAE+I,MAAF,CAAS,KAAKpK,KAAL,CAAWmI,QAApB,EAA8B,CAAC,KAAKnI,KAAL,CAAWiK,cAAZ,EAA4B,KAAKjK,KAAL,CAAWkK,eAAvC,CAA9B;AACA7I,QAAE+I,MAAF,CAAS,KAAKpK,KAAL,CAAW6J,OAApB,EAA6B,KAAK7J,KAAL,CAAWmI,QAAxC;AAEH;;AAED;;;;;;;4CAIwB;;AAEpB;;;;AAIA,aAAO9G,EAAEwC,IAAF,CAAO,MAAP,EAAe+F,QAAQzH,GAAR,CAAY6H,iBAA3B,CAAP;AAEH;;AAED;;;;;;2BAGO;;AAEH;AACA,WAAKtU,MAAL,CAAY4U,OAAZ,CAAoBG,KAApB;;AAEA,UAAIjI,cAAc,KAAK9M,MAAL,CAAYwI,YAAZ,CAAyBsE,WAA3C;;AAEA;;;AAGA,UAAI,CAACA,WAAL,EAAkB;;AAEd;AAEH;;AAED;;;;AAIA,UAAMkI,uBAAuB,EAA7B;AACA,UAAMC,gBAAgB,EAAtB;;AAEA,UAAIC,iBAAiBpI,YAAYqI,SAAZ,GAAyBH,uBAAuB,CAAhD,GAAqDC,aAA1E;;AAEA,WAAK3K,KAAL,CAAWoC,OAAX,CAAmB0I,KAAnB,CAAyBC,SAAzB,uBAAuDC,KAAKC,KAAL,CAAWL,cAAX,CAAvD;;AAEA;AACA;AAEH;;AAED;;;;;;2BAGO;;AAEH,WAAK5K,KAAL,CAAWoC,OAAX,CAAmBzI,SAAnB,CAA6BC,GAA7B,CAAiCgQ,QAAQzH,GAAR,CAAY+I,aAA7C;AAEH;;AAED;;;;;;4BAGQ;;AAEJ,WAAKlL,KAAL,CAAWoC,OAAX,CAAmBzI,SAAnB,CAA6BqJ,MAA7B,CAAoC4G,QAAQzH,GAAR,CAAY+I,aAAhD;AAEH;;AAED;;;;;;;;;AAaA;;;;sCAIkBrK,K,EAAO;;AAErB,WAAKnL,MAAL,CAAY4U,OAAZ,CAAoBa,MAApB;AAEH;;;wBAjBgB;AAAA;;AAEb,aAAO;AACHC,cAAM;AAAA,iBAAM,OAAKpL,KAAL,CAAW8J,UAAX,CAAsBnQ,SAAtB,CAAgCC,GAAhC,CAAoCgQ,QAAQzH,GAAR,CAAYkJ,gBAAhD,CAAN;AAAA,SADH;AAEHC,cAAM;AAAA,iBAAM,OAAKtL,KAAL,CAAW8J,UAAX,CAAsBnQ,SAAtB,CAAgCqJ,MAAhC,CAAuC4G,QAAQzH,GAAR,CAAYkJ,gBAAnD,CAAN;AAAA;AAFH,OAAP;AAKH;;;wBAhLgB;;AAEb,aAAO;AACHlB,iBAAS,YADN;AAEHrQ,iBAAS,qBAFN;AAGH+P,iBAAS,qBAHN;;AAKHqB,uBAAe,oBALZ;;AAOH;AACApB,oBAAY,kBART;AASHuB,0BAAkB,0BATf;;AAWH;AACAtB,yBAAiB,0BAZd;AAaHC,2BAAmB,wBAbhB;;AAeH;AACA7B,kBAAU,aAhBP;AAiBH+B,yBAAiB,qBAjBd;AAkBHD,wBAAgB;AAlBb,OAAP;AAqBH;;;;EAzDgC5U,M;;;kBAAhBuU,O;;;;;;;;;;;;;;;;;;;;;;;ACnDrB;;;;;;;;;;IAUqBU,O;;;AAEjB;;;AAGA,2BAAsB;AAAA,YAAThV,MAAS,QAATA,MAAS;;AAAA;;AAAA,sHAEZ,EAACA,cAAD,EAFY;;AAIlB,cAAK0K,KAAL,GAAa;AACTuL,qBAAS,IADA;AAETC,qBAAS;AAFA,SAAb;;AAKA;;;;AAIA,cAAKC,MAAL,GAAc,KAAd;;AAbkB;AAerB;;AAED;;;;;;;;;;AAcA;;;+BAGO;;AAEH,iBAAKzL,KAAL,CAAWuL,OAAX,GAAqBlK,EAAEwC,IAAF,CAAO,KAAP,EAAcyG,QAAQnI,GAAR,CAAYoJ,OAA1B,CAArB;AACAlK,cAAE+I,MAAF,CAAS,KAAK1U,MAAL,CAAYkU,OAAZ,CAAoB5J,KAApB,CAA0BlG,OAAnC,EAA4C,KAAKkG,KAAL,CAAWuL,OAAvD;;AAEA,iBAAKG,QAAL;AAEH;;AAED;;;;;;mCAGW;;AAEP,gBAAI5M,QAAQ,KAAKpJ,MAAL,CAAYsI,KAAZ,CAAkB2N,cAA9B;;AAEA,iBAAK,IAAItL,QAAT,IAAqBvB,KAArB,EAA4B;;AAExB,qBAAK8M,OAAL,CAAavL,QAAb,EAAuBvB,MAAMuB,QAAN,CAAvB;AAEH;AAEJ;;AAED;;;;;;;;;gCAMQA,Q,EAAUqD,I,EAAM;AAAA;;AAEpB,gBAAIA,KAAKmI,gBAAL,IAAyB,CAACnI,KAAKoI,aAAnC,EAAkD;;AAE9C9M,kBAAE5B,GAAF,CAAM,oDAAN,EAA4D,MAA5D,EAAoEiD,QAApE;AACA;AAEH;;AAED;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA,gBAAI,CAACqD,KAAKmI,gBAAV,EAA4B;;AAExB;AAEH;;AAED,gBAAIE,SAAS1K,EAAEwC,IAAF,CAAO,IAAP,EAAa,CAACyG,QAAQnI,GAAR,CAAY6J,aAAb,EAA4BtI,KAAKoI,aAAjC,CAAb,EAA8D;AACvEG,uBAAO5L;AADgE,aAA9D,CAAb;;AAIA;;;AAGA0L,mBAAOG,OAAP,CAAezO,IAAf,GAAsB4C,QAAtB;;AAEAgB,cAAE+I,MAAF,CAAS,KAAKpK,KAAL,CAAWuL,OAApB,EAA6BQ,MAA7B;;AAEA,iBAAK/L,KAAL,CAAWuL,OAAX,CAAmBpR,WAAnB,CAA+B4R,MAA/B;AACA,iBAAK/L,KAAL,CAAWwL,OAAX,CAAmB3P,IAAnB,CAAwBkQ,MAAxB;;AAEA;;;AAGA;AACAA,mBAAOnF,gBAAP,CAAwB,OAAxB,EAAiC,iBAAS;;AAEtC,uBAAKuF,aAAL,CAAmBtL,KAAnB;AAEH,aAJD,EAIG,KAJH;AAMH;;AAED;;;;;;;;;;sCAOcA,K,EAAO;;AAEjB,gBAAIuL,aAAavL,MAAMrL,MAAvB;AAAA,gBACI6K,WAAW+L,WAAWF,OAAX,CAAmBzO,IADlC;AAAA,gBAEIiG,OAAO,KAAKhO,MAAL,CAAYsI,KAAZ,CAAkBqO,WAAlB,CAA8BhM,QAA9B,CAFX;;AAIA;;;AAGA,gBAAIiB,eAAe,KAAK5L,MAAL,CAAYwI,YAAZ,CAAyBoD,YAA5C;;AAEA;;;;;;AAMA,gBAAI,CAACoC,KAAK4I,aAAN,IAAuBhL,aAAarC,OAAxC,EAAiD;;AAE7C,qBAAKvJ,MAAL,CAAYwI,YAAZ,CAAyBzC,OAAzB,CAAiC4E,QAAjC;AAEH,aAJD,MAIO;;AAEH,qBAAK3K,MAAL,CAAYwI,YAAZ,CAAyB8D,MAAzB,CAAgC3B,QAAhC;AAEH;;AAED;;;;AAIA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA,iBAAK3K,MAAL,CAAYkU,OAAZ,CAAoB2C,IAApB;AAEH;;AAED;;;;;;+BAGO;;AAEH,iBAAKvM,KAAL,CAAWuL,OAAX,CAAmB5R,SAAnB,CAA6BC,GAA7B,CAAiC0Q,QAAQnI,GAAR,CAAYqK,aAA7C;AACA,iBAAKf,MAAL,GAAc,IAAd;AAEH;;AAED;;;;;;gCAGQ;;AAEJ,iBAAKzL,KAAL,CAAWuL,OAAX,CAAmB5R,SAAnB,CAA6BqJ,MAA7B,CAAoCsH,QAAQnI,GAAR,CAAYqK,aAAhD;AACA,iBAAKf,MAAL,GAAc,KAAd;AAEH;;AAED;;;;;;iCAGS;;AAEL,gBAAI,CAAC,KAAKA,MAAV,EAAkB;;AAEd,qBAAKgB,IAAL;AAEH,aAJD,MAIO;;AAEH,qBAAKhC,KAAL;AAEH;AAEJ;;;4BAxLgB;;AAEb,mBAAQ;AACJc,yBAAS,YADL;AAEJS,+BAAe,oBAFX;AAGJQ,+BAAe;AAHX,aAAR;AAMH;;;;EAlCgCnX,M;;;kBAAhBiV,O;;;;;;;;;;;;;;;;;;;;;;;ACVrB;;;;;;AAMA;;;;;;;;;;;;;AAaA;;;;;;;;;;;;;;AAcA;;;;;;;;;IASqBtM,K;;;;;;;AAEjB;;;;4BAIgB;;AAEZ,mBAAO,KAAK2N,cAAZ;AAEH;;AAED;;;;;;;4BAIkB;;AAEd,mBAAO,KAAKe,gBAAZ;AAEH;;AAED;;;;;;;;;4BAM2B;;AAEvB,mBAAO;AACHZ,+BAAgB,EADb;AAEHD,kCAAmB,KAFhB;AAGHc,kCAAmB,KAHhB;AAIHL,+BAAgB;AAJb,aAAP;AAOH;;AAED;;;;;;;;AAKA,yBAAsB;AAAA,YAAThX,MAAS,QAATA,MAAS;;AAAA;;AAIlB;;;;;AAJkB,kHAEZ,EAACA,cAAD,EAFY;;AASlB,cAAK+W,WAAL,GAAmB,EAAnB;;AAEA;;;;;AAKA,cAAKV,cAAL,GAAsB,EAAtB;;AAEA;;;;;AAKA,cAAKe,gBAAL,GAAwB,EAAxB;;AAvBkB;AAyBrB;;AAED;;;;;;;;kCAIU;AAAA;;AAEN,gBAAI,CAAC,KAAKpX,MAAL,CAAYsX,cAAZ,CAA2B,OAA3B,CAAL,EAA0C;;AAEtC,uBAAOvW,QAAQwW,MAAR,CAAe,2BAAf,CAAP;AAEH;;AAED,iBAAI,IAAIxM,QAAR,IAAoB,KAAK/K,MAAL,CAAYwJ,KAAhC,EAAuC;;AAEnC,qBAAKuN,WAAL,CAAiBhM,QAAjB,IAA6B,KAAK/K,MAAL,CAAYwJ,KAAZ,CAAkBuB,QAAlB,CAA7B;AAEH;;AAED;;;AAGA,gBAAIyM,eAAe,KAAKC,yBAAL,EAAnB;;AAEA;;;AAGA,gBAAID,aAAajW,MAAb,KAAwB,CAA5B,EAA+B;;AAE3B,uBAAOR,QAAQC,OAAR,EAAP;AAEH;;AAED;;;AAGA,mBAAO0I,EAAE6I,QAAF,CAAWiF,YAAX,EAAyB,UAAC5V,IAAD,EAAU;;AAEtC,uBAAKf,OAAL,CAAae,IAAb;AAEH,aAJM,EAIJ,UAACA,IAAD,EAAU;;AAET,uBAAKd,QAAL,CAAcc,IAAd;AAEH,aARM,CAAP;AAUH;;AAED;;;;;;;oDAI4B;;AAExB,gBAAI8V,sBAAsB,EAA1B;;AAEA,iBAAI,IAAI3M,QAAR,IAAoB,KAAKgM,WAAzB,EAAsC;;AAElC,oBAAIY,YAAY,KAAKZ,WAAL,CAAiBhM,QAAjB,CAAhB;;AAEA,oBAAI,OAAO4M,UAAUlP,OAAjB,KAA6B,UAAjC,EAA6C;;AAEzCiP,wCAAoBnR,IAApB,CAAyB;AACrB5E,kCAAWgW,UAAUlP,OADA;AAErB7G,8BAAO;AACHmJ;AADG;AAFc,qBAAzB;AAOH,iBATD,MASO;;AAEH;;;AAGA,yBAAKsL,cAAL,CAAoBtL,QAApB,IAAgC4M,SAAhC;AAEH;AAEJ;;AAED,mBAAOD,mBAAP;AAEH;;AAED;;;;;;gCAGQ9V,I,EAAM;;AAEV,iBAAKyU,cAAL,CAAoBzU,KAAKmJ,QAAzB,IAAqC,KAAKgM,WAAL,CAAiBnV,KAAKmJ,QAAtB,CAArC;AAEH;;AAED;;;;;;iCAGSnJ,I,EAAM;;AAEX,iBAAKwV,gBAAL,CAAsBxV,KAAKmJ,QAA3B,IAAuC,KAAKgM,WAAL,CAAiBnV,KAAKmJ,QAAtB,CAAvC;AAEH;;AAED;;;;;;;;;;;;kCASUqD,I,EAAMxM,I,EAAM;;AAElB,gBAAIgW,SAAS,KAAKb,WAAL,CAAiB3I,IAAjB,CAAb;AAAA,gBACIpO,SAAS,KAAKA,MAAL,CAAYyJ,WAAZ,CAAwB2E,IAAxB,CADb;;AAGA,gBAAI,CAACpO,MAAL,EAAa;;AAETA,yBAAS,KAAK0S,aAAd;AAEH;;AAED,gBAAI1L,WAAW,IAAI4Q,MAAJ,CAAWhW,IAAX,EAAiB5B,MAAjB,CAAf;;AAEA,mBAAOgH,QAAP;AAEH;;AAED;;;;;;;;kCAKUoH,I,EAAM;;AAEZ,mBAAOA,gBAAgB,KAAKyJ,SAAL,CAAe,KAAK7X,MAAL,CAAYgJ,YAA3B,CAAvB;AAEH;;;;EA/M8BjJ,M;;;kBAAd2I,K;;;;;;;;;;;;;;;;;;;;;;;AC1CrB;;;;;AAKA;;AAEA;;;AAGA;;AAEA;;;AAGA;;AAEA;;;AAGA;;AAEA;;;AAGA;;AAEA;;;AAGA;AACA;;AAEA;;AAEA;;;;;;;;;;;;;;;;;;IAkBqBC,E;;;AAEjB;;;;;AAKA,oBAAsB;AAAA,QAAT3I,MAAS,QAATA,MAAS;;AAAA;;AAAA,wGAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAK0K,KAAL,GAAa;AACToN,cAAQ,IADC;AAEThL,eAAS,IAFA;AAGTnC,gBAAU;AAHD,KAAb;;AAJkB;AAUrB;;AAED;;;;;;;8BAGU;AAAA;;AAEN,aAAO,KAAK4D,IAAL;AACH;;;AADG,OAIFlN,IAJE,CAIG;AAAA,eAAM,OAAKjB,MAAL,CAAYkU,OAAZ,CAAoB/F,IAApB,EAAN;AAAA,OAJH;AAKH;;;AALG,OAQFlN,IARE,CAQG;AAAA,eAAM,OAAK0W,UAAL,EAAN;AAAA,OARH;AASH;;;AATG,OAYF1W,IAZE,CAYG;AAAA,eAAM,OAAK8J,UAAL,EAAN;AAAA,OAZH;;AAcP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAxBO,OA0BFtJ,KA1BE,CA0BI,aAAK;;AAERnB,gBAAQqH,KAAR,CAAcpH,CAAd;;AAEJ;AAEC,OAhCE,CAAP;AAkCH;;AAED;;;;;;;;;AAaA;;;;2BAIO;AAAA;;AAEH,aAAO,IAAII,OAAJ,CAAa,UAACC,OAAD,EAAUuW,MAAV,EAAqB;;AAErC;;;;AAIA,eAAK7M,KAAL,CAAWoN,MAAX,GAAoB5T,SAAS8T,cAAT,CAAwB,OAAKhY,MAAL,CAAYiJ,QAApC,CAApB;;AAEA,YAAI,CAAC,OAAKyB,KAAL,CAAWoN,MAAhB,EAAwB;;AAEpBP,iBAAOpK,MAAM,iCAAiC,OAAKnN,MAAL,CAAYiJ,QAAnD,CAAP;AACA;AAEH;;AAED;;;AAGA,eAAKyB,KAAL,CAAWoC,OAAX,GAAsBf,EAAEwC,IAAF,CAAO,KAAP,EAAc,OAAK1B,GAAL,CAASoL,aAAvB,CAAtB;AACA,eAAKvN,KAAL,CAAWC,QAAX,GAAsBoB,EAAEwC,IAAF,CAAO,KAAP,EAAc,OAAK1B,GAAL,CAASqL,UAAvB,CAAtB;;AAEA,eAAKxN,KAAL,CAAWoC,OAAX,CAAmBjI,WAAnB,CAA+B,OAAK6F,KAAL,CAAWC,QAA1C;AACA,eAAKD,KAAL,CAAWoN,MAAX,CAAkBjT,WAAlB,CAA8B,OAAK6F,KAAL,CAAWoC,OAAzC;;AAEA9L;AAEH,OA1BM,CAAP;AA4BH;;AAED;;;;;;iCAGa;;AAET;;;AAGA,UAAImX,SAAS,mBAAApF,CAAQ,EAAR,CAAb;;AAEA;;;AAGA,UAAIqF,MAAMrM,EAAEwC,IAAF,CAAO,OAAP,EAAgB,IAAhB,EAAsB;AAC5BrI,qBAAaiS,OAAOE,QAAP;AADe,OAAtB,CAAV;;AAIA;;;AAGAtM,QAAE+I,MAAF,CAAS5Q,SAASoU,IAAlB,EAAwBF,GAAxB;AAEH;;AAED;;;;;;iCAGa;AAAA;;AAET;;;AAGA,WAAK1N,KAAL,CAAWC,QAAX,CAAoB2G,gBAApB,CAAqC,OAArC,EAA8C;AAAA,eAAS,OAAKiH,eAAL,CAAqBhN,KAArB,CAAT;AAAA,OAA9C,EAAoF,KAApF;AAEH;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAwBgBA,K,EAAO;;AAEnB,UAAIiN,cAAcjN,MAAMrL,MAAxB;;AAEA;;;AAGA,UAAI;;AAEA,aAAKE,MAAL,CAAYwI,YAAZ,CAAyB6P,0BAAzB,CAAoDD,WAApD;;AAEJ;;;AAIC,OARD,CAQE,OAAO7X,CAAP,EAAU;;AAER,aAAKP,MAAL,CAAYiM,KAAZ,CAAkBqM,iBAAlB;AAEH;;AAKD;;;AAGA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,WAAKtY,MAAL,CAAYkU,OAAZ,CAAoB2C,IAApB;AACA,WAAK7W,MAAL,CAAYkU,OAAZ,CAAoB6C,IAApB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA,WAAK/W,MAAL,CAAYkU,OAAZ,CAAoBE,UAApB,CAA+BsB,IAA/B;;AAEA;;;;;AAKA,UAAI6C,iBAAiB,KAAKvY,MAAL,CAAYsI,KAAZ,CAAkBkQ,SAAlB,CAA4B,KAAKxY,MAAL,CAAYwI,YAAZ,CAAyBoD,YAAzB,CAAsCoC,IAAlE,CAArB;AAAA,UACIyK,eAAe,KAAKzY,MAAL,CAAYwI,YAAZ,CAAyBoD,YAAzB,CAAsCrC,OADzD;;AAGA,UAAIgP,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAKzY,MAAL,CAAYkU,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;AAEH;AAEJ;;;wBA3OS;;AAEN,aAAO;AACHiC,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2BnY,M;;AA+ShC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBApgBqB4I,E;;;;;;;;ACrDrB;AACA;;;AAGA;AACA,gCAAiC,sLAAsL,4CAA4C,yBAAyB,6BAA6B,oBAAoB,6BAA6B,GAAG,uBAAuB,wBAAwB,OAAO,2BAA2B,gCAAgC,OAAO,eAAe,uBAAuB,YAAY,aAAa,WAAW,iBAAiB,2BAA2B,qCAAqC,oCAAoC,kBAAkB,GAAG,uBAAuB,qBAAqB,mBAAmB,8BAA8B,OAAO,wBAAwB,uBAAuB,qBAAqB,yBAAyB,KAAK,qBAAqB,yBAAyB,+BAA+B,4BAA4B,gCAAgC,kBAAkB,mBAAmB,wBAAwB,yBAAyB,6BAA6B,4BAA4B,mBAAmB,sBAAsB,qBAAqB,uBAAuB,yBAAyB,KAAK,6BAA6B,sBAAsB,KAAK,eAAe,yBAAyB,qCAAqC,2BAA2B,GAAG,uBAAuB,qBAAqB,8BAA8B,OAAO,uBAAuB,gCAAgC,2BAA2B,oBAAoB,8BAA8B,sBAAsB,uBAAuB,8BAA8B,2BAA2B,6BAA6B,kCAAkC,+BAA+B,2BAA2B,sBAAsB,uBAAuB,0BAA0B,wDAAwD,wDAAwD,wCAAwC,2BAA2B,uBAAuB,4BAA4B,KAAK,aAAa,4BAA4B,kBAAkB,GAAG,uBAAuB,gCAAgC,KAAK,sBAAsB,uBAAuB,qBAAqB,KAAK;;AAEp1E;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD,IAAI;AACJ;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;;AAElE;AACA","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap bb65f22814c0579e597b","/**\n * @abstract\n * @class Module\n * @classdesc All modules inherits from this class.\n *\n * @typedef {Module} Module\n * @property {Object} config - Editor user settings\n * @property {Object} Editor - List of Editor modules\n */\nexport default class Module {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({ config } = {}) {\n\n if (new.target === Module) {\n\n throw new TypeError('Constructors for abstract class Module are not allowed.');\n\n }\n\n /**\n * @type {EditorConfig}\n */\n this.config = config;\n\n /**\n * @type {EditorComponents}\n */\n this.Editor = null;\n\n }\n\n /**\n * Editor modules setter\n *\n * @param Editor\n * @param Editor.modules {@link CodexEditor#moduleInstances}\n * @param Editor.config {@link CodexEditor#configuration}\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/__module.js","/**\n * Codex Editor Util\n */\nexport default class Util {\n\n /**\n * Custom logger\n *\n * @param {string} msg - message\n * @param {string} type - logging type 'log'|'warn'|'error'|'info'\n * @param {*} args - argument to log with a message\n */\n static log(msg, type, args) {\n\n type = type || 'log';\n\n if (!args) {\n\n args = msg || 'undefined';\n msg = '[codex-editor]: %o';\n\n } else {\n\n msg = '[codex-editor]: ' + msg;\n\n }\n\n try{\n\n if ( 'console' in window && window.console[ type ] ) {\n\n if ( args ) window.console[ type ]( msg, args );\n else window.console[ type ]( msg );\n\n }\n\n } catch(e) {\n // do nothing\n }\n\n }\n\n /**\n * Returns basic keycodes as constants\n * @return {{}}\n */\n static get keyCodes() {\n\n return {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n SHIFT: 16,\n CTRL: 17,\n ALT: 18,\n ESC: 27,\n SPACE: 32,\n LEFT: 37,\n UP: 38,\n DOWN: 40,\n RIGHT: 39,\n DELETE: 46,\n META: 91\n };\n\n }\n\n /**\n * @typedef {Object} ChainData\n * @property {Object} data - data that will be passed to the success or fallback\n * @property {Function} function - function's that must be called asynchronically\n */\n\n /**\n * Fires a promise sequence asyncronically\n *\n * @param {Object[]} chains - list or ChainData's\n * @param {Function} success - success callback\n * @param {Function} fallback - callback that fires in case of errors\n *\n * @return {Promise}\n */\n static sequence(chains, success = () => {}, fallback = () => {}) {\n\n return new Promise(function (resolve) {\n\n /**\n * pluck each element from queue\n * First, send resolved Promise as previous value\n * Each plugins \"prepare\" method returns a Promise, that's why\n * reduce current element will not be able to continue while can't get\n * a resolved Promise\n */\n chains.reduce(function (previousValue, currentValue, iteration) {\n\n return previousValue\n .then(() => waitNextBlock(currentValue, success, fallback))\n .then(() => {\n\n // finished\n if (iteration === chains.length - 1) {\n\n resolve();\n\n }\n\n });\n\n }, Promise.resolve());\n\n });\n\n /**\n * Decorator\n *\n * @param {ChainData} chainData\n *\n * @param {Function} successCallback\n * @param {Function} fallbackCallback\n *\n * @return {Promise}\n */\n function waitNextBlock(chainData, successCallback, fallbackCallback) {\n\n return new Promise(function (resolve) {\n\n chainData.function()\n .then(() => {\n\n successCallback(chainData.data || {});\n\n })\n .then(resolve)\n .catch(function () {\n\n fallbackCallback(chainData.data || {});\n\n // anyway, go ahead even it falls\n resolve();\n\n });\n\n });\n\n }\n\n }\n\n /**\n * Make array from array-like collection\n *\n * @param {*} collection\n *\n * @return {Array}\n */\n static array(collection) {\n\n return Array.prototype.slice.call(collection);\n\n }\n\n /**\n * Checks if object is empty\n *\n * @param {Object} object\n * @return {boolean}\n */\n static isEmpty(object) {\n\n return Object.keys(object).length === 0 && object.constructor === Object;\n\n }\n\n /**\n * Check if passed object is a Promise\n * @param {*} object - object to check\n * @return {Boolean}\n */\n static isPromise(object) {\n\n return Promise.resolve(object) === object;\n\n }\n\n /**\n * Check if passed element is contenteditable\n * @param element\n * @return {boolean}\n */\n static isContentEditable(element) {\n\n return element.contentEditable === 'true';\n\n }\n\n /**\n * Delays method execution\n *\n * @param method\n * @param timeout\n */\n static delay(method, timeout) {\n\n return function () {\n\n let context = this,\n args = arguments;\n\n window.setTimeout(() => method.apply(context, args), timeout);\n\n };\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/utils.js","/**\n * DOM manipulations helper\n */\nexport default class Dom {\n\n /**\n * Helper for making Elements with classname and attributes\n *\n * @param {string} tagName - new Element tag name\n * @param {array|string} classNames - list or name of CSS classname(s)\n * @param {Object} attributes - any attributes\n * @return {Element}\n */\n static make(tagName, classNames = null, attributes = {}) {\n\n let el = document.createElement(tagName);\n\n if ( Array.isArray(classNames) ) {\n\n el.classList.add(...classNames);\n\n } else if( classNames ) {\n\n el.classList.add(classNames);\n\n }\n\n for (let attrName in attributes) {\n\n el[attrName] = attributes[attrName];\n\n }\n\n return el;\n\n }\n\n /**\n * Creates Text Node with the passed content\n * @param {String} content - text content\n * @return {Text}\n */\n static text(content) {\n\n return document.createTextNode(content);\n\n }\n\n /**\n * Append one or several elements to the parent\n *\n * @param {Element} parent - where to append\n * @param {Element|Element[]} - element ore elements list\n */\n static append(parent, elements) {\n\n if ( Array.isArray(elements) ) {\n\n elements.forEach( el => parent.appendChild(el) );\n\n } else {\n\n parent.appendChild(elements);\n\n }\n\n }\n\n /**\n * Selector Decorator\n *\n * Returns first match\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n *\n * @returns {Element}\n */\n static find(el = document, selector) {\n\n return el.querySelector(selector);\n\n }\n\n /**\n * Selector Decorator.\n *\n * Returns all matches\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n * @returns {NodeList}\n */\n static findAll(el = document, selector) {\n\n return el.querySelectorAll(selector);\n\n }\n\n /**\n * Search for deepest node which is Leaf.\n * Leaf is the vertex that doesn't have any child nodes\n *\n * @description Method recursively goes throw the all Node until it finds the Leaf\n *\n * @param {Element} node - root Node. From this vertex we start Deep-first search {@link https://en.wikipedia.org/wiki/Depth-first_search}\n * @param {Boolean} atLast - find last text node\n * @return {Node} - it can be text Node or Element Node, so that caret will able to work with it\n */\n static getDeepestNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return an empty text node\n * But caret will not be placed in empty textNode, so we need textNode with zero-width char\n */\n if (this.isElement(node) && !this.isNativeInput(node)) {\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\n return node;\n\n }\n\n let childsLength = node.childNodes.length,\n last = childsLength - 1;\n\n if (atLast) {\n\n return this.getDeepestNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestNode(node.childNodes[0], false);\n\n }\n\n }\n\n /**\n * Check if object is DOM node\n *\n * @param {Object} node\n * @returns {boolean}\n */\n static isElement(node) {\n\n return node && typeof node === 'object' && node.nodeType && node.nodeType === Node.ELEMENT_NODE;\n\n }\n\n /**\n * Checks target if it is native input\n * @param {Element|String} target - HTML element or string\n * @return {Boolean}\n */\n static isNativeInput(target) {\n\n let nativeInputs = [\n 'INPUT',\n 'TEXTAREA'\n ];\n\n return target ? nativeInputs.includes(target.tagName) : false;\n\n }\n\n /**\n * Checks node if it is empty\n *\n * @description Method checks simple Node without any childs for emptiness\n * If you have Node with 2 or more children id depth, you better use {@link Dom#isEmpty} method\n *\n * @param {Node} node\n * @return {Boolean} true if it is empty\n */\n static isNodeEmpty(node) {\n\n let nodeText;\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n nodeText = node.value;\n\n } else {\n\n nodeText = node.textContent.replace('\\u200B', '');\n\n }\n\n return nodeText.trim().length === 0;\n\n }\n\n /**\n * checks node if it is doesn't have any child nodes\n * @param {Node} node\n * @return {boolean}\n */\n static isLeaf(node) {\n\n if (!node) {\n\n return false;\n\n }\n\n return node.childNodes.length === 0;\n\n }\n\n /**\n * breadth-first search (BFS)\n * {@link https://en.wikipedia.org/wiki/Breadth-first_search}\n *\n * @description Pushes to stack all DOM leafs and checks for emptiness\n *\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n leafs = [];\n\n if (!node) {\n\n return false;\n\n }\n\n treeWalker.push(node);\n\n while ( treeWalker.length > 0 ) {\n\n if ( this.isLeaf(node) ) {\n\n leafs.push(node);\n\n }\n\n while ( node && node.nextSibling ) {\n\n node = node.nextSibling;\n\n if (!node) continue;\n\n treeWalker.push(node);\n\n }\n\n node = treeWalker.shift();\n\n if (!node) continue;\n\n node = node.firstChild;\n treeWalker.push(node);\n\n }\n\n return leafs.every( leaf => this.isNodeEmpty(leaf)) ;\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.js","/**\n * Working with selection\n */\nexport default class Selection {\n\n /**\n * @constructor\n */\n constructor() {\n\n this.instance = null;\n this.selection = null;\n\n }\n\n /**\n * Returns window Selection\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Window/getSelection}\n * @return {Selection}\n */\n static get() {\n\n return window.getSelection();\n\n }\n\n /**\n * Returns selected anchor\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorNode}\n * @return {Node}\n */\n static getAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n /**\n * Returns selection offset according to the anchor node\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorOffset}\n * @return {Number}\n */\n static getAnchorOffset() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorOffset;\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/Selection.js","/**\n * Codex Editor\n *\n * Short Description (눈_눈;)\n * @version 2.0.0\n *\n * How to start?\n * Example:\n * new CodexEditor({\n * holderId : 'codex-editor',\n * initialBlock : 'text',\n * placeholder : 'Write your story....',\n * tools: {\n * quote: Quote,\n * anotherTool : AnotherTool\n * },\n * toolsConfig: {\n * quote: {\n * iconClassname : 'quote-icon',\n * displayInToolbox : true,\n * enableLineBreaks : true\n * },\n * anotherTool: {\n * iconClassname : 'tool-icon'\n * }\n * }\n * });\n *\n * - tools is an object: {\n * pluginName: PluginClass,\n * .....\n * }\n * - toolsConfig is an additional configuration that uses Codex Editor API\n * iconClassname - CSS classname of toolbox icon\n * displayInToolbox - if you want to see your Tool in toolbox hided in \"plus\" button, than set \"True\". By default : \"False\"\n * enableLineBreaks - by default enter creates new block that set as initialblock, but if you set this property \"True\", enter will break the lines in current block\n *\n * @author CodeX-Team \n *\n */\n\n/**\n * @typedef {CodexEditor} CodexEditor - editor class\n */\n\n/**\n * @typedef {Object} EditorConfig\n * @property {String} holderId - Element to append Editor\n * @property {Array} data - Blocks list in JSON-format\n * @property {Object} tools - Map for used Tools in format { name : Class, ... }\n * @property {String} initialBlock - This Tool will be added by default\n * @property {String} placeholder - First Block placeholder\n * @property {Object} sanitizer - @todo fill desc\n * @property {Boolean} hideToolbar - @todo fill desc\n * @property {Object} toolsConfig - tools configuration {@link Tools#ToolsConfig}\n */\n\n/**\n * Dynamically imported utils\n *\n * @typedef {Dom} $ - {@link components/dom.js}\n * @typedef {Util} _ - {@link components/utils.js}\n */\n\n'use strict';\n\n/**\n * Apply polyfills\n */\nimport 'components/polyfills';\n\n/**\n * Require Editor modules places in components/modules dir\n */\n// eslint-disable-next-line\nlet modules = editorModules.map( module => require('./components/modules/' + module ));\n\n/**\n * @class\n *\n * @classdesc CodeX Editor base class\n *\n * @property this.config - all settings\n * @property this.moduleInstances - constructed editor components\n *\n * @type {CodexEditor}\n */\nmodule.exports = class CodexEditor {\n\n /** Editor version */\n static get version() {\n\n return VERSION;\n\n }\n\n /**\n * @param {EditorConfig} config - user configuration\n *\n */\n constructor(config) {\n\n /**\n * Configuration object\n * @type {EditorConfig}\n */\n this.config = {};\n\n /**\n * @typedef {Object} EditorComponents\n * @property {BlockManager} BlockManager\n * @property {Tools} Tools\n * @property {Events} Events\n * @property {UI} UI\n * @property {Toolbar} Toolbar\n * @property {Toolbox} Toolbox\n * @property {Renderer} Renderer\n */\n this.moduleInstances = {};\n\n Promise.resolve()\n .then(() => {\n\n this.configuration = config;\n\n })\n .then(() => this.init())\n .then(() => this.start())\n .then(() => {\n\n console.log('CodeX Editor is ready!');\n\n })\n .catch(error => {\n\n console.log('CodeX Editor does not ready because of %o', error);\n\n });\n\n }\n\n /**\n * Setting for configuration\n * @param {EditorConfig} config\n */\n set configuration(config) {\n\n /**\n * Initlai block type\n * Uses in case when there is no items passed\n * @type {{type: (*), data: {text: null}}}\n */\n let initialBlock = {\n type : config.initialBlock,\n data : {}\n };\n\n this.config.holderId = config.holderId;\n this.config.placeholder = config.placeholder || 'write your story...';\n this.config.sanitizer = config.sanitizer || {\n p: true,\n b: true,\n a: true\n };\n\n this.config.hideToolbar = config.hideToolbar ? config.hideToolbar : false;\n this.config.tools = config.tools || {};\n this.config.toolsConfig = config.toolsConfig || {};\n this.config.data = config.data || {};\n\n /**\n * Initialize items to pass data to the Renderer\n */\n if (_.isEmpty(this.config.data)) {\n\n this.config.data = {};\n this.config.data.items = [ initialBlock ];\n\n } else {\n\n if (!this.config.data.items || this.config.data.items.length === 0) {\n\n this.config.data.items = [ initialBlock ];\n\n }\n\n }\n\n /**\n * If initial Block's Tool was not passed, use the first Tool in config.tools\n */\n if (!config.initialBlock) {\n\n for (this.config.initialBlock in this.config.tools) break;\n\n } else {\n\n this.config.initialBlock = config.initialBlock;\n\n }\n\n }\n\n /**\n * Returns private property\n * @returns {EditorConfig}\n */\n get configuration() {\n\n return this.config;\n\n }\n\n /**\n * Initializes modules:\n * - make and save instances\n * - configure\n */\n init() {\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n this.constructModules();\n\n /**\n * Modules configuration\n */\n this.configureModules();\n\n }\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n constructModules() {\n\n modules.forEach( Module => {\n\n try {\n\n /**\n * We use class name provided by displayName property\n *\n * On build, Babel will transform all Classes to the Functions so, name will always be 'Function'\n * To prevent this, we use 'babel-plugin-class-display-name' plugin\n * @see https://www.npmjs.com/package/babel-plugin-class-display-name\n */\n this.moduleInstances[Module.displayName] = new Module({\n config : this.configuration\n });\n\n } catch ( e ) {\n\n console.log('Module %o skipped because %o', Module, e);\n\n }\n\n });\n\n }\n\n /**\n * Modules instances configuration:\n * - pass other modules to the 'state' property\n * - ...\n */\n configureModules() {\n\n for(let name in this.moduleInstances) {\n\n /**\n * Module does not need self-instance\n */\n this.moduleInstances[name].state = this.getModulesDiff( name );\n\n }\n\n }\n\n /**\n * Return modules without passed name\n */\n getModulesDiff( name ) {\n\n let diff = {};\n\n for(let moduleName in this.moduleInstances) {\n\n /**\n * Skip module with passed name\n */\n if (moduleName === name) {\n\n continue;\n\n }\n diff[moduleName] = this.moduleInstances[moduleName];\n\n }\n\n return diff;\n\n }\n\n /**\n * Start Editor!\n *\n * Get list of modules that needs to be prepared and return a sequence (Promise)\n * @return {Promise}\n */\n start() {\n\n let prepareDecorator = module => module.prepare();\n\n return Promise.resolve()\n .then(prepareDecorator(this.moduleInstances.Tools))\n .then(prepareDecorator(this.moduleInstances.UI))\n .then(prepareDecorator(this.moduleInstances.BlockManager))\n .then(() => {\n\n return this.moduleInstances.Renderer.render(this.config.data.items);\n\n\n });\n\n }\n\n};\n\n// module.exports = (function (editor) {\n//\n// 'use strict';\n//\n// editor.version = VERSION;\n// editor.scriptPrefix = 'cdx-script-';\n//\n// var init = function () {\n//\n// editor.core = require('./modules/core');\n// editor.tools = require('./modules/tools');\n// editor.ui = require('./modules/ui');\n// editor.transport = require('./modules/transport');\n// editor.renderer = require('./modules/renderer');\n// editor.saver = require('./modules/saver');\n// editor.content = require('./modules/content');\n// editor.toolbar = require('./modules/toolbar/toolbar');\n// editor.callback = require('./modules/callbacks');\n// editor.draw = require('./modules/draw');\n// editor.caret = require('./modules/caret');\n// editor.notifications = require('./modules/notifications');\n// editor.parser = require('./modules/parser');\n// editor.sanitizer = require('./modules/sanitizer');\n// editor.listeners = require('./modules/listeners');\n// editor.destroyer = require('./modules/destroyer');\n// editor.paste = require('./modules/paste');\n//\n// };\n//\n// /**\n// * @public\n// * holds initial settings\n// */\n// editor.settings = {\n// tools : ['text', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n// holderId : 'codex-editor',\n//\n// // Type of block showing on empty editor\n// initialBlockPlugin: 'text'\n// };\n//\n// /**\n// * public\n// *\n// * Static nodes\n// */\n// editor.nodes = {\n// holder : null,\n// wrapper : null,\n// toolbar : null,\n// inlineToolbar : {\n// wrapper : null,\n// buttons : null,\n// actions : null\n// },\n// toolbox : null,\n// notifications : null,\n// plusButton : null,\n// showSettingsButton: null,\n// showTrashButton : null,\n// blockSettings : null,\n// pluginSettings : null,\n// defaultSettings : null,\n// toolbarButtons : {}, // { type : DomEl, ... }\n// redactor : null\n// };\n//\n// /**\n// * @public\n// *\n// * Output state\n// */\n// editor.state = {\n// jsonOutput : [],\n// blocks : [],\n// inputs : []\n// };\n//\n// /**\n// * @public\n// * Editor plugins\n// */\n// editor.tools = {};\n//\n// editor.start = function (userSettings) {\n//\n// init();\n//\n// editor.core.prepare(userSettings)\n//\n// // If all ok, make UI, bind events and parse initial-content\n// .then(editor.ui.prepare)\n// .then(editor.tools.prepare)\n// .then(editor.sanitizer.prepare)\n// .then(editor.paste.prepare)\n// .then(editor.transport.prepare)\n// .then(editor.renderer.makeBlocksFromData)\n// .then(editor.ui.saveInputs)\n// .catch(function (error) {\n//\n// editor.core.log('Initialization failed with error: %o', 'warn', error);\n//\n// });\n//\n// };\n//\n// return editor;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/codex.js","/**\n * Element.closest()\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\n */\nif (!Element.prototype.matches)\n Element.prototype.matches = Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n\nif (!Element.prototype.closest)\n Element.prototype.closest = function (s) {\n\n var el = this;\n\n if (!document.documentElement.contains(el)) return null;\n do {\n\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n\n } while (el !== null);\n return null;\n\n };\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/polyfills.js","var map = {\n\t\"./blockManager.js\": 7,\n\t\"./caret.js\": 9,\n\t\"./events.js\": 10,\n\t\"./listeners.js\": 11,\n\t\"./renderer.js\": 12,\n\t\"./sanitizer.js\": 13,\n\t\"./saver.js\": 15,\n\t\"./toolbar.js\": 16,\n\t\"./toolbox.js\": 17,\n\t\"./tools.js\": 18,\n\t\"./ui.js\": 19\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 6;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/modules nonrecursive [^_](blockManager.js|caret.js|events.js|listeners.js|renderer.js|sanitizer.js|saver.js|toolbar.js|toolbox.js|tools.js|ui.js)$\n// module id = 6\n// module chunks = 0","/**\n * @class BlockManager\n * @classdesc Manage editor`s blocks storage and appearance\n *\n * @module BlockManager\n *\n * @version 2.0.0\n */\n\nimport Block from '../block';\nimport Selection from '../Selection';\n\n/**\n * @typedef {BlockManager} BlockManager\n * @property {Number} currentBlockIndex - Index of current working block\n * @property {Proxy} _blocks - Proxy for Blocks instance {@link Blocks}\n */\nexport default class BlockManager extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n /**\n * Proxy for Blocks instance {@link Blocks}\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = null;\n\n /**\n * Index of current working block\n *\n * @type {number}\n * @private\n */\n this.currentBlockIndex = -1;\n\n }\n\n /**\n * Should be called after Editor.UI preparation\n * Define this._blocks property\n *\n * @returns {Promise}\n */\n prepare() {\n\n return new Promise(resolve => {\n\n let blocks = new Blocks(this.Editor.UI.nodes.redactor);\n\n /**\n * We need to use Proxy to overload set/get [] operator.\n * So we can use array-like syntax to access blocks\n *\n * @example\n * this._blocks[0] = new Block(...);\n *\n * block = this._blocks[0];\n *\n * @todo proxy the enumerate method\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = new Proxy(blocks, {\n set: Blocks.set,\n get: Blocks.get\n });\n\n resolve();\n\n });\n\n }\n\n /**\n * Creates Block instance by tool name\n *\n * @param {String} toolName - tools passed in editor config {@link EditorConfig#tools}\n * @param {Object} data - constructor params\n *\n * @return {Block}\n */\n composeBlock(toolName, data) {\n\n let toolInstance = this.Editor.Tools.construct(toolName, data),\n block = new Block(toolName, toolInstance);\n\n this.bindEvents(block);\n\n /**\n * Apply callback before inserting html\n */\n block.call('appendCallback', {});\n\n return block;\n\n }\n\n /**\n * Bind Events\n * @param {Object} block\n */\n bindEvents(block) {\n\n /**\n * keydown on block\n * @todo move to the keydown module\n */\n this.Editor.Listeners.on(block.pluginsContent, 'keydown', (event) => this.keyDownOnBlock(event));\n\n }\n\n /**\n * @todo move to the keydown module\n * @param {MouseEvent} event\n */\n keyDownOnBlock(event) {\n\n switch(event.keyCode) {\n\n case _.keyCodes.ENTER:\n this.enterPressedOnPluginsContent(event);\n break;\n case _.keyCodes.DOWN:\n case _.keyCodes.RIGHT:\n this.navigateNext();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.navigatePrevious();\n break;\n\n }\n\n }\n\n /**\n * Set's caret to the next Block\n * Before moving caret, we should check if caret position is at the end of Plugins node\n * Using {@link Dom#getDeepestNode} to get a last node and match with current selection\n */\n navigateNext() {\n\n let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getAnchorOffset() === textNodeLength) {\n\n let nextBlock = this.nextBlock;\n\n if (!nextBlock) return;\n\n this.Editor.Caret.setToBlock( nextBlock );\n\n }\n\n }\n\n /**\n * Set's caret to the previous Block\n * Before moving caret, we should check if caret position is at the end of Plugins node\n * Using {@link Dom#getDeepestNode} to get a last node and match with current selection\n */\n navigatePrevious() {\n\n let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n if (Selection.getAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getAnchorOffset() === 0) {\n\n let previousBlock = this.previousBlock;\n\n if (!previousBlock) return;\n\n this.Editor.Caret.setToBlock( previousBlock, textNodeLength, true );\n\n }\n\n }\n\n /**\n * Insert new block into _blocks\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n insert(toolName, data = {}) {\n\n\n let block = this.composeBlock(toolName, data);\n\n this._blocks[++this.currentBlockIndex] = block;\n this.Editor.Caret.setToBlock(block);\n\n }\n\n /**\n * Replace current working block\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n replace(toolName, data = {}) {\n\n let block = this.composeBlock(toolName, data);\n\n this._blocks.insert(this.currentBlockIndex, block, true);\n\n }\n\n /**\n * returns last Block\n * @return {Block}\n */\n get lastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n * Returns Block by passed index\n * @param {Number} index\n * @return {Block}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Get Block instance by html element\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`),\n index = nodes.indexOf(firstLevelBlock);\n\n if (index >= 0) {\n\n return this._blocks[index];\n\n }\n\n }\n\n /**\n * Get current Block instance\n *\n * @return {Block}\n */\n get currentBlock() {\n\n return this._blocks[this.currentBlockIndex];\n\n }\n\n /**\n * Returns next Block instance\n * @return {Block|null}\n */\n get nextBlock() {\n\n let isLastBlock = this.currentBlockIndex === (this._blocks.length - 1);\n\n if (isLastBlock) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex + 1];\n\n }\n\n /**\n * Returns previous Block instance\n * @return {Block|null}\n */\n get previousBlock() {\n\n let isFirstBlock = this.currentBlockIndex === 0;\n\n if (isFirstBlock) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex - 1];\n\n }\n\n /**\n * Get working html element\n *\n * @return {HTMLElement}\n */\n get currentNode() {\n\n return this._blocks.nodes[this.currentBlockIndex];\n\n }\n\n /**\n * Set currentBlockIndex to passed block\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes,\n firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`);\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(firstLevelBlock);\n\n /**\n * Remove previous selected Block's state\n */\n this._blocks.array.forEach( block => block.selected = false);\n\n /**\n * Mark current Block as selected\n * @type {boolean}\n */\n this.currentBlock.selected = true;\n\n }\n\n /**\n * Get array of Block instances\n *\n * @returns {Block[]} {@link Blocks#array}\n */\n get blocks() {\n\n return this._blocks.array;\n\n }\n\n /**\n * 1) Find first-level Block from passed child Node\n * 2) Mark it as current\n *\n * @param {Element|Text} childNode - look ahead from this node.\n * @throws Error - when passed Node is not included at the Block\n */\n setCurrentBlockByChildNode(childNode) {\n\n /**\n * If node is Text TextNode\n */\n if (!$.isElement(childNode)) {\n\n childNode = childNode.parentNode;\n\n }\n\n let parentFirstLevelBlock = childNode.closest(`.${Block.CSS.wrapper}`);\n\n if (parentFirstLevelBlock) {\n\n this.currentNode = parentFirstLevelBlock;\n\n } else {\n\n throw new Error('Can not find a Block from this child Node');\n\n }\n\n }\n\n}\n\n/**\n * @class Blocks\n * @classdesc Class to work with Block instances array\n *\n * @private\n *\n * @property {HTMLElement} workingArea — editor`s working node\n *\n */\nclass Blocks {\n\n /**\n * @constructor\n *\n * @param {HTMLElement} workingArea — editor`s working node\n */\n constructor(workingArea) {\n\n this.blocks = [];\n this.workingArea = workingArea;\n\n }\n\n /**\n * Push back new Block\n *\n * @param {Block} block\n */\n push(block) {\n\n this.blocks.push(block);\n this.workingArea.appendChild(block.html);\n\n }\n\n /**\n * Insert new Block at passed index\n *\n * @param {Number} index — index to insert Block\n * @param {Block} block — Block to insert\n * @param {Boolean} replace — it true, replace block on given index\n */\n insert(index, block, replace = false) {\n\n if (!this.length) {\n\n this.push(block);\n return;\n\n }\n\n if (index > this.length) {\n\n index = this.length;\n\n }\n\n if (replace) {\n\n this.blocks[index].html.remove();\n\n }\n\n let deleteCount = replace ? 1 : 0;\n\n this.blocks.splice(index, deleteCount, block);\n\n if (index > 0) {\n\n let previousBlock = this.blocks[index - 1];\n\n previousBlock.html.insertAdjacentElement('afterend', block.html);\n\n } else {\n\n let nextBlock = this.blocks[index + 1];\n\n if (nextBlock) {\n\n nextBlock.html.insertAdjacentElement('beforebegin', block.html);\n\n } else {\n\n this.workingArea.appendChild(block.html);\n\n }\n\n }\n\n }\n\n /**\n * Insert Block after passed target\n *\n * @todo decide if this method is necessary\n *\n * @param {Block} targetBlock — target after wich Block should be inserted\n * @param {Block} newBlock — Block to insert\n */\n insertAfter(targetBlock, newBlock) {\n\n let index = this.blocks.indexOf(targetBlock);\n\n this.insert(index + 1, newBlock);\n\n }\n\n /**\n * Get Block by index\n *\n * @param {Number} index — Block index\n * @returns {Block}\n */\n get(index) {\n\n return this.blocks[index];\n\n }\n\n /**\n * Return index of passed Block\n *\n * @param {Block} block\n * @returns {Number}\n */\n indexOf(block) {\n\n return this.blocks.indexOf(block);\n\n }\n\n /**\n * Get length of Block instances array\n *\n * @returns {Number}\n */\n get length() {\n\n return this.blocks.length;\n\n }\n\n /**\n * Get Block instances array\n *\n * @returns {Block[]}\n */\n get array() {\n\n return this.blocks;\n\n }\n\n /**\n * Get blocks html elements array\n *\n * @returns {HTMLElement[]}\n */\n get nodes() {\n\n return _.array(this.workingArea.children);\n\n }\n\n /**\n * Proxy trap to implement array-like setter\n *\n * @example\n * blocks[0] = new Block(...)\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — block index\n * @param {Block} block — Block to set\n * @returns {Boolean}\n */\n static set(instance, index, block) {\n\n if (isNaN(Number(index))) {\n\n return false;\n\n }\n\n instance.insert(index, block);\n\n return true;\n\n }\n\n /**\n * Proxy trap to implement array-like getter\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — Block index\n * @returns {Block|*}\n */\n static get(instance, index) {\n\n if (isNaN(Number(index))) {\n\n return instance[index];\n\n }\n\n return instance.get(index);\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/blockManager.js","/**\n *\n * @class Block\n * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool\n *\n * @property {Tool} tool — current block tool (Paragraph, for example)\n * @property {Object} CSS — block`s css classes\n *\n */\n\n/**\n * @classdesc Abstract Block class that contains Block information, Tool name and Tool class instance\n *\n * @property tool - Tool instance\n * @property html - Returns HTML content of plugin\n * @property wrapper - Div element that wraps block content with Tool's content. Has `ce-block` CSS class\n * @property contentNode - Div element that wraps Tool's content. Has `ce-block__content` CSS class\n * @property pluginsContent - HTML content that returns by Tool's render function\n */\nexport default class Block {\n\n /**\n * @constructor\n * @param {String} toolName - Tool name that passed on initialization\n * @param {Object} toolInstance — passed Tool`s instance that rendered the Block\n */\n constructor(toolName, toolInstance) {\n\n this.name = toolName;\n this.tool = toolInstance;\n this._html = this.compose();\n\n }\n\n /**\n * CSS classes for the Block\n * @return {{wrapper: string, content: string}}\n */\n static get CSS() {\n\n return {\n wrapper: 'ce-block',\n content: 'ce-block__content',\n selected: 'ce-block--selected'\n };\n\n }\n\n /**\n * Make default Block wrappers and put Tool`s content there\n * @returns {HTMLDivElement}\n */\n compose() {\n\n this.wrapper = $.make('div', Block.CSS.wrapper);\n this.contentNode = $.make('div', Block.CSS.content);\n this.pluginsContent = this.tool.render();\n\n this.contentNode.appendChild(this.pluginsContent);\n this.wrapper.appendChild(this.contentNode);\n\n return this.wrapper;\n\n }\n\n /**\n * Calls Tool's method\n *\n * Method checks tool property {MethodName}. Fires method with passes params If it is instance of Function\n *\n * @param {String} methodName\n * @param {Object} params\n */\n call(methodName, params) {\n\n /**\n * call Tool's method with the instance context\n */\n if (this.tool[methodName] && this.tool[methodName] instanceof Function) {\n\n this.tool[methodName].call(this.tool, params);\n\n }\n\n }\n\n /**\n * Get Block`s HTML\n * @returns {HTMLElement}\n */\n get html() {\n\n return this._html;\n\n }\n\n /**\n * Get Block's JSON data\n * @return {Object}\n */\n get data() {\n\n return this.save();\n\n }\n\n /**\n * Extracts data from Block\n * Groups Tool's save processing time\n * @return {Object}\n */\n save() {\n\n let extractedBlock = this.tool.save(this.pluginsContent);\n\n /** Measuring execution time*/\n let measuringStart = window.performance.now(),\n measuringEnd;\n\n return Promise.resolve(extractedBlock)\n .then((finishedExtraction) => {\n\n /** measure promise execution */\n measuringEnd = window.performance.now();\n\n return {\n tool: this.name,\n data: finishedExtraction,\n time : measuringEnd - measuringStart\n };\n\n })\n .catch(function (error) {\n\n _.log(`Saving proccess for ${this.tool.name} tool failed due to the ${error}`, 'log', 'red');\n\n });\n\n }\n\n /**\n * Uses Tool's validation method to check the correctness of output data\n * Tool's validation method is optional\n *\n * @description Method also can return data if it passed the validation\n *\n * @param {Object} data\n * @returns {Boolean|Object} valid\n */\n validateData(data) {\n\n let isValid = true;\n\n if (this.tool.validate instanceof Function) {\n\n isValid = this.tool.validate(data);\n\n }\n\n if (!isValid) {\n\n return false;\n\n }\n\n return data;\n\n }\n\n /**\n * Check block for emptiness\n * @return {Boolean}\n */\n get isEmpty() {\n\n /**\n * Allow Tool to represent decorative contentless blocks: for example \"* * *\"-tool\n * That Tools are not empty\n */\n if (this.tool.contentless) {\n\n return false;\n\n }\n\n let emptyText = $.isEmpty(this.pluginsContent),\n emptyMedia = !this.hasMedia;\n\n return emptyText && emptyMedia;\n\n }\n\n /**\n * Check if block has a media content such as images, iframes and other\n * @return {Boolean}\n */\n get hasMedia() {\n\n /**\n * This tags represents media-content\n * @type {string[]}\n */\n const mediaTags = [\n 'img',\n 'iframe',\n 'video',\n 'audio',\n 'source',\n 'input',\n 'textarea',\n 'twitterwidget'\n ];\n\n return !!this._html.querySelector(mediaTags.join(','));\n\n }\n\n /**\n * Set selected state\n * @param {Boolean} state - 'true' to select, 'false' to remove selection\n */\n set selected(state) {\n\n /**\n * We don't need to mark Block as Selected when it is not empty\n */\n if (state === true && !this.isEmpty) {\n\n this._html.classList.add(Block.CSS.selected);\n\n } else {\n\n this._html.classList.remove(Block.CSS.selected);\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/block.js","/**\n * @class Caret\n * @classdesc Contains methods for working Caret\n *\n * Uses Range methods to manipulate with caret\n *\n * @module Caret\n *\n * @version 2.0.0\n */\n\n/**\n * @typedef {Caret} Caret\n */\nimport Selection from '../Selection';\n\nexport default class Caret extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * Method gets Block instance and puts caret to the text node with offset\n * There two ways that method applies caret position:\n * - first found text node: sets at the beginning, but you can pass an offset\n * - last found text node: sets at the end of the node. Also, you can customize the behaviour\n *\n * @param {Block} block - Block class\n * @param {Number} offset - caret offset regarding to the text node\n * @param {Boolean} atEnd - put caret at the end of the text node or not\n */\n setToBlock(block, offset = 0, atEnd = false) {\n\n let element = block.pluginsContent;\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestNode(element, atEnd);\n\n if (atEnd || offset > nodeToSet.length) {\n\n offset = nodeToSet.length;\n\n }\n\n /** if found deepest node is native input */\n if ($.isNativeInput(nodeToSet)) {\n\n nodeToSet.focus();\n return;\n\n }\n\n /**\n * @todo try to fix via Promises or use querySelectorAll to not to use timeout\n */\n _.delay( () => this.set(nodeToSet, offset), 20)();\n\n this.Editor.BlockManager.currentNode = block.wrapper;\n\n }\n\n /**\n * Creates Document Range and sets caret to the element with offset\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n */\n set( element, offset = 0) {\n\n let range = document.createRange(),\n selection = Selection.get();\n\n range.setStart(element, offset);\n range.setEnd(element, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n };\n\n /**\n * Set Caret to the last Block\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let lastBlock = this.Editor.BlockManager.lastBlock;\n\n if (!lastBlock) return;\n\n /**\n * If last block is empty and it is an initialBlock, set to that.\n * Otherwise, append new empty block and set to that\n */\n if (lastBlock.isEmpty) {\n\n this.setToBlock(lastBlock);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/caret.js","/**\n * @module eventDispatcher\n *\n * Has two important methods:\n * - {Function} on - appends subscriber to the event. If event doesn't exist - creates new one\n * - {Function} emit - fires all subscribers with data\n *\n * @version 1.0.0\n *\n * @typedef {Events} Events\n * @property {Object} subscribers - all subscribers grouped by event name\n */\nexport default class Events extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n this.subscribers = {};\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Function} callback - subscriber\n */\n on(eventName, callback) {\n\n if (!(eventName in this.subscribers)) {\n\n this.subscribers[eventName] = [];\n\n }\n\n // group by events\n this.subscribers[eventName].push(callback);\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Object} data - subscribers get this data when they were fired\n */\n emit(eventName, data) {\n\n this.subscribers[eventName].reduce(function (previousData, currentHandler) {\n\n let newData = currentHandler(previousData);\n\n return newData ? newData : previousData;\n\n }, data);\n\n }\n\n /**\n * Destroyer\n * clears subsribers list\n */\n destroy() {\n\n this.subscribers = null;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/events.js","/**\n * Codex Editor Listeners module\n *\n * @module Listeners\n *\n * Module-decorator for event listeners assignment\n *\n * @author Codex Team\n * @version 2.0.0\n */\n\n/**\n * @typedef {Listeners} Listeners\n * @property {Array} allListeners\n */\n\nexport default class Listeners extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n this.allListeners = [];\n\n }\n\n /**\n * Assigns event listener on element\n *\n * @param {Element} element - DOM element that needs to be listened\n * @param {String} eventType - event type\n * @param {Function} handler - method that will be fired on event\n * @param {Boolean} useCapture - use event bubbling\n */\n on(element, eventType, handler, useCapture = false) {\n\n let assignedEventData = {\n element,\n eventType,\n handler,\n useCapture\n };\n\n let alreadyExist = this.findOne(element, eventType, handler);\n\n if (alreadyExist) return;\n\n this.allListeners.push(assignedEventData);\n element.addEventListener(eventType, handler, useCapture);\n\n }\n\n /**\n * Removes event listener from element\n *\n * @param {Element} element - DOM element that we removing listener\n * @param {String} eventType - event type\n * @param {Function} handler - remove handler, if element listens several handlers on the same event type\n * @param {Boolean} useCapture - use event bubbling\n */\n off(element, eventType, handler, useCapture = false) {\n\n let existingListeners = this.findAll(element, eventType, handler);\n\n for (let i = 0; i < existingListeners.length; i++) {\n\n let index = this.allListeners.indexOf(existingListeners[i]);\n\n if (index > 0) {\n\n this.allListeners.splice(index, 1);\n\n }\n\n }\n\n element.removeEventListener(eventType, handler, useCapture);\n\n\n }\n\n /**\n * Search methods\n *\n * byElement, byType and byHandler returns array of suitable listeners\n * one and all takes element, eventType, and handler and returns first (all) suitable listener\n */\n findByElement(element) {\n\n let listenersOnElement = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.element === element) {\n\n listenersOnElement.push(listener);\n\n }\n\n }\n\n return listenersOnElement;\n\n }\n\n findByType(eventType) {\n\n let listenersWithType = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.type === eventType) {\n\n listenersWithType.push(listener);\n\n }\n\n }\n\n return listenersWithType;\n\n }\n\n findByHandler(handler) {\n\n let listenersWithHandler = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.handler === handler) {\n\n listenersWithHandler.push(listener);\n\n }\n\n }\n\n return listenersWithHandler;\n\n }\n\n findOne(element, eventType, handler) {\n\n let foundListeners = [];\n\n if (element)\n foundListeners = this.byElement(element);\n\n if (eventType)\n foundListeners = foundListeners.concat(this.byType(eventType));\n\n if (handler)\n foundListeners = foundListeners.concat(this.byHandler(handler));\n\n return foundListeners[0];\n\n }\n\n findAll(element, eventType, handler) {\n\n let foundListeners = [];\n\n if (element)\n foundListeners = this.byElement(element);\n\n if (eventType)\n foundListeners = foundListeners.concat(this.byType(eventType));\n\n if (handler)\n foundListeners = foundListeners.concat(this.byHandler(handler));\n\n return foundListeners;\n\n }\n\n removeAll() {\n\n this.allListeners.map( (current) => {\n\n this.off(current.element, current.type, current.handler);\n\n });\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/listeners.js","/**\n * Codex Editor Renderer Module\n *\n * @module Renderer\n * @author CodeX Team\n *\n * @version 2.0.0\n */\nexport default class Renderer extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * @typedef {Object} RendererItems\n * @property {String} type - tool name\n * @property {Object} data - tool data\n */\n\n /**\n * @example\n *\n * items: [\n * {\n * type : 'paragraph',\n * data : {\n * text : 'Hello from Codex!'\n * }\n * },\n * {\n * type : 'paragraph',\n * data : {\n * text : 'Leave feedback if you like it!'\n * }\n * },\n * ]\n *\n */\n\n /**\n * Make plugin blocks from array of plugin`s data\n * @param {RendererItems[]} items\n */\n render(items) {\n\n let chainData = [];\n\n for (let i = 0; i < items.length; i++) {\n\n chainData.push({\n function: () => this.insertBlock(items[i])\n });\n\n }\n\n return _.sequence(chainData);\n\n }\n\n /**\n * Get plugin instance\n * Add plugin instance to BlockManager\n * Insert block to working zone\n *\n * @param {Object} item\n * @returns {Promise.}\n * @private\n */\n insertBlock(item) {\n\n let tool = item.type,\n data = item.data;\n\n this.Editor.BlockManager.insert(tool, data);\n\n return Promise.resolve();\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/renderer.js","/**\n * CodeX Sanitizer\n *\n * @module Sanitizer\n * Clears HTML from taint tags\n *\n * @version 2.0.0\n *\n * @example\n * Module can be used within two ways:\n * 1) When you have an instance\n * - this.Editor.Sanitizer.clean(yourTaintString);\n * 2) As static method\n * - CodexEditor.Sanitizer.clean(yourTaintString, yourCustomConfiguration);\n *\n * {@link SanitizerConfig}\n */\n\n\n/**\n * @typedef {Object} SanitizerConfig\n * @property {Object} tags - define tags restrictions\n *\n * @example\n *\n * tags : {\n * p: true,\n * a: {\n * href: true,\n * rel: \"nofollow\",\n * target: \"_blank\"\n * }\n * }\n */\nexport default class Sanitizer extends Module {\n\n /**\n * Initializes Sanitizer module\n * Sets default configuration if custom not exists\n *\n * @property {SanitizerConfig} this.defaultConfig\n * @property {HTMLJanitor} this._sanitizerInstance - Sanitizer library\n *\n * @param {SanitizerConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n // default config\n this.defaultConfig = null;\n this._sanitizerInstance = null;\n\n /** Custom configuration */\n this.sanitizerConfig = config.settings ? config.settings.sanitizer : {};\n\n /** HTML Janitor library */\n this.sanitizerInstance = require('html-janitor');\n\n }\n\n /**\n * If developer uses editor's API, then he can customize sanitize restrictions.\n * Or, sanitizing config can be defined globally in editors initialization. That config will be used everywhere\n * At least, if there is no config overrides, that API uses Default configuration\n *\n * @uses https://www.npmjs.com/package/html-janitor\n *\n * @param {HTMLJanitor} library - sanitizer extension\n */\n set sanitizerInstance(library) {\n\n this._sanitizerInstance = new library(this.defaultConfig);\n\n }\n\n /**\n * Sets sanitizer configuration. Uses default config if user didn't pass the restriction\n * @param {SanitizerConfig} config\n */\n set sanitizerConfig(config) {\n\n if (_.isEmpty(config)) {\n\n this.defaultConfig = {\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: 'nofollow'\n }\n }\n };\n\n } else {\n\n this.defaultConfig = config;\n\n }\n\n }\n\n /**\n * Cleans string from unwanted tags\n * @param {String} taintString - HTML string\n * @param {Object} customConfig - custom sanitizer configuration. Method uses default if param is empty\n * @return {String} clean HTML\n */\n clean(taintString, customConfig = {}) {\n\n if (_.isEmpty(customConfig)) {\n\n return this._sanitizerInstance.clean(taintString);\n\n } else {\n\n return Sanitizer.clean(taintString, customConfig);\n\n }\n\n\n }\n\n /**\n * Cleans string from unwanted tags\n * @static\n *\n * Method allows to use default config\n *\n * @param {String} taintString - taint string\n * @param {SanitizerConfig} customConfig - allowed tags\n *\n * @return {String} clean HTML\n */\n static clean(taintString, customConfig) {\n\n let newInstance = Sanitizer(customConfig);\n\n return newInstance.clean(taintString);\n\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/sanitizer.js","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('html-janitor', factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.HTMLJanitor = factory();\n }\n}(this, function () {\n\n /**\n * @param {Object} config.tags Dictionary of allowed tags.\n * @param {boolean} config.keepNestedBlockElements Default false.\n */\n function HTMLJanitor(config) {\n\n var tagDefinitions = config['tags'];\n var tags = Object.keys(tagDefinitions);\n\n var validConfigValues = tags\n .map(function(k) { return typeof tagDefinitions[k]; })\n .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });\n\n if(!validConfigValues) {\n throw new Error(\"The configuration was invalid\");\n }\n\n this.config = config;\n }\n\n // TODO: not exhaustive?\n var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];\n function isBlockElement(node) {\n return blockElementNames.indexOf(node.nodeName) !== -1;\n }\n\n var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];\n function isInlineElement(node) {\n return inlineElementNames.indexOf(node.nodeName) !== -1;\n }\n\n HTMLJanitor.prototype.clean = function (html) {\n var sandbox = document.createElement('div');\n sandbox.innerHTML = html;\n\n this._sanitize(sandbox);\n\n return sandbox.innerHTML;\n };\n\n HTMLJanitor.prototype._sanitize = function (parentNode) {\n var treeWalker = createTreeWalker(parentNode);\n var node = treeWalker.firstChild();\n if (!node) { return; }\n\n do {\n // Ignore nodes that have already been sanitized\n if (node._sanitized) {\n continue;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // If this text node is just whitespace and the previous or next element\n // sibling is a block element, remove it\n // N.B.: This heuristic could change. Very specific to a bug with\n // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output\n // FIXME: make this an option?\n if (node.data.trim() === ''\n && ((node.previousElementSibling && isBlockElement(node.previousElementSibling))\n || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n } else {\n continue;\n }\n }\n\n // Remove all comments\n if (node.nodeType === Node.COMMENT_NODE) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n }\n\n var isInline = isInlineElement(node);\n var containsBlockElement;\n if (isInline) {\n containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);\n }\n\n // Block elements should not be nested (e.g.

  • ...); if\n // they are, we want to unwrap the inner block element.\n var isNotTopContainer = !! parentNode.parentNode;\n var isNestedBlockElement =\n isBlockElement(parentNode) &&\n isBlockElement(node) &&\n isNotTopContainer;\n\n var nodeName = node.nodeName.toLowerCase();\n\n var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);\n\n var isInvalid = isInline && containsBlockElement;\n\n // Drop tag entirely according to the whitelist *and* if the markup\n // is invalid.\n if (isInvalid || shouldRejectNode(node, allowedAttrs)\n || (!this.config.keepNestedBlockElements && isNestedBlockElement)) {\n // Do not keep the inner text of SCRIPT/STYLE elements.\n if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {\n while (node.childNodes.length > 0) {\n parentNode.insertBefore(node.childNodes[0], node);\n }\n }\n parentNode.removeChild(node);\n\n this._sanitize(parentNode);\n break;\n }\n\n // Sanitize attributes\n for (var a = 0; a < node.attributes.length; a += 1) {\n var attr = node.attributes[a];\n\n if (shouldRejectAttr(attr, allowedAttrs, node)) {\n node.removeAttribute(attr.name);\n // Shift the array to continue looping.\n a = a - 1;\n }\n }\n\n // Sanitize children\n this._sanitize(node);\n\n // Mark node as sanitized so it's ignored in future runs\n node._sanitized = true;\n } while ((node = treeWalker.nextSibling()));\n };\n\n function createTreeWalker(node) {\n return document.createTreeWalker(node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,\n null, false);\n }\n\n function getAllowedAttrs(config, nodeName, node){\n if (typeof config.tags[nodeName] === 'function') {\n return config.tags[nodeName](node);\n } else {\n return config.tags[nodeName];\n }\n }\n\n function shouldRejectNode(node, allowedAttrs){\n if (typeof allowedAttrs === 'undefined') {\n return true;\n } else if (typeof allowedAttrs === 'boolean') {\n return !allowedAttrs;\n }\n\n return false;\n }\n\n function shouldRejectAttr(attr, allowedAttrs, node){\n var attrName = attr.name.toLowerCase();\n\n if (allowedAttrs === true){\n return false;\n } else if (typeof allowedAttrs[attrName] === 'function'){\n return !allowedAttrs[attrName](attr.value, node);\n } else if (typeof allowedAttrs[attrName] === 'undefined'){\n return true;\n } else if (allowedAttrs[attrName] === false) {\n return true;\n } else if (typeof allowedAttrs[attrName] === 'string') {\n return (allowedAttrs[attrName] !== attr.value);\n }\n\n return false;\n }\n\n return HTMLJanitor;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html-janitor/src/html-janitor.js\n// module id = 14\n// module chunks = 0","/**\n * Codex Editor Saver\n *\n * @module Saver\n * @author Codex Team\n * @version 2.0.0\n */\n\n/**\n * @typedef {Object} SavedData\n * @property {Date} time - saving proccess time\n * @property {Object} items - extracted data\n * @property {String} version - CodexEditor version\n */\n\n/**\n * @classdesc This method reduces all Blocks asyncronically and calls Block's save method to extract data\n *\n * @typedef {Saver} Saver\n * @property {Element} html - Editor HTML content\n * @property {String} json - Editor JSON output\n */\n\nexport default class Saver extends Module {\n\n /**\n * @constructor\n * @param config\n */\n constructor({config}) {\n\n super({config});\n\n this.output = null;\n this.blocksData = [];\n\n }\n\n /**\n * Composes new chain of Promises to fire them alternatelly\n * @return {SavedData}\n */\n save() {\n\n let blocks = this.Editor.BlockManager.blocks,\n chainData = [];\n\n blocks.forEach((block) => {\n\n chainData.push(block.data);\n\n });\n\n return Promise.all(chainData)\n .then((allExtractedData) => this.makeOutput(allExtractedData))\n .then((outputData) => {\n\n return outputData;\n\n });\n\n }\n\n /**\n * Creates output object with saved data, time and version of editor\n * @param {Object} allExtractedData\n * @return {SavedData}\n */\n makeOutput(allExtractedData) {\n\n let items = [],\n totalTime = 0;\n\n console.groupCollapsed('[CodexEditor saving]:');\n\n allExtractedData.forEach((extraction, index) => {\n\n /** Group process info */\n console.log(`«${extraction.tool}» saving info`, extraction);\n totalTime += extraction.time;\n items.push(extraction.data);\n\n });\n\n console.log('Total', totalTime);\n console.groupEnd();\n\n return {\n time : +new Date(),\n items : items,\n version : VERSION,\n };\n\n }\n\n}\n\n// module.exports = (function (saver) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * @public\n// * Save blocks\n// */\n// saver.save = function () {\n//\n// /** Save html content of redactor to memory */\n// editor.state.html = editor.nodes.redactor.innerHTML;\n//\n// /** Clean jsonOutput state */\n// editor.state.jsonOutput = [];\n//\n// return saveBlocks(editor.nodes.redactor.childNodes);\n//\n// };\n//\n// /**\n// * @private\n// * Save each block data\n// *\n// * @param blocks\n// * @returns {Promise.}\n// */\n// let saveBlocks = function (blocks) {\n//\n// let data = [];\n//\n// for(let index = 0; index < blocks.length; index++) {\n//\n// data.push(getBlockData(blocks[index]));\n//\n// }\n//\n// return Promise.all(data)\n// .then(makeOutput)\n// .catch(editor.core.log);\n//\n// };\n//\n// /** Save and validate block data */\n// let getBlockData = function (block) {\n//\n// return saveBlockData(block)\n// .then(validateBlockData)\n// .catch(editor.core.log);\n//\n// };\n//\n// /**\n// * @private\n// * Call block`s plugin save method and return saved data\n// *\n// * @param block\n// * @returns {Object}\n// */\n// let saveBlockData = function (block) {\n//\n// let pluginName = block.dataset.tool;\n//\n// /** Check for plugin existence */\n// if (!editor.tools[pluginName]) {\n//\n// editor.core.log(`Plugin «${pluginName}» not found`, 'error');\n// return {data: null, pluginName: null};\n//\n// }\n//\n// /** Check for plugin having save method */\n// if (typeof editor.tools[pluginName].save !== 'function') {\n//\n// editor.core.log(`Plugin «${pluginName}» must have save method`, 'error');\n// return {data: null, pluginName: null};\n//\n// }\n//\n// /** Result saver */\n// let blockContent = block.childNodes[0],\n// pluginsContent = blockContent.childNodes[0],\n// position = pluginsContent.dataset.inputPosition;\n//\n// /** If plugin wasn't available then return data from cache */\n// if ( editor.tools[pluginName].available === false ) {\n//\n// return Promise.resolve({data: codex.editor.state.blocks.items[position].data, pluginName});\n//\n// }\n//\n// return Promise.resolve(pluginsContent)\n// .then(editor.tools[pluginName].save)\n// .then(data => Object({data, pluginName}));\n//\n// };\n//\n// /**\n// * Call plugin`s validate method. Return false if validation failed\n// *\n// * @param data\n// * @param pluginName\n// * @returns {Object|Boolean}\n// */\n// let validateBlockData = function ({data, pluginName}) {\n//\n// if (!data || !pluginName) {\n//\n// return false;\n//\n// }\n//\n// if (editor.tools[pluginName].validate) {\n//\n// let result = editor.tools[pluginName].validate(data);\n//\n// /**\n// * Do not allow invalid data\n// */\n// if (!result) {\n//\n// return false;\n//\n// }\n//\n// }\n//\n// return {data, pluginName};\n//\n//\n// };\n//\n// /**\n// * Compile article output\n// *\n// * @param savedData\n// * @returns {{time: number, version, items: (*|Array)}}\n// */\n// let makeOutput = function (savedData) {\n//\n// savedData = savedData.filter(blockData => blockData);\n//\n// let items = savedData.map(blockData => Object({type: blockData.pluginName, data: blockData.data}));\n//\n// editor.state.jsonOutput = items;\n//\n// return {\n// id: editor.state.blocks.id || null,\n// time: +new Date(),\n// version: editor.version,\n// items\n// };\n//\n// };\n//\n// return saver;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/saver.js","/**\n *\n * «Toolbar» is the node that moves up/down over current block\n *\n * ______________________________________ Toolbar ____________________________________________\n * | |\n * | ..................... Content .................... ......... Block Actions .......... |\n * | . . . . |\n * | . . . [Open Settings] [Remove Block] . |\n * | . [Plus Button] [Toolbox: {Tool1}, {Tool2}] . . . |\n * | . . . [Settings Panel] . |\n * | .................................................. .................................. |\n * | |\n * |___________________________________________________________________________________________|\n *\n *\n * Toolbox — its an Element contains tools buttons. Can be shown by Plus Button.\n *\n * _______________ Toolbox _______________\n * | |\n * | [Header] [Image] [List] [Quote] ... |\n * |_______________________________________|\n *\n *\n * Settings Panel — is an Element with block settings:\n *\n * ____ Settings Panel ____\n * | ...................... |\n * | . Tool Settings . |\n * | ...................... |\n * | . Default Settings . |\n * | ...................... |\n * |________________________|\n *\n *\n * @class\n * @classdesc Toolbar module\n *\n * @typedef {Toolbar} Toolbar\n * @property {Object} nodes\n * @property {Element} nodes.wrapper - Toolbar main element\n * @property {Element} nodes.content - Zone with Plus button and toolbox.\n * @property {Element} nodes.actions - Zone with Block Settings and Remove Button\n * @property {Element} nodes.plusButton - Button that opens or closes Toolbox\n * @property {Element} nodes.toolbox - Container for tools\n * @property {Element} nodes.settingsToggler - open/close Settings Panel button\n * @property {Element} nodes.removeBlockButton - Remove Block button\n * @property {Element} nodes.settings - Settings Panel\n * @property {Element} nodes.pluginSettings - Plugin Settings section of Settings Panel\n * @property {Element} nodes.defaultSettings - Default Settings section of Settings Panel\n */\nexport default class Toolbar extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n wrapper : null,\n content : null,\n actions : null,\n\n // Content Zone\n plusButton : null,\n\n // Actions Zone\n settingsToggler : null,\n removeBlockButton: null,\n settings: null,\n\n // Settings Zone: Plugin Settings and Default Settings\n pluginSettings: null,\n defaultSettings: null,\n };\n\n }\n\n /**\n * CSS styles\n * @return {Object}\n * @constructor\n */\n static get CSS() {\n\n return {\n toolbar: 'ce-toolbar',\n content: 'ce-toolbar__content',\n actions: 'ce-toolbar__actions',\n\n toolbarOpened: 'ce-toolbar--opened',\n\n // Content Zone\n plusButton: 'ce-toolbar__plus',\n plusButtonHidden: 'ce-toolbar__plus--hidden',\n\n // Actions Zone\n settingsToggler: 'ce-toolbar__settings-btn',\n removeBlockButton: 'ce-toolbar__remove-btn',\n\n // Settings Panel\n settings: 'ce-settings',\n defaultSettings: 'ce-settings_default',\n pluginSettings: 'ce-settings_plugin',\n };\n\n }\n\n /**\n * Makes toolbar\n */\n make() {\n\n this.nodes.wrapper = $.make('div', Toolbar.CSS.toolbar);\n\n /**\n * Make Content Zone and Actions Zone\n */\n ['content', 'actions'].forEach( el => {\n\n this.nodes[el] = $.make('div', Toolbar.CSS[el]);\n $.append(this.nodes.wrapper, this.nodes[el]);\n\n });\n\n\n /**\n * Fill Content Zone:\n * - Plus Button\n * - Toolbox\n */\n this.nodes.plusButton = $.make('div', Toolbar.CSS.plusButton);\n $.append(this.nodes.content, this.nodes.plusButton);\n this.nodes.plusButton.addEventListener('click', event => this.plusButtonClicked(event), false);\n\n\n /**\n * Make a Toolbox\n */\n this.Editor.Toolbox.make();\n\n /**\n * Fill Actions Zone:\n * - Settings Toggler\n * - Remove Block Button\n * - Settings Panel\n */\n this.nodes.settingsToggler = $.make('span', Toolbar.CSS.settingsToggler);\n this.nodes.removeBlockButton = this.makeRemoveBlockButton();\n\n $.append(this.nodes.actions, [this.nodes.settingsToggler, this.nodes.removeBlockButton]);\n\n /**\n * Make and append Settings Panel\n */\n this.makeBlockSettingsPanel();\n\n /**\n * Append toolbar to the Editor\n */\n $.append(this.Editor.UI.nodes.wrapper, this.nodes.wrapper);\n\n }\n\n /**\n * Panel with block settings with 2 sections:\n *\n * @return {Element}\n */\n makeBlockSettingsPanel() {\n\n this.nodes.settings = $.make('div', Toolbar.CSS.settings);\n\n this.nodes.pluginSettings = $.make('div', Toolbar.CSS.pluginSettings);\n this.nodes.defaultSettings = $.make('div', Toolbar.CSS.defaultSettings);\n\n $.append(this.nodes.settings, [this.nodes.pluginSettings, this.nodes.defaultSettings]);\n $.append(this.nodes.actions, this.nodes.settings);\n\n }\n\n /**\n * Makes Remove Block button, and confirmation panel\n * @return {Element} wrapper with button and panel\n */\n makeRemoveBlockButton() {\n\n /**\n * @todo add confirmation panel and handlers\n * @see {@link settings#makeRemoveBlockButton}\n */\n return $.make('span', Toolbar.CSS.removeBlockButton);\n\n }\n\n /**\n * Move Toolbar to the Current Block\n */\n move() {\n\n /** Close Toolbox when we move toolbar */\n this.Editor.Toolbox.close();\n\n let currentNode = this.Editor.BlockManager.currentNode;\n\n /**\n * If no one Block selected as a Current\n */\n if (!currentNode) {\n\n return;\n\n }\n\n /**\n * @todo Compute dynamically on prepare\n * @type {number}\n */\n const defaultToolbarHeight = 49;\n const defaultOffset = 34;\n\n var newYCoordinate = currentNode.offsetTop - (defaultToolbarHeight / 2) + defaultOffset;\n\n this.nodes.wrapper.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n // editor.toolbar.settings.hideRemoveActions();\n\n }\n\n /**\n * Open Toolbar with Plus Button\n */\n open() {\n\n this.nodes.wrapper.classList.add(Toolbar.CSS.toolbarOpened);\n\n }\n\n /**\n * Close the Toolbar\n */\n close() {\n\n this.nodes.wrapper.classList.remove(Toolbar.CSS.toolbarOpened);\n\n }\n\n /**\n * Plus Button public methods\n * @return {{hide: function(): void, show: function(): void}}\n */\n get plusButton() {\n\n return {\n hide: () => this.nodes.plusButton.classList.add(Toolbar.CSS.plusButtonHidden),\n show: () => this.nodes.plusButton.classList.remove(Toolbar.CSS.plusButtonHidden)\n };\n\n }\n\n /**\n * Handler for Plus Button\n * @param {MouseEvent} event\n */\n plusButtonClicked(event) {\n\n this.Editor.Toolbox.toggle();\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar.js","/**\n * @class Toolbox\n * @classdesc Holder for Tools\n *\n * @typedef {Toolbox} Toolbox\n * @property {Boolean} opened - opening state\n * @property {Object} nodes - Toolbox nodes\n * @property {Object} CSS - CSS class names\n *\n */\nexport default class Toolbox extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n toolbox: null,\n buttons: []\n };\n\n /**\n * Opening state\n * @type {boolean}\n */\n this.opened = false;\n\n }\n\n /**\n * CSS styles\n * @return {{toolbox: string, toolboxButton: string, toolboxOpened: string}}\n */\n static get CSS() {\n\n return {\n toolbox: 'ce-toolbox',\n toolboxButton: 'ce-toolbox__button',\n toolboxOpened: 'ce-toolbox--opened',\n };\n\n }\n\n /**\n * Makes the Toolbox\n */\n make() {\n\n this.nodes.toolbox = $.make('div', Toolbox.CSS.toolbox);\n $.append(this.Editor.Toolbar.nodes.content, this.nodes.toolbox);\n\n this.addTools();\n\n }\n\n /**\n * Iterates available tools and appends them to the Toolbox\n */\n addTools() {\n\n let tools = this.Editor.Tools.toolsAvailable;\n\n for (let toolName in tools) {\n\n this.addTool(toolName, tools[toolName]);\n\n }\n\n }\n\n /**\n * Append Tool to the Toolbox\n *\n * @param {string} toolName - tool name\n * @param {Tool} tool - tool class\n */\n addTool(toolName, tool) {\n\n if (tool.displayInToolbox && !tool.iconClassName) {\n\n _.log('Toolbar icon class name is missed. Tool %o skipped', 'warn', toolName);\n return;\n\n }\n\n /**\n * @todo Add checkup for the render method\n */\n // if (typeof tool.render !== 'function') {\n //\n // _.log('render method missed. Tool %o skipped', 'warn', tool);\n // return;\n //\n // }\n\n /**\n * Skip tools that pass 'displayInToolbox=false'\n */\n if (!tool.displayInToolbox) {\n\n return;\n\n }\n\n let button = $.make('li', [Toolbox.CSS.toolboxButton, tool.iconClassName], {\n title: toolName\n });\n\n /**\n * Save tool's name in the button data-name\n */\n button.dataset.name = toolName;\n\n $.append(this.nodes.toolbox, button);\n\n this.nodes.toolbox.appendChild(button);\n this.nodes.buttons.push(button);\n\n /**\n * @todo add event with module Listeners\n */\n // this.Editor.Listeners.add();\n button.addEventListener('click', event => {\n\n this.buttonClicked(event);\n\n }, false);\n\n }\n\n /**\n * Toolbox button click listener\n * 1) if block is empty -> replace\n * 2) if block is not empty -> add new block below\n *\n * @param {MouseEvent} event\n */\n buttonClicked(event) {\n\n let toolButton = event.target,\n toolName = toolButton.dataset.name,\n tool = this.Editor.Tools.toolClasses[toolName];\n\n /**\n * @type {Block}\n */\n let currentBlock = this.Editor.BlockManager.currentBlock;\n\n /**\n * We do replace if:\n * - block is empty\n * - block is not irreplaceable\n * @type {Array}\n */\n if (!tool.irreplaceable && currentBlock.isEmpty) {\n\n this.Editor.BlockManager.replace(toolName);\n\n } else {\n\n this.Editor.BlockManager.insert(toolName);\n\n }\n\n /**\n * @todo set caret to the new block\n */\n\n // window.setTimeout(function () {\n\n /** Set caret to current block */\n // editor.caret.setToBlock(currentInputIndex);\n\n // }, 10);\n\n /**\n * Move toolbar when node is changed\n */\n this.Editor.Toolbar.move();\n\n }\n\n /**\n * Open Toolbox with Tools\n */\n open() {\n\n this.nodes.toolbox.classList.add(Toolbox.CSS.toolboxOpened);\n this.opened = true;\n\n }\n\n /**\n * Close Toolbox\n */\n close() {\n\n this.nodes.toolbox.classList.remove(Toolbox.CSS.toolboxOpened);\n this.opened = false;\n\n }\n\n /**\n * Close Toolbox\n */\n toggle() {\n\n if (!this.opened) {\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbox.js","/**\n * @module Codex Editor Tools Submodule\n *\n * Creates Instances from Plugins and binds external config to the instances\n */\n\n/**\n * Each Tool must contain the following important objects:\n *\n * @typedef {Object} ToolConfig {@link docs/tools.md}\n * @property {String} iconClassname - this a icon in toolbar\n * @property {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @property {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n * @property render @todo add description\n * @property save @todo add description\n * @property settings @todo add description\n * @property validate - method that validates output data before saving\n */\n\n/**\n * @typedef {Function} Tool {@link docs/tools.md}\n * @property {Boolean} displayInToolbox - By default, tools won't be added in the Toolbox. Pass true to add.\n * @property {String} iconClassName - CSS class name for the Toolbox button\n * @property {Boolean} irreplaceable - Toolbox behaviour: replace or add new block below\n * @property render\n * @property save\n * @property settings\n * @property validate\n *\n * @todo update according to current API\n * @todo describe Tool in the {@link docs/tools.md}\n */\n\n/**\n * Class properties:\n *\n * @typedef {Tools} Tools\n * @property {Tools[]} toolsAvailable - available Tools\n * @property {Tools[]} toolsUnavailable - unavailable Tools\n * @property {Object} toolsClasses - all classes\n * @property {EditorConfig} config - Editor config\n */\nexport default class Tools extends Module {\n\n /**\n * Returns available Tools\n * @return {Tool[]}\n */\n get available() {\n\n return this.toolsAvailable;\n\n }\n\n /**\n * Returns unavailable Tools\n * @return {Tool[]}\n */\n get unavailable() {\n\n return this.toolsUnavailable;\n\n }\n\n /**\n * Static getter for default Tool config fields\n *\n * @usage Tools.defaultConfig.displayInToolbox\n * @return {ToolConfig}\n */\n static get defaultConfig() {\n\n return {\n iconClassName : '',\n displayInToolbox : false,\n enableLineBreaks : false,\n irreplaceable : false\n };\n\n }\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n /**\n * Map {name: Class, ...} where:\n * name — block type name in JSON. Got from EditorConfig.tools keys\n * @type {Object}\n */\n this.toolClasses = {};\n\n /**\n * Available tools list\n * {name: Class, ...}\n * @type {Object}\n */\n this.toolsAvailable = {};\n\n /**\n * Tools that rejected a prepare method\n * {name: Class, ... }\n * @type {Object}\n */\n this.toolsUnavailable = {};\n\n }\n\n /**\n * Creates instances via passed or default configuration\n * @return {Promise}\n */\n prepare() {\n\n if (!this.config.hasOwnProperty('tools')) {\n\n return Promise.reject(\"Can't start without tools\");\n\n }\n\n for(let toolName in this.config.tools) {\n\n this.toolClasses[toolName] = this.config.tools[toolName];\n\n }\n\n /**\n * getting classes that has prepare method\n */\n let sequenceData = this.getListOfPrepareFunctions();\n\n /**\n * if sequence data contains nothing then resolve current chain and run other module prepare\n */\n if (sequenceData.length === 0) {\n\n return Promise.resolve();\n\n }\n\n /**\n * to see how it works {@link Util#sequence}\n */\n return _.sequence(sequenceData, (data) => {\n\n this.success(data);\n\n }, (data) => {\n\n this.fallback(data);\n\n });\n\n }\n\n /**\n * Binds prepare function of plugins with user or default config\n * @return {Array} list of functions that needs to be fired sequentially\n */\n getListOfPrepareFunctions() {\n\n let toolPreparationList = [];\n\n for(let toolName in this.toolClasses) {\n\n let toolClass = this.toolClasses[toolName];\n\n if (typeof toolClass.prepare === 'function') {\n\n toolPreparationList.push({\n function : toolClass.prepare,\n data : {\n toolName\n }\n });\n\n } else {\n\n /**\n * If Tool hasn't a prepare method, mark it as available\n */\n this.toolsAvailable[toolName] = toolClass;\n\n }\n\n }\n\n return toolPreparationList;\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to available list\n */\n success(data) {\n\n this.toolsAvailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to unavailable list\n */\n fallback(data) {\n\n this.toolsUnavailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * Return tool`a instance\n *\n * @param {String} tool — tool name\n * @param {Object} data — initial data\n *\n * @todo throw exceptions if tool doesnt exist\n *\n */\n construct(tool, data) {\n\n let plugin = this.toolClasses[tool],\n config = this.config.toolsConfig[tool];\n\n if (!config) {\n\n config = this.defaultConfig;\n\n }\n\n let instance = new plugin(data, config);\n\n return instance;\n\n }\n\n /**\n * Check if passed Tool is an instance of Initial Block Tool\n * @param {Tool} tool - Tool to check\n * @return {Boolean}\n */\n isInitial(tool) {\n\n return tool instanceof this.available[this.config.initialBlock];\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/tools.js","/**\n * Module UI\n *\n * @type {UI}\n */\n// let className = {\n\n/**\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\n */\n// BLOCK_CLASSNAME : 'ce-block',\n\n/**\n * @const {String} wrapper for plugins content\n */\n// BLOCK_CONTENT : 'ce-block__content',\n\n/**\n * @const {String} BLOCK_STRETCHED - makes block stretched\n */\n// BLOCK_STRETCHED : 'ce-block--stretched',\n\n/**\n * @const {String} BLOCK_HIGHLIGHTED - adds background\n */\n// BLOCK_HIGHLIGHTED : 'ce-block--focused',\n\n/**\n * @const {String} - for all default settings\n */\n// SETTINGS_ITEM : 'ce-settings__item'\n// };\n\n// import Block from '../block';\n\n/**\n * @class\n *\n * @classdesc Makes CodeX Editor UI:\n * \n * \n * \n * \n * \n *\n * @typedef {UI} UI\n * @property {EditorConfig} config - editor configuration {@link CodexEditor#configuration}\n * @property {Object} Editor - available editor modules {@link CodexEditor#moduleInstances}\n * @property {Object} nodes -\n * @property {Element} nodes.holder - element where we need to append redactor\n * @property {Element} nodes.wrapper - \n * @property {Element} nodes.redactor - \n */\nexport default class UI extends Module {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n holder: null,\n wrapper: null,\n redactor: null\n };\n\n }\n\n /**\n * Making main interface\n */\n prepare() {\n\n return this.make()\n /**\n * Make toolbar\n */\n .then(() => this.Editor.Toolbar.make())\n /**\n * Load and append CSS\n */\n .then(() => this.loadStyles())\n /**\n * Bind events for the UI elements\n */\n .then(() => this.bindEvents())\n\n /** Make container for inline toolbar */\n // .then(makeInlineToolbar_)\n\n /** Add inline toolbar tools */\n // .then(addInlineToolbarTools_)\n\n /** Draw wrapper for notifications */\n // .then(makeNotificationHolder_)\n\n /** Add eventlisteners to redactor elements */\n // .then(bindEvents_)\n\n .catch(e => {\n\n console.error(e);\n\n // editor.core.log(\"Can't draw editor interface\");\n\n });\n\n }\n\n /**\n * CodeX Editor UI CSS class names\n * @return {{editorWrapper: string, editorZone: string, block: string}}\n */\n get CSS() {\n\n return {\n editorWrapper : 'codex-editor',\n editorZone : 'codex-editor__redactor',\n };\n\n }\n\n /**\n * Makes CodeX Editor interface\n * @return {Promise}\n */\n make() {\n\n return new Promise( (resolve, reject) => {\n\n /**\n * Element where we need to append CodeX Editor\n * @type {Element}\n */\n this.nodes.holder = document.getElementById(this.config.holderId);\n\n if (!this.nodes.holder) {\n\n reject(Error(\"Holder wasn't found by ID: #\" + this.config.holderId));\n return;\n\n }\n\n /**\n * Create and save main UI elements\n */\n this.nodes.wrapper = $.make('div', this.CSS.editorWrapper);\n this.nodes.redactor = $.make('div', this.CSS.editorZone);\n\n this.nodes.wrapper.appendChild(this.nodes.redactor);\n this.nodes.holder.appendChild(this.nodes.wrapper);\n\n resolve();\n\n });\n\n }\n\n /**\n * Appends CSS\n */\n loadStyles() {\n\n /**\n * Load CSS\n */\n let styles = require('../../styles/main.css');\n\n /**\n * Make tag\n */\n let tag = $.make('style', null, {\n textContent: styles.toString()\n });\n\n /**\n * Append styles\n */\n $.append(document.head, tag);\n\n }\n\n /**\n * Bind events on the CodeX Editor interface\n */\n bindEvents() {\n\n /**\n * @todo bind events with the Listeners module\n */\n this.nodes.redactor.addEventListener('click', event => this.redactorClicked(event), false );\n\n }\n\n /**\n * All clicks on the redactor zone\n *\n * @param {MouseEvent} event\n *\n * @description\n * 1. Save clicked Block as a current {@link BlockManager#currentNode}\n * it uses for the following:\n * - add CSS modifier for the selected Block\n * - on Enter press, we make a new Block under that\n *\n * 2. Move and show the Toolbar\n *\n * 3. Set a Caret\n *\n * 4. By clicks on the Editor's bottom zone:\n * - if last Block is empty, set a Caret to this\n * - otherwise, add a new empty Block and set a Caret to that\n *\n * 5. Hide the Inline Toolbar\n *\n * @see selectClickedBlock\n *\n */\n redactorClicked(event) {\n\n let clickedNode = event.target;\n\n /**\n * Select clicked Block as Current\n */\n try {\n\n this.Editor.BlockManager.setCurrentBlockByChildNode(clickedNode);\n\n /**\n * If clicked outside first-level Blocks, set Caret to the last empty Block\n */\n\n } catch (e) {\n\n this.Editor.Caret.setToTheLastBlock();\n\n }\n\n\n\n\n /**\n * @todo hide the Inline Toolbar\n */\n // var selectedText = editor.toolbar.inline.getSelectionText(),\n // firstLevelBlock;\n\n /** If selection range took off, then we hide inline toolbar */\n // if (selectedText.length === 0) {\n\n // editor.toolbar.inline.close();\n\n // }\n\n /**\n *\n\n /** Update current input index in memory when caret focused into existed input */\n // if (event.target.contentEditable == 'true') {\n //\n // editor.caret.saveCurrentInputIndex();\n //\n // }\n\n // if (editor.content.currentNode === null) {\n //\n // /**\n // * If inputs in redactor does not exits, then we put input index 0 not -1\n // */\n // var indexOfLastInput = editor.state.inputs.length > 0 ? editor.state.inputs.length - 1 : 0;\n //\n // /** If we have any inputs */\n // if (editor.state.inputs.length) {\n //\n // /** getting firstlevel parent of input */\n // firstLevelBlock = editor.content.getFirstLevelBlock(editor.state.inputs[indexOfLastInput]);\n //\n // }\n //\n // /** If input is empty, then we set caret to the last input */\n // if (editor.state.inputs.length && editor.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == editor.settings.initialBlockPlugin) {\n //\n // editor.caret.setToBlock(indexOfLastInput);\n //\n // } else {\n //\n // /** Create new input when caret clicked in redactors area */\n // var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n //\n // editor.content.insertBlock({\n // type : NEW_BLOCK_TYPE,\n // block : editor.tools[NEW_BLOCK_TYPE].render()\n // });\n //\n // /** If there is no inputs except inserted */\n // if (editor.state.inputs.length === 1) {\n //\n // editor.caret.setToBlock(indexOfLastInput);\n //\n // } else {\n //\n // /** Set caret to this appended input */\n // editor.caret.setToNextBlock(indexOfLastInput);\n //\n // }\n //\n // }\n //\n // } else {\n //\n // /** Close all panels */\n // editor.toolbar.settings.close();\n // editor.toolbar.toolbox.close();\n //\n // }\n //\n /**\n * Move toolbar and open\n */\n this.Editor.Toolbar.move();\n this.Editor.Toolbar.open();\n //\n // var inputIsEmpty = !editor.content.currentNode.textContent.trim(),\n // currentNodeType = editor.content.currentNode.dataset.tool,\n // isInitialType = currentNodeType == editor.settings.initialBlockPlugin;\n //\n //\n\n /**\n * Hide the Plus Button\n * */\n this.Editor.Toolbar.plusButton.hide();\n\n /**\n * Show the Plus Button if:\n * - Block is an initial-block (Text)\n * - Block is empty\n */\n let isInitialBlock = this.Editor.Tools.isInitial(this.Editor.BlockManager.currentBlock.tool),\n isEmptyBlock = this.Editor.BlockManager.currentBlock.isEmpty;\n\n if (isInitialBlock && isEmptyBlock) {\n\n this.Editor.Toolbar.plusButton.show();\n\n }\n\n }\n\n}\n\n// /**\n// * Codex Editor UI module\n// *\n// * @author Codex Team\n// * @version 1.2.0\n// */\n//\n// module.exports = (function (ui) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * Basic editor classnames\n// */\n// ui.prepare = function () {\n//\n\n//\n// };\n//\n// /** Draw notifications holder */\n// var makeNotificationHolder_ = function () {\n//\n// /** Append block with notifications to the document */\n// editor.nodes.notifications = editor.notifications.createHolder();\n//\n// };\n//\n//\n// var addInlineToolbarTools_ = function () {\n//\n// var tools = {\n//\n// bold: {\n// icon : 'ce-icon-bold',\n// command : 'bold'\n// },\n//\n// italic: {\n// icon : 'ce-icon-italic',\n// command : 'italic'\n// },\n//\n// link: {\n// icon : 'ce-icon-link',\n// command : 'createLink'\n// }\n// };\n//\n// var toolButton,\n// tool;\n//\n// for(var name in tools) {\n//\n// tool = tools[name];\n//\n// toolButton = editor.draw.toolbarButtonInline(name, tool.icon);\n//\n// editor.nodes.inlineToolbar.buttons.appendChild(toolButton);\n// /**\n// * Add callbacks to this buttons\n// */\n// editor.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n//\n// }\n//\n// };\n//\n// /**\n// * @private\n// * Bind editor UI events\n// */\n// var bindEvents_ = function () {\n//\n// editor.core.log('ui.bindEvents fired', 'info');\n//\n// // window.addEventListener('error', function (errorMsg, url, lineNumber) {\n// // editor.notifications.errorThrown(errorMsg, event);\n// // }, false );\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keydown', editor.callback.globalKeydown, false);\n//\n// /** All keydowns on Redactor zone */\n// editor.listeners.add(editor.nodes.redactor, 'keydown', editor.callback.redactorKeyDown, false);\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keyup', editor.callback.globalKeyup, false );\n//\n// /**\n// * Mouse click to radactor\n// */\n// editor.listeners.add(editor.nodes.redactor, 'click', editor.callback.redactorClicked, false );\n//\n// /**\n// * Clicks to the Plus button\n// */\n// editor.listeners.add(editor.nodes.plusButton, 'click', editor.callback.plusButtonClicked, false);\n//\n// /**\n// * Clicks to SETTINGS button in toolbar\n// */\n// editor.listeners.add(editor.nodes.showSettingsButton, 'click', editor.callback.showSettingsButtonClicked, false );\n//\n// /** Bind click listeners on toolbar buttons */\n// for (var button in editor.nodes.toolbarButtons) {\n//\n// editor.listeners.add(editor.nodes.toolbarButtons[button], 'click', editor.callback.toolbarButtonClicked, false);\n//\n// }\n//\n// };\n//\n// ui.addBlockHandlers = function (block) {\n//\n// if (!block) return;\n//\n// /**\n// * Block keydowns\n// */\n// editor.listeners.add(block, 'keydown', editor.callback.blockKeydown, false);\n//\n// /**\n// * Pasting content from another source\n// * We have two type of sanitization\n// * First - uses deep-first search algorithm to get sub nodes,\n// * sanitizes whole Block_content and replaces cleared nodes\n// * This method is deprecated\n// * Method is used in editor.callback.blockPaste(event)\n// *\n// * Secont - uses Mutation observer.\n// * Observer \"observe\" DOM changes and send changings to callback.\n// * Callback gets changed node, not whole Block_content.\n// * Inserted or changed node, which we've gotten have been cleared and replaced with diry node\n// *\n// * Method is used in editor.callback.blockPasteViaSanitize(event)\n// *\n// * @uses html-janitor\n// * @example editor.callback.blockPasteViaSanitize(event), the second method.\n// *\n// */\n// editor.listeners.add(block, 'paste', editor.paste.blockPasteCallback, false);\n//\n// /**\n// * Show inline toolbar for selected text\n// */\n// editor.listeners.add(block, 'mouseup', editor.toolbar.inline.show, false);\n// editor.listeners.add(block, 'keyup', editor.toolbar.inline.show, false);\n//\n// };\n//\n// /** getting all contenteditable elements */\n// ui.saveInputs = function () {\n//\n// var redactor = editor.nodes.redactor;\n//\n// editor.state.inputs = [];\n//\n// /** Save all inputs in global variable state */\n// var inputs = redactor.querySelectorAll('[contenteditable], input, textarea');\n//\n// Array.prototype.map.call(inputs, function (current) {\n//\n// if (!current.type || current.type == 'text' || current.type == 'textarea') {\n//\n// editor.state.inputs.push(current);\n//\n// }\n//\n// });\n//\n// };\n//\n// /**\n// * Adds first initial block on empty redactor\n// */\n// ui.addInitialBlock = function () {\n//\n// var initialBlockType = editor.settings.initialBlockPlugin,\n// initialBlock;\n//\n// if ( !editor.tools[initialBlockType] ) {\n//\n// editor.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n// return;\n//\n// }\n//\n// initialBlock = editor.tools[initialBlockType].render();\n//\n// initialBlock.setAttribute('data-placeholder', editor.settings.placeholder);\n//\n// editor.content.insertBlock({\n// type : initialBlockType,\n// block : initialBlock\n// });\n//\n// editor.content.workingNodeChanged(initialBlock);\n//\n// };\n//\n// ui.setInlineToolbarButtonBehaviour = function (button, type) {\n//\n// editor.listeners.add(button, 'mousedown', function (event) {\n//\n// editor.toolbar.inline.toolClicked(event, type);\n//\n// }, false);\n//\n// };\n//\n// return ui;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/ui.js","exports = module.exports = require(\"../../node_modules/css-loader/lib/css-base.js\")(undefined);\n// imports\n\n\n// module\nexports.push([module.id, \":root {\\n\\n /**\\n * Toolbar buttons\\n */\\n\\n /**\\n * Block content width\\n */\\n\\n /**\\n * Toolbar Plus Button and Toolbox buttons height and width\\n */\\n\\n}\\n/**\\n* Editor wrapper\\n*/\\n.codex-editor {\\n position: relative;\\n border: 1px solid #ccc;\\n padding: 10px;\\n box-sizing: border-box;\\n}\\n.codex-editor .hide {\\n display: none;\\n }\\n.codex-editor__redactor {\\n padding-bottom: 300px;\\n }\\n.ce-toolbar {\\n position: absolute;\\n left: 0;\\n right: 0;\\n top: 0;\\n /*opacity: 0;*/\\n /*visibility: hidden;*/\\n transition: opacity 100ms ease;\\n will-change: opacity, transform;\\n display: none;\\n}\\n.ce-toolbar--opened {\\n display: block;\\n /*opacity: 1;*/\\n /*visibility: visible;*/\\n }\\n.ce-toolbar__content {\\n max-width: 650px;\\n margin: 0 auto;\\n position: relative;\\n }\\n.ce-toolbar__plus {\\n position: absolute;\\n left: calc(-34px - 10px);\\n display: inline-block;\\n background-color: #eff2f5;\\n width: 34px;\\n height: 34px;\\n line-height: 34px;\\n text-align: center;\\n border-radius: 50%\\n }\\n.ce-toolbar__plus::after {\\n content: '+';\\n font-size: 26px;\\n display: block;\\n margin-top: -2px;\\n margin-right: -2px;\\n\\n}\\n.ce-toolbar__plus--hidden {\\n display: none;\\n\\n}\\n.ce-toolbox {\\n visibility: hidden;\\n transition: opacity 100ms ease;\\n will-change: opacity;\\n}\\n.ce-toolbox--opened {\\n opacity: 1;\\n visibility: visible;\\n }\\n.ce-toolbox__button {\\n display: inline-block;\\n list-style: none;\\n margin: 0;\\n background: #eff2f5;\\n width: 34px;\\n height: 34px;\\n border-radius: 30px;\\n overflow: hidden;\\n text-align: center;\\n line-height: 34px\\n }\\n.ce-toolbox__button::before {\\n content: attr(title);\\n font-size: 22px;\\n font-weight: 500;\\n letter-spacing: 1em;\\n -webkit-font-feature-settings: \\\"smcp\\\", \\\"c2sc\\\";\\n font-feature-settings: \\\"smcp\\\", \\\"c2sc\\\";\\n font-variant-caps: all-small-caps;\\n padding-left: 11.5px;\\n margin-top: -1px;\\n display: inline-block;\\n\\n}\\n.ce-block {\\n border: 1px dotted #ccc;\\n margin: 2px 0;\\n}\\n.ce-block--selected {\\n background-color: #eff2f5;\\n }\\n.ce-block__content {\\n max-width: 650px;\\n margin: 0 auto;\\n }\\n\", \"\"]);\n\n// exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/styles/main.css\n// module id = 20\n// module chunks = 0","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t// when a module is imported multiple times with different media queries.\n\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/css-loader/lib/css-base.js\n// module id = 21\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap ca66f67e18c906de94b6","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/Selection.js","webpack:///./src/codex.js","webpack:///./src/components/polyfills.js","webpack:///./src/components/modules nonrecursive [^_](blockManager.js|caret.js|events.js|listeners.js|renderer.js|sanitizer.js|saver.js|toolbar.js|toolbox.js|tools.js|ui.js)$","webpack:///./src/components/modules/blockManager.js","webpack:///./src/components/block.js","webpack:///./src/components/modules/caret.js","webpack:///./src/components/modules/events.js","webpack:///./src/components/modules/listeners.js","webpack:///./src/components/modules/renderer.js","webpack:///./src/components/modules/sanitizer.js","webpack:///./node_modules/html-janitor/src/html-janitor.js","webpack:///./src/components/modules/saver.js","webpack:///./src/components/modules/toolbar.js","webpack:///./src/components/modules/toolbox.js","webpack:///./src/components/modules/tools.js","webpack:///./src/components/modules/ui.js","webpack:///./src/styles/main.css","webpack:///./node_modules/css-loader/lib/css-base.js"],"names":["Module","config","new","target","TypeError","Editor","Util","msg","type","args","window","console","e","chains","success","fallback","Promise","resolve","reduce","previousValue","currentValue","iteration","then","waitNextBlock","length","chainData","successCallback","fallbackCallback","function","data","catch","collection","Array","prototype","slice","call","object","Object","keys","constructor","element","contentEditable","method","timeout","context","arguments","setTimeout","apply","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","Dom","tagName","classNames","attributes","el","document","createElement","isArray","classList","add","attrName","content","createTextNode","parent","elements","forEach","appendChild","selector","querySelector","querySelectorAll","node","atLast","childNodes","isElement","isNativeInput","emptyTextNode","text","childsLength","last","getDeepestNode","nodeType","Node","ELEMENT_NODE","nativeInputs","includes","nodeText","value","textContent","replace","trim","treeWalker","leafs","push","isLeaf","nextSibling","shift","firstChild","every","isNodeEmpty","leaf","Selection","instance","selection","getSelection","anchorNode","anchorOffset","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","log","error","constructModules","configureModules","displayName","name","state","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","render","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","_","isEmpty","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","toolName","toolInstance","construct","block","bindEvents","Listeners","on","pluginsContent","event","keyDownOnBlock","keyCode","keyCodes","navigateNext","navigatePrevious","lastTextNode","$","currentBlock","textNodeLength","getAnchorNode","getAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","firstLevelBlock","CSS","wrapper","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","array","selected","workingArea","html","remove","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","isNaN","Number","Block","tool","_html","compose","make","contentNode","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","offset","atEnd","focus","nodeToSet","delay","range","createRange","setStart","setEnd","removeAllRanges","addRange","lastBlock","Events","subscribers","eventName","callback","previousData","currentHandler","newData","allListeners","eventType","handler","useCapture","assignedEventData","alreadyExist","findOne","addEventListener","existingListeners","findAll","i","removeEventListener","listenersOnElement","listener","listenersWithType","listenersWithHandler","foundListeners","foundAllListeners","foundByElements","foundByEventType","foundByHandler","findByElement","findByType","findByHandler","concat","current","off","insertBlock","sequence","item","Sanitizer","defaultConfig","_sanitizerInstance","sanitizerConfig","settings","sanitizerInstance","require","taintString","customConfig","clean","library","tags","href","rel","newInstance","Saver","output","blocksData","all","allExtractedData","makeOutput","outputData","totalTime","groupCollapsed","extraction","groupEnd","Date","version","VERSION","Toolbar","actions","plusButton","settingsToggler","removeBlockButton","pluginSettings","defaultSettings","toolbar","append","plusButtonClicked","Toolbox","makeRemoveBlockButton","makeBlockSettingsPanel","close","defaultToolbarHeight","defaultOffset","newYCoordinate","offsetTop","style","transform","Math","floor","toolbarOpened","toggle","hide","plusButtonHidden","show","toolbox","buttons","opened","addTools","toolsAvailable","addTool","displayInToolbox","iconClassName","button","toolboxButton","title","dataset","buttonClicked","toolButton","toolClasses","irreplaceable","move","toolboxOpened","open","toolsUnavailable","enableLineBreaks","hasOwnProperty","reject","sequenceData","getListOfPrepareFunctions","toolPreparationList","toolClass","plugin","available","holder","loadStyles","getElementById","editorWrapper","editorZone","styles","tag","toString","head","redactorClicked","clickedNode","setCurrentBlockByChildNode","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock"],"mappings":"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pT,M;;;kBAAlB6S,S;;;;;;;;AClCrB;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA;;AAEA;AACA;;AAEA;AACA,wBAAwB,iCAAiC,EAAE;AAC3D,6BAA6B,uEAAuE,EAAE;;AAEtG;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,QAAQ;;AAExB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,qBAAqB,4BAA4B;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;;;;;;;;;;;ACxLD;;;;;;;;AAQA;;;;;;;AAOA;;;;;;;;IAQqBe,K;;;AAEjB;;;;AAIA,yBAAsB;AAAA,YAAT3T,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,cAAK4T,MAAL,GAAc,IAAd;AACA,cAAKC,UAAL,GAAkB,EAAl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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,WAAKzY,MAAL,CAAYqU,OAAZ,CAAoB2C,IAApB;AACA,WAAKhX,MAAL,CAAYqU,OAAZ,CAAoB6C,IAApB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA,WAAKlX,MAAL,CAAYqU,OAAZ,CAAoBE,UAApB,CAA+BsB,IAA/B;;AAEA;;;;;AAKA,UAAI6C,iBAAiB,KAAK1Y,MAAL,CAAYsI,KAAZ,CAAkBqQ,SAAlB,CAA4B,KAAK3Y,MAAL,CAAYwI,YAAZ,CAAyBmD,YAAzB,CAAsCoC,IAAlE,CAArB;AAAA,UACI6K,eAAe,KAAK5Y,MAAL,CAAYwI,YAAZ,CAAyBmD,YAAzB,CAAsCpC,OADzD;;AAGA,UAAImP,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAK5Y,MAAL,CAAYqU,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;AAEH;AAEJ;;;wBA3OS;;AAEN,aAAO;AACHiC,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2BtY,M;;AA+ShC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBApgBqB4I,E;;;;;;;;ACrDrB;AACA;;;AAGA;AACA,gCAAiC,sLAAsL,4CAA4C,yBAAyB,6BAA6B,oBAAoB,6BAA6B,GAAG,uBAAuB,wBAAwB,OAAO,2BAA2B,gCAAgC,OAAO,eAAe,uBAAuB,YAAY,aAAa,WAAW,iBAAiB,2BAA2B,qCAAqC,oCAAoC,kBAAkB,GAAG,uBAAuB,qBAAqB,mBAAmB,8BAA8B,OAAO,wBAAwB,uBAAuB,qBAAqB,yBAAyB,KAAK,qBAAqB,yBAAyB,+BAA+B,4BAA4B,gCAAgC,kBAAkB,mBAAmB,wBAAwB,yBAAyB,6BAA6B,4BAA4B,mBAAmB,sBAAsB,qBAAqB,uBAAuB,yBAAyB,KAAK,6BAA6B,sBAAsB,KAAK,eAAe,yBAAyB,qCAAqC,2BAA2B,GAAG,uBAAuB,qBAAqB,8BAA8B,OAAO,uBAAuB,gCAAgC,2BAA2B,oBAAoB,8BAA8B,sBAAsB,uBAAuB,8BAA8B,2BAA2B,6BAA6B,kCAAkC,+BAA+B,2BAA2B,sBAAsB,uBAAuB,0BAA0B,wDAAwD,wDAAwD,wCAAwC,2BAA2B,uBAAuB,4BAA4B,KAAK,aAAa,4BAA4B,kBAAkB,GAAG,uBAAuB,gCAAgC,KAAK,sBAAsB,uBAAuB,qBAAqB,KAAK;;AAEp1E;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD,IAAI;AACJ;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;;AAElE;AACA","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap ca66f67e18c906de94b6","/**\n * @abstract\n * @class Module\n * @classdesc All modules inherits from this class.\n *\n * @typedef {Module} Module\n * @property {Object} config - Editor user settings\n * @property {Object} Editor - List of Editor modules\n */\nexport default class Module {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({ config } = {}) {\n\n if (new.target === Module) {\n\n throw new TypeError('Constructors for abstract class Module are not allowed.');\n\n }\n\n /**\n * @type {EditorConfig}\n */\n this.config = config;\n\n /**\n * @type {EditorComponents}\n */\n this.Editor = null;\n\n }\n\n /**\n * Editor modules setter\n *\n * @param Editor\n * @param Editor.modules {@link CodexEditor#moduleInstances}\n * @param Editor.config {@link CodexEditor#configuration}\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/__module.js","/**\n * Codex Editor Util\n */\nexport default class Util {\n\n /**\n * Custom logger\n *\n * @param {string} msg - message\n * @param {string} type - logging type 'log'|'warn'|'error'|'info'\n * @param {*} args - argument to log with a message\n */\n static log(msg, type, args) {\n\n type = type || 'log';\n\n if (!args) {\n\n args = msg || 'undefined';\n msg = '[codex-editor]: %o';\n\n } else {\n\n msg = '[codex-editor]: ' + msg;\n\n }\n\n try{\n\n if ( 'console' in window && window.console[ type ] ) {\n\n if ( args ) window.console[ type ]( msg, args );\n else window.console[ type ]( msg );\n\n }\n\n } catch(e) {\n // do nothing\n }\n\n }\n\n /**\n * Returns basic keycodes as constants\n * @return {{}}\n */\n static get keyCodes() {\n\n return {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n SHIFT: 16,\n CTRL: 17,\n ALT: 18,\n ESC: 27,\n SPACE: 32,\n LEFT: 37,\n UP: 38,\n DOWN: 40,\n RIGHT: 39,\n DELETE: 46,\n META: 91\n };\n\n }\n\n /**\n * @typedef {Object} ChainData\n * @property {Object} data - data that will be passed to the success or fallback\n * @property {Function} function - function's that must be called asynchronically\n */\n\n /**\n * Fires a promise sequence asyncronically\n *\n * @param {Object[]} chains - list or ChainData's\n * @param {Function} success - success callback\n * @param {Function} fallback - callback that fires in case of errors\n *\n * @return {Promise}\n */\n static sequence(chains, success = () => {}, fallback = () => {}) {\n\n return new Promise(function (resolve) {\n\n /**\n * pluck each element from queue\n * First, send resolved Promise as previous value\n * Each plugins \"prepare\" method returns a Promise, that's why\n * reduce current element will not be able to continue while can't get\n * a resolved Promise\n */\n chains.reduce(function (previousValue, currentValue, iteration) {\n\n return previousValue\n .then(() => waitNextBlock(currentValue, success, fallback))\n .then(() => {\n\n // finished\n if (iteration === chains.length - 1) {\n\n resolve();\n\n }\n\n });\n\n }, Promise.resolve());\n\n });\n\n /**\n * Decorator\n *\n * @param {ChainData} chainData\n *\n * @param {Function} successCallback\n * @param {Function} fallbackCallback\n *\n * @return {Promise}\n */\n function waitNextBlock(chainData, successCallback, fallbackCallback) {\n\n return new Promise(function (resolve) {\n\n chainData.function()\n .then(() => {\n\n successCallback(chainData.data || {});\n\n })\n .then(resolve)\n .catch(function () {\n\n fallbackCallback(chainData.data || {});\n\n // anyway, go ahead even it falls\n resolve();\n\n });\n\n });\n\n }\n\n }\n\n /**\n * Make array from array-like collection\n *\n * @param {*} collection\n *\n * @return {Array}\n */\n static array(collection) {\n\n return Array.prototype.slice.call(collection);\n\n }\n\n /**\n * Checks if object is empty\n *\n * @param {Object} object\n * @return {boolean}\n */\n static isEmpty(object) {\n\n return Object.keys(object).length === 0 && object.constructor === Object;\n\n }\n\n /**\n * Check if passed object is a Promise\n * @param {*} object - object to check\n * @return {Boolean}\n */\n static isPromise(object) {\n\n return Promise.resolve(object) === object;\n\n }\n\n /**\n * Check if passed element is contenteditable\n * @param element\n * @return {boolean}\n */\n static isContentEditable(element) {\n\n return element.contentEditable === 'true';\n\n }\n\n /**\n * Delays method execution\n *\n * @param method\n * @param timeout\n */\n static delay(method, timeout) {\n\n return function () {\n\n let context = this,\n args = arguments;\n\n window.setTimeout(() => method.apply(context, args), timeout);\n\n };\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/utils.js","/**\n * DOM manipulations helper\n */\nexport default class Dom {\n\n /**\n * Helper for making Elements with classname and attributes\n *\n * @param {string} tagName - new Element tag name\n * @param {array|string} classNames - list or name of CSS classname(s)\n * @param {Object} attributes - any attributes\n * @return {Element}\n */\n static make(tagName, classNames = null, attributes = {}) {\n\n let el = document.createElement(tagName);\n\n if ( Array.isArray(classNames) ) {\n\n el.classList.add(...classNames);\n\n } else if( classNames ) {\n\n el.classList.add(classNames);\n\n }\n\n for (let attrName in attributes) {\n\n el[attrName] = attributes[attrName];\n\n }\n\n return el;\n\n }\n\n /**\n * Creates Text Node with the passed content\n * @param {String} content - text content\n * @return {Text}\n */\n static text(content) {\n\n return document.createTextNode(content);\n\n }\n\n /**\n * Append one or several elements to the parent\n *\n * @param {Element} parent - where to append\n * @param {Element|Element[]} - element ore elements list\n */\n static append(parent, elements) {\n\n if ( Array.isArray(elements) ) {\n\n elements.forEach( el => parent.appendChild(el) );\n\n } else {\n\n parent.appendChild(elements);\n\n }\n\n }\n\n /**\n * Selector Decorator\n *\n * Returns first match\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n *\n * @returns {Element}\n */\n static find(el = document, selector) {\n\n return el.querySelector(selector);\n\n }\n\n /**\n * Selector Decorator.\n *\n * Returns all matches\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n * @returns {NodeList}\n */\n static findAll(el = document, selector) {\n\n return el.querySelectorAll(selector);\n\n }\n\n /**\n * Search for deepest node which is Leaf.\n * Leaf is the vertex that doesn't have any child nodes\n *\n * @description Method recursively goes throw the all Node until it finds the Leaf\n *\n * @param {Element} node - root Node. From this vertex we start Deep-first search {@link https://en.wikipedia.org/wiki/Depth-first_search}\n * @param {Boolean} atLast - find last text node\n * @return {Node} - it can be text Node or Element Node, so that caret will able to work with it\n */\n static getDeepestNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return an empty text node\n * But caret will not be placed in empty textNode, so we need textNode with zero-width char\n */\n if (this.isElement(node) && !this.isNativeInput(node)) {\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\n return node;\n\n }\n\n let childsLength = node.childNodes.length,\n last = childsLength - 1;\n\n if (atLast) {\n\n return this.getDeepestNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestNode(node.childNodes[0], false);\n\n }\n\n }\n\n /**\n * Check if object is DOM node\n *\n * @param {Object} node\n * @returns {boolean}\n */\n static isElement(node) {\n\n return node && typeof node === 'object' && node.nodeType && node.nodeType === Node.ELEMENT_NODE;\n\n }\n\n /**\n * Checks target if it is native input\n * @param {Element|String} target - HTML element or string\n * @return {Boolean}\n */\n static isNativeInput(target) {\n\n let nativeInputs = [\n 'INPUT',\n 'TEXTAREA'\n ];\n\n return target ? nativeInputs.includes(target.tagName) : false;\n\n }\n\n /**\n * Checks node if it is empty\n *\n * @description Method checks simple Node without any childs for emptiness\n * If you have Node with 2 or more children id depth, you better use {@link Dom#isEmpty} method\n *\n * @param {Node} node\n * @return {Boolean} true if it is empty\n */\n static isNodeEmpty(node) {\n\n let nodeText;\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n nodeText = node.value;\n\n } else {\n\n nodeText = node.textContent.replace('\\u200B', '');\n\n }\n\n return nodeText.trim().length === 0;\n\n }\n\n /**\n * checks node if it is doesn't have any child nodes\n * @param {Node} node\n * @return {boolean}\n */\n static isLeaf(node) {\n\n if (!node) {\n\n return false;\n\n }\n\n return node.childNodes.length === 0;\n\n }\n\n /**\n * breadth-first search (BFS)\n * {@link https://en.wikipedia.org/wiki/Breadth-first_search}\n *\n * @description Pushes to stack all DOM leafs and checks for emptiness\n *\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n leafs = [];\n\n if (!node) {\n\n return false;\n\n }\n\n treeWalker.push(node);\n\n while ( treeWalker.length > 0 ) {\n\n if ( this.isLeaf(node) ) {\n\n leafs.push(node);\n\n }\n\n while ( node && node.nextSibling ) {\n\n node = node.nextSibling;\n\n if (!node) continue;\n\n treeWalker.push(node);\n\n }\n\n node = treeWalker.shift();\n\n if (!node) continue;\n\n node = node.firstChild;\n treeWalker.push(node);\n\n }\n\n return leafs.every( leaf => this.isNodeEmpty(leaf)) ;\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.js","/**\n * Working with selection\n */\nexport default class Selection {\n\n /**\n * @constructor\n */\n constructor() {\n\n this.instance = null;\n this.selection = null;\n\n }\n\n /**\n * Returns window Selection\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Window/getSelection}\n * @return {Selection}\n */\n static get() {\n\n return window.getSelection();\n\n }\n\n /**\n * Returns selected anchor\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorNode}\n * @return {Node}\n */\n static getAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n /**\n * Returns selection offset according to the anchor node\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorOffset}\n * @return {Number}\n */\n static getAnchorOffset() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorOffset;\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/Selection.js","/**\n * Codex Editor\n *\n * Short Description (눈_눈;)\n * @version 2.0.0\n *\n * How to start?\n * Example:\n * new CodexEditor({\n * holderId : 'codex-editor',\n * initialBlock : 'text',\n * placeholder : 'Write your story....',\n * tools: {\n * quote: Quote,\n * anotherTool : AnotherTool\n * },\n * toolsConfig: {\n * quote: {\n * iconClassname : 'quote-icon',\n * displayInToolbox : true,\n * enableLineBreaks : true\n * },\n * anotherTool: {\n * iconClassname : 'tool-icon'\n * }\n * }\n * });\n *\n * - tools is an object: {\n * pluginName: PluginClass,\n * .....\n * }\n * - toolsConfig is an additional configuration that uses Codex Editor API\n * iconClassname - CSS classname of toolbox icon\n * displayInToolbox - if you want to see your Tool in toolbox hided in \"plus\" button, than set \"True\". By default : \"False\"\n * enableLineBreaks - by default enter creates new block that set as initialblock, but if you set this property \"True\", enter will break the lines in current block\n *\n * @author CodeX-Team \n *\n */\n\n/**\n * @typedef {CodexEditor} CodexEditor - editor class\n */\n\n/**\n * @typedef {Object} EditorConfig\n * @property {String} holderId - Element to append Editor\n * @property {Array} data - Blocks list in JSON-format\n * @property {Object} tools - Map for used Tools in format { name : Class, ... }\n * @property {String} initialBlock - This Tool will be added by default\n * @property {String} placeholder - First Block placeholder\n * @property {Object} sanitizer - @todo fill desc\n * @property {Boolean} hideToolbar - @todo fill desc\n * @property {Object} toolsConfig - tools configuration {@link tools#ToolConfig}\n */\n\n/**\n * Dynamically imported utils\n *\n * @typedef {Dom} $ - {@link components/dom.js}\n * @typedef {Util} _ - {@link components/utils.js}\n */\n\n'use strict';\n\n/**\n * Apply polyfills\n */\nimport 'components/polyfills';\n\n/**\n * Require Editor modules places in components/modules dir\n */\n// eslint-disable-next-line\nlet modules = editorModules.map( module => require('./components/modules/' + module ));\n\n/**\n * @class\n *\n * @classdesc CodeX Editor base class\n *\n * @property this.config - all settings\n * @property this.moduleInstances - constructed editor components\n *\n * @type {CodexEditor}\n */\nmodule.exports = class CodexEditor {\n\n /** Editor version */\n static get version() {\n\n return VERSION;\n\n }\n\n /**\n * @param {EditorConfig} config - user configuration\n *\n */\n constructor(config) {\n\n /**\n * Configuration object\n * @type {EditorConfig}\n */\n this.config = {};\n\n /**\n * @typedef {Object} EditorComponents\n * @property {BlockManager} BlockManager\n * @property {Tools} Tools\n * @property {Events} Events\n * @property {UI} UI\n * @property {Toolbar} Toolbar\n * @property {Toolbox} Toolbox\n * @property {Renderer} Renderer\n */\n this.moduleInstances = {};\n\n Promise.resolve()\n .then(() => {\n\n this.configuration = config;\n\n })\n .then(() => this.init())\n .then(() => this.start())\n .then(() => {\n\n console.log('CodeX Editor is ready!');\n\n })\n .catch(error => {\n\n console.log('CodeX Editor does not ready because of %o', error);\n\n });\n\n }\n\n /**\n * Setting for configuration\n * @param {EditorConfig} config\n */\n set configuration(config) {\n\n /**\n * Initlai block type\n * Uses in case when there is no items passed\n * @type {{type: (*), data: {text: null}}}\n */\n let initialBlock = {\n type : config.initialBlock,\n data : {}\n };\n\n this.config.holderId = config.holderId;\n this.config.placeholder = config.placeholder || 'write your story...';\n this.config.sanitizer = config.sanitizer || {\n p: true,\n b: true,\n a: true\n };\n\n this.config.hideToolbar = config.hideToolbar ? config.hideToolbar : false;\n this.config.tools = config.tools || {};\n this.config.toolsConfig = config.toolsConfig || {};\n this.config.data = config.data || {};\n\n /**\n * Initialize items to pass data to the Renderer\n */\n if (_.isEmpty(this.config.data)) {\n\n this.config.data = {};\n this.config.data.items = [ initialBlock ];\n\n } else {\n\n if (!this.config.data.items || this.config.data.items.length === 0) {\n\n this.config.data.items = [ initialBlock ];\n\n }\n\n }\n\n /**\n * If initial Block's Tool was not passed, use the first Tool in config.tools\n */\n if (!config.initialBlock) {\n\n for (this.config.initialBlock in this.config.tools) break;\n\n } else {\n\n this.config.initialBlock = config.initialBlock;\n\n }\n\n }\n\n /**\n * Returns private property\n * @returns {EditorConfig}\n */\n get configuration() {\n\n return this.config;\n\n }\n\n /**\n * Initializes modules:\n * - make and save instances\n * - configure\n */\n init() {\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n this.constructModules();\n\n /**\n * Modules configuration\n */\n this.configureModules();\n\n }\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n constructModules() {\n\n modules.forEach( Module => {\n\n try {\n\n /**\n * We use class name provided by displayName property\n *\n * On build, Babel will transform all Classes to the Functions so, name will always be 'Function'\n * To prevent this, we use 'babel-plugin-class-display-name' plugin\n * @see https://www.npmjs.com/package/babel-plugin-class-display-name\n */\n this.moduleInstances[Module.displayName] = new Module({\n config : this.configuration\n });\n\n } catch ( e ) {\n\n console.log('Module %o skipped because %o', Module, e);\n\n }\n\n });\n\n }\n\n /**\n * Modules instances configuration:\n * - pass other modules to the 'state' property\n * - ...\n */\n configureModules() {\n\n for(let name in this.moduleInstances) {\n\n /**\n * Module does not need self-instance\n */\n this.moduleInstances[name].state = this.getModulesDiff( name );\n\n }\n\n }\n\n /**\n * Return modules without passed name\n */\n getModulesDiff( name ) {\n\n let diff = {};\n\n for(let moduleName in this.moduleInstances) {\n\n /**\n * Skip module with passed name\n */\n if (moduleName === name) {\n\n continue;\n\n }\n diff[moduleName] = this.moduleInstances[moduleName];\n\n }\n\n return diff;\n\n }\n\n /**\n * Start Editor!\n *\n * Get list of modules that needs to be prepared and return a sequence (Promise)\n * @return {Promise}\n */\n start() {\n\n let prepareDecorator = module => module.prepare();\n\n return Promise.resolve()\n .then(prepareDecorator(this.moduleInstances.Tools))\n .then(prepareDecorator(this.moduleInstances.UI))\n .then(prepareDecorator(this.moduleInstances.BlockManager))\n .then(() => {\n\n return this.moduleInstances.Renderer.render(this.config.data.items);\n\n\n });\n\n }\n\n};\n\n// module.exports = (function (editor) {\n//\n// 'use strict';\n//\n// editor.version = VERSION;\n// editor.scriptPrefix = 'cdx-script-';\n//\n// var init = function () {\n//\n// editor.core = require('./modules/core');\n// editor.tools = require('./modules/tools');\n// editor.ui = require('./modules/ui');\n// editor.transport = require('./modules/transport');\n// editor.renderer = require('./modules/renderer');\n// editor.saver = require('./modules/saver');\n// editor.content = require('./modules/content');\n// editor.toolbar = require('./modules/toolbar/toolbar');\n// editor.callback = require('./modules/callbacks');\n// editor.draw = require('./modules/draw');\n// editor.caret = require('./modules/caret');\n// editor.notifications = require('./modules/notifications');\n// editor.parser = require('./modules/parser');\n// editor.sanitizer = require('./modules/sanitizer');\n// editor.listeners = require('./modules/listeners');\n// editor.destroyer = require('./modules/destroyer');\n// editor.paste = require('./modules/paste');\n//\n// };\n//\n// /**\n// * @public\n// * holds initial settings\n// */\n// editor.settings = {\n// tools : ['text', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n// holderId : 'codex-editor',\n//\n// // Type of block showing on empty editor\n// initialBlockPlugin: 'text'\n// };\n//\n// /**\n// * public\n// *\n// * Static nodes\n// */\n// editor.nodes = {\n// holder : null,\n// wrapper : null,\n// toolbar : null,\n// inlineToolbar : {\n// wrapper : null,\n// buttons : null,\n// actions : null\n// },\n// toolbox : null,\n// notifications : null,\n// plusButton : null,\n// showSettingsButton: null,\n// showTrashButton : null,\n// blockSettings : null,\n// pluginSettings : null,\n// defaultSettings : null,\n// toolbarButtons : {}, // { type : DomEl, ... }\n// redactor : null\n// };\n//\n// /**\n// * @public\n// *\n// * Output state\n// */\n// editor.state = {\n// jsonOutput : [],\n// blocks : [],\n// inputs : []\n// };\n//\n// /**\n// * @public\n// * Editor plugins\n// */\n// editor.tools = {};\n//\n// editor.start = function (userSettings) {\n//\n// init();\n//\n// editor.core.prepare(userSettings)\n//\n// // If all ok, make UI, bind events and parse initial-content\n// .then(editor.ui.prepare)\n// .then(editor.tools.prepare)\n// .then(editor.sanitizer.prepare)\n// .then(editor.paste.prepare)\n// .then(editor.transport.prepare)\n// .then(editor.renderer.makeBlocksFromData)\n// .then(editor.ui.saveInputs)\n// .catch(function (error) {\n//\n// editor.core.log('Initialization failed with error: %o', 'warn', error);\n//\n// });\n//\n// };\n//\n// return editor;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/codex.js","/**\n * Element.closest()\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\n */\nif (!Element.prototype.matches)\n Element.prototype.matches = Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n\nif (!Element.prototype.closest)\n Element.prototype.closest = function (s) {\n\n var el = this;\n\n if (!document.documentElement.contains(el)) return null;\n do {\n\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n\n } while (el !== null);\n return null;\n\n };\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/polyfills.js","var map = {\n\t\"./blockManager.js\": 7,\n\t\"./caret.js\": 9,\n\t\"./events.js\": 10,\n\t\"./listeners.js\": 11,\n\t\"./renderer.js\": 12,\n\t\"./sanitizer.js\": 13,\n\t\"./saver.js\": 15,\n\t\"./toolbar.js\": 16,\n\t\"./toolbox.js\": 17,\n\t\"./tools.js\": 18,\n\t\"./ui.js\": 19\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 6;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/modules nonrecursive [^_](blockManager.js|caret.js|events.js|listeners.js|renderer.js|sanitizer.js|saver.js|toolbar.js|toolbox.js|tools.js|ui.js)$\n// module id = 6\n// module chunks = 0","/**\n * @class BlockManager\n * @classdesc Manage editor`s blocks storage and appearance\n *\n * @module BlockManager\n *\n * @version 2.0.0\n */\n\nimport Block from '../block';\nimport Selection from '../Selection';\n\n/**\n * @typedef {BlockManager} BlockManager\n * @property {Number} currentBlockIndex - Index of current working block\n * @property {Proxy} _blocks - Proxy for Blocks instance {@link Blocks}\n */\nexport default class BlockManager extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n /**\n * Proxy for Blocks instance {@link Blocks}\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = null;\n\n /**\n * Index of current working block\n *\n * @type {number}\n * @private\n */\n this.currentBlockIndex = -1;\n\n }\n\n /**\n * Should be called after Editor.UI preparation\n * Define this._blocks property\n *\n * @returns {Promise}\n */\n prepare() {\n\n return new Promise(resolve => {\n\n let blocks = new Blocks(this.Editor.UI.nodes.redactor);\n\n /**\n * We need to use Proxy to overload set/get [] operator.\n * So we can use array-like syntax to access blocks\n *\n * @example\n * this._blocks[0] = new Block(...);\n *\n * block = this._blocks[0];\n *\n * @todo proxy the enumerate method\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = new Proxy(blocks, {\n set: Blocks.set,\n get: Blocks.get\n });\n\n resolve();\n\n });\n\n }\n\n /**\n * Creates Block instance by tool name\n *\n * @param {String} toolName - tools passed in editor config {@link EditorConfig#tools}\n * @param {Object} data - constructor params\n *\n * @return {Block}\n */\n composeBlock(toolName, data) {\n\n let toolInstance = this.Editor.Tools.construct(toolName, data),\n block = new Block(toolName, toolInstance);\n\n this.bindEvents(block);\n\n /**\n * Apply callback before inserting html\n */\n block.call('appendCallback', {});\n\n return block;\n\n }\n\n /**\n * Bind Events\n * @param {Object} block\n */\n bindEvents(block) {\n\n /**\n * keydown on block\n * @todo move to the keydown module\n */\n this.Editor.Listeners.on(block.pluginsContent, 'keydown', (event) => this.keyDownOnBlock(event));\n\n }\n\n /**\n * @todo move to the keydown module\n * @param {MouseEvent} event\n */\n keyDownOnBlock(event) {\n\n switch(event.keyCode) {\n\n case _.keyCodes.ENTER:\n // this.enterPressedOnPluginsContent(event);\n break;\n case _.keyCodes.DOWN:\n case _.keyCodes.RIGHT:\n this.navigateNext();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.navigatePrevious();\n break;\n\n }\n\n }\n\n /**\n * Set's caret to the next Block\n * Before moving caret, we should check if caret position is at the end of Plugins node\n * Using {@link Dom#getDeepestNode} to get a last node and match with current selection\n */\n navigateNext() {\n\n let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getAnchorOffset() === textNodeLength) {\n\n let nextBlock = this.nextBlock;\n\n if (!nextBlock) return;\n\n this.Editor.Caret.setToBlock( nextBlock );\n\n }\n\n }\n\n /**\n * Set's caret to the previous Block\n * Before moving caret, we should check if caret position is at the end of Plugins node\n * Using {@link Dom#getDeepestNode} to get a last node and match with current selection\n */\n navigatePrevious() {\n\n let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n if (Selection.getAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getAnchorOffset() === 0) {\n\n let previousBlock = this.previousBlock;\n\n if (!previousBlock) return;\n\n this.Editor.Caret.setToBlock( previousBlock, textNodeLength, true );\n\n }\n\n }\n\n /**\n * Insert new block into _blocks\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n insert(toolName, data = {}) {\n\n\n let block = this.composeBlock(toolName, data);\n\n this._blocks[++this.currentBlockIndex] = block;\n this.Editor.Caret.setToBlock(block);\n\n }\n\n /**\n * Replace current working block\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n replace(toolName, data = {}) {\n\n let block = this.composeBlock(toolName, data);\n\n this._blocks.insert(this.currentBlockIndex, block, true);\n\n }\n\n /**\n * returns last Block\n * @return {Block}\n */\n get lastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n * Returns Block by passed index\n * @param {Number} index\n * @return {Block}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Get Block instance by html element\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`),\n index = nodes.indexOf(firstLevelBlock);\n\n if (index >= 0) {\n\n return this._blocks[index];\n\n }\n\n }\n\n /**\n * Get current Block instance\n *\n * @return {Block}\n */\n get currentBlock() {\n\n return this._blocks[this.currentBlockIndex];\n\n }\n\n /**\n * Returns next Block instance\n * @return {Block|null}\n */\n get nextBlock() {\n\n let isLastBlock = this.currentBlockIndex === (this._blocks.length - 1);\n\n if (isLastBlock) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex + 1];\n\n }\n\n /**\n * Returns previous Block instance\n * @return {Block|null}\n */\n get previousBlock() {\n\n let isFirstBlock = this.currentBlockIndex === 0;\n\n if (isFirstBlock) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex - 1];\n\n }\n\n /**\n * Get working html element\n *\n * @return {HTMLElement}\n */\n get currentNode() {\n\n return this._blocks.nodes[this.currentBlockIndex];\n\n }\n\n /**\n * Set currentBlockIndex to passed block\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes,\n firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`);\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(firstLevelBlock);\n\n /**\n * Remove previous selected Block's state\n */\n this._blocks.array.forEach( block => block.selected = false);\n\n /**\n * Mark current Block as selected\n * @type {boolean}\n */\n this.currentBlock.selected = true;\n\n }\n\n /**\n * Get array of Block instances\n *\n * @returns {Block[]} {@link Blocks#array}\n */\n get blocks() {\n\n return this._blocks.array;\n\n }\n\n /**\n * 1) Find first-level Block from passed child Node\n * 2) Mark it as current\n *\n * @param {Element|Text} childNode - look ahead from this node.\n * @throws Error - when passed Node is not included at the Block\n */\n setCurrentBlockByChildNode(childNode) {\n\n /**\n * If node is Text TextNode\n */\n if (!$.isElement(childNode)) {\n\n childNode = childNode.parentNode;\n\n }\n\n let parentFirstLevelBlock = childNode.closest(`.${Block.CSS.wrapper}`);\n\n if (parentFirstLevelBlock) {\n\n this.currentNode = parentFirstLevelBlock;\n\n } else {\n\n throw new Error('Can not find a Block from this child Node');\n\n }\n\n }\n\n}\n\n/**\n * @class Blocks\n * @classdesc Class to work with Block instances array\n *\n * @private\n *\n * @property {HTMLElement} workingArea — editor`s working node\n *\n */\nclass Blocks {\n\n /**\n * @constructor\n *\n * @param {HTMLElement} workingArea — editor`s working node\n */\n constructor(workingArea) {\n\n this.blocks = [];\n this.workingArea = workingArea;\n\n }\n\n /**\n * Push back new Block\n *\n * @param {Block} block\n */\n push(block) {\n\n this.blocks.push(block);\n this.workingArea.appendChild(block.html);\n\n }\n\n /**\n * Insert new Block at passed index\n *\n * @param {Number} index — index to insert Block\n * @param {Block} block — Block to insert\n * @param {Boolean} replace — it true, replace block on given index\n */\n insert(index, block, replace = false) {\n\n if (!this.length) {\n\n this.push(block);\n return;\n\n }\n\n if (index > this.length) {\n\n index = this.length;\n\n }\n\n if (replace) {\n\n this.blocks[index].html.remove();\n\n }\n\n let deleteCount = replace ? 1 : 0;\n\n this.blocks.splice(index, deleteCount, block);\n\n if (index > 0) {\n\n let previousBlock = this.blocks[index - 1];\n\n previousBlock.html.insertAdjacentElement('afterend', block.html);\n\n } else {\n\n let nextBlock = this.blocks[index + 1];\n\n if (nextBlock) {\n\n nextBlock.html.insertAdjacentElement('beforebegin', block.html);\n\n } else {\n\n this.workingArea.appendChild(block.html);\n\n }\n\n }\n\n }\n\n /**\n * Insert Block after passed target\n *\n * @todo decide if this method is necessary\n *\n * @param {Block} targetBlock — target after wich Block should be inserted\n * @param {Block} newBlock — Block to insert\n */\n insertAfter(targetBlock, newBlock) {\n\n let index = this.blocks.indexOf(targetBlock);\n\n this.insert(index + 1, newBlock);\n\n }\n\n /**\n * Get Block by index\n *\n * @param {Number} index — Block index\n * @returns {Block}\n */\n get(index) {\n\n return this.blocks[index];\n\n }\n\n /**\n * Return index of passed Block\n *\n * @param {Block} block\n * @returns {Number}\n */\n indexOf(block) {\n\n return this.blocks.indexOf(block);\n\n }\n\n /**\n * Get length of Block instances array\n *\n * @returns {Number}\n */\n get length() {\n\n return this.blocks.length;\n\n }\n\n /**\n * Get Block instances array\n *\n * @returns {Block[]}\n */\n get array() {\n\n return this.blocks;\n\n }\n\n /**\n * Get blocks html elements array\n *\n * @returns {HTMLElement[]}\n */\n get nodes() {\n\n return _.array(this.workingArea.children);\n\n }\n\n /**\n * Proxy trap to implement array-like setter\n *\n * @example\n * blocks[0] = new Block(...)\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — block index\n * @param {Block} block — Block to set\n * @returns {Boolean}\n */\n static set(instance, index, block) {\n\n if (isNaN(Number(index))) {\n\n return false;\n\n }\n\n instance.insert(index, block);\n\n return true;\n\n }\n\n /**\n * Proxy trap to implement array-like getter\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — Block index\n * @returns {Block|*}\n */\n static get(instance, index) {\n\n if (isNaN(Number(index))) {\n\n return instance[index];\n\n }\n\n return instance.get(index);\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/blockManager.js","/**\n *\n * @class Block\n * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool\n *\n * @property {Tool} tool — current block tool (Paragraph, for example)\n * @property {Object} CSS — block`s css classes\n *\n */\n\n/**\n * @classdesc Abstract Block class that contains Block information, Tool name and Tool class instance\n *\n * @property tool - Tool instance\n * @property html - Returns HTML content of plugin\n * @property wrapper - Div element that wraps block content with Tool's content. Has `ce-block` CSS class\n * @property contentNode - Div element that wraps Tool's content. Has `ce-block__content` CSS class\n * @property pluginsContent - HTML content that returns by Tool's render function\n */\nexport default class Block {\n\n /**\n * @constructor\n * @param {String} toolName - Tool name that passed on initialization\n * @param {Object} toolInstance — passed Tool`s instance that rendered the Block\n */\n constructor(toolName, toolInstance) {\n\n this.name = toolName;\n this.tool = toolInstance;\n this._html = this.compose();\n\n }\n\n /**\n * CSS classes for the Block\n * @return {{wrapper: string, content: string}}\n */\n static get CSS() {\n\n return {\n wrapper: 'ce-block',\n content: 'ce-block__content',\n selected: 'ce-block--selected'\n };\n\n }\n\n /**\n * Make default Block wrappers and put Tool`s content there\n * @returns {HTMLDivElement}\n */\n compose() {\n\n this.wrapper = $.make('div', Block.CSS.wrapper);\n this.contentNode = $.make('div', Block.CSS.content);\n this.pluginsContent = this.tool.render();\n\n this.contentNode.appendChild(this.pluginsContent);\n this.wrapper.appendChild(this.contentNode);\n\n return this.wrapper;\n\n }\n\n /**\n * Calls Tool's method\n *\n * Method checks tool property {MethodName}. Fires method with passes params If it is instance of Function\n *\n * @param {String} methodName\n * @param {Object} params\n */\n call(methodName, params) {\n\n /**\n * call Tool's method with the instance context\n */\n if (this.tool[methodName] && this.tool[methodName] instanceof Function) {\n\n this.tool[methodName].call(this.tool, params);\n\n }\n\n }\n\n /**\n * Get Block`s HTML\n * @returns {HTMLElement}\n */\n get html() {\n\n return this._html;\n\n }\n\n /**\n * Get Block's JSON data\n * @return {Object}\n */\n get data() {\n\n return this.save();\n\n }\n\n /**\n * Extracts data from Block\n * Groups Tool's save processing time\n * @return {Object}\n */\n save() {\n\n let extractedBlock = this.tool.save(this.pluginsContent);\n\n /** Measuring execution time*/\n let measuringStart = window.performance.now(),\n measuringEnd;\n\n return Promise.resolve(extractedBlock)\n .then((finishedExtraction) => {\n\n /** measure promise execution */\n measuringEnd = window.performance.now();\n\n return {\n tool: this.name,\n data: finishedExtraction,\n time : measuringEnd - measuringStart\n };\n\n })\n .catch(function (error) {\n\n _.log(`Saving proccess for ${this.tool.name} tool failed due to the ${error}`, 'log', 'red');\n\n });\n\n }\n\n /**\n * Uses Tool's validation method to check the correctness of output data\n * Tool's validation method is optional\n *\n * @description Method also can return data if it passed the validation\n *\n * @param {Object} data\n * @returns {Boolean|Object} valid\n */\n validateData(data) {\n\n let isValid = true;\n\n if (this.tool.validate instanceof Function) {\n\n isValid = this.tool.validate(data);\n\n }\n\n if (!isValid) {\n\n return false;\n\n }\n\n return data;\n\n }\n\n /**\n * Check block for emptiness\n * @return {Boolean}\n */\n get isEmpty() {\n\n /**\n * Allow Tool to represent decorative contentless blocks: for example \"* * *\"-tool\n * That Tools are not empty\n */\n if (this.tool.contentless) {\n\n return false;\n\n }\n\n let emptyText = $.isEmpty(this.pluginsContent),\n emptyMedia = !this.hasMedia;\n\n return emptyText && emptyMedia;\n\n }\n\n /**\n * Check if block has a media content such as images, iframes and other\n * @return {Boolean}\n */\n get hasMedia() {\n\n /**\n * This tags represents media-content\n * @type {string[]}\n */\n const mediaTags = [\n 'img',\n 'iframe',\n 'video',\n 'audio',\n 'source',\n 'input',\n 'textarea',\n 'twitterwidget'\n ];\n\n return !!this._html.querySelector(mediaTags.join(','));\n\n }\n\n /**\n * Set selected state\n * @param {Boolean} state - 'true' to select, 'false' to remove selection\n */\n set selected(state) {\n\n /**\n * We don't need to mark Block as Selected when it is not empty\n */\n if (state === true && !this.isEmpty) {\n\n this._html.classList.add(Block.CSS.selected);\n\n } else {\n\n this._html.classList.remove(Block.CSS.selected);\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/block.js","/**\n * @class Caret\n * @classdesc Contains methods for working Caret\n *\n * Uses Range methods to manipulate with caret\n *\n * @module Caret\n *\n * @version 2.0.0\n */\n\n/**\n * @typedef {Caret} Caret\n */\nimport Selection from '../Selection';\n\nexport default class Caret extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * Method gets Block instance and puts caret to the text node with offset\n * There two ways that method applies caret position:\n * - first found text node: sets at the beginning, but you can pass an offset\n * - last found text node: sets at the end of the node. Also, you can customize the behaviour\n *\n * @param {Block} block - Block class\n * @param {Number} offset - caret offset regarding to the text node\n * @param {Boolean} atEnd - put caret at the end of the text node or not\n */\n setToBlock(block, offset = 0, atEnd = false) {\n\n let element = block.pluginsContent;\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestNode(element, atEnd);\n\n if (atEnd || offset > nodeToSet.length) {\n\n offset = nodeToSet.length;\n\n }\n\n /** if found deepest node is native input */\n if ($.isNativeInput(nodeToSet)) {\n\n nodeToSet.focus();\n return;\n\n }\n\n /**\n * @todo try to fix via Promises or use querySelectorAll to not to use timeout\n */\n _.delay( () => this.set(nodeToSet, offset), 20)();\n\n this.Editor.BlockManager.currentNode = block.wrapper;\n\n }\n\n /**\n * Creates Document Range and sets caret to the element with offset\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n */\n set( element, offset = 0) {\n\n let range = document.createRange(),\n selection = Selection.get();\n\n range.setStart(element, offset);\n range.setEnd(element, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n };\n\n /**\n * Set Caret to the last Block\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let lastBlock = this.Editor.BlockManager.lastBlock;\n\n if (!lastBlock) return;\n\n /**\n * If last block is empty and it is an initialBlock, set to that.\n * Otherwise, append new empty block and set to that\n */\n if (lastBlock.isEmpty) {\n\n this.setToBlock(lastBlock);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/caret.js","/**\n * @module eventDispatcher\n *\n * Has two important methods:\n * - {Function} on - appends subscriber to the event. If event doesn't exist - creates new one\n * - {Function} emit - fires all subscribers with data\n *\n * @version 1.0.0\n *\n * @typedef {Events} Events\n * @property {Object} subscribers - all subscribers grouped by event name\n */\nexport default class Events extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n this.subscribers = {};\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Function} callback - subscriber\n */\n on(eventName, callback) {\n\n if (!(eventName in this.subscribers)) {\n\n this.subscribers[eventName] = [];\n\n }\n\n // group by events\n this.subscribers[eventName].push(callback);\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Object} data - subscribers get this data when they were fired\n */\n emit(eventName, data) {\n\n this.subscribers[eventName].reduce(function (previousData, currentHandler) {\n\n let newData = currentHandler(previousData);\n\n return newData ? newData : previousData;\n\n }, data);\n\n }\n\n /**\n * Destroyer\n * clears subsribers list\n */\n destroy() {\n\n this.subscribers = null;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/events.js","/**\n * Codex Editor Listeners module\n *\n * @module Listeners\n *\n * Module-decorator for event listeners assignment\n *\n * @author Codex Team\n * @version 2.0.0\n */\n\n/**\n * @typedef {Listeners} Listeners\n * @property {Array} allListeners\n */\n\nexport default class Listeners extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n this.allListeners = [];\n\n }\n\n /**\n * Assigns event listener on element\n *\n * @param {Element} element - DOM element that needs to be listened\n * @param {String} eventType - event type\n * @param {Function} handler - method that will be fired on event\n * @param {Boolean} useCapture - use event bubbling\n */\n on(element, eventType, handler, useCapture = false) {\n\n let assignedEventData = {\n element,\n eventType,\n handler,\n useCapture\n };\n\n let alreadyExist = this.findOne(element, eventType, handler);\n\n if (alreadyExist) return;\n\n this.allListeners.push(assignedEventData);\n element.addEventListener(eventType, handler, useCapture);\n\n }\n\n /**\n * Removes event listener from element\n *\n * @param {Element} element - DOM element that we removing listener\n * @param {String} eventType - event type\n * @param {Function} handler - remove handler, if element listens several handlers on the same event type\n * @param {Boolean} useCapture - use event bubbling\n */\n off(element, eventType, handler, useCapture = false) {\n\n let existingListeners = this.findAll(element, eventType, handler);\n\n for (let i = 0; i < existingListeners.length; i++) {\n\n let index = this.allListeners.indexOf(existingListeners[i]);\n\n if (index > 0) {\n\n this.allListeners.splice(index, 1);\n\n }\n\n }\n\n element.removeEventListener(eventType, handler, useCapture);\n\n\n }\n\n /**\n * Search method: looks for listener by passed element\n * @param {Element} element - searching element\n * @returns {Array} listeners that found on element\n */\n findByElement(element) {\n\n let listenersOnElement = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.element === element) {\n\n listenersOnElement.push(listener);\n\n }\n\n }\n\n return listenersOnElement;\n\n }\n\n /**\n * Search method: looks for listener by passed event type\n * @param {String} eventType\n * @return {Array} listeners that found on element\n */\n findByType(eventType) {\n\n let listenersWithType = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.type === eventType) {\n\n listenersWithType.push(listener);\n\n }\n\n }\n\n return listenersWithType;\n\n }\n\n /**\n * Search method: looks for listener by passed handler\n * @param {Function} handler\n * @return {Array} listeners that found on element\n */\n findByHandler(handler) {\n\n let listenersWithHandler = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.handler === handler) {\n\n listenersWithHandler.push(listener);\n\n }\n\n }\n\n return listenersWithHandler;\n\n }\n\n /**\n * @param {Element} element\n * @param {String} eventType\n * @param {Function} handler\n * @return {Element|null}\n */\n findOne(element, eventType, handler) {\n\n let foundListeners = this.findAll(element, eventType, handler);\n\n return foundListeners.length > 0 ? foundListeners[0] : null;\n\n }\n\n /**\n * @param {Element} element\n * @param {String} eventType\n * @param {Function} handler\n * @return {Array}\n */\n findAll(element, eventType, handler) {\n\n let foundAllListeners,\n foundByElements = [],\n foundByEventType = [],\n foundByHandler = [];\n\n if (element)\n foundByElements = this.findByElement(element);\n\n if (eventType)\n foundByEventType = this.findByType(eventType);\n\n if (handler)\n foundByHandler = this.findByHandler(handler);\n\n foundAllListeners = foundByElements.concat(foundByEventType, foundByHandler);\n\n return foundAllListeners;\n\n }\n\n /**\n * Removes all listeners\n */\n removeAll() {\n\n this.allListeners.map( (current) => {\n\n this.off(current.element, current.type, current.handler);\n\n });\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/listeners.js","/**\n * Codex Editor Renderer Module\n *\n * @module Renderer\n * @author CodeX Team\n *\n * @version 2.0.0\n */\nexport default class Renderer extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * @typedef {Object} RendererItems\n * @property {String} type - tool name\n * @property {Object} data - tool data\n */\n\n /**\n * @example\n *\n * items: [\n * {\n * type : 'paragraph',\n * data : {\n * text : 'Hello from Codex!'\n * }\n * },\n * {\n * type : 'paragraph',\n * data : {\n * text : 'Leave feedback if you like it!'\n * }\n * },\n * ]\n *\n */\n\n /**\n * Make plugin blocks from array of plugin`s data\n * @param {RendererItems[]} items\n */\n render(items) {\n\n let chainData = [];\n\n for (let i = 0; i < items.length; i++) {\n\n chainData.push({\n function: () => this.insertBlock(items[i])\n });\n\n }\n\n return _.sequence(chainData);\n\n }\n\n /**\n * Get plugin instance\n * Add plugin instance to BlockManager\n * Insert block to working zone\n *\n * @param {Object} item\n * @returns {Promise.}\n * @private\n */\n insertBlock(item) {\n\n let tool = item.type,\n data = item.data;\n\n this.Editor.BlockManager.insert(tool, data);\n\n return Promise.resolve();\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/renderer.js","/**\n * CodeX Sanitizer\n *\n * @module Sanitizer\n * Clears HTML from taint tags\n *\n * @version 2.0.0\n *\n * @example\n * Module can be used within two ways:\n * 1) When you have an instance\n * - this.Editor.Sanitizer.clean(yourTaintString);\n * 2) As static method\n * - CodexEditor.Sanitizer.clean(yourTaintString, yourCustomConfiguration);\n *\n * {@link SanitizerConfig}\n */\n\n\n/**\n * @typedef {Object} SanitizerConfig\n * @property {Object} tags - define tags restrictions\n *\n * @example\n *\n * tags : {\n * p: true,\n * a: {\n * href: true,\n * rel: \"nofollow\",\n * target: \"_blank\"\n * }\n * }\n */\nexport default class Sanitizer extends Module {\n\n /**\n * Initializes Sanitizer module\n * Sets default configuration if custom not exists\n *\n * @property {SanitizerConfig} this.defaultConfig\n * @property {HTMLJanitor} this._sanitizerInstance - Sanitizer library\n *\n * @param {SanitizerConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n // default config\n this.defaultConfig = null;\n this._sanitizerInstance = null;\n\n /** Custom configuration */\n this.sanitizerConfig = config.settings ? config.settings.sanitizer : {};\n\n /** HTML Janitor library */\n this.sanitizerInstance = require('html-janitor');\n\n }\n\n /**\n * If developer uses editor's API, then he can customize sanitize restrictions.\n * Or, sanitizing config can be defined globally in editors initialization. That config will be used everywhere\n * At least, if there is no config overrides, that API uses Default configuration\n *\n * @uses https://www.npmjs.com/package/html-janitor\n *\n * @param {HTMLJanitor} library - sanitizer extension\n */\n set sanitizerInstance(library) {\n\n this._sanitizerInstance = new library(this.defaultConfig);\n\n }\n\n /**\n * Sets sanitizer configuration. Uses default config if user didn't pass the restriction\n * @param {SanitizerConfig} config\n */\n set sanitizerConfig(config) {\n\n if (_.isEmpty(config)) {\n\n this.defaultConfig = {\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: 'nofollow'\n }\n }\n };\n\n } else {\n\n this.defaultConfig = config;\n\n }\n\n }\n\n /**\n * Cleans string from unwanted tags\n * @param {String} taintString - HTML string\n * @param {Object} customConfig - custom sanitizer configuration. Method uses default if param is empty\n * @return {String} clean HTML\n */\n clean(taintString, customConfig = {}) {\n\n if (_.isEmpty(customConfig)) {\n\n return this._sanitizerInstance.clean(taintString);\n\n } else {\n\n return Sanitizer.clean(taintString, customConfig);\n\n }\n\n\n }\n\n /**\n * Cleans string from unwanted tags\n * @static\n *\n * Method allows to use default config\n *\n * @param {String} taintString - taint string\n * @param {SanitizerConfig} customConfig - allowed tags\n *\n * @return {String} clean HTML\n */\n static clean(taintString, customConfig) {\n\n let newInstance = Sanitizer(customConfig);\n\n return newInstance.clean(taintString);\n\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/sanitizer.js","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('html-janitor', factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.HTMLJanitor = factory();\n }\n}(this, function () {\n\n /**\n * @param {Object} config.tags Dictionary of allowed tags.\n * @param {boolean} config.keepNestedBlockElements Default false.\n */\n function HTMLJanitor(config) {\n\n var tagDefinitions = config['tags'];\n var tags = Object.keys(tagDefinitions);\n\n var validConfigValues = tags\n .map(function(k) { return typeof tagDefinitions[k]; })\n .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });\n\n if(!validConfigValues) {\n throw new Error(\"The configuration was invalid\");\n }\n\n this.config = config;\n }\n\n // TODO: not exhaustive?\n var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];\n function isBlockElement(node) {\n return blockElementNames.indexOf(node.nodeName) !== -1;\n }\n\n var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];\n function isInlineElement(node) {\n return inlineElementNames.indexOf(node.nodeName) !== -1;\n }\n\n HTMLJanitor.prototype.clean = function (html) {\n var sandbox = document.createElement('div');\n sandbox.innerHTML = html;\n\n this._sanitize(sandbox);\n\n return sandbox.innerHTML;\n };\n\n HTMLJanitor.prototype._sanitize = function (parentNode) {\n var treeWalker = createTreeWalker(parentNode);\n var node = treeWalker.firstChild();\n if (!node) { return; }\n\n do {\n // Ignore nodes that have already been sanitized\n if (node._sanitized) {\n continue;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // If this text node is just whitespace and the previous or next element\n // sibling is a block element, remove it\n // N.B.: This heuristic could change. Very specific to a bug with\n // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output\n // FIXME: make this an option?\n if (node.data.trim() === ''\n && ((node.previousElementSibling && isBlockElement(node.previousElementSibling))\n || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n } else {\n continue;\n }\n }\n\n // Remove all comments\n if (node.nodeType === Node.COMMENT_NODE) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n }\n\n var isInline = isInlineElement(node);\n var containsBlockElement;\n if (isInline) {\n containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);\n }\n\n // Block elements should not be nested (e.g.

  • ...); if\n // they are, we want to unwrap the inner block element.\n var isNotTopContainer = !! parentNode.parentNode;\n var isNestedBlockElement =\n isBlockElement(parentNode) &&\n isBlockElement(node) &&\n isNotTopContainer;\n\n var nodeName = node.nodeName.toLowerCase();\n\n var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);\n\n var isInvalid = isInline && containsBlockElement;\n\n // Drop tag entirely according to the whitelist *and* if the markup\n // is invalid.\n if (isInvalid || shouldRejectNode(node, allowedAttrs)\n || (!this.config.keepNestedBlockElements && isNestedBlockElement)) {\n // Do not keep the inner text of SCRIPT/STYLE elements.\n if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {\n while (node.childNodes.length > 0) {\n parentNode.insertBefore(node.childNodes[0], node);\n }\n }\n parentNode.removeChild(node);\n\n this._sanitize(parentNode);\n break;\n }\n\n // Sanitize attributes\n for (var a = 0; a < node.attributes.length; a += 1) {\n var attr = node.attributes[a];\n\n if (shouldRejectAttr(attr, allowedAttrs, node)) {\n node.removeAttribute(attr.name);\n // Shift the array to continue looping.\n a = a - 1;\n }\n }\n\n // Sanitize children\n this._sanitize(node);\n\n // Mark node as sanitized so it's ignored in future runs\n node._sanitized = true;\n } while ((node = treeWalker.nextSibling()));\n };\n\n function createTreeWalker(node) {\n return document.createTreeWalker(node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,\n null, false);\n }\n\n function getAllowedAttrs(config, nodeName, node){\n if (typeof config.tags[nodeName] === 'function') {\n return config.tags[nodeName](node);\n } else {\n return config.tags[nodeName];\n }\n }\n\n function shouldRejectNode(node, allowedAttrs){\n if (typeof allowedAttrs === 'undefined') {\n return true;\n } else if (typeof allowedAttrs === 'boolean') {\n return !allowedAttrs;\n }\n\n return false;\n }\n\n function shouldRejectAttr(attr, allowedAttrs, node){\n var attrName = attr.name.toLowerCase();\n\n if (allowedAttrs === true){\n return false;\n } else if (typeof allowedAttrs[attrName] === 'function'){\n return !allowedAttrs[attrName](attr.value, node);\n } else if (typeof allowedAttrs[attrName] === 'undefined'){\n return true;\n } else if (allowedAttrs[attrName] === false) {\n return true;\n } else if (typeof allowedAttrs[attrName] === 'string') {\n return (allowedAttrs[attrName] !== attr.value);\n }\n\n return false;\n }\n\n return HTMLJanitor;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html-janitor/src/html-janitor.js\n// module id = 14\n// module chunks = 0","/**\n * Codex Editor Saver\n *\n * @module Saver\n * @author Codex Team\n * @version 2.0.0\n */\n\n/**\n * @typedef {Object} SavedData\n * @property {Date} time - saving proccess time\n * @property {Object} items - extracted data\n * @property {String} version - CodexEditor version\n */\n\n/**\n * @classdesc This method reduces all Blocks asyncronically and calls Block's save method to extract data\n *\n * @typedef {Saver} Saver\n * @property {Element} html - Editor HTML content\n * @property {String} json - Editor JSON output\n */\n\nexport default class Saver extends Module {\n\n /**\n * @constructor\n * @param config\n */\n constructor({config}) {\n\n super({config});\n\n this.output = null;\n this.blocksData = [];\n\n }\n\n /**\n * Composes new chain of Promises to fire them alternatelly\n * @return {SavedData}\n */\n save() {\n\n let blocks = this.Editor.BlockManager.blocks,\n chainData = [];\n\n blocks.forEach((block) => {\n\n chainData.push(block.data);\n\n });\n\n return Promise.all(chainData)\n .then((allExtractedData) => this.makeOutput(allExtractedData))\n .then((outputData) => {\n\n return outputData;\n\n });\n\n }\n\n /**\n * Creates output object with saved data, time and version of editor\n * @param {Object} allExtractedData\n * @return {SavedData}\n */\n makeOutput(allExtractedData) {\n\n let items = [],\n totalTime = 0;\n\n console.groupCollapsed('[CodexEditor saving]:');\n\n allExtractedData.forEach((extraction, index) => {\n\n /** Group process info */\n console.log(`«${extraction.tool}» saving info`, extraction);\n totalTime += extraction.time;\n items.push(extraction.data);\n\n });\n\n console.log('Total', totalTime);\n console.groupEnd();\n\n return {\n time : +new Date(),\n items : items,\n version : VERSION,\n };\n\n }\n\n}\n\n// module.exports = (function (saver) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * @public\n// * Save blocks\n// */\n// saver.save = function () {\n//\n// /** Save html content of redactor to memory */\n// editor.state.html = editor.nodes.redactor.innerHTML;\n//\n// /** Clean jsonOutput state */\n// editor.state.jsonOutput = [];\n//\n// return saveBlocks(editor.nodes.redactor.childNodes);\n//\n// };\n//\n// /**\n// * @private\n// * Save each block data\n// *\n// * @param blocks\n// * @returns {Promise.}\n// */\n// let saveBlocks = function (blocks) {\n//\n// let data = [];\n//\n// for(let index = 0; index < blocks.length; index++) {\n//\n// data.push(getBlockData(blocks[index]));\n//\n// }\n//\n// return Promise.all(data)\n// .then(makeOutput)\n// .catch(editor.core.log);\n//\n// };\n//\n// /** Save and validate block data */\n// let getBlockData = function (block) {\n//\n// return saveBlockData(block)\n// .then(validateBlockData)\n// .catch(editor.core.log);\n//\n// };\n//\n// /**\n// * @private\n// * Call block`s plugin save method and return saved data\n// *\n// * @param block\n// * @returns {Object}\n// */\n// let saveBlockData = function (block) {\n//\n// let pluginName = block.dataset.tool;\n//\n// /** Check for plugin existence */\n// if (!editor.tools[pluginName]) {\n//\n// editor.core.log(`Plugin «${pluginName}» not found`, 'error');\n// return {data: null, pluginName: null};\n//\n// }\n//\n// /** Check for plugin having save method */\n// if (typeof editor.tools[pluginName].save !== 'function') {\n//\n// editor.core.log(`Plugin «${pluginName}» must have save method`, 'error');\n// return {data: null, pluginName: null};\n//\n// }\n//\n// /** Result saver */\n// let blockContent = block.childNodes[0],\n// pluginsContent = blockContent.childNodes[0],\n// position = pluginsContent.dataset.inputPosition;\n//\n// /** If plugin wasn't available then return data from cache */\n// if ( editor.tools[pluginName].available === false ) {\n//\n// return Promise.resolve({data: codex.editor.state.blocks.items[position].data, pluginName});\n//\n// }\n//\n// return Promise.resolve(pluginsContent)\n// .then(editor.tools[pluginName].save)\n// .then(data => Object({data, pluginName}));\n//\n// };\n//\n// /**\n// * Call plugin`s validate method. Return false if validation failed\n// *\n// * @param data\n// * @param pluginName\n// * @returns {Object|Boolean}\n// */\n// let validateBlockData = function ({data, pluginName}) {\n//\n// if (!data || !pluginName) {\n//\n// return false;\n//\n// }\n//\n// if (editor.tools[pluginName].validate) {\n//\n// let result = editor.tools[pluginName].validate(data);\n//\n// /**\n// * Do not allow invalid data\n// */\n// if (!result) {\n//\n// return false;\n//\n// }\n//\n// }\n//\n// return {data, pluginName};\n//\n//\n// };\n//\n// /**\n// * Compile article output\n// *\n// * @param savedData\n// * @returns {{time: number, version, items: (*|Array)}}\n// */\n// let makeOutput = function (savedData) {\n//\n// savedData = savedData.filter(blockData => blockData);\n//\n// let items = savedData.map(blockData => Object({type: blockData.pluginName, data: blockData.data}));\n//\n// editor.state.jsonOutput = items;\n//\n// return {\n// id: editor.state.blocks.id || null,\n// time: +new Date(),\n// version: editor.version,\n// items\n// };\n//\n// };\n//\n// return saver;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/saver.js","/**\n *\n * «Toolbar» is the node that moves up/down over current block\n *\n * ______________________________________ Toolbar ____________________________________________\n * | |\n * | ..................... Content .................... ......... Block Actions .......... |\n * | . . . . |\n * | . . . [Open Settings] [Remove Block] . |\n * | . [Plus Button] [Toolbox: {Tool1}, {Tool2}] . . . |\n * | . . . [Settings Panel] . |\n * | .................................................. .................................. |\n * | |\n * |___________________________________________________________________________________________|\n *\n *\n * Toolbox — its an Element contains tools buttons. Can be shown by Plus Button.\n *\n * _______________ Toolbox _______________\n * | |\n * | [Header] [Image] [List] [Quote] ... |\n * |_______________________________________|\n *\n *\n * Settings Panel — is an Element with block settings:\n *\n * ____ Settings Panel ____\n * | ...................... |\n * | . Tool Settings . |\n * | ...................... |\n * | . Default Settings . |\n * | ...................... |\n * |________________________|\n *\n *\n * @class\n * @classdesc Toolbar module\n *\n * @typedef {Toolbar} Toolbar\n * @property {Object} nodes\n * @property {Element} nodes.wrapper - Toolbar main element\n * @property {Element} nodes.content - Zone with Plus button and toolbox.\n * @property {Element} nodes.actions - Zone with Block Settings and Remove Button\n * @property {Element} nodes.plusButton - Button that opens or closes Toolbox\n * @property {Element} nodes.toolbox - Container for tools\n * @property {Element} nodes.settingsToggler - open/close Settings Panel button\n * @property {Element} nodes.removeBlockButton - Remove Block button\n * @property {Element} nodes.settings - Settings Panel\n * @property {Element} nodes.pluginSettings - Plugin Settings section of Settings Panel\n * @property {Element} nodes.defaultSettings - Default Settings section of Settings Panel\n */\nexport default class Toolbar extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n wrapper : null,\n content : null,\n actions : null,\n\n // Content Zone\n plusButton : null,\n\n // Actions Zone\n settingsToggler : null,\n removeBlockButton: null,\n settings: null,\n\n // Settings Zone: Plugin Settings and Default Settings\n pluginSettings: null,\n defaultSettings: null,\n };\n\n }\n\n /**\n * CSS styles\n * @return {Object}\n * @constructor\n */\n static get CSS() {\n\n return {\n toolbar: 'ce-toolbar',\n content: 'ce-toolbar__content',\n actions: 'ce-toolbar__actions',\n\n toolbarOpened: 'ce-toolbar--opened',\n\n // Content Zone\n plusButton: 'ce-toolbar__plus',\n plusButtonHidden: 'ce-toolbar__plus--hidden',\n\n // Actions Zone\n settingsToggler: 'ce-toolbar__settings-btn',\n removeBlockButton: 'ce-toolbar__remove-btn',\n\n // Settings Panel\n settings: 'ce-settings',\n defaultSettings: 'ce-settings_default',\n pluginSettings: 'ce-settings_plugin',\n };\n\n }\n\n /**\n * Makes toolbar\n */\n make() {\n\n this.nodes.wrapper = $.make('div', Toolbar.CSS.toolbar);\n\n /**\n * Make Content Zone and Actions Zone\n */\n ['content', 'actions'].forEach( el => {\n\n this.nodes[el] = $.make('div', Toolbar.CSS[el]);\n $.append(this.nodes.wrapper, this.nodes[el]);\n\n });\n\n\n /**\n * Fill Content Zone:\n * - Plus Button\n * - Toolbox\n */\n this.nodes.plusButton = $.make('div', Toolbar.CSS.plusButton);\n $.append(this.nodes.content, this.nodes.plusButton);\n this.nodes.plusButton.addEventListener('click', event => this.plusButtonClicked(event), false);\n\n\n /**\n * Make a Toolbox\n */\n this.Editor.Toolbox.make();\n\n /**\n * Fill Actions Zone:\n * - Settings Toggler\n * - Remove Block Button\n * - Settings Panel\n */\n this.nodes.settingsToggler = $.make('span', Toolbar.CSS.settingsToggler);\n this.nodes.removeBlockButton = this.makeRemoveBlockButton();\n\n $.append(this.nodes.actions, [this.nodes.settingsToggler, this.nodes.removeBlockButton]);\n\n /**\n * Make and append Settings Panel\n */\n this.makeBlockSettingsPanel();\n\n /**\n * Append toolbar to the Editor\n */\n $.append(this.Editor.UI.nodes.wrapper, this.nodes.wrapper);\n\n }\n\n /**\n * Panel with block settings with 2 sections:\n *\n * @return {Element}\n */\n makeBlockSettingsPanel() {\n\n this.nodes.settings = $.make('div', Toolbar.CSS.settings);\n\n this.nodes.pluginSettings = $.make('div', Toolbar.CSS.pluginSettings);\n this.nodes.defaultSettings = $.make('div', Toolbar.CSS.defaultSettings);\n\n $.append(this.nodes.settings, [this.nodes.pluginSettings, this.nodes.defaultSettings]);\n $.append(this.nodes.actions, this.nodes.settings);\n\n }\n\n /**\n * Makes Remove Block button, and confirmation panel\n * @return {Element} wrapper with button and panel\n */\n makeRemoveBlockButton() {\n\n /**\n * @todo add confirmation panel and handlers\n * @see {@link settings#makeRemoveBlockButton}\n */\n return $.make('span', Toolbar.CSS.removeBlockButton);\n\n }\n\n /**\n * Move Toolbar to the Current Block\n */\n move() {\n\n /** Close Toolbox when we move toolbar */\n this.Editor.Toolbox.close();\n\n let currentNode = this.Editor.BlockManager.currentNode;\n\n /**\n * If no one Block selected as a Current\n */\n if (!currentNode) {\n\n return;\n\n }\n\n /**\n * @todo Compute dynamically on prepare\n * @type {number}\n */\n const defaultToolbarHeight = 49;\n const defaultOffset = 34;\n\n var newYCoordinate = currentNode.offsetTop - (defaultToolbarHeight / 2) + defaultOffset;\n\n this.nodes.wrapper.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n // editor.toolbar.settings.hideRemoveActions();\n\n }\n\n /**\n * Open Toolbar with Plus Button\n */\n open() {\n\n this.nodes.wrapper.classList.add(Toolbar.CSS.toolbarOpened);\n\n }\n\n /**\n * Close the Toolbar\n */\n close() {\n\n this.nodes.wrapper.classList.remove(Toolbar.CSS.toolbarOpened);\n\n }\n\n /**\n * Plus Button public methods\n * @return {{hide: function(): void, show: function(): void}}\n */\n get plusButton() {\n\n return {\n hide: () => this.nodes.plusButton.classList.add(Toolbar.CSS.plusButtonHidden),\n show: () => this.nodes.plusButton.classList.remove(Toolbar.CSS.plusButtonHidden)\n };\n\n }\n\n /**\n * Handler for Plus Button\n * @param {MouseEvent} event\n */\n plusButtonClicked(event) {\n\n this.Editor.Toolbox.toggle();\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar.js","/**\n * @class Toolbox\n * @classdesc Holder for Tools\n *\n * @typedef {Toolbox} Toolbox\n * @property {Boolean} opened - opening state\n * @property {Object} nodes - Toolbox nodes\n * @property {Object} CSS - CSS class names\n *\n */\nexport default class Toolbox extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n toolbox: null,\n buttons: []\n };\n\n /**\n * Opening state\n * @type {boolean}\n */\n this.opened = false;\n\n }\n\n /**\n * CSS styles\n * @return {{toolbox: string, toolboxButton: string, toolboxOpened: string}}\n */\n static get CSS() {\n\n return {\n toolbox: 'ce-toolbox',\n toolboxButton: 'ce-toolbox__button',\n toolboxOpened: 'ce-toolbox--opened',\n };\n\n }\n\n /**\n * Makes the Toolbox\n */\n make() {\n\n this.nodes.toolbox = $.make('div', Toolbox.CSS.toolbox);\n $.append(this.Editor.Toolbar.nodes.content, this.nodes.toolbox);\n\n this.addTools();\n\n }\n\n /**\n * Iterates available tools and appends them to the Toolbox\n */\n addTools() {\n\n let tools = this.Editor.Tools.toolsAvailable;\n\n for (let toolName in tools) {\n\n this.addTool(toolName, tools[toolName]);\n\n }\n\n }\n\n /**\n * Append Tool to the Toolbox\n *\n * @param {string} toolName - tool name\n * @param {Tool} tool - tool class\n */\n addTool(toolName, tool) {\n\n if (tool.displayInToolbox && !tool.iconClassName) {\n\n _.log('Toolbar icon class name is missed. Tool %o skipped', 'warn', toolName);\n return;\n\n }\n\n /**\n * @todo Add checkup for the render method\n */\n // if (typeof tool.render !== 'function') {\n //\n // _.log('render method missed. Tool %o skipped', 'warn', tool);\n // return;\n //\n // }\n\n /**\n * Skip tools that pass 'displayInToolbox=false'\n */\n if (!tool.displayInToolbox) {\n\n return;\n\n }\n\n let button = $.make('li', [Toolbox.CSS.toolboxButton, tool.iconClassName], {\n title: toolName\n });\n\n /**\n * Save tool's name in the button data-name\n */\n button.dataset.name = toolName;\n\n $.append(this.nodes.toolbox, button);\n\n this.nodes.toolbox.appendChild(button);\n this.nodes.buttons.push(button);\n\n /**\n * @todo add event with module Listeners\n */\n // this.Editor.Listeners.add();\n button.addEventListener('click', event => {\n\n this.buttonClicked(event);\n\n }, false);\n\n }\n\n /**\n * Toolbox button click listener\n * 1) if block is empty -> replace\n * 2) if block is not empty -> add new block below\n *\n * @param {MouseEvent} event\n */\n buttonClicked(event) {\n\n let toolButton = event.target,\n toolName = toolButton.dataset.name,\n tool = this.Editor.Tools.toolClasses[toolName];\n\n /**\n * @type {Block}\n */\n let currentBlock = this.Editor.BlockManager.currentBlock;\n\n /**\n * We do replace if:\n * - block is empty\n * - block is not irreplaceable\n * @type {Array}\n */\n if (!tool.irreplaceable && currentBlock.isEmpty) {\n\n this.Editor.BlockManager.replace(toolName);\n\n } else {\n\n this.Editor.BlockManager.insert(toolName);\n\n }\n\n /**\n * @todo set caret to the new block\n */\n\n // window.setTimeout(function () {\n\n /** Set caret to current block */\n // editor.caret.setToBlock(currentInputIndex);\n\n // }, 10);\n\n /**\n * Move toolbar when node is changed\n */\n this.Editor.Toolbar.move();\n\n }\n\n /**\n * Open Toolbox with Tools\n */\n open() {\n\n this.nodes.toolbox.classList.add(Toolbox.CSS.toolboxOpened);\n this.opened = true;\n\n }\n\n /**\n * Close Toolbox\n */\n close() {\n\n this.nodes.toolbox.classList.remove(Toolbox.CSS.toolboxOpened);\n this.opened = false;\n\n }\n\n /**\n * Close Toolbox\n */\n toggle() {\n\n if (!this.opened) {\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbox.js","/**\n * @module Codex Editor Tools Submodule\n *\n * Creates Instances from Plugins and binds external config to the instances\n */\n\n/**\n * Each Tool must contain the following important objects:\n *\n * @typedef {Object} ToolConfig {@link docs/tools.md}\n * @property {String} iconClassname - this a icon in toolbar\n * @property {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @property {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n * @property render @todo add description\n * @property save @todo add description\n * @property settings @todo add description\n * @property validate - method that validates output data before saving\n */\n\n/**\n * @typedef {Function} Tool {@link docs/tools.md}\n * @property {Boolean} displayInToolbox - By default, tools won't be added in the Toolbox. Pass true to add.\n * @property {String} iconClassName - CSS class name for the Toolbox button\n * @property {Boolean} irreplaceable - Toolbox behaviour: replace or add new block below\n * @property render\n * @property save\n * @property settings\n * @property validate\n *\n * @todo update according to current API\n * @todo describe Tool in the {@link docs/tools.md}\n */\n\n/**\n * Class properties:\n *\n * @typedef {Tools} Tools\n * @property {Tools[]} toolsAvailable - available Tools\n * @property {Tools[]} toolsUnavailable - unavailable Tools\n * @property {Object} toolsClasses - all classes\n * @property {EditorConfig} config - Editor config\n */\nexport default class Tools extends Module {\n\n /**\n * Returns available Tools\n * @return {Tool[]}\n */\n get available() {\n\n return this.toolsAvailable;\n\n }\n\n /**\n * Returns unavailable Tools\n * @return {Tool[]}\n */\n get unavailable() {\n\n return this.toolsUnavailable;\n\n }\n\n /**\n * Static getter for default Tool config fields\n *\n * @usage Tools.defaultConfig.displayInToolbox\n * @return {ToolConfig}\n */\n static get defaultConfig() {\n\n return {\n iconClassName : '',\n displayInToolbox : false,\n enableLineBreaks : false,\n irreplaceable : false\n };\n\n }\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n /**\n * Map {name: Class, ...} where:\n * name — block type name in JSON. Got from EditorConfig.tools keys\n * @type {Object}\n */\n this.toolClasses = {};\n\n /**\n * Available tools list\n * {name: Class, ...}\n * @type {Object}\n */\n this.toolsAvailable = {};\n\n /**\n * Tools that rejected a prepare method\n * {name: Class, ... }\n * @type {Object}\n */\n this.toolsUnavailable = {};\n\n }\n\n /**\n * Creates instances via passed or default configuration\n * @return {Promise}\n */\n prepare() {\n\n if (!this.config.hasOwnProperty('tools')) {\n\n return Promise.reject(\"Can't start without tools\");\n\n }\n\n for(let toolName in this.config.tools) {\n\n this.toolClasses[toolName] = this.config.tools[toolName];\n\n }\n\n /**\n * getting classes that has prepare method\n */\n let sequenceData = this.getListOfPrepareFunctions();\n\n /**\n * if sequence data contains nothing then resolve current chain and run other module prepare\n */\n if (sequenceData.length === 0) {\n\n return Promise.resolve();\n\n }\n\n /**\n * to see how it works {@link Util#sequence}\n */\n return _.sequence(sequenceData, (data) => {\n\n this.success(data);\n\n }, (data) => {\n\n this.fallback(data);\n\n });\n\n }\n\n /**\n * Binds prepare function of plugins with user or default config\n * @return {Array} list of functions that needs to be fired sequentially\n */\n getListOfPrepareFunctions() {\n\n let toolPreparationList = [];\n\n for(let toolName in this.toolClasses) {\n\n let toolClass = this.toolClasses[toolName];\n\n if (typeof toolClass.prepare === 'function') {\n\n toolPreparationList.push({\n function : toolClass.prepare,\n data : {\n toolName\n }\n });\n\n } else {\n\n /**\n * If Tool hasn't a prepare method, mark it as available\n */\n this.toolsAvailable[toolName] = toolClass;\n\n }\n\n }\n\n return toolPreparationList;\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to available list\n */\n success(data) {\n\n this.toolsAvailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to unavailable list\n */\n fallback(data) {\n\n this.toolsUnavailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * Return tool`a instance\n *\n * @param {String} tool — tool name\n * @param {Object} data — initial data\n *\n * @todo throw exceptions if tool doesnt exist\n *\n */\n construct(tool, data) {\n\n let plugin = this.toolClasses[tool],\n config = this.config.toolsConfig[tool];\n\n if (!config) {\n\n config = this.defaultConfig;\n\n }\n\n let instance = new plugin(data, config);\n\n return instance;\n\n }\n\n /**\n * Check if passed Tool is an instance of Initial Block Tool\n * @param {Tool} tool - Tool to check\n * @return {Boolean}\n */\n isInitial(tool) {\n\n return tool instanceof this.available[this.config.initialBlock];\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/tools.js","/**\n * Module UI\n *\n * @type {UI}\n */\n// let className = {\n\n/**\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\n */\n// BLOCK_CLASSNAME : 'ce-block',\n\n/**\n * @const {String} wrapper for plugins content\n */\n// BLOCK_CONTENT : 'ce-block__content',\n\n/**\n * @const {String} BLOCK_STRETCHED - makes block stretched\n */\n// BLOCK_STRETCHED : 'ce-block--stretched',\n\n/**\n * @const {String} BLOCK_HIGHLIGHTED - adds background\n */\n// BLOCK_HIGHLIGHTED : 'ce-block--focused',\n\n/**\n * @const {String} - for all default settings\n */\n// SETTINGS_ITEM : 'ce-settings__item'\n// };\n\n// import Block from '../block';\n\n/**\n * @class\n *\n * @classdesc Makes CodeX Editor UI:\n * \n * \n * \n * \n * \n *\n * @typedef {UI} UI\n * @property {EditorConfig} config - editor configuration {@link CodexEditor#configuration}\n * @property {Object} Editor - available editor modules {@link CodexEditor#moduleInstances}\n * @property {Object} nodes -\n * @property {Element} nodes.holder - element where we need to append redactor\n * @property {Element} nodes.wrapper - \n * @property {Element} nodes.redactor - \n */\nexport default class UI extends Module {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n holder: null,\n wrapper: null,\n redactor: null\n };\n\n }\n\n /**\n * Making main interface\n */\n prepare() {\n\n return this.make()\n /**\n * Make toolbar\n */\n .then(() => this.Editor.Toolbar.make())\n /**\n * Load and append CSS\n */\n .then(() => this.loadStyles())\n /**\n * Bind events for the UI elements\n */\n .then(() => this.bindEvents())\n\n /** Make container for inline toolbar */\n // .then(makeInlineToolbar_)\n\n /** Add inline toolbar tools */\n // .then(addInlineToolbarTools_)\n\n /** Draw wrapper for notifications */\n // .then(makeNotificationHolder_)\n\n /** Add eventlisteners to redactor elements */\n // .then(bindEvents_)\n\n .catch(e => {\n\n console.error(e);\n\n // editor.core.log(\"Can't draw editor interface\");\n\n });\n\n }\n\n /**\n * CodeX Editor UI CSS class names\n * @return {{editorWrapper: string, editorZone: string, block: string}}\n */\n get CSS() {\n\n return {\n editorWrapper : 'codex-editor',\n editorZone : 'codex-editor__redactor',\n };\n\n }\n\n /**\n * Makes CodeX Editor interface\n * @return {Promise}\n */\n make() {\n\n return new Promise( (resolve, reject) => {\n\n /**\n * Element where we need to append CodeX Editor\n * @type {Element}\n */\n this.nodes.holder = document.getElementById(this.config.holderId);\n\n if (!this.nodes.holder) {\n\n reject(Error(\"Holder wasn't found by ID: #\" + this.config.holderId));\n return;\n\n }\n\n /**\n * Create and save main UI elements\n */\n this.nodes.wrapper = $.make('div', this.CSS.editorWrapper);\n this.nodes.redactor = $.make('div', this.CSS.editorZone);\n\n this.nodes.wrapper.appendChild(this.nodes.redactor);\n this.nodes.holder.appendChild(this.nodes.wrapper);\n\n resolve();\n\n });\n\n }\n\n /**\n * Appends CSS\n */\n loadStyles() {\n\n /**\n * Load CSS\n */\n let styles = require('../../styles/main.css');\n\n /**\n * Make tag\n */\n let tag = $.make('style', null, {\n textContent: styles.toString()\n });\n\n /**\n * Append styles\n */\n $.append(document.head, tag);\n\n }\n\n /**\n * Bind events on the CodeX Editor interface\n */\n bindEvents() {\n\n /**\n * @todo bind events with the Listeners module\n */\n this.nodes.redactor.addEventListener('click', event => this.redactorClicked(event), false );\n\n }\n\n /**\n * All clicks on the redactor zone\n *\n * @param {MouseEvent} event\n *\n * @description\n * 1. Save clicked Block as a current {@link BlockManager#currentNode}\n * it uses for the following:\n * - add CSS modifier for the selected Block\n * - on Enter press, we make a new Block under that\n *\n * 2. Move and show the Toolbar\n *\n * 3. Set a Caret\n *\n * 4. By clicks on the Editor's bottom zone:\n * - if last Block is empty, set a Caret to this\n * - otherwise, add a new empty Block and set a Caret to that\n *\n * 5. Hide the Inline Toolbar\n *\n * @see selectClickedBlock\n *\n */\n redactorClicked(event) {\n\n let clickedNode = event.target;\n\n /**\n * Select clicked Block as Current\n */\n try {\n\n this.Editor.BlockManager.setCurrentBlockByChildNode(clickedNode);\n\n /**\n * If clicked outside first-level Blocks, set Caret to the last empty Block\n */\n\n } catch (e) {\n\n this.Editor.Caret.setToTheLastBlock();\n\n }\n\n\n\n\n /**\n * @todo hide the Inline Toolbar\n */\n // var selectedText = editor.toolbar.inline.getSelectionText(),\n // firstLevelBlock;\n\n /** If selection range took off, then we hide inline toolbar */\n // if (selectedText.length === 0) {\n\n // editor.toolbar.inline.close();\n\n // }\n\n /**\n *\n\n /** Update current input index in memory when caret focused into existed input */\n // if (event.target.contentEditable == 'true') {\n //\n // editor.caret.saveCurrentInputIndex();\n //\n // }\n\n // if (editor.content.currentNode === null) {\n //\n // /**\n // * If inputs in redactor does not exits, then we put input index 0 not -1\n // */\n // var indexOfLastInput = editor.state.inputs.length > 0 ? editor.state.inputs.length - 1 : 0;\n //\n // /** If we have any inputs */\n // if (editor.state.inputs.length) {\n //\n // /** getting firstlevel parent of input */\n // firstLevelBlock = editor.content.getFirstLevelBlock(editor.state.inputs[indexOfLastInput]);\n //\n // }\n //\n // /** If input is empty, then we set caret to the last input */\n // if (editor.state.inputs.length && editor.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == editor.settings.initialBlockPlugin) {\n //\n // editor.caret.setToBlock(indexOfLastInput);\n //\n // } else {\n //\n // /** Create new input when caret clicked in redactors area */\n // var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n //\n // editor.content.insertBlock({\n // type : NEW_BLOCK_TYPE,\n // block : editor.tools[NEW_BLOCK_TYPE].render()\n // });\n //\n // /** If there is no inputs except inserted */\n // if (editor.state.inputs.length === 1) {\n //\n // editor.caret.setToBlock(indexOfLastInput);\n //\n // } else {\n //\n // /** Set caret to this appended input */\n // editor.caret.setToNextBlock(indexOfLastInput);\n //\n // }\n //\n // }\n //\n // } else {\n //\n // /** Close all panels */\n // editor.toolbar.settings.close();\n // editor.toolbar.toolbox.close();\n //\n // }\n //\n /**\n * Move toolbar and open\n */\n this.Editor.Toolbar.move();\n this.Editor.Toolbar.open();\n //\n // var inputIsEmpty = !editor.content.currentNode.textContent.trim(),\n // currentNodeType = editor.content.currentNode.dataset.tool,\n // isInitialType = currentNodeType == editor.settings.initialBlockPlugin;\n //\n //\n\n /**\n * Hide the Plus Button\n * */\n this.Editor.Toolbar.plusButton.hide();\n\n /**\n * Show the Plus Button if:\n * - Block is an initial-block (Text)\n * - Block is empty\n */\n let isInitialBlock = this.Editor.Tools.isInitial(this.Editor.BlockManager.currentBlock.tool),\n isEmptyBlock = this.Editor.BlockManager.currentBlock.isEmpty;\n\n if (isInitialBlock && isEmptyBlock) {\n\n this.Editor.Toolbar.plusButton.show();\n\n }\n\n }\n\n}\n\n// /**\n// * Codex Editor UI module\n// *\n// * @author Codex Team\n// * @version 1.2.0\n// */\n//\n// module.exports = (function (ui) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * Basic editor classnames\n// */\n// ui.prepare = function () {\n//\n\n//\n// };\n//\n// /** Draw notifications holder */\n// var makeNotificationHolder_ = function () {\n//\n// /** Append block with notifications to the document */\n// editor.nodes.notifications = editor.notifications.createHolder();\n//\n// };\n//\n//\n// var addInlineToolbarTools_ = function () {\n//\n// var tools = {\n//\n// bold: {\n// icon : 'ce-icon-bold',\n// command : 'bold'\n// },\n//\n// italic: {\n// icon : 'ce-icon-italic',\n// command : 'italic'\n// },\n//\n// link: {\n// icon : 'ce-icon-link',\n// command : 'createLink'\n// }\n// };\n//\n// var toolButton,\n// tool;\n//\n// for(var name in tools) {\n//\n// tool = tools[name];\n//\n// toolButton = editor.draw.toolbarButtonInline(name, tool.icon);\n//\n// editor.nodes.inlineToolbar.buttons.appendChild(toolButton);\n// /**\n// * Add callbacks to this buttons\n// */\n// editor.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n//\n// }\n//\n// };\n//\n// /**\n// * @private\n// * Bind editor UI events\n// */\n// var bindEvents_ = function () {\n//\n// editor.core.log('ui.bindEvents fired', 'info');\n//\n// // window.addEventListener('error', function (errorMsg, url, lineNumber) {\n// // editor.notifications.errorThrown(errorMsg, event);\n// // }, false );\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keydown', editor.callback.globalKeydown, false);\n//\n// /** All keydowns on Redactor zone */\n// editor.listeners.add(editor.nodes.redactor, 'keydown', editor.callback.redactorKeyDown, false);\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keyup', editor.callback.globalKeyup, false );\n//\n// /**\n// * Mouse click to radactor\n// */\n// editor.listeners.add(editor.nodes.redactor, 'click', editor.callback.redactorClicked, false );\n//\n// /**\n// * Clicks to the Plus button\n// */\n// editor.listeners.add(editor.nodes.plusButton, 'click', editor.callback.plusButtonClicked, false);\n//\n// /**\n// * Clicks to SETTINGS button in toolbar\n// */\n// editor.listeners.add(editor.nodes.showSettingsButton, 'click', editor.callback.showSettingsButtonClicked, false );\n//\n// /** Bind click listeners on toolbar buttons */\n// for (var button in editor.nodes.toolbarButtons) {\n//\n// editor.listeners.add(editor.nodes.toolbarButtons[button], 'click', editor.callback.toolbarButtonClicked, false);\n//\n// }\n//\n// };\n//\n// ui.addBlockHandlers = function (block) {\n//\n// if (!block) return;\n//\n// /**\n// * Block keydowns\n// */\n// editor.listeners.add(block, 'keydown', editor.callback.blockKeydown, false);\n//\n// /**\n// * Pasting content from another source\n// * We have two type of sanitization\n// * First - uses deep-first search algorithm to get sub nodes,\n// * sanitizes whole Block_content and replaces cleared nodes\n// * This method is deprecated\n// * Method is used in editor.callback.blockPaste(event)\n// *\n// * Secont - uses Mutation observer.\n// * Observer \"observe\" DOM changes and send changings to callback.\n// * Callback gets changed node, not whole Block_content.\n// * Inserted or changed node, which we've gotten have been cleared and replaced with diry node\n// *\n// * Method is used in editor.callback.blockPasteViaSanitize(event)\n// *\n// * @uses html-janitor\n// * @example editor.callback.blockPasteViaSanitize(event), the second method.\n// *\n// */\n// editor.listeners.add(block, 'paste', editor.paste.blockPasteCallback, false);\n//\n// /**\n// * Show inline toolbar for selected text\n// */\n// editor.listeners.add(block, 'mouseup', editor.toolbar.inline.show, false);\n// editor.listeners.add(block, 'keyup', editor.toolbar.inline.show, false);\n//\n// };\n//\n// /** getting all contenteditable elements */\n// ui.saveInputs = function () {\n//\n// var redactor = editor.nodes.redactor;\n//\n// editor.state.inputs = [];\n//\n// /** Save all inputs in global variable state */\n// var inputs = redactor.querySelectorAll('[contenteditable], input, textarea');\n//\n// Array.prototype.map.call(inputs, function (current) {\n//\n// if (!current.type || current.type == 'text' || current.type == 'textarea') {\n//\n// editor.state.inputs.push(current);\n//\n// }\n//\n// });\n//\n// };\n//\n// /**\n// * Adds first initial block on empty redactor\n// */\n// ui.addInitialBlock = function () {\n//\n// var initialBlockType = editor.settings.initialBlockPlugin,\n// initialBlock;\n//\n// if ( !editor.tools[initialBlockType] ) {\n//\n// editor.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n// return;\n//\n// }\n//\n// initialBlock = editor.tools[initialBlockType].render();\n//\n// initialBlock.setAttribute('data-placeholder', editor.settings.placeholder);\n//\n// editor.content.insertBlock({\n// type : initialBlockType,\n// block : initialBlock\n// });\n//\n// editor.content.workingNodeChanged(initialBlock);\n//\n// };\n//\n// ui.setInlineToolbarButtonBehaviour = function (button, type) {\n//\n// editor.listeners.add(button, 'mousedown', function (event) {\n//\n// editor.toolbar.inline.toolClicked(event, type);\n//\n// }, false);\n//\n// };\n//\n// return ui;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/ui.js","exports = module.exports = require(\"../../node_modules/css-loader/lib/css-base.js\")(undefined);\n// imports\n\n\n// module\nexports.push([module.id, \":root {\\n\\n /**\\n * Toolbar buttons\\n */\\n\\n /**\\n * Block content width\\n */\\n\\n /**\\n * Toolbar Plus Button and Toolbox buttons height and width\\n */\\n\\n}\\n/**\\n* Editor wrapper\\n*/\\n.codex-editor {\\n position: relative;\\n border: 1px solid #ccc;\\n padding: 10px;\\n box-sizing: border-box;\\n}\\n.codex-editor .hide {\\n display: none;\\n }\\n.codex-editor__redactor {\\n padding-bottom: 300px;\\n }\\n.ce-toolbar {\\n position: absolute;\\n left: 0;\\n right: 0;\\n top: 0;\\n /*opacity: 0;*/\\n /*visibility: hidden;*/\\n transition: opacity 100ms ease;\\n will-change: opacity, transform;\\n display: none;\\n}\\n.ce-toolbar--opened {\\n display: block;\\n /*opacity: 1;*/\\n /*visibility: visible;*/\\n }\\n.ce-toolbar__content {\\n max-width: 650px;\\n margin: 0 auto;\\n position: relative;\\n }\\n.ce-toolbar__plus {\\n position: absolute;\\n left: calc(-34px - 10px);\\n display: inline-block;\\n background-color: #eff2f5;\\n width: 34px;\\n height: 34px;\\n line-height: 34px;\\n text-align: center;\\n border-radius: 50%\\n }\\n.ce-toolbar__plus::after {\\n content: '+';\\n font-size: 26px;\\n display: block;\\n margin-top: -2px;\\n margin-right: -2px;\\n\\n}\\n.ce-toolbar__plus--hidden {\\n display: none;\\n\\n}\\n.ce-toolbox {\\n visibility: hidden;\\n transition: opacity 100ms ease;\\n will-change: opacity;\\n}\\n.ce-toolbox--opened {\\n opacity: 1;\\n visibility: visible;\\n }\\n.ce-toolbox__button {\\n display: inline-block;\\n list-style: none;\\n margin: 0;\\n background: #eff2f5;\\n width: 34px;\\n height: 34px;\\n border-radius: 30px;\\n overflow: hidden;\\n text-align: center;\\n line-height: 34px\\n }\\n.ce-toolbox__button::before {\\n content: attr(title);\\n font-size: 22px;\\n font-weight: 500;\\n letter-spacing: 1em;\\n -webkit-font-feature-settings: \\\"smcp\\\", \\\"c2sc\\\";\\n font-feature-settings: \\\"smcp\\\", \\\"c2sc\\\";\\n font-variant-caps: all-small-caps;\\n padding-left: 11.5px;\\n margin-top: -1px;\\n display: inline-block;\\n\\n}\\n.ce-block {\\n border: 1px dotted #ccc;\\n margin: 2px 0;\\n}\\n.ce-block--selected {\\n background-color: #eff2f5;\\n }\\n.ce-block__content {\\n max-width: 650px;\\n margin: 0 auto;\\n }\\n\", \"\"]);\n\n// exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/styles/main.css\n// module id = 20\n// module chunks = 0","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t// when a module is imported multiple times with different media queries.\n\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/css-loader/lib/css-base.js\n// module id = 21\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/listeners.md b/docs/listeners.md new file mode 100644 index 00000000..9848685d --- /dev/null +++ b/docs/listeners.md @@ -0,0 +1 @@ +# CodeX Editor Listeners \ No newline at end of file diff --git a/src/codex.js b/src/codex.js index 3ed041e0..5b0621d8 100644 --- a/src/codex.js +++ b/src/codex.js @@ -52,7 +52,7 @@ * @property {String} placeholder - First Block placeholder * @property {Object} sanitizer - @todo fill desc * @property {Boolean} hideToolbar - @todo fill desc - * @property {Object} toolsConfig - tools configuration {@link Tools#ToolsConfig} + * @property {Object} toolsConfig - tools configuration {@link tools#ToolConfig} */ /** diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index 7adf4443..e38844c8 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -127,7 +127,7 @@ export default class BlockManager extends Module { switch(event.keyCode) { case _.keyCodes.ENTER: - this.enterPressedOnPluginsContent(event); + // this.enterPressedOnPluginsContent(event); break; case _.keyCodes.DOWN: case _.keyCodes.RIGHT: diff --git a/src/components/modules/listeners.js b/src/components/modules/listeners.js index 996ceb40..eeba4ce5 100644 --- a/src/components/modules/listeners.js +++ b/src/components/modules/listeners.js @@ -83,10 +83,9 @@ export default class Listeners extends Module { } /** - * Search methods - * - * byElement, byType and byHandler returns array of suitable listeners - * one and all takes element, eventType, and handler and returns first (all) suitable listener + * Search method: looks for listener by passed element + * @param {Element} element - searching element + * @returns {Array} listeners that found on element */ findByElement(element) { @@ -108,6 +107,11 @@ export default class Listeners extends Module { } + /** + * Search method: looks for listener by passed event type + * @param {String} eventType + * @return {Array} listeners that found on element + */ findByType(eventType) { let listenersWithType = []; @@ -128,6 +132,11 @@ export default class Listeners extends Module { } + /** + * Search method: looks for listener by passed handler + * @param {Function} handler + * @return {Array} listeners that found on element + */ findByHandler(handler) { let listenersWithHandler = []; @@ -148,40 +157,51 @@ export default class Listeners extends Module { } + /** + * @param {Element} element + * @param {String} eventType + * @param {Function} handler + * @return {Element|null} + */ findOne(element, eventType, handler) { - let foundListeners = []; + let foundListeners = this.findAll(element, eventType, handler); - if (element) - foundListeners = this.byElement(element); - - if (eventType) - foundListeners = foundListeners.concat(this.byType(eventType)); - - if (handler) - foundListeners = foundListeners.concat(this.byHandler(handler)); - - return foundListeners[0]; + return foundListeners.length > 0 ? foundListeners[0] : null; } + /** + * @param {Element} element + * @param {String} eventType + * @param {Function} handler + * @return {Array} + */ findAll(element, eventType, handler) { - let foundListeners = []; + let foundAllListeners, + foundByElements = [], + foundByEventType = [], + foundByHandler = []; if (element) - foundListeners = this.byElement(element); + foundByElements = this.findByElement(element); if (eventType) - foundListeners = foundListeners.concat(this.byType(eventType)); + foundByEventType = this.findByType(eventType); if (handler) - foundListeners = foundListeners.concat(this.byHandler(handler)); + foundByHandler = this.findByHandler(handler); - return foundListeners; + foundAllListeners = foundByElements.concat(foundByEventType, foundByHandler); + + return foundAllListeners; } + /** + * Removes all listeners + */ removeAll() { this.allListeners.map( (current) => { From 52ed6582609a18d92f6dc1115b993f07b2b00a0e Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Sat, 6 Jan 2018 23:17:12 +0300 Subject: [PATCH 5/6] update --- build/codex-editor.js | 5 +++-- build/codex-editor.js.map | 2 +- src/components/modules/listeners.js | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/build/codex-editor.js b/build/codex-editor.js index 88de6f91..37a1eb14 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -2791,12 +2791,13 @@ var Listeners = function (_Module) { }, { key: "removeAll", value: function removeAll() { - var _this2 = this; this.allListeners.map(function (current) { - _this2.off(current.element, current.type, current.handler); + current.element.removeEventListener(current.eventType, current.handler); }); + + this.allListeners = []; } }]); diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 53ee59da..ff359086 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap ca66f67e18c906de94b6","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/Selection.js","webpack:///./src/codex.js","webpack:///./src/components/polyfills.js","webpack:///./src/components/modules nonrecursive [^_](blockManager.js|caret.js|events.js|listeners.js|renderer.js|sanitizer.js|saver.js|toolbar.js|toolbox.js|tools.js|ui.js)$","webpack:///./src/components/modules/blockManager.js","webpack:///./src/components/block.js","webpack:///./src/components/modules/caret.js","webpack:///./src/components/modules/events.js","webpack:///./src/components/modules/listeners.js","webpack:///./src/components/modules/renderer.js","webpack:///./src/components/modules/sanitizer.js","webpack:///./node_modules/html-janitor/src/html-janitor.js","webpack:///./src/components/modules/saver.js","webpack:///./src/components/modules/toolbar.js","webpack:///./src/components/modules/toolbox.js","webpack:///./src/components/modules/tools.js","webpack:///./src/components/modules/ui.js","webpack:///./src/styles/main.css","webpack:///./node_modules/css-loader/lib/css-base.js"],"names":["Module","config","new","target","TypeError","Editor","Util","msg","type","args","window","console","e","chains","success","fallback","Promise","resolve","reduce","previousValue","currentValue","iteration","then","waitNextBlock","length","chainData","successCallback","fallbackCallback","function","data","catch","collection","Array","prototype","slice","call","object","Object","keys","constructor","element","contentEditable","method","timeout","context","arguments","setTimeout","apply","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","Dom","tagName","classNames","attributes","el","document","createElement","isArray","classList","add","attrName","content","createTextNode","parent","elements","forEach","appendChild","selector","querySelector","querySelectorAll","node","atLast","childNodes","isElement","isNativeInput","emptyTextNode","text","childsLength","last","getDeepestNode","nodeType","Node","ELEMENT_NODE","nativeInputs","includes","nodeText","value","textContent","replace","trim","treeWalker","leafs","push","isLeaf","nextSibling","shift","firstChild","every","isNodeEmpty","leaf","Selection","instance","selection","getSelection","anchorNode","anchorOffset","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","log","error","constructModules","configureModules","displayName","name","state","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","render","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","_","isEmpty","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","toolName","toolInstance","construct","block","bindEvents","Listeners","on","pluginsContent","event","keyDownOnBlock","keyCode","keyCodes","navigateNext","navigatePrevious","lastTextNode","$","currentBlock","textNodeLength","getAnchorNode","getAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","firstLevelBlock","CSS","wrapper","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","array","selected","workingArea","html","remove","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","isNaN","Number","Block","tool","_html","compose","make","contentNode","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","offset","atEnd","focus","nodeToSet","delay","range","createRange","setStart","setEnd","removeAllRanges","addRange","lastBlock","Events","subscribers","eventName","callback","previousData","currentHandler","newData","allListeners","eventType","handler","useCapture","assignedEventData","alreadyExist","findOne","addEventListener","existingListeners","findAll","i","removeEventListener","listenersOnElement","listener","listenersWithType","listenersWithHandler","foundListeners","foundAllListeners","foundByElements","foundByEventType","foundByHandler","findByElement","findByType","findByHandler","concat","current","off","insertBlock","sequence","item","Sanitizer","defaultConfig","_sanitizerInstance","sanitizerConfig","settings","sanitizerInstance","require","taintString","customConfig","clean","library","tags","href","rel","newInstance","Saver","output","blocksData","all","allExtractedData","makeOutput","outputData","totalTime","groupCollapsed","extraction","groupEnd","Date","version","VERSION","Toolbar","actions","plusButton","settingsToggler","removeBlockButton","pluginSettings","defaultSettings","toolbar","append","plusButtonClicked","Toolbox","makeRemoveBlockButton","makeBlockSettingsPanel","close","defaultToolbarHeight","defaultOffset","newYCoordinate","offsetTop","style","transform","Math","floor","toolbarOpened","toggle","hide","plusButtonHidden","show","toolbox","buttons","opened","addTools","toolsAvailable","addTool","displayInToolbox","iconClassName","button","toolboxButton","title","dataset","buttonClicked","toolButton","toolClasses","irreplaceable","move","toolboxOpened","open","toolsUnavailable","enableLineBreaks","hasOwnProperty","reject","sequenceData","getListOfPrepareFunctions","toolPreparationList","toolClass","plugin","available","holder","loadStyles","getElementById","editorWrapper","editorZone","styles","tag","toString","head","redactorClicked","clickedNode","setCurrentBlockByChildNode","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock"],"mappings":"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pT,M;;;kBAAlB6S,S;;;;;;;;AClCrB;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA;;AAEA;AACA;;AAEA;AACA,wBAAwB,iCAAiC,EAAE;AAC3D,6BAA6B,uEAAuE,EAAE;;AAEtG;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,QAAQ;;AAExB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,qBAAqB,4BAA4B;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;;;;;;;;;;;ACxLD;;;;;;;;AAQA;;;;;;;AAOA;;;;;;;;IAQqBe,K;;;AAEjB;;;;AAIA,yBAAsB;AAAA,YAAT3T,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,cAAK4T,MAAL,GAAc,IAAd;AACA,cAAKC,UAAL,GAAkB,EAAl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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,WAAKzY,MAAL,CAAYqU,OAAZ,CAAoB2C,IAApB;AACA,WAAKhX,MAAL,CAAYqU,OAAZ,CAAoB6C,IAApB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA,WAAKlX,MAAL,CAAYqU,OAAZ,CAAoBE,UAApB,CAA+BsB,IAA/B;;AAEA;;;;;AAKA,UAAI6C,iBAAiB,KAAK1Y,MAAL,CAAYsI,KAAZ,CAAkBqQ,SAAlB,CAA4B,KAAK3Y,MAAL,CAAYwI,YAAZ,CAAyBmD,YAAzB,CAAsCoC,IAAlE,CAArB;AAAA,UACI6K,eAAe,KAAK5Y,MAAL,CAAYwI,YAAZ,CAAyBmD,YAAzB,CAAsCpC,OADzD;;AAGA,UAAImP,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAK5Y,MAAL,CAAYqU,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;AAEH;AAEJ;;;wBA3OS;;AAEN,aAAO;AACHiC,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2BtY,M;;AA+ShC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBApgBqB4I,E;;;;;;;;ACrDrB;AACA;;;AAGA;AACA,gCAAiC,sLAAsL,4CAA4C,yBAAyB,6BAA6B,oBAAoB,6BAA6B,GAAG,uBAAuB,wBAAwB,OAAO,2BAA2B,gCAAgC,OAAO,eAAe,uBAAuB,YAAY,aAAa,WAAW,iBAAiB,2BAA2B,qCAAqC,oCAAoC,kBAAkB,GAAG,uBAAuB,qBAAqB,mBAAmB,8BAA8B,OAAO,wBAAwB,uBAAuB,qBAAqB,yBAAyB,KAAK,qBAAqB,yBAAyB,+BAA+B,4BAA4B,gCAAgC,kBAAkB,mBAAmB,wBAAwB,yBAAyB,6BAA6B,4BAA4B,mBAAmB,sBAAsB,qBAAqB,uBAAuB,yBAAyB,KAAK,6BAA6B,sBAAsB,KAAK,eAAe,yBAAyB,qCAAqC,2BAA2B,GAAG,uBAAuB,qBAAqB,8BAA8B,OAAO,uBAAuB,gCAAgC,2BAA2B,oBAAoB,8BAA8B,sBAAsB,uBAAuB,8BAA8B,2BAA2B,6BAA6B,kCAAkC,+BAA+B,2BAA2B,sBAAsB,uBAAuB,0BAA0B,wDAAwD,wDAAwD,wCAAwC,2BAA2B,uBAAuB,4BAA4B,KAAK,aAAa,4BAA4B,kBAAkB,GAAG,uBAAuB,gCAAgC,KAAK,sBAAsB,uBAAuB,qBAAqB,KAAK;;AAEp1E;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD,IAAI;AACJ;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;;AAElE;AACA","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap ca66f67e18c906de94b6","/**\n * @abstract\n * @class Module\n * @classdesc All modules inherits from this class.\n *\n * @typedef {Module} Module\n * @property {Object} config - Editor user settings\n * @property {Object} Editor - List of Editor modules\n */\nexport default class Module {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({ config } = {}) {\n\n if (new.target === Module) {\n\n throw new TypeError('Constructors for abstract class Module are not allowed.');\n\n }\n\n /**\n * @type {EditorConfig}\n */\n this.config = config;\n\n /**\n * @type {EditorComponents}\n */\n this.Editor = null;\n\n }\n\n /**\n * Editor modules setter\n *\n * @param Editor\n * @param Editor.modules {@link CodexEditor#moduleInstances}\n * @param Editor.config {@link CodexEditor#configuration}\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/__module.js","/**\n * Codex Editor Util\n */\nexport default class Util {\n\n /**\n * Custom logger\n *\n * @param {string} msg - message\n * @param {string} type - logging type 'log'|'warn'|'error'|'info'\n * @param {*} args - argument to log with a message\n */\n static log(msg, type, args) {\n\n type = type || 'log';\n\n if (!args) {\n\n args = msg || 'undefined';\n msg = '[codex-editor]: %o';\n\n } else {\n\n msg = '[codex-editor]: ' + msg;\n\n }\n\n try{\n\n if ( 'console' in window && window.console[ type ] ) {\n\n if ( args ) window.console[ type ]( msg, args );\n else window.console[ type ]( msg );\n\n }\n\n } catch(e) {\n // do nothing\n }\n\n }\n\n /**\n * Returns basic keycodes as constants\n * @return {{}}\n */\n static get keyCodes() {\n\n return {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n SHIFT: 16,\n CTRL: 17,\n ALT: 18,\n ESC: 27,\n SPACE: 32,\n LEFT: 37,\n UP: 38,\n DOWN: 40,\n RIGHT: 39,\n DELETE: 46,\n META: 91\n };\n\n }\n\n /**\n * @typedef {Object} ChainData\n * @property {Object} data - data that will be passed to the success or fallback\n * @property {Function} function - function's that must be called asynchronically\n */\n\n /**\n * Fires a promise sequence asyncronically\n *\n * @param {Object[]} chains - list or ChainData's\n * @param {Function} success - success callback\n * @param {Function} fallback - callback that fires in case of errors\n *\n * @return {Promise}\n */\n static sequence(chains, success = () => {}, fallback = () => {}) {\n\n return new Promise(function (resolve) {\n\n /**\n * pluck each element from queue\n * First, send resolved Promise as previous value\n * Each plugins \"prepare\" method returns a Promise, that's why\n * reduce current element will not be able to continue while can't get\n * a resolved Promise\n */\n chains.reduce(function (previousValue, currentValue, iteration) {\n\n return previousValue\n .then(() => waitNextBlock(currentValue, success, fallback))\n .then(() => {\n\n // finished\n if (iteration === chains.length - 1) {\n\n resolve();\n\n }\n\n });\n\n }, Promise.resolve());\n\n });\n\n /**\n * Decorator\n *\n * @param {ChainData} chainData\n *\n * @param {Function} successCallback\n * @param {Function} fallbackCallback\n *\n * @return {Promise}\n */\n function waitNextBlock(chainData, successCallback, fallbackCallback) {\n\n return new Promise(function (resolve) {\n\n chainData.function()\n .then(() => {\n\n successCallback(chainData.data || {});\n\n })\n .then(resolve)\n .catch(function () {\n\n fallbackCallback(chainData.data || {});\n\n // anyway, go ahead even it falls\n resolve();\n\n });\n\n });\n\n }\n\n }\n\n /**\n * Make array from array-like collection\n *\n * @param {*} collection\n *\n * @return {Array}\n */\n static array(collection) {\n\n return Array.prototype.slice.call(collection);\n\n }\n\n /**\n * Checks if object is empty\n *\n * @param {Object} object\n * @return {boolean}\n */\n static isEmpty(object) {\n\n return Object.keys(object).length === 0 && object.constructor === Object;\n\n }\n\n /**\n * Check if passed object is a Promise\n * @param {*} object - object to check\n * @return {Boolean}\n */\n static isPromise(object) {\n\n return Promise.resolve(object) === object;\n\n }\n\n /**\n * Check if passed element is contenteditable\n * @param element\n * @return {boolean}\n */\n static isContentEditable(element) {\n\n return element.contentEditable === 'true';\n\n }\n\n /**\n * Delays method execution\n *\n * @param method\n * @param timeout\n */\n static delay(method, timeout) {\n\n return function () {\n\n let context = this,\n args = arguments;\n\n window.setTimeout(() => method.apply(context, args), timeout);\n\n };\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/utils.js","/**\n * DOM manipulations helper\n */\nexport default class Dom {\n\n /**\n * Helper for making Elements with classname and attributes\n *\n * @param {string} tagName - new Element tag name\n * @param {array|string} classNames - list or name of CSS classname(s)\n * @param {Object} attributes - any attributes\n * @return {Element}\n */\n static make(tagName, classNames = null, attributes = {}) {\n\n let el = document.createElement(tagName);\n\n if ( Array.isArray(classNames) ) {\n\n el.classList.add(...classNames);\n\n } else if( classNames ) {\n\n el.classList.add(classNames);\n\n }\n\n for (let attrName in attributes) {\n\n el[attrName] = attributes[attrName];\n\n }\n\n return el;\n\n }\n\n /**\n * Creates Text Node with the passed content\n * @param {String} content - text content\n * @return {Text}\n */\n static text(content) {\n\n return document.createTextNode(content);\n\n }\n\n /**\n * Append one or several elements to the parent\n *\n * @param {Element} parent - where to append\n * @param {Element|Element[]} - element ore elements list\n */\n static append(parent, elements) {\n\n if ( Array.isArray(elements) ) {\n\n elements.forEach( el => parent.appendChild(el) );\n\n } else {\n\n parent.appendChild(elements);\n\n }\n\n }\n\n /**\n * Selector Decorator\n *\n * Returns first match\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n *\n * @returns {Element}\n */\n static find(el = document, selector) {\n\n return el.querySelector(selector);\n\n }\n\n /**\n * Selector Decorator.\n *\n * Returns all matches\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n * @returns {NodeList}\n */\n static findAll(el = document, selector) {\n\n return el.querySelectorAll(selector);\n\n }\n\n /**\n * Search for deepest node which is Leaf.\n * Leaf is the vertex that doesn't have any child nodes\n *\n * @description Method recursively goes throw the all Node until it finds the Leaf\n *\n * @param {Element} node - root Node. From this vertex we start Deep-first search {@link https://en.wikipedia.org/wiki/Depth-first_search}\n * @param {Boolean} atLast - find last text node\n * @return {Node} - it can be text Node or Element Node, so that caret will able to work with it\n */\n static getDeepestNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return an empty text node\n * But caret will not be placed in empty textNode, so we need textNode with zero-width char\n */\n if (this.isElement(node) && !this.isNativeInput(node)) {\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\n return node;\n\n }\n\n let childsLength = node.childNodes.length,\n last = childsLength - 1;\n\n if (atLast) {\n\n return this.getDeepestNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestNode(node.childNodes[0], false);\n\n }\n\n }\n\n /**\n * Check if object is DOM node\n *\n * @param {Object} node\n * @returns {boolean}\n */\n static isElement(node) {\n\n return node && typeof node === 'object' && node.nodeType && node.nodeType === Node.ELEMENT_NODE;\n\n }\n\n /**\n * Checks target if it is native input\n * @param {Element|String} target - HTML element or string\n * @return {Boolean}\n */\n static isNativeInput(target) {\n\n let nativeInputs = [\n 'INPUT',\n 'TEXTAREA'\n ];\n\n return target ? nativeInputs.includes(target.tagName) : false;\n\n }\n\n /**\n * Checks node if it is empty\n *\n * @description Method checks simple Node without any childs for emptiness\n * If you have Node with 2 or more children id depth, you better use {@link Dom#isEmpty} method\n *\n * @param {Node} node\n * @return {Boolean} true if it is empty\n */\n static isNodeEmpty(node) {\n\n let nodeText;\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n nodeText = node.value;\n\n } else {\n\n nodeText = node.textContent.replace('\\u200B', '');\n\n }\n\n return nodeText.trim().length === 0;\n\n }\n\n /**\n * checks node if it is doesn't have any child nodes\n * @param {Node} node\n * @return {boolean}\n */\n static isLeaf(node) {\n\n if (!node) {\n\n return false;\n\n }\n\n return node.childNodes.length === 0;\n\n }\n\n /**\n * breadth-first search (BFS)\n * {@link https://en.wikipedia.org/wiki/Breadth-first_search}\n *\n * @description Pushes to stack all DOM leafs and checks for emptiness\n *\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n leafs = [];\n\n if (!node) {\n\n return false;\n\n }\n\n treeWalker.push(node);\n\n while ( treeWalker.length > 0 ) {\n\n if ( this.isLeaf(node) ) {\n\n leafs.push(node);\n\n }\n\n while ( node && node.nextSibling ) {\n\n node = node.nextSibling;\n\n if (!node) continue;\n\n treeWalker.push(node);\n\n }\n\n node = treeWalker.shift();\n\n if (!node) continue;\n\n node = node.firstChild;\n treeWalker.push(node);\n\n }\n\n return leafs.every( leaf => this.isNodeEmpty(leaf)) ;\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.js","/**\n * Working with selection\n */\nexport default class Selection {\n\n /**\n * @constructor\n */\n constructor() {\n\n this.instance = null;\n this.selection = null;\n\n }\n\n /**\n * Returns window Selection\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Window/getSelection}\n * @return {Selection}\n */\n static get() {\n\n return window.getSelection();\n\n }\n\n /**\n * Returns selected anchor\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorNode}\n * @return {Node}\n */\n static getAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n /**\n * Returns selection offset according to the anchor node\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorOffset}\n * @return {Number}\n */\n static getAnchorOffset() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorOffset;\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/Selection.js","/**\n * Codex Editor\n *\n * Short Description (눈_눈;)\n * @version 2.0.0\n *\n * How to start?\n * Example:\n * new CodexEditor({\n * holderId : 'codex-editor',\n * initialBlock : 'text',\n * placeholder : 'Write your story....',\n * tools: {\n * quote: Quote,\n * anotherTool : AnotherTool\n * },\n * toolsConfig: {\n * quote: {\n * iconClassname : 'quote-icon',\n * displayInToolbox : true,\n * enableLineBreaks : true\n * },\n * anotherTool: {\n * iconClassname : 'tool-icon'\n * }\n * }\n * });\n *\n * - tools is an object: {\n * pluginName: PluginClass,\n * .....\n * }\n * - toolsConfig is an additional configuration that uses Codex Editor API\n * iconClassname - CSS classname of toolbox icon\n * displayInToolbox - if you want to see your Tool in toolbox hided in \"plus\" button, than set \"True\". By default : \"False\"\n * enableLineBreaks - by default enter creates new block that set as initialblock, but if you set this property \"True\", enter will break the lines in current block\n *\n * @author CodeX-Team \n *\n */\n\n/**\n * @typedef {CodexEditor} CodexEditor - editor class\n */\n\n/**\n * @typedef {Object} EditorConfig\n * @property {String} holderId - Element to append Editor\n * @property {Array} data - Blocks list in JSON-format\n * @property {Object} tools - Map for used Tools in format { name : Class, ... }\n * @property {String} initialBlock - This Tool will be added by default\n * @property {String} placeholder - First Block placeholder\n * @property {Object} sanitizer - @todo fill desc\n * @property {Boolean} hideToolbar - @todo fill desc\n * @property {Object} toolsConfig - tools configuration {@link tools#ToolConfig}\n */\n\n/**\n * Dynamically imported utils\n *\n * @typedef {Dom} $ - {@link components/dom.js}\n * @typedef {Util} _ - {@link components/utils.js}\n */\n\n'use strict';\n\n/**\n * Apply polyfills\n */\nimport 'components/polyfills';\n\n/**\n * Require Editor modules places in components/modules dir\n */\n// eslint-disable-next-line\nlet modules = editorModules.map( module => require('./components/modules/' + module ));\n\n/**\n * @class\n *\n * @classdesc CodeX Editor base class\n *\n * @property this.config - all settings\n * @property this.moduleInstances - constructed editor components\n *\n * @type {CodexEditor}\n */\nmodule.exports = class CodexEditor {\n\n /** Editor version */\n static get version() {\n\n return VERSION;\n\n }\n\n /**\n * @param {EditorConfig} config - user configuration\n *\n */\n constructor(config) {\n\n /**\n * Configuration object\n * @type {EditorConfig}\n */\n this.config = {};\n\n /**\n * @typedef {Object} EditorComponents\n * @property {BlockManager} BlockManager\n * @property {Tools} Tools\n * @property {Events} Events\n * @property {UI} UI\n * @property {Toolbar} Toolbar\n * @property {Toolbox} Toolbox\n * @property {Renderer} Renderer\n */\n this.moduleInstances = {};\n\n Promise.resolve()\n .then(() => {\n\n this.configuration = config;\n\n })\n .then(() => this.init())\n .then(() => this.start())\n .then(() => {\n\n console.log('CodeX Editor is ready!');\n\n })\n .catch(error => {\n\n console.log('CodeX Editor does not ready because of %o', error);\n\n });\n\n }\n\n /**\n * Setting for configuration\n * @param {EditorConfig} config\n */\n set configuration(config) {\n\n /**\n * Initlai block type\n * Uses in case when there is no items passed\n * @type {{type: (*), data: {text: null}}}\n */\n let initialBlock = {\n type : config.initialBlock,\n data : {}\n };\n\n this.config.holderId = config.holderId;\n this.config.placeholder = config.placeholder || 'write your story...';\n this.config.sanitizer = config.sanitizer || {\n p: true,\n b: true,\n a: true\n };\n\n this.config.hideToolbar = config.hideToolbar ? config.hideToolbar : false;\n this.config.tools = config.tools || {};\n this.config.toolsConfig = config.toolsConfig || {};\n this.config.data = config.data || {};\n\n /**\n * Initialize items to pass data to the Renderer\n */\n if (_.isEmpty(this.config.data)) {\n\n this.config.data = {};\n this.config.data.items = [ initialBlock ];\n\n } else {\n\n if (!this.config.data.items || this.config.data.items.length === 0) {\n\n this.config.data.items = [ initialBlock ];\n\n }\n\n }\n\n /**\n * If initial Block's Tool was not passed, use the first Tool in config.tools\n */\n if (!config.initialBlock) {\n\n for (this.config.initialBlock in this.config.tools) break;\n\n } else {\n\n this.config.initialBlock = config.initialBlock;\n\n }\n\n }\n\n /**\n * Returns private property\n * @returns {EditorConfig}\n */\n get configuration() {\n\n return this.config;\n\n }\n\n /**\n * Initializes modules:\n * - make and save instances\n * - configure\n */\n init() {\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n this.constructModules();\n\n /**\n * Modules configuration\n */\n this.configureModules();\n\n }\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n constructModules() {\n\n modules.forEach( Module => {\n\n try {\n\n /**\n * We use class name provided by displayName property\n *\n * On build, Babel will transform all Classes to the Functions so, name will always be 'Function'\n * To prevent this, we use 'babel-plugin-class-display-name' plugin\n * @see https://www.npmjs.com/package/babel-plugin-class-display-name\n */\n this.moduleInstances[Module.displayName] = new Module({\n config : this.configuration\n });\n\n } catch ( e ) {\n\n console.log('Module %o skipped because %o', Module, e);\n\n }\n\n });\n\n }\n\n /**\n * Modules instances configuration:\n * - pass other modules to the 'state' property\n * - ...\n */\n configureModules() {\n\n for(let name in this.moduleInstances) {\n\n /**\n * Module does not need self-instance\n */\n this.moduleInstances[name].state = this.getModulesDiff( name );\n\n }\n\n }\n\n /**\n * Return modules without passed name\n */\n getModulesDiff( name ) {\n\n let diff = {};\n\n for(let moduleName in this.moduleInstances) {\n\n /**\n * Skip module with passed name\n */\n if (moduleName === name) {\n\n continue;\n\n }\n diff[moduleName] = this.moduleInstances[moduleName];\n\n }\n\n return diff;\n\n }\n\n /**\n * Start Editor!\n *\n * Get list of modules that needs to be prepared and return a sequence (Promise)\n * @return {Promise}\n */\n start() {\n\n let prepareDecorator = module => module.prepare();\n\n return Promise.resolve()\n .then(prepareDecorator(this.moduleInstances.Tools))\n .then(prepareDecorator(this.moduleInstances.UI))\n .then(prepareDecorator(this.moduleInstances.BlockManager))\n .then(() => {\n\n return this.moduleInstances.Renderer.render(this.config.data.items);\n\n\n });\n\n }\n\n};\n\n// module.exports = (function (editor) {\n//\n// 'use strict';\n//\n// editor.version = VERSION;\n// editor.scriptPrefix = 'cdx-script-';\n//\n// var init = function () {\n//\n// editor.core = require('./modules/core');\n// editor.tools = require('./modules/tools');\n// editor.ui = require('./modules/ui');\n// editor.transport = require('./modules/transport');\n// editor.renderer = require('./modules/renderer');\n// editor.saver = require('./modules/saver');\n// editor.content = require('./modules/content');\n// editor.toolbar = require('./modules/toolbar/toolbar');\n// editor.callback = require('./modules/callbacks');\n// editor.draw = require('./modules/draw');\n// editor.caret = require('./modules/caret');\n// editor.notifications = require('./modules/notifications');\n// editor.parser = require('./modules/parser');\n// editor.sanitizer = require('./modules/sanitizer');\n// editor.listeners = require('./modules/listeners');\n// editor.destroyer = require('./modules/destroyer');\n// editor.paste = require('./modules/paste');\n//\n// };\n//\n// /**\n// * @public\n// * holds initial settings\n// */\n// editor.settings = {\n// tools : ['text', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n// holderId : 'codex-editor',\n//\n// // Type of block showing on empty editor\n// initialBlockPlugin: 'text'\n// };\n//\n// /**\n// * public\n// *\n// * Static nodes\n// */\n// editor.nodes = {\n// holder : null,\n// wrapper : null,\n// toolbar : null,\n// inlineToolbar : {\n// wrapper : null,\n// buttons : null,\n// actions : null\n// },\n// toolbox : null,\n// notifications : null,\n// plusButton : null,\n// showSettingsButton: null,\n// showTrashButton : null,\n// blockSettings : null,\n// pluginSettings : null,\n// defaultSettings : null,\n// toolbarButtons : {}, // { type : DomEl, ... }\n// redactor : null\n// };\n//\n// /**\n// * @public\n// *\n// * Output state\n// */\n// editor.state = {\n// jsonOutput : [],\n// blocks : [],\n// inputs : []\n// };\n//\n// /**\n// * @public\n// * Editor plugins\n// */\n// editor.tools = {};\n//\n// editor.start = function (userSettings) {\n//\n// init();\n//\n// editor.core.prepare(userSettings)\n//\n// // If all ok, make UI, bind events and parse initial-content\n// .then(editor.ui.prepare)\n// .then(editor.tools.prepare)\n// .then(editor.sanitizer.prepare)\n// .then(editor.paste.prepare)\n// .then(editor.transport.prepare)\n// .then(editor.renderer.makeBlocksFromData)\n// .then(editor.ui.saveInputs)\n// .catch(function (error) {\n//\n// editor.core.log('Initialization failed with error: %o', 'warn', error);\n//\n// });\n//\n// };\n//\n// return editor;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/codex.js","/**\n * Element.closest()\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\n */\nif (!Element.prototype.matches)\n Element.prototype.matches = Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n\nif (!Element.prototype.closest)\n Element.prototype.closest = function (s) {\n\n var el = this;\n\n if (!document.documentElement.contains(el)) return null;\n do {\n\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n\n } while (el !== null);\n return null;\n\n };\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/polyfills.js","var map = {\n\t\"./blockManager.js\": 7,\n\t\"./caret.js\": 9,\n\t\"./events.js\": 10,\n\t\"./listeners.js\": 11,\n\t\"./renderer.js\": 12,\n\t\"./sanitizer.js\": 13,\n\t\"./saver.js\": 15,\n\t\"./toolbar.js\": 16,\n\t\"./toolbox.js\": 17,\n\t\"./tools.js\": 18,\n\t\"./ui.js\": 19\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 6;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/modules nonrecursive [^_](blockManager.js|caret.js|events.js|listeners.js|renderer.js|sanitizer.js|saver.js|toolbar.js|toolbox.js|tools.js|ui.js)$\n// module id = 6\n// module chunks = 0","/**\n * @class BlockManager\n * @classdesc Manage editor`s blocks storage and appearance\n *\n * @module BlockManager\n *\n * @version 2.0.0\n */\n\nimport Block from '../block';\nimport Selection from '../Selection';\n\n/**\n * @typedef {BlockManager} BlockManager\n * @property {Number} currentBlockIndex - Index of current working block\n * @property {Proxy} _blocks - Proxy for Blocks instance {@link Blocks}\n */\nexport default class BlockManager extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n /**\n * Proxy for Blocks instance {@link Blocks}\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = null;\n\n /**\n * Index of current working block\n *\n * @type {number}\n * @private\n */\n this.currentBlockIndex = -1;\n\n }\n\n /**\n * Should be called after Editor.UI preparation\n * Define this._blocks property\n *\n * @returns {Promise}\n */\n prepare() {\n\n return new Promise(resolve => {\n\n let blocks = new Blocks(this.Editor.UI.nodes.redactor);\n\n /**\n * We need to use Proxy to overload set/get [] operator.\n * So we can use array-like syntax to access blocks\n *\n * @example\n * this._blocks[0] = new Block(...);\n *\n * block = this._blocks[0];\n *\n * @todo proxy the enumerate method\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = new Proxy(blocks, {\n set: Blocks.set,\n get: Blocks.get\n });\n\n resolve();\n\n });\n\n }\n\n /**\n * Creates Block instance by tool name\n *\n * @param {String} toolName - tools passed in editor config {@link EditorConfig#tools}\n * @param {Object} data - constructor params\n *\n * @return {Block}\n */\n composeBlock(toolName, data) {\n\n let toolInstance = this.Editor.Tools.construct(toolName, data),\n block = new Block(toolName, toolInstance);\n\n this.bindEvents(block);\n\n /**\n * Apply callback before inserting html\n */\n block.call('appendCallback', {});\n\n return block;\n\n }\n\n /**\n * Bind Events\n * @param {Object} block\n */\n bindEvents(block) {\n\n /**\n * keydown on block\n * @todo move to the keydown module\n */\n this.Editor.Listeners.on(block.pluginsContent, 'keydown', (event) => this.keyDownOnBlock(event));\n\n }\n\n /**\n * @todo move to the keydown module\n * @param {MouseEvent} event\n */\n keyDownOnBlock(event) {\n\n switch(event.keyCode) {\n\n case _.keyCodes.ENTER:\n // this.enterPressedOnPluginsContent(event);\n break;\n case _.keyCodes.DOWN:\n case _.keyCodes.RIGHT:\n this.navigateNext();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.navigatePrevious();\n break;\n\n }\n\n }\n\n /**\n * Set's caret to the next Block\n * Before moving caret, we should check if caret position is at the end of Plugins node\n * Using {@link Dom#getDeepestNode} to get a last node and match with current selection\n */\n navigateNext() {\n\n let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getAnchorOffset() === textNodeLength) {\n\n let nextBlock = this.nextBlock;\n\n if (!nextBlock) return;\n\n this.Editor.Caret.setToBlock( nextBlock );\n\n }\n\n }\n\n /**\n * Set's caret to the previous Block\n * Before moving caret, we should check if caret position is at the end of Plugins node\n * Using {@link Dom#getDeepestNode} to get a last node and match with current selection\n */\n navigatePrevious() {\n\n let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n if (Selection.getAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getAnchorOffset() === 0) {\n\n let previousBlock = this.previousBlock;\n\n if (!previousBlock) return;\n\n this.Editor.Caret.setToBlock( previousBlock, textNodeLength, true );\n\n }\n\n }\n\n /**\n * Insert new block into _blocks\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n insert(toolName, data = {}) {\n\n\n let block = this.composeBlock(toolName, data);\n\n this._blocks[++this.currentBlockIndex] = block;\n this.Editor.Caret.setToBlock(block);\n\n }\n\n /**\n * Replace current working block\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n replace(toolName, data = {}) {\n\n let block = this.composeBlock(toolName, data);\n\n this._blocks.insert(this.currentBlockIndex, block, true);\n\n }\n\n /**\n * returns last Block\n * @return {Block}\n */\n get lastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n * Returns Block by passed index\n * @param {Number} index\n * @return {Block}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Get Block instance by html element\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`),\n index = nodes.indexOf(firstLevelBlock);\n\n if (index >= 0) {\n\n return this._blocks[index];\n\n }\n\n }\n\n /**\n * Get current Block instance\n *\n * @return {Block}\n */\n get currentBlock() {\n\n return this._blocks[this.currentBlockIndex];\n\n }\n\n /**\n * Returns next Block instance\n * @return {Block|null}\n */\n get nextBlock() {\n\n let isLastBlock = this.currentBlockIndex === (this._blocks.length - 1);\n\n if (isLastBlock) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex + 1];\n\n }\n\n /**\n * Returns previous Block instance\n * @return {Block|null}\n */\n get previousBlock() {\n\n let isFirstBlock = this.currentBlockIndex === 0;\n\n if (isFirstBlock) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex - 1];\n\n }\n\n /**\n * Get working html element\n *\n * @return {HTMLElement}\n */\n get currentNode() {\n\n return this._blocks.nodes[this.currentBlockIndex];\n\n }\n\n /**\n * Set currentBlockIndex to passed block\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes,\n firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`);\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(firstLevelBlock);\n\n /**\n * Remove previous selected Block's state\n */\n this._blocks.array.forEach( block => block.selected = false);\n\n /**\n * Mark current Block as selected\n * @type {boolean}\n */\n this.currentBlock.selected = true;\n\n }\n\n /**\n * Get array of Block instances\n *\n * @returns {Block[]} {@link Blocks#array}\n */\n get blocks() {\n\n return this._blocks.array;\n\n }\n\n /**\n * 1) Find first-level Block from passed child Node\n * 2) Mark it as current\n *\n * @param {Element|Text} childNode - look ahead from this node.\n * @throws Error - when passed Node is not included at the Block\n */\n setCurrentBlockByChildNode(childNode) {\n\n /**\n * If node is Text TextNode\n */\n if (!$.isElement(childNode)) {\n\n childNode = childNode.parentNode;\n\n }\n\n let parentFirstLevelBlock = childNode.closest(`.${Block.CSS.wrapper}`);\n\n if (parentFirstLevelBlock) {\n\n this.currentNode = parentFirstLevelBlock;\n\n } else {\n\n throw new Error('Can not find a Block from this child Node');\n\n }\n\n }\n\n}\n\n/**\n * @class Blocks\n * @classdesc Class to work with Block instances array\n *\n * @private\n *\n * @property {HTMLElement} workingArea — editor`s working node\n *\n */\nclass Blocks {\n\n /**\n * @constructor\n *\n * @param {HTMLElement} workingArea — editor`s working node\n */\n constructor(workingArea) {\n\n this.blocks = [];\n this.workingArea = workingArea;\n\n }\n\n /**\n * Push back new Block\n *\n * @param {Block} block\n */\n push(block) {\n\n this.blocks.push(block);\n this.workingArea.appendChild(block.html);\n\n }\n\n /**\n * Insert new Block at passed index\n *\n * @param {Number} index — index to insert Block\n * @param {Block} block — Block to insert\n * @param {Boolean} replace — it true, replace block on given index\n */\n insert(index, block, replace = false) {\n\n if (!this.length) {\n\n this.push(block);\n return;\n\n }\n\n if (index > this.length) {\n\n index = this.length;\n\n }\n\n if (replace) {\n\n this.blocks[index].html.remove();\n\n }\n\n let deleteCount = replace ? 1 : 0;\n\n this.blocks.splice(index, deleteCount, block);\n\n if (index > 0) {\n\n let previousBlock = this.blocks[index - 1];\n\n previousBlock.html.insertAdjacentElement('afterend', block.html);\n\n } else {\n\n let nextBlock = this.blocks[index + 1];\n\n if (nextBlock) {\n\n nextBlock.html.insertAdjacentElement('beforebegin', block.html);\n\n } else {\n\n this.workingArea.appendChild(block.html);\n\n }\n\n }\n\n }\n\n /**\n * Insert Block after passed target\n *\n * @todo decide if this method is necessary\n *\n * @param {Block} targetBlock — target after wich Block should be inserted\n * @param {Block} newBlock — Block to insert\n */\n insertAfter(targetBlock, newBlock) {\n\n let index = this.blocks.indexOf(targetBlock);\n\n this.insert(index + 1, newBlock);\n\n }\n\n /**\n * Get Block by index\n *\n * @param {Number} index — Block index\n * @returns {Block}\n */\n get(index) {\n\n return this.blocks[index];\n\n }\n\n /**\n * Return index of passed Block\n *\n * @param {Block} block\n * @returns {Number}\n */\n indexOf(block) {\n\n return this.blocks.indexOf(block);\n\n }\n\n /**\n * Get length of Block instances array\n *\n * @returns {Number}\n */\n get length() {\n\n return this.blocks.length;\n\n }\n\n /**\n * Get Block instances array\n *\n * @returns {Block[]}\n */\n get array() {\n\n return this.blocks;\n\n }\n\n /**\n * Get blocks html elements array\n *\n * @returns {HTMLElement[]}\n */\n get nodes() {\n\n return _.array(this.workingArea.children);\n\n }\n\n /**\n * Proxy trap to implement array-like setter\n *\n * @example\n * blocks[0] = new Block(...)\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — block index\n * @param {Block} block — Block to set\n * @returns {Boolean}\n */\n static set(instance, index, block) {\n\n if (isNaN(Number(index))) {\n\n return false;\n\n }\n\n instance.insert(index, block);\n\n return true;\n\n }\n\n /**\n * Proxy trap to implement array-like getter\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — Block index\n * @returns {Block|*}\n */\n static get(instance, index) {\n\n if (isNaN(Number(index))) {\n\n return instance[index];\n\n }\n\n return instance.get(index);\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/blockManager.js","/**\n *\n * @class Block\n * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool\n *\n * @property {Tool} tool — current block tool (Paragraph, for example)\n * @property {Object} CSS — block`s css classes\n *\n */\n\n/**\n * @classdesc Abstract Block class that contains Block information, Tool name and Tool class instance\n *\n * @property tool - Tool instance\n * @property html - Returns HTML content of plugin\n * @property wrapper - Div element that wraps block content with Tool's content. Has `ce-block` CSS class\n * @property contentNode - Div element that wraps Tool's content. Has `ce-block__content` CSS class\n * @property pluginsContent - HTML content that returns by Tool's render function\n */\nexport default class Block {\n\n /**\n * @constructor\n * @param {String} toolName - Tool name that passed on initialization\n * @param {Object} toolInstance — passed Tool`s instance that rendered the Block\n */\n constructor(toolName, toolInstance) {\n\n this.name = toolName;\n this.tool = toolInstance;\n this._html = this.compose();\n\n }\n\n /**\n * CSS classes for the Block\n * @return {{wrapper: string, content: string}}\n */\n static get CSS() {\n\n return {\n wrapper: 'ce-block',\n content: 'ce-block__content',\n selected: 'ce-block--selected'\n };\n\n }\n\n /**\n * Make default Block wrappers and put Tool`s content there\n * @returns {HTMLDivElement}\n */\n compose() {\n\n this.wrapper = $.make('div', Block.CSS.wrapper);\n this.contentNode = $.make('div', Block.CSS.content);\n this.pluginsContent = this.tool.render();\n\n this.contentNode.appendChild(this.pluginsContent);\n this.wrapper.appendChild(this.contentNode);\n\n return this.wrapper;\n\n }\n\n /**\n * Calls Tool's method\n *\n * Method checks tool property {MethodName}. Fires method with passes params If it is instance of Function\n *\n * @param {String} methodName\n * @param {Object} params\n */\n call(methodName, params) {\n\n /**\n * call Tool's method with the instance context\n */\n if (this.tool[methodName] && this.tool[methodName] instanceof Function) {\n\n this.tool[methodName].call(this.tool, params);\n\n }\n\n }\n\n /**\n * Get Block`s HTML\n * @returns {HTMLElement}\n */\n get html() {\n\n return this._html;\n\n }\n\n /**\n * Get Block's JSON data\n * @return {Object}\n */\n get data() {\n\n return this.save();\n\n }\n\n /**\n * Extracts data from Block\n * Groups Tool's save processing time\n * @return {Object}\n */\n save() {\n\n let extractedBlock = this.tool.save(this.pluginsContent);\n\n /** Measuring execution time*/\n let measuringStart = window.performance.now(),\n measuringEnd;\n\n return Promise.resolve(extractedBlock)\n .then((finishedExtraction) => {\n\n /** measure promise execution */\n measuringEnd = window.performance.now();\n\n return {\n tool: this.name,\n data: finishedExtraction,\n time : measuringEnd - measuringStart\n };\n\n })\n .catch(function (error) {\n\n _.log(`Saving proccess for ${this.tool.name} tool failed due to the ${error}`, 'log', 'red');\n\n });\n\n }\n\n /**\n * Uses Tool's validation method to check the correctness of output data\n * Tool's validation method is optional\n *\n * @description Method also can return data if it passed the validation\n *\n * @param {Object} data\n * @returns {Boolean|Object} valid\n */\n validateData(data) {\n\n let isValid = true;\n\n if (this.tool.validate instanceof Function) {\n\n isValid = this.tool.validate(data);\n\n }\n\n if (!isValid) {\n\n return false;\n\n }\n\n return data;\n\n }\n\n /**\n * Check block for emptiness\n * @return {Boolean}\n */\n get isEmpty() {\n\n /**\n * Allow Tool to represent decorative contentless blocks: for example \"* * *\"-tool\n * That Tools are not empty\n */\n if (this.tool.contentless) {\n\n return false;\n\n }\n\n let emptyText = $.isEmpty(this.pluginsContent),\n emptyMedia = !this.hasMedia;\n\n return emptyText && emptyMedia;\n\n }\n\n /**\n * Check if block has a media content such as images, iframes and other\n * @return {Boolean}\n */\n get hasMedia() {\n\n /**\n * This tags represents media-content\n * @type {string[]}\n */\n const mediaTags = [\n 'img',\n 'iframe',\n 'video',\n 'audio',\n 'source',\n 'input',\n 'textarea',\n 'twitterwidget'\n ];\n\n return !!this._html.querySelector(mediaTags.join(','));\n\n }\n\n /**\n * Set selected state\n * @param {Boolean} state - 'true' to select, 'false' to remove selection\n */\n set selected(state) {\n\n /**\n * We don't need to mark Block as Selected when it is not empty\n */\n if (state === true && !this.isEmpty) {\n\n this._html.classList.add(Block.CSS.selected);\n\n } else {\n\n this._html.classList.remove(Block.CSS.selected);\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/block.js","/**\n * @class Caret\n * @classdesc Contains methods for working Caret\n *\n * Uses Range methods to manipulate with caret\n *\n * @module Caret\n *\n * @version 2.0.0\n */\n\n/**\n * @typedef {Caret} Caret\n */\nimport Selection from '../Selection';\n\nexport default class Caret extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * Method gets Block instance and puts caret to the text node with offset\n * There two ways that method applies caret position:\n * - first found text node: sets at the beginning, but you can pass an offset\n * - last found text node: sets at the end of the node. Also, you can customize the behaviour\n *\n * @param {Block} block - Block class\n * @param {Number} offset - caret offset regarding to the text node\n * @param {Boolean} atEnd - put caret at the end of the text node or not\n */\n setToBlock(block, offset = 0, atEnd = false) {\n\n let element = block.pluginsContent;\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestNode(element, atEnd);\n\n if (atEnd || offset > nodeToSet.length) {\n\n offset = nodeToSet.length;\n\n }\n\n /** if found deepest node is native input */\n if ($.isNativeInput(nodeToSet)) {\n\n nodeToSet.focus();\n return;\n\n }\n\n /**\n * @todo try to fix via Promises or use querySelectorAll to not to use timeout\n */\n _.delay( () => this.set(nodeToSet, offset), 20)();\n\n this.Editor.BlockManager.currentNode = block.wrapper;\n\n }\n\n /**\n * Creates Document Range and sets caret to the element with offset\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n */\n set( element, offset = 0) {\n\n let range = document.createRange(),\n selection = Selection.get();\n\n range.setStart(element, offset);\n range.setEnd(element, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n };\n\n /**\n * Set Caret to the last Block\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let lastBlock = this.Editor.BlockManager.lastBlock;\n\n if (!lastBlock) return;\n\n /**\n * If last block is empty and it is an initialBlock, set to that.\n * Otherwise, append new empty block and set to that\n */\n if (lastBlock.isEmpty) {\n\n this.setToBlock(lastBlock);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/caret.js","/**\n * @module eventDispatcher\n *\n * Has two important methods:\n * - {Function} on - appends subscriber to the event. If event doesn't exist - creates new one\n * - {Function} emit - fires all subscribers with data\n *\n * @version 1.0.0\n *\n * @typedef {Events} Events\n * @property {Object} subscribers - all subscribers grouped by event name\n */\nexport default class Events extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n this.subscribers = {};\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Function} callback - subscriber\n */\n on(eventName, callback) {\n\n if (!(eventName in this.subscribers)) {\n\n this.subscribers[eventName] = [];\n\n }\n\n // group by events\n this.subscribers[eventName].push(callback);\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Object} data - subscribers get this data when they were fired\n */\n emit(eventName, data) {\n\n this.subscribers[eventName].reduce(function (previousData, currentHandler) {\n\n let newData = currentHandler(previousData);\n\n return newData ? newData : previousData;\n\n }, data);\n\n }\n\n /**\n * Destroyer\n * clears subsribers list\n */\n destroy() {\n\n this.subscribers = null;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/events.js","/**\n * Codex Editor Listeners module\n *\n * @module Listeners\n *\n * Module-decorator for event listeners assignment\n *\n * @author Codex Team\n * @version 2.0.0\n */\n\n/**\n * @typedef {Listeners} Listeners\n * @property {Array} allListeners\n */\n\nexport default class Listeners extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n this.allListeners = [];\n\n }\n\n /**\n * Assigns event listener on element\n *\n * @param {Element} element - DOM element that needs to be listened\n * @param {String} eventType - event type\n * @param {Function} handler - method that will be fired on event\n * @param {Boolean} useCapture - use event bubbling\n */\n on(element, eventType, handler, useCapture = false) {\n\n let assignedEventData = {\n element,\n eventType,\n handler,\n useCapture\n };\n\n let alreadyExist = this.findOne(element, eventType, handler);\n\n if (alreadyExist) return;\n\n this.allListeners.push(assignedEventData);\n element.addEventListener(eventType, handler, useCapture);\n\n }\n\n /**\n * Removes event listener from element\n *\n * @param {Element} element - DOM element that we removing listener\n * @param {String} eventType - event type\n * @param {Function} handler - remove handler, if element listens several handlers on the same event type\n * @param {Boolean} useCapture - use event bubbling\n */\n off(element, eventType, handler, useCapture = false) {\n\n let existingListeners = this.findAll(element, eventType, handler);\n\n for (let i = 0; i < existingListeners.length; i++) {\n\n let index = this.allListeners.indexOf(existingListeners[i]);\n\n if (index > 0) {\n\n this.allListeners.splice(index, 1);\n\n }\n\n }\n\n element.removeEventListener(eventType, handler, useCapture);\n\n\n }\n\n /**\n * Search method: looks for listener by passed element\n * @param {Element} element - searching element\n * @returns {Array} listeners that found on element\n */\n findByElement(element) {\n\n let listenersOnElement = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.element === element) {\n\n listenersOnElement.push(listener);\n\n }\n\n }\n\n return listenersOnElement;\n\n }\n\n /**\n * Search method: looks for listener by passed event type\n * @param {String} eventType\n * @return {Array} listeners that found on element\n */\n findByType(eventType) {\n\n let listenersWithType = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.type === eventType) {\n\n listenersWithType.push(listener);\n\n }\n\n }\n\n return listenersWithType;\n\n }\n\n /**\n * Search method: looks for listener by passed handler\n * @param {Function} handler\n * @return {Array} listeners that found on element\n */\n findByHandler(handler) {\n\n let listenersWithHandler = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.handler === handler) {\n\n listenersWithHandler.push(listener);\n\n }\n\n }\n\n return listenersWithHandler;\n\n }\n\n /**\n * @param {Element} element\n * @param {String} eventType\n * @param {Function} handler\n * @return {Element|null}\n */\n findOne(element, eventType, handler) {\n\n let foundListeners = this.findAll(element, eventType, handler);\n\n return foundListeners.length > 0 ? foundListeners[0] : null;\n\n }\n\n /**\n * @param {Element} element\n * @param {String} eventType\n * @param {Function} handler\n * @return {Array}\n */\n findAll(element, eventType, handler) {\n\n let foundAllListeners,\n foundByElements = [],\n foundByEventType = [],\n foundByHandler = [];\n\n if (element)\n foundByElements = this.findByElement(element);\n\n if (eventType)\n foundByEventType = this.findByType(eventType);\n\n if (handler)\n foundByHandler = this.findByHandler(handler);\n\n foundAllListeners = foundByElements.concat(foundByEventType, foundByHandler);\n\n return foundAllListeners;\n\n }\n\n /**\n * Removes all listeners\n */\n removeAll() {\n\n this.allListeners.map( (current) => {\n\n this.off(current.element, current.type, current.handler);\n\n });\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/listeners.js","/**\n * Codex Editor Renderer Module\n *\n * @module Renderer\n * @author CodeX Team\n *\n * @version 2.0.0\n */\nexport default class Renderer extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * @typedef {Object} RendererItems\n * @property {String} type - tool name\n * @property {Object} data - tool data\n */\n\n /**\n * @example\n *\n * items: [\n * {\n * type : 'paragraph',\n * data : {\n * text : 'Hello from Codex!'\n * }\n * },\n * {\n * type : 'paragraph',\n * data : {\n * text : 'Leave feedback if you like it!'\n * }\n * },\n * ]\n *\n */\n\n /**\n * Make plugin blocks from array of plugin`s data\n * @param {RendererItems[]} items\n */\n render(items) {\n\n let chainData = [];\n\n for (let i = 0; i < items.length; i++) {\n\n chainData.push({\n function: () => this.insertBlock(items[i])\n });\n\n }\n\n return _.sequence(chainData);\n\n }\n\n /**\n * Get plugin instance\n * Add plugin instance to BlockManager\n * Insert block to working zone\n *\n * @param {Object} item\n * @returns {Promise.}\n * @private\n */\n insertBlock(item) {\n\n let tool = item.type,\n data = item.data;\n\n this.Editor.BlockManager.insert(tool, data);\n\n return Promise.resolve();\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/renderer.js","/**\n * CodeX Sanitizer\n *\n * @module Sanitizer\n * Clears HTML from taint tags\n *\n * @version 2.0.0\n *\n * @example\n * Module can be used within two ways:\n * 1) When you have an instance\n * - this.Editor.Sanitizer.clean(yourTaintString);\n * 2) As static method\n * - CodexEditor.Sanitizer.clean(yourTaintString, yourCustomConfiguration);\n *\n * {@link SanitizerConfig}\n */\n\n\n/**\n * @typedef {Object} SanitizerConfig\n * @property {Object} tags - define tags restrictions\n *\n * @example\n *\n * tags : {\n * p: true,\n * a: {\n * href: true,\n * rel: \"nofollow\",\n * target: \"_blank\"\n * }\n * }\n */\nexport default class Sanitizer extends Module {\n\n /**\n * Initializes Sanitizer module\n * Sets default configuration if custom not exists\n *\n * @property {SanitizerConfig} this.defaultConfig\n * @property {HTMLJanitor} this._sanitizerInstance - Sanitizer library\n *\n * @param {SanitizerConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n // default config\n this.defaultConfig = null;\n this._sanitizerInstance = null;\n\n /** Custom configuration */\n this.sanitizerConfig = config.settings ? config.settings.sanitizer : {};\n\n /** HTML Janitor library */\n this.sanitizerInstance = require('html-janitor');\n\n }\n\n /**\n * If developer uses editor's API, then he can customize sanitize restrictions.\n * Or, sanitizing config can be defined globally in editors initialization. That config will be used everywhere\n * At least, if there is no config overrides, that API uses Default configuration\n *\n * @uses https://www.npmjs.com/package/html-janitor\n *\n * @param {HTMLJanitor} library - sanitizer extension\n */\n set sanitizerInstance(library) {\n\n this._sanitizerInstance = new library(this.defaultConfig);\n\n }\n\n /**\n * Sets sanitizer configuration. Uses default config if user didn't pass the restriction\n * @param {SanitizerConfig} config\n */\n set sanitizerConfig(config) {\n\n if (_.isEmpty(config)) {\n\n this.defaultConfig = {\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: 'nofollow'\n }\n }\n };\n\n } else {\n\n this.defaultConfig = config;\n\n }\n\n }\n\n /**\n * Cleans string from unwanted tags\n * @param {String} taintString - HTML string\n * @param {Object} customConfig - custom sanitizer configuration. Method uses default if param is empty\n * @return {String} clean HTML\n */\n clean(taintString, customConfig = {}) {\n\n if (_.isEmpty(customConfig)) {\n\n return this._sanitizerInstance.clean(taintString);\n\n } else {\n\n return Sanitizer.clean(taintString, customConfig);\n\n }\n\n\n }\n\n /**\n * Cleans string from unwanted tags\n * @static\n *\n * Method allows to use default config\n *\n * @param {String} taintString - taint string\n * @param {SanitizerConfig} customConfig - allowed tags\n *\n * @return {String} clean HTML\n */\n static clean(taintString, customConfig) {\n\n let newInstance = Sanitizer(customConfig);\n\n return newInstance.clean(taintString);\n\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/sanitizer.js","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('html-janitor', factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.HTMLJanitor = factory();\n }\n}(this, function () {\n\n /**\n * @param {Object} config.tags Dictionary of allowed tags.\n * @param {boolean} config.keepNestedBlockElements Default false.\n */\n function HTMLJanitor(config) {\n\n var tagDefinitions = config['tags'];\n var tags = Object.keys(tagDefinitions);\n\n var validConfigValues = tags\n .map(function(k) { return typeof tagDefinitions[k]; })\n .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });\n\n if(!validConfigValues) {\n throw new Error(\"The configuration was invalid\");\n }\n\n this.config = config;\n }\n\n // TODO: not exhaustive?\n var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];\n function isBlockElement(node) {\n return blockElementNames.indexOf(node.nodeName) !== -1;\n }\n\n var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];\n function isInlineElement(node) {\n return inlineElementNames.indexOf(node.nodeName) !== -1;\n }\n\n HTMLJanitor.prototype.clean = function (html) {\n var sandbox = document.createElement('div');\n sandbox.innerHTML = html;\n\n this._sanitize(sandbox);\n\n return sandbox.innerHTML;\n };\n\n HTMLJanitor.prototype._sanitize = function (parentNode) {\n var treeWalker = createTreeWalker(parentNode);\n var node = treeWalker.firstChild();\n if (!node) { return; }\n\n do {\n // Ignore nodes that have already been sanitized\n if (node._sanitized) {\n continue;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // If this text node is just whitespace and the previous or next element\n // sibling is a block element, remove it\n // N.B.: This heuristic could change. Very specific to a bug with\n // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output\n // FIXME: make this an option?\n if (node.data.trim() === ''\n && ((node.previousElementSibling && isBlockElement(node.previousElementSibling))\n || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n } else {\n continue;\n }\n }\n\n // Remove all comments\n if (node.nodeType === Node.COMMENT_NODE) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n }\n\n var isInline = isInlineElement(node);\n var containsBlockElement;\n if (isInline) {\n containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);\n }\n\n // Block elements should not be nested (e.g.

  • ...); if\n // they are, we want to unwrap the inner block element.\n var isNotTopContainer = !! parentNode.parentNode;\n var isNestedBlockElement =\n isBlockElement(parentNode) &&\n isBlockElement(node) &&\n isNotTopContainer;\n\n var nodeName = node.nodeName.toLowerCase();\n\n var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);\n\n var isInvalid = isInline && containsBlockElement;\n\n // Drop tag entirely according to the whitelist *and* if the markup\n // is invalid.\n if (isInvalid || shouldRejectNode(node, allowedAttrs)\n || (!this.config.keepNestedBlockElements && isNestedBlockElement)) {\n // Do not keep the inner text of SCRIPT/STYLE elements.\n if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {\n while (node.childNodes.length > 0) {\n parentNode.insertBefore(node.childNodes[0], node);\n }\n }\n parentNode.removeChild(node);\n\n this._sanitize(parentNode);\n break;\n }\n\n // Sanitize attributes\n for (var a = 0; a < node.attributes.length; a += 1) {\n var attr = node.attributes[a];\n\n if (shouldRejectAttr(attr, allowedAttrs, node)) {\n node.removeAttribute(attr.name);\n // Shift the array to continue looping.\n a = a - 1;\n }\n }\n\n // Sanitize children\n this._sanitize(node);\n\n // Mark node as sanitized so it's ignored in future runs\n node._sanitized = true;\n } while ((node = treeWalker.nextSibling()));\n };\n\n function createTreeWalker(node) {\n return document.createTreeWalker(node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,\n null, false);\n }\n\n function getAllowedAttrs(config, nodeName, node){\n if (typeof config.tags[nodeName] === 'function') {\n return config.tags[nodeName](node);\n } else {\n return config.tags[nodeName];\n }\n }\n\n function shouldRejectNode(node, allowedAttrs){\n if (typeof allowedAttrs === 'undefined') {\n return true;\n } else if (typeof allowedAttrs === 'boolean') {\n return !allowedAttrs;\n }\n\n return false;\n }\n\n function shouldRejectAttr(attr, allowedAttrs, node){\n var attrName = attr.name.toLowerCase();\n\n if (allowedAttrs === true){\n return false;\n } else if (typeof allowedAttrs[attrName] === 'function'){\n return !allowedAttrs[attrName](attr.value, node);\n } else if (typeof allowedAttrs[attrName] === 'undefined'){\n return true;\n } else if (allowedAttrs[attrName] === false) {\n return true;\n } else if (typeof allowedAttrs[attrName] === 'string') {\n return (allowedAttrs[attrName] !== attr.value);\n }\n\n return false;\n }\n\n return HTMLJanitor;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html-janitor/src/html-janitor.js\n// module id = 14\n// module chunks = 0","/**\n * Codex Editor Saver\n *\n * @module Saver\n * @author Codex Team\n * @version 2.0.0\n */\n\n/**\n * @typedef {Object} SavedData\n * @property {Date} time - saving proccess time\n * @property {Object} items - extracted data\n * @property {String} version - CodexEditor version\n */\n\n/**\n * @classdesc This method reduces all Blocks asyncronically and calls Block's save method to extract data\n *\n * @typedef {Saver} Saver\n * @property {Element} html - Editor HTML content\n * @property {String} json - Editor JSON output\n */\n\nexport default class Saver extends Module {\n\n /**\n * @constructor\n * @param config\n */\n constructor({config}) {\n\n super({config});\n\n this.output = null;\n this.blocksData = [];\n\n }\n\n /**\n * Composes new chain of Promises to fire them alternatelly\n * @return {SavedData}\n */\n save() {\n\n let blocks = this.Editor.BlockManager.blocks,\n chainData = [];\n\n blocks.forEach((block) => {\n\n chainData.push(block.data);\n\n });\n\n return Promise.all(chainData)\n .then((allExtractedData) => this.makeOutput(allExtractedData))\n .then((outputData) => {\n\n return outputData;\n\n });\n\n }\n\n /**\n * Creates output object with saved data, time and version of editor\n * @param {Object} allExtractedData\n * @return {SavedData}\n */\n makeOutput(allExtractedData) {\n\n let items = [],\n totalTime = 0;\n\n console.groupCollapsed('[CodexEditor saving]:');\n\n allExtractedData.forEach((extraction, index) => {\n\n /** Group process info */\n console.log(`«${extraction.tool}» saving info`, extraction);\n totalTime += extraction.time;\n items.push(extraction.data);\n\n });\n\n console.log('Total', totalTime);\n console.groupEnd();\n\n return {\n time : +new Date(),\n items : items,\n version : VERSION,\n };\n\n }\n\n}\n\n// module.exports = (function (saver) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * @public\n// * Save blocks\n// */\n// saver.save = function () {\n//\n// /** Save html content of redactor to memory */\n// editor.state.html = editor.nodes.redactor.innerHTML;\n//\n// /** Clean jsonOutput state */\n// editor.state.jsonOutput = [];\n//\n// return saveBlocks(editor.nodes.redactor.childNodes);\n//\n// };\n//\n// /**\n// * @private\n// * Save each block data\n// *\n// * @param blocks\n// * @returns {Promise.}\n// */\n// let saveBlocks = function (blocks) {\n//\n// let data = [];\n//\n// for(let index = 0; index < blocks.length; index++) {\n//\n// data.push(getBlockData(blocks[index]));\n//\n// }\n//\n// return Promise.all(data)\n// .then(makeOutput)\n// .catch(editor.core.log);\n//\n// };\n//\n// /** Save and validate block data */\n// let getBlockData = function (block) {\n//\n// return saveBlockData(block)\n// .then(validateBlockData)\n// .catch(editor.core.log);\n//\n// };\n//\n// /**\n// * @private\n// * Call block`s plugin save method and return saved data\n// *\n// * @param block\n// * @returns {Object}\n// */\n// let saveBlockData = function (block) {\n//\n// let pluginName = block.dataset.tool;\n//\n// /** Check for plugin existence */\n// if (!editor.tools[pluginName]) {\n//\n// editor.core.log(`Plugin «${pluginName}» not found`, 'error');\n// return {data: null, pluginName: null};\n//\n// }\n//\n// /** Check for plugin having save method */\n// if (typeof editor.tools[pluginName].save !== 'function') {\n//\n// editor.core.log(`Plugin «${pluginName}» must have save method`, 'error');\n// return {data: null, pluginName: null};\n//\n// }\n//\n// /** Result saver */\n// let blockContent = block.childNodes[0],\n// pluginsContent = blockContent.childNodes[0],\n// position = pluginsContent.dataset.inputPosition;\n//\n// /** If plugin wasn't available then return data from cache */\n// if ( editor.tools[pluginName].available === false ) {\n//\n// return Promise.resolve({data: codex.editor.state.blocks.items[position].data, pluginName});\n//\n// }\n//\n// return Promise.resolve(pluginsContent)\n// .then(editor.tools[pluginName].save)\n// .then(data => Object({data, pluginName}));\n//\n// };\n//\n// /**\n// * Call plugin`s validate method. Return false if validation failed\n// *\n// * @param data\n// * @param pluginName\n// * @returns {Object|Boolean}\n// */\n// let validateBlockData = function ({data, pluginName}) {\n//\n// if (!data || !pluginName) {\n//\n// return false;\n//\n// }\n//\n// if (editor.tools[pluginName].validate) {\n//\n// let result = editor.tools[pluginName].validate(data);\n//\n// /**\n// * Do not allow invalid data\n// */\n// if (!result) {\n//\n// return false;\n//\n// }\n//\n// }\n//\n// return {data, pluginName};\n//\n//\n// };\n//\n// /**\n// * Compile article output\n// *\n// * @param savedData\n// * @returns {{time: number, version, items: (*|Array)}}\n// */\n// let makeOutput = function (savedData) {\n//\n// savedData = savedData.filter(blockData => blockData);\n//\n// let items = savedData.map(blockData => Object({type: blockData.pluginName, data: blockData.data}));\n//\n// editor.state.jsonOutput = items;\n//\n// return {\n// id: editor.state.blocks.id || null,\n// time: +new Date(),\n// version: editor.version,\n// items\n// };\n//\n// };\n//\n// return saver;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/saver.js","/**\n *\n * «Toolbar» is the node that moves up/down over current block\n *\n * ______________________________________ Toolbar ____________________________________________\n * | |\n * | ..................... Content .................... ......... Block Actions .......... |\n * | . . . . |\n * | . . . [Open Settings] [Remove Block] . |\n * | . [Plus Button] [Toolbox: {Tool1}, {Tool2}] . . . |\n * | . . . [Settings Panel] . |\n * | .................................................. .................................. |\n * | |\n * |___________________________________________________________________________________________|\n *\n *\n * Toolbox — its an Element contains tools buttons. Can be shown by Plus Button.\n *\n * _______________ Toolbox _______________\n * | |\n * | [Header] [Image] [List] [Quote] ... |\n * |_______________________________________|\n *\n *\n * Settings Panel — is an Element with block settings:\n *\n * ____ Settings Panel ____\n * | ...................... |\n * | . Tool Settings . |\n * | ...................... |\n * | . Default Settings . |\n * | ...................... |\n * |________________________|\n *\n *\n * @class\n * @classdesc Toolbar module\n *\n * @typedef {Toolbar} Toolbar\n * @property {Object} nodes\n * @property {Element} nodes.wrapper - Toolbar main element\n * @property {Element} nodes.content - Zone with Plus button and toolbox.\n * @property {Element} nodes.actions - Zone with Block Settings and Remove Button\n * @property {Element} nodes.plusButton - Button that opens or closes Toolbox\n * @property {Element} nodes.toolbox - Container for tools\n * @property {Element} nodes.settingsToggler - open/close Settings Panel button\n * @property {Element} nodes.removeBlockButton - Remove Block button\n * @property {Element} nodes.settings - Settings Panel\n * @property {Element} nodes.pluginSettings - Plugin Settings section of Settings Panel\n * @property {Element} nodes.defaultSettings - Default Settings section of Settings Panel\n */\nexport default class Toolbar extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n wrapper : null,\n content : null,\n actions : null,\n\n // Content Zone\n plusButton : null,\n\n // Actions Zone\n settingsToggler : null,\n removeBlockButton: null,\n settings: null,\n\n // Settings Zone: Plugin Settings and Default Settings\n pluginSettings: null,\n defaultSettings: null,\n };\n\n }\n\n /**\n * CSS styles\n * @return {Object}\n * @constructor\n */\n static get CSS() {\n\n return {\n toolbar: 'ce-toolbar',\n content: 'ce-toolbar__content',\n actions: 'ce-toolbar__actions',\n\n toolbarOpened: 'ce-toolbar--opened',\n\n // Content Zone\n plusButton: 'ce-toolbar__plus',\n plusButtonHidden: 'ce-toolbar__plus--hidden',\n\n // Actions Zone\n settingsToggler: 'ce-toolbar__settings-btn',\n removeBlockButton: 'ce-toolbar__remove-btn',\n\n // Settings Panel\n settings: 'ce-settings',\n defaultSettings: 'ce-settings_default',\n pluginSettings: 'ce-settings_plugin',\n };\n\n }\n\n /**\n * Makes toolbar\n */\n make() {\n\n this.nodes.wrapper = $.make('div', Toolbar.CSS.toolbar);\n\n /**\n * Make Content Zone and Actions Zone\n */\n ['content', 'actions'].forEach( el => {\n\n this.nodes[el] = $.make('div', Toolbar.CSS[el]);\n $.append(this.nodes.wrapper, this.nodes[el]);\n\n });\n\n\n /**\n * Fill Content Zone:\n * - Plus Button\n * - Toolbox\n */\n this.nodes.plusButton = $.make('div', Toolbar.CSS.plusButton);\n $.append(this.nodes.content, this.nodes.plusButton);\n this.nodes.plusButton.addEventListener('click', event => this.plusButtonClicked(event), false);\n\n\n /**\n * Make a Toolbox\n */\n this.Editor.Toolbox.make();\n\n /**\n * Fill Actions Zone:\n * - Settings Toggler\n * - Remove Block Button\n * - Settings Panel\n */\n this.nodes.settingsToggler = $.make('span', Toolbar.CSS.settingsToggler);\n this.nodes.removeBlockButton = this.makeRemoveBlockButton();\n\n $.append(this.nodes.actions, [this.nodes.settingsToggler, this.nodes.removeBlockButton]);\n\n /**\n * Make and append Settings Panel\n */\n this.makeBlockSettingsPanel();\n\n /**\n * Append toolbar to the Editor\n */\n $.append(this.Editor.UI.nodes.wrapper, this.nodes.wrapper);\n\n }\n\n /**\n * Panel with block settings with 2 sections:\n *\n * @return {Element}\n */\n makeBlockSettingsPanel() {\n\n this.nodes.settings = $.make('div', Toolbar.CSS.settings);\n\n this.nodes.pluginSettings = $.make('div', Toolbar.CSS.pluginSettings);\n this.nodes.defaultSettings = $.make('div', Toolbar.CSS.defaultSettings);\n\n $.append(this.nodes.settings, [this.nodes.pluginSettings, this.nodes.defaultSettings]);\n $.append(this.nodes.actions, this.nodes.settings);\n\n }\n\n /**\n * Makes Remove Block button, and confirmation panel\n * @return {Element} wrapper with button and panel\n */\n makeRemoveBlockButton() {\n\n /**\n * @todo add confirmation panel and handlers\n * @see {@link settings#makeRemoveBlockButton}\n */\n return $.make('span', Toolbar.CSS.removeBlockButton);\n\n }\n\n /**\n * Move Toolbar to the Current Block\n */\n move() {\n\n /** Close Toolbox when we move toolbar */\n this.Editor.Toolbox.close();\n\n let currentNode = this.Editor.BlockManager.currentNode;\n\n /**\n * If no one Block selected as a Current\n */\n if (!currentNode) {\n\n return;\n\n }\n\n /**\n * @todo Compute dynamically on prepare\n * @type {number}\n */\n const defaultToolbarHeight = 49;\n const defaultOffset = 34;\n\n var newYCoordinate = currentNode.offsetTop - (defaultToolbarHeight / 2) + defaultOffset;\n\n this.nodes.wrapper.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n // editor.toolbar.settings.hideRemoveActions();\n\n }\n\n /**\n * Open Toolbar with Plus Button\n */\n open() {\n\n this.nodes.wrapper.classList.add(Toolbar.CSS.toolbarOpened);\n\n }\n\n /**\n * Close the Toolbar\n */\n close() {\n\n this.nodes.wrapper.classList.remove(Toolbar.CSS.toolbarOpened);\n\n }\n\n /**\n * Plus Button public methods\n * @return {{hide: function(): void, show: function(): void}}\n */\n get plusButton() {\n\n return {\n hide: () => this.nodes.plusButton.classList.add(Toolbar.CSS.plusButtonHidden),\n show: () => this.nodes.plusButton.classList.remove(Toolbar.CSS.plusButtonHidden)\n };\n\n }\n\n /**\n * Handler for Plus Button\n * @param {MouseEvent} event\n */\n plusButtonClicked(event) {\n\n this.Editor.Toolbox.toggle();\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar.js","/**\n * @class Toolbox\n * @classdesc Holder for Tools\n *\n * @typedef {Toolbox} Toolbox\n * @property {Boolean} opened - opening state\n * @property {Object} nodes - Toolbox nodes\n * @property {Object} CSS - CSS class names\n *\n */\nexport default class Toolbox extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n toolbox: null,\n buttons: []\n };\n\n /**\n * Opening state\n * @type {boolean}\n */\n this.opened = false;\n\n }\n\n /**\n * CSS styles\n * @return {{toolbox: string, toolboxButton: string, toolboxOpened: string}}\n */\n static get CSS() {\n\n return {\n toolbox: 'ce-toolbox',\n toolboxButton: 'ce-toolbox__button',\n toolboxOpened: 'ce-toolbox--opened',\n };\n\n }\n\n /**\n * Makes the Toolbox\n */\n make() {\n\n this.nodes.toolbox = $.make('div', Toolbox.CSS.toolbox);\n $.append(this.Editor.Toolbar.nodes.content, this.nodes.toolbox);\n\n this.addTools();\n\n }\n\n /**\n * Iterates available tools and appends them to the Toolbox\n */\n addTools() {\n\n let tools = this.Editor.Tools.toolsAvailable;\n\n for (let toolName in tools) {\n\n this.addTool(toolName, tools[toolName]);\n\n }\n\n }\n\n /**\n * Append Tool to the Toolbox\n *\n * @param {string} toolName - tool name\n * @param {Tool} tool - tool class\n */\n addTool(toolName, tool) {\n\n if (tool.displayInToolbox && !tool.iconClassName) {\n\n _.log('Toolbar icon class name is missed. Tool %o skipped', 'warn', toolName);\n return;\n\n }\n\n /**\n * @todo Add checkup for the render method\n */\n // if (typeof tool.render !== 'function') {\n //\n // _.log('render method missed. Tool %o skipped', 'warn', tool);\n // return;\n //\n // }\n\n /**\n * Skip tools that pass 'displayInToolbox=false'\n */\n if (!tool.displayInToolbox) {\n\n return;\n\n }\n\n let button = $.make('li', [Toolbox.CSS.toolboxButton, tool.iconClassName], {\n title: toolName\n });\n\n /**\n * Save tool's name in the button data-name\n */\n button.dataset.name = toolName;\n\n $.append(this.nodes.toolbox, button);\n\n this.nodes.toolbox.appendChild(button);\n this.nodes.buttons.push(button);\n\n /**\n * @todo add event with module Listeners\n */\n // this.Editor.Listeners.add();\n button.addEventListener('click', event => {\n\n this.buttonClicked(event);\n\n }, false);\n\n }\n\n /**\n * Toolbox button click listener\n * 1) if block is empty -> replace\n * 2) if block is not empty -> add new block below\n *\n * @param {MouseEvent} event\n */\n buttonClicked(event) {\n\n let toolButton = event.target,\n toolName = toolButton.dataset.name,\n tool = this.Editor.Tools.toolClasses[toolName];\n\n /**\n * @type {Block}\n */\n let currentBlock = this.Editor.BlockManager.currentBlock;\n\n /**\n * We do replace if:\n * - block is empty\n * - block is not irreplaceable\n * @type {Array}\n */\n if (!tool.irreplaceable && currentBlock.isEmpty) {\n\n this.Editor.BlockManager.replace(toolName);\n\n } else {\n\n this.Editor.BlockManager.insert(toolName);\n\n }\n\n /**\n * @todo set caret to the new block\n */\n\n // window.setTimeout(function () {\n\n /** Set caret to current block */\n // editor.caret.setToBlock(currentInputIndex);\n\n // }, 10);\n\n /**\n * Move toolbar when node is changed\n */\n this.Editor.Toolbar.move();\n\n }\n\n /**\n * Open Toolbox with Tools\n */\n open() {\n\n this.nodes.toolbox.classList.add(Toolbox.CSS.toolboxOpened);\n this.opened = true;\n\n }\n\n /**\n * Close Toolbox\n */\n close() {\n\n this.nodes.toolbox.classList.remove(Toolbox.CSS.toolboxOpened);\n this.opened = false;\n\n }\n\n /**\n * Close Toolbox\n */\n toggle() {\n\n if (!this.opened) {\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbox.js","/**\n * @module Codex Editor Tools Submodule\n *\n * Creates Instances from Plugins and binds external config to the instances\n */\n\n/**\n * Each Tool must contain the following important objects:\n *\n * @typedef {Object} ToolConfig {@link docs/tools.md}\n * @property {String} iconClassname - this a icon in toolbar\n * @property {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @property {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n * @property render @todo add description\n * @property save @todo add description\n * @property settings @todo add description\n * @property validate - method that validates output data before saving\n */\n\n/**\n * @typedef {Function} Tool {@link docs/tools.md}\n * @property {Boolean} displayInToolbox - By default, tools won't be added in the Toolbox. Pass true to add.\n * @property {String} iconClassName - CSS class name for the Toolbox button\n * @property {Boolean} irreplaceable - Toolbox behaviour: replace or add new block below\n * @property render\n * @property save\n * @property settings\n * @property validate\n *\n * @todo update according to current API\n * @todo describe Tool in the {@link docs/tools.md}\n */\n\n/**\n * Class properties:\n *\n * @typedef {Tools} Tools\n * @property {Tools[]} toolsAvailable - available Tools\n * @property {Tools[]} toolsUnavailable - unavailable Tools\n * @property {Object} toolsClasses - all classes\n * @property {EditorConfig} config - Editor config\n */\nexport default class Tools extends Module {\n\n /**\n * Returns available Tools\n * @return {Tool[]}\n */\n get available() {\n\n return this.toolsAvailable;\n\n }\n\n /**\n * Returns unavailable Tools\n * @return {Tool[]}\n */\n get unavailable() {\n\n return this.toolsUnavailable;\n\n }\n\n /**\n * Static getter for default Tool config fields\n *\n * @usage Tools.defaultConfig.displayInToolbox\n * @return {ToolConfig}\n */\n static get defaultConfig() {\n\n return {\n iconClassName : '',\n displayInToolbox : false,\n enableLineBreaks : false,\n irreplaceable : false\n };\n\n }\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n /**\n * Map {name: Class, ...} where:\n * name — block type name in JSON. Got from EditorConfig.tools keys\n * @type {Object}\n */\n this.toolClasses = {};\n\n /**\n * Available tools list\n * {name: Class, ...}\n * @type {Object}\n */\n this.toolsAvailable = {};\n\n /**\n * Tools that rejected a prepare method\n * {name: Class, ... }\n * @type {Object}\n */\n this.toolsUnavailable = {};\n\n }\n\n /**\n * Creates instances via passed or default configuration\n * @return {Promise}\n */\n prepare() {\n\n if (!this.config.hasOwnProperty('tools')) {\n\n return Promise.reject(\"Can't start without tools\");\n\n }\n\n for(let toolName in this.config.tools) {\n\n this.toolClasses[toolName] = this.config.tools[toolName];\n\n }\n\n /**\n * getting classes that has prepare method\n */\n let sequenceData = this.getListOfPrepareFunctions();\n\n /**\n * if sequence data contains nothing then resolve current chain and run other module prepare\n */\n if (sequenceData.length === 0) {\n\n return Promise.resolve();\n\n }\n\n /**\n * to see how it works {@link Util#sequence}\n */\n return _.sequence(sequenceData, (data) => {\n\n this.success(data);\n\n }, (data) => {\n\n this.fallback(data);\n\n });\n\n }\n\n /**\n * Binds prepare function of plugins with user or default config\n * @return {Array} list of functions that needs to be fired sequentially\n */\n getListOfPrepareFunctions() {\n\n let toolPreparationList = [];\n\n for(let toolName in this.toolClasses) {\n\n let toolClass = this.toolClasses[toolName];\n\n if (typeof toolClass.prepare === 'function') {\n\n toolPreparationList.push({\n function : toolClass.prepare,\n data : {\n toolName\n }\n });\n\n } else {\n\n /**\n * If Tool hasn't a prepare method, mark it as available\n */\n this.toolsAvailable[toolName] = toolClass;\n\n }\n\n }\n\n return toolPreparationList;\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to available list\n */\n success(data) {\n\n this.toolsAvailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to unavailable list\n */\n fallback(data) {\n\n this.toolsUnavailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * Return tool`a instance\n *\n * @param {String} tool — tool name\n * @param {Object} data — initial data\n *\n * @todo throw exceptions if tool doesnt exist\n *\n */\n construct(tool, data) {\n\n let plugin = this.toolClasses[tool],\n config = this.config.toolsConfig[tool];\n\n if (!config) {\n\n config = this.defaultConfig;\n\n }\n\n let instance = new plugin(data, config);\n\n return instance;\n\n }\n\n /**\n * Check if passed Tool is an instance of Initial Block Tool\n * @param {Tool} tool - Tool to check\n * @return {Boolean}\n */\n isInitial(tool) {\n\n return tool instanceof this.available[this.config.initialBlock];\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/tools.js","/**\n * Module UI\n *\n * @type {UI}\n */\n// let className = {\n\n/**\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\n */\n// BLOCK_CLASSNAME : 'ce-block',\n\n/**\n * @const {String} wrapper for plugins content\n */\n// BLOCK_CONTENT : 'ce-block__content',\n\n/**\n * @const {String} BLOCK_STRETCHED - makes block stretched\n */\n// BLOCK_STRETCHED : 'ce-block--stretched',\n\n/**\n * @const {String} BLOCK_HIGHLIGHTED - adds background\n */\n// BLOCK_HIGHLIGHTED : 'ce-block--focused',\n\n/**\n * @const {String} - for all default settings\n */\n// SETTINGS_ITEM : 'ce-settings__item'\n// };\n\n// import Block from '../block';\n\n/**\n * @class\n *\n * @classdesc Makes CodeX Editor UI:\n * \n * \n * \n * \n * \n *\n * @typedef {UI} UI\n * @property {EditorConfig} config - editor configuration {@link CodexEditor#configuration}\n * @property {Object} Editor - available editor modules {@link CodexEditor#moduleInstances}\n * @property {Object} nodes -\n * @property {Element} nodes.holder - element where we need to append redactor\n * @property {Element} nodes.wrapper - \n * @property {Element} nodes.redactor - \n */\nexport default class UI extends Module {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n holder: null,\n wrapper: null,\n redactor: null\n };\n\n }\n\n /**\n * Making main interface\n */\n prepare() {\n\n return this.make()\n /**\n * Make toolbar\n */\n .then(() => this.Editor.Toolbar.make())\n /**\n * Load and append CSS\n */\n .then(() => this.loadStyles())\n /**\n * Bind events for the UI elements\n */\n .then(() => this.bindEvents())\n\n /** Make container for inline toolbar */\n // .then(makeInlineToolbar_)\n\n /** Add inline toolbar tools */\n // .then(addInlineToolbarTools_)\n\n /** Draw wrapper for notifications */\n // .then(makeNotificationHolder_)\n\n /** Add eventlisteners to redactor elements */\n // .then(bindEvents_)\n\n .catch(e => {\n\n console.error(e);\n\n // editor.core.log(\"Can't draw editor interface\");\n\n });\n\n }\n\n /**\n * CodeX Editor UI CSS class names\n * @return {{editorWrapper: string, editorZone: string, block: string}}\n */\n get CSS() {\n\n return {\n editorWrapper : 'codex-editor',\n editorZone : 'codex-editor__redactor',\n };\n\n }\n\n /**\n * Makes CodeX Editor interface\n * @return {Promise}\n */\n make() {\n\n return new Promise( (resolve, reject) => {\n\n /**\n * Element where we need to append CodeX Editor\n * @type {Element}\n */\n this.nodes.holder = document.getElementById(this.config.holderId);\n\n if (!this.nodes.holder) {\n\n reject(Error(\"Holder wasn't found by ID: #\" + this.config.holderId));\n return;\n\n }\n\n /**\n * Create and save main UI elements\n */\n this.nodes.wrapper = $.make('div', this.CSS.editorWrapper);\n this.nodes.redactor = $.make('div', this.CSS.editorZone);\n\n this.nodes.wrapper.appendChild(this.nodes.redactor);\n this.nodes.holder.appendChild(this.nodes.wrapper);\n\n resolve();\n\n });\n\n }\n\n /**\n * Appends CSS\n */\n loadStyles() {\n\n /**\n * Load CSS\n */\n let styles = require('../../styles/main.css');\n\n /**\n * Make tag\n */\n let tag = $.make('style', null, {\n textContent: styles.toString()\n });\n\n /**\n * Append styles\n */\n $.append(document.head, tag);\n\n }\n\n /**\n * Bind events on the CodeX Editor interface\n */\n bindEvents() {\n\n /**\n * @todo bind events with the Listeners module\n */\n this.nodes.redactor.addEventListener('click', event => this.redactorClicked(event), false );\n\n }\n\n /**\n * All clicks on the redactor zone\n *\n * @param {MouseEvent} event\n *\n * @description\n * 1. Save clicked Block as a current {@link BlockManager#currentNode}\n * it uses for the following:\n * - add CSS modifier for the selected Block\n * - on Enter press, we make a new Block under that\n *\n * 2. Move and show the Toolbar\n *\n * 3. Set a Caret\n *\n * 4. By clicks on the Editor's bottom zone:\n * - if last Block is empty, set a Caret to this\n * - otherwise, add a new empty Block and set a Caret to that\n *\n * 5. Hide the Inline Toolbar\n *\n * @see selectClickedBlock\n *\n */\n redactorClicked(event) {\n\n let clickedNode = event.target;\n\n /**\n * Select clicked Block as Current\n */\n try {\n\n this.Editor.BlockManager.setCurrentBlockByChildNode(clickedNode);\n\n /**\n * If clicked outside first-level Blocks, set Caret to the last empty Block\n */\n\n } catch (e) {\n\n this.Editor.Caret.setToTheLastBlock();\n\n }\n\n\n\n\n /**\n * @todo hide the Inline Toolbar\n */\n // var selectedText = editor.toolbar.inline.getSelectionText(),\n // firstLevelBlock;\n\n /** If selection range took off, then we hide inline toolbar */\n // if (selectedText.length === 0) {\n\n // editor.toolbar.inline.close();\n\n // }\n\n /**\n *\n\n /** Update current input index in memory when caret focused into existed input */\n // if (event.target.contentEditable == 'true') {\n //\n // editor.caret.saveCurrentInputIndex();\n //\n // }\n\n // if (editor.content.currentNode === null) {\n //\n // /**\n // * If inputs in redactor does not exits, then we put input index 0 not -1\n // */\n // var indexOfLastInput = editor.state.inputs.length > 0 ? editor.state.inputs.length - 1 : 0;\n //\n // /** If we have any inputs */\n // if (editor.state.inputs.length) {\n //\n // /** getting firstlevel parent of input */\n // firstLevelBlock = editor.content.getFirstLevelBlock(editor.state.inputs[indexOfLastInput]);\n //\n // }\n //\n // /** If input is empty, then we set caret to the last input */\n // if (editor.state.inputs.length && editor.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == editor.settings.initialBlockPlugin) {\n //\n // editor.caret.setToBlock(indexOfLastInput);\n //\n // } else {\n //\n // /** Create new input when caret clicked in redactors area */\n // var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n //\n // editor.content.insertBlock({\n // type : NEW_BLOCK_TYPE,\n // block : editor.tools[NEW_BLOCK_TYPE].render()\n // });\n //\n // /** If there is no inputs except inserted */\n // if (editor.state.inputs.length === 1) {\n //\n // editor.caret.setToBlock(indexOfLastInput);\n //\n // } else {\n //\n // /** Set caret to this appended input */\n // editor.caret.setToNextBlock(indexOfLastInput);\n //\n // }\n //\n // }\n //\n // } else {\n //\n // /** Close all panels */\n // editor.toolbar.settings.close();\n // editor.toolbar.toolbox.close();\n //\n // }\n //\n /**\n * Move toolbar and open\n */\n this.Editor.Toolbar.move();\n this.Editor.Toolbar.open();\n //\n // var inputIsEmpty = !editor.content.currentNode.textContent.trim(),\n // currentNodeType = editor.content.currentNode.dataset.tool,\n // isInitialType = currentNodeType == editor.settings.initialBlockPlugin;\n //\n //\n\n /**\n * Hide the Plus Button\n * */\n this.Editor.Toolbar.plusButton.hide();\n\n /**\n * Show the Plus Button if:\n * - Block is an initial-block (Text)\n * - Block is empty\n */\n let isInitialBlock = this.Editor.Tools.isInitial(this.Editor.BlockManager.currentBlock.tool),\n isEmptyBlock = this.Editor.BlockManager.currentBlock.isEmpty;\n\n if (isInitialBlock && isEmptyBlock) {\n\n this.Editor.Toolbar.plusButton.show();\n\n }\n\n }\n\n}\n\n// /**\n// * Codex Editor UI module\n// *\n// * @author Codex Team\n// * @version 1.2.0\n// */\n//\n// module.exports = (function (ui) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * Basic editor classnames\n// */\n// ui.prepare = function () {\n//\n\n//\n// };\n//\n// /** Draw notifications holder */\n// var makeNotificationHolder_ = function () {\n//\n// /** Append block with notifications to the document */\n// editor.nodes.notifications = editor.notifications.createHolder();\n//\n// };\n//\n//\n// var addInlineToolbarTools_ = function () {\n//\n// var tools = {\n//\n// bold: {\n// icon : 'ce-icon-bold',\n// command : 'bold'\n// },\n//\n// italic: {\n// icon : 'ce-icon-italic',\n// command : 'italic'\n// },\n//\n// link: {\n// icon : 'ce-icon-link',\n// command : 'createLink'\n// }\n// };\n//\n// var toolButton,\n// tool;\n//\n// for(var name in tools) {\n//\n// tool = tools[name];\n//\n// toolButton = editor.draw.toolbarButtonInline(name, tool.icon);\n//\n// editor.nodes.inlineToolbar.buttons.appendChild(toolButton);\n// /**\n// * Add callbacks to this buttons\n// */\n// editor.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n//\n// }\n//\n// };\n//\n// /**\n// * @private\n// * Bind editor UI events\n// */\n// var bindEvents_ = function () {\n//\n// editor.core.log('ui.bindEvents fired', 'info');\n//\n// // window.addEventListener('error', function (errorMsg, url, lineNumber) {\n// // editor.notifications.errorThrown(errorMsg, event);\n// // }, false );\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keydown', editor.callback.globalKeydown, false);\n//\n// /** All keydowns on Redactor zone */\n// editor.listeners.add(editor.nodes.redactor, 'keydown', editor.callback.redactorKeyDown, false);\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keyup', editor.callback.globalKeyup, false );\n//\n// /**\n// * Mouse click to radactor\n// */\n// editor.listeners.add(editor.nodes.redactor, 'click', editor.callback.redactorClicked, false );\n//\n// /**\n// * Clicks to the Plus button\n// */\n// editor.listeners.add(editor.nodes.plusButton, 'click', editor.callback.plusButtonClicked, false);\n//\n// /**\n// * Clicks to SETTINGS button in toolbar\n// */\n// editor.listeners.add(editor.nodes.showSettingsButton, 'click', editor.callback.showSettingsButtonClicked, false );\n//\n// /** Bind click listeners on toolbar buttons */\n// for (var button in editor.nodes.toolbarButtons) {\n//\n// editor.listeners.add(editor.nodes.toolbarButtons[button], 'click', editor.callback.toolbarButtonClicked, false);\n//\n// }\n//\n// };\n//\n// ui.addBlockHandlers = function (block) {\n//\n// if (!block) return;\n//\n// /**\n// * Block keydowns\n// */\n// editor.listeners.add(block, 'keydown', editor.callback.blockKeydown, false);\n//\n// /**\n// * Pasting content from another source\n// * We have two type of sanitization\n// * First - uses deep-first search algorithm to get sub nodes,\n// * sanitizes whole Block_content and replaces cleared nodes\n// * This method is deprecated\n// * Method is used in editor.callback.blockPaste(event)\n// *\n// * Secont - uses Mutation observer.\n// * Observer \"observe\" DOM changes and send changings to callback.\n// * Callback gets changed node, not whole Block_content.\n// * Inserted or changed node, which we've gotten have been cleared and replaced with diry node\n// *\n// * Method is used in editor.callback.blockPasteViaSanitize(event)\n// *\n// * @uses html-janitor\n// * @example editor.callback.blockPasteViaSanitize(event), the second method.\n// *\n// */\n// editor.listeners.add(block, 'paste', editor.paste.blockPasteCallback, false);\n//\n// /**\n// * Show inline toolbar for selected text\n// */\n// editor.listeners.add(block, 'mouseup', editor.toolbar.inline.show, false);\n// editor.listeners.add(block, 'keyup', editor.toolbar.inline.show, false);\n//\n// };\n//\n// /** getting all contenteditable elements */\n// ui.saveInputs = function () {\n//\n// var redactor = editor.nodes.redactor;\n//\n// editor.state.inputs = [];\n//\n// /** Save all inputs in global variable state */\n// var inputs = redactor.querySelectorAll('[contenteditable], input, textarea');\n//\n// Array.prototype.map.call(inputs, function (current) {\n//\n// if (!current.type || current.type == 'text' || current.type == 'textarea') {\n//\n// editor.state.inputs.push(current);\n//\n// }\n//\n// });\n//\n// };\n//\n// /**\n// * Adds first initial block on empty redactor\n// */\n// ui.addInitialBlock = function () {\n//\n// var initialBlockType = editor.settings.initialBlockPlugin,\n// initialBlock;\n//\n// if ( !editor.tools[initialBlockType] ) {\n//\n// editor.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n// return;\n//\n// }\n//\n// initialBlock = editor.tools[initialBlockType].render();\n//\n// initialBlock.setAttribute('data-placeholder', editor.settings.placeholder);\n//\n// editor.content.insertBlock({\n// type : initialBlockType,\n// block : initialBlock\n// });\n//\n// editor.content.workingNodeChanged(initialBlock);\n//\n// };\n//\n// ui.setInlineToolbarButtonBehaviour = function (button, type) {\n//\n// editor.listeners.add(button, 'mousedown', function (event) {\n//\n// editor.toolbar.inline.toolClicked(event, type);\n//\n// }, false);\n//\n// };\n//\n// return ui;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/ui.js","exports = module.exports = require(\"../../node_modules/css-loader/lib/css-base.js\")(undefined);\n// imports\n\n\n// module\nexports.push([module.id, \":root {\\n\\n /**\\n * Toolbar buttons\\n */\\n\\n /**\\n * Block content width\\n */\\n\\n /**\\n * Toolbar Plus Button and Toolbox buttons height and width\\n */\\n\\n}\\n/**\\n* Editor wrapper\\n*/\\n.codex-editor {\\n position: relative;\\n border: 1px solid #ccc;\\n padding: 10px;\\n box-sizing: border-box;\\n}\\n.codex-editor .hide {\\n display: none;\\n }\\n.codex-editor__redactor {\\n padding-bottom: 300px;\\n }\\n.ce-toolbar {\\n position: absolute;\\n left: 0;\\n right: 0;\\n top: 0;\\n /*opacity: 0;*/\\n /*visibility: hidden;*/\\n transition: opacity 100ms ease;\\n will-change: opacity, transform;\\n display: none;\\n}\\n.ce-toolbar--opened {\\n display: block;\\n /*opacity: 1;*/\\n /*visibility: visible;*/\\n }\\n.ce-toolbar__content {\\n max-width: 650px;\\n margin: 0 auto;\\n position: relative;\\n }\\n.ce-toolbar__plus {\\n position: absolute;\\n left: calc(-34px - 10px);\\n display: inline-block;\\n background-color: #eff2f5;\\n width: 34px;\\n height: 34px;\\n line-height: 34px;\\n text-align: center;\\n border-radius: 50%\\n }\\n.ce-toolbar__plus::after {\\n content: '+';\\n font-size: 26px;\\n display: block;\\n margin-top: -2px;\\n margin-right: -2px;\\n\\n}\\n.ce-toolbar__plus--hidden {\\n display: none;\\n\\n}\\n.ce-toolbox {\\n visibility: hidden;\\n transition: opacity 100ms ease;\\n will-change: opacity;\\n}\\n.ce-toolbox--opened {\\n opacity: 1;\\n visibility: visible;\\n }\\n.ce-toolbox__button {\\n display: inline-block;\\n list-style: none;\\n margin: 0;\\n background: #eff2f5;\\n width: 34px;\\n height: 34px;\\n border-radius: 30px;\\n overflow: hidden;\\n text-align: center;\\n line-height: 34px\\n }\\n.ce-toolbox__button::before {\\n content: attr(title);\\n font-size: 22px;\\n font-weight: 500;\\n letter-spacing: 1em;\\n -webkit-font-feature-settings: \\\"smcp\\\", \\\"c2sc\\\";\\n font-feature-settings: \\\"smcp\\\", \\\"c2sc\\\";\\n font-variant-caps: all-small-caps;\\n padding-left: 11.5px;\\n margin-top: -1px;\\n display: inline-block;\\n\\n}\\n.ce-block {\\n border: 1px dotted #ccc;\\n margin: 2px 0;\\n}\\n.ce-block--selected {\\n background-color: #eff2f5;\\n }\\n.ce-block__content {\\n max-width: 650px;\\n margin: 0 auto;\\n }\\n\", \"\"]);\n\n// exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/styles/main.css\n// module id = 20\n// module chunks = 0","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t// when a module is imported multiple times with different media queries.\n\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/css-loader/lib/css-base.js\n// module id = 21\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 5dee27df686d86490cad","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/Selection.js","webpack:///./src/codex.js","webpack:///./src/components/polyfills.js","webpack:///./src/components/modules nonrecursive [^_](blockManager.js|caret.js|events.js|listeners.js|renderer.js|sanitizer.js|saver.js|toolbar.js|toolbox.js|tools.js|ui.js)$","webpack:///./src/components/modules/blockManager.js","webpack:///./src/components/block.js","webpack:///./src/components/modules/caret.js","webpack:///./src/components/modules/events.js","webpack:///./src/components/modules/listeners.js","webpack:///./src/components/modules/renderer.js","webpack:///./src/components/modules/sanitizer.js","webpack:///./node_modules/html-janitor/src/html-janitor.js","webpack:///./src/components/modules/saver.js","webpack:///./src/components/modules/toolbar.js","webpack:///./src/components/modules/toolbox.js","webpack:///./src/components/modules/tools.js","webpack:///./src/components/modules/ui.js","webpack:///./src/styles/main.css","webpack:///./node_modules/css-loader/lib/css-base.js"],"names":["Module","config","new","target","TypeError","Editor","Util","msg","type","args","window","console","e","chains","success","fallback","Promise","resolve","reduce","previousValue","currentValue","iteration","then","waitNextBlock","length","chainData","successCallback","fallbackCallback","function","data","catch","collection","Array","prototype","slice","call","object","Object","keys","constructor","element","contentEditable","method","timeout","context","arguments","setTimeout","apply","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","Dom","tagName","classNames","attributes","el","document","createElement","isArray","classList","add","attrName","content","createTextNode","parent","elements","forEach","appendChild","selector","querySelector","querySelectorAll","node","atLast","childNodes","isElement","isNativeInput","emptyTextNode","text","childsLength","last","getDeepestNode","nodeType","Node","ELEMENT_NODE","nativeInputs","includes","nodeText","value","textContent","replace","trim","treeWalker","leafs","push","isLeaf","nextSibling","shift","firstChild","every","isNodeEmpty","leaf","Selection","instance","selection","getSelection","anchorNode","anchorOffset","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","log","error","constructModules","configureModules","displayName","name","state","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","render","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","_","isEmpty","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","toolName","toolInstance","construct","block","bindEvents","Listeners","on","pluginsContent","event","keyDownOnBlock","keyCode","keyCodes","navigateNext","navigatePrevious","lastTextNode","$","currentBlock","textNodeLength","getAnchorNode","getAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","firstLevelBlock","CSS","wrapper","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","array","selected","workingArea","html","remove","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","isNaN","Number","Block","tool","_html","compose","make","contentNode","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","offset","atEnd","focus","nodeToSet","delay","range","createRange","setStart","setEnd","removeAllRanges","addRange","lastBlock","Events","subscribers","eventName","callback","previousData","currentHandler","newData","allListeners","eventType","handler","useCapture","assignedEventData","alreadyExist","findOne","addEventListener","existingListeners","findAll","i","removeEventListener","listenersOnElement","listener","listenersWithType","listenersWithHandler","foundListeners","foundAllListeners","foundByElements","foundByEventType","foundByHandler","findByElement","findByType","findByHandler","concat","current","insertBlock","sequence","item","Sanitizer","defaultConfig","_sanitizerInstance","sanitizerConfig","settings","sanitizerInstance","require","taintString","customConfig","clean","library","tags","href","rel","newInstance","Saver","output","blocksData","all","allExtractedData","makeOutput","outputData","totalTime","groupCollapsed","extraction","groupEnd","Date","version","VERSION","Toolbar","actions","plusButton","settingsToggler","removeBlockButton","pluginSettings","defaultSettings","toolbar","append","plusButtonClicked","Toolbox","makeRemoveBlockButton","makeBlockSettingsPanel","close","defaultToolbarHeight","defaultOffset","newYCoordinate","offsetTop","style","transform","Math","floor","toolbarOpened","toggle","hide","plusButtonHidden","show","toolbox","buttons","opened","addTools","toolsAvailable","addTool","displayInToolbox","iconClassName","button","toolboxButton","title","dataset","buttonClicked","toolButton","toolClasses","irreplaceable","move","toolboxOpened","open","toolsUnavailable","enableLineBreaks","hasOwnProperty","reject","sequenceData","getListOfPrepareFunctions","toolPreparationList","toolClass","plugin","available","holder","loadStyles","getElementById","editorWrapper","editorZone","styles","tag","toString","head","redactorClicked","clickedNode","setCurrentBlockByChildNode","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock"],"mappings":"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lB,CAAP;AAEH;;;;EA3GkCnT,M;;;kBAAlB4S,S;;;;;;;;AClCrB;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AACA,GAAG;AACH;AACA,GAAG;AACH;AACA;AACA,CAAC;;AAED;AACA,aAAa,OAAO;AACpB,aAAa,QAAQ;AACrB;AACA;;AAEA;AACA;;AAEA;AACA,wBAAwB,iCAAiC,EAAE;AAC3D,6BAA6B,uEAAuE,EAAE;;AAEtG;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,gBAAgB,QAAQ;;AAExB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,qBAAqB,4BAA4B;AACjD;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;;AAEA,CAAC;;;;;;;;;;;;;;;;;;;;;;ACxLD;;;;;;;;AAQA;;;;;;;AAOA;;;;;;;;IAQqBe,K;;;AAEjB;;;;AAIA,yBAAsB;AAAA,YAAT1T,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,cAAK2T,MAAL,GAAc,IAAd;AACA,cAAKC,UAAL,GAAkB,EAAlB;;AALkB;AAOrB;;AAED;;;;;;;;+BAIO;AAAA;;AAEH,gBAAIpJ,SAAS,KAAKpK,MAAL,CAAYwI,YAAZ,CAAyB4B,MAAtC;AAAA,gBACIhJ,YAAY,EADhB;;AAGAgJ,mBAAO5F,OAAP,CAAe,UAACsG,KAAD,EAAW;;AAEtB1J,0BAAU+E,IAAV,CAAe2E,MAAMtJ,IAArB;AAEH,aAJD;;AAMA,mBAAOb,QAAQ8S,GAAR,CAAYrS,SAAZ,EACFH,IADE,CACG,UAACyS,gBAAD;AAAA,uBAAsB,OAAKC,UAAL,CAAgBD,gBAAhB,CAAtB;AAAA,aADH,EAEFzS,IAFE,CAEG,UAAC2S,UAAD,EAAgB;;AAElB,uBAAOA,UAAP;AAEH,aANE,CAAP;AAQH;;AAED;;;;;;;;mCAKWF,gB,EAAkB;;AAEzB,gBAAI/K,QAAQ,EAAZ;AAAA,gBACIkL,YAAY,CADhB;;AAGAvT,oBAAQwT,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBlP,OAAjB,CAAyB,UAACuP,UAAD,EAAazH,KAAb,EAAuB;;AAE5C;AACAhM,wBAAQoH,GAAR,UAAgBqM,WAAWhG,IAA3B,uBAAgDgG,UAAhD;AACAF,6BAAaE,WAAWjF,IAAxB;AACAnG,sBAAMxC,IAAN,CAAW4N,WAAWvS,IAAtB;AAEH,aAPD;;AASAlB,oBAAQoH,GAAR,CAAY,OAAZ,EAAqBmM,SAArB;AACAvT,oBAAQ0T,QAAR;;AAEA,mBAAO;AACHlF,sBAAU,CAAC,IAAImF,IAAJ,EADR;AAEHtL,uBAAUA,KAFP;AAGHuL,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8BxU,M;;AA0EnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAvOqB2T,K;;;;;;;;;;;;;;;;;;;;;;;ACvBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmDqBc,O;;;AAEjB;;;AAGA,yBAAsB;AAAA,QAATxU,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAK0K,KAAL,GAAa;AACTmC,eAAU,IADD;AAETrI,eAAU,IAFD;AAGTiQ,eAAU,IAHD;;AAKT;AACAC,kBAAa,IANJ;;AAQT;AACAC,uBAAkB,IATT;AAUTC,yBAAmB,IAVV;AAWT7B,gBAAU,IAXD;;AAaT;AACA8B,sBAAgB,IAdP;AAeTC,uBAAiB;AAfR,KAAb;;AAJkB;AAsBrB;;AAED;;;;;;;;;;;AA8BA;;;2BAGO;AAAA;;AAEH,WAAKpK,KAAL,CAAWmC,OAAX,GAAqBf,EAAEwC,IAAF,CAAO,KAAP,EAAckG,QAAQ5H,GAAR,CAAYmI,OAA1B,CAArB;;AAEA;;;AAGA,OAAC,SAAD,EAAa,SAAb,EAAwBnQ,OAAxB,CAAiC,cAAM;;AAEnC,eAAK8F,KAAL,CAAWzG,EAAX,IAAiB6H,EAAEwC,IAAF,CAAO,KAAP,EAAckG,QAAQ5H,GAAR,CAAY3I,EAAZ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ACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA,WAAKxY,MAAL,CAAYoU,OAAZ,CAAoB2C,IAApB;AACA,WAAK/W,MAAL,CAAYoU,OAAZ,CAAoB6C,IAApB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA,WAAKjX,MAAL,CAAYoU,OAAZ,CAAoBE,UAApB,CAA+BsB,IAA/B;;AAEA;;;;;AAKA,UAAI6C,iBAAiB,KAAKzY,MAAL,CAAYsI,KAAZ,CAAkBoQ,SAAlB,CAA4B,KAAK1Y,MAAL,CAAYwI,YAAZ,CAAyBmD,YAAzB,CAAsCoC,IAAlE,CAArB;AAAA,UACI4K,eAAe,KAAK3Y,MAAL,CAAYwI,YAAZ,CAAyBmD,YAAzB,CAAsCpC,OADzD;;AAGA,UAAIkP,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAK3Y,MAAL,CAAYoU,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;AAEH;AAEJ;;;wBA3OS;;AAEN,aAAO;AACHiC,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2BrY,M;;AA+ShC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBApgBqB4I,E;;;;;;;;ACrDrB;AACA;;;AAGA;AACA,gCAAiC,sLAAsL,4CAA4C,yBAAyB,6BAA6B,oBAAoB,6BAA6B,GAAG,uBAAuB,wBAAwB,OAAO,2BAA2B,gCAAgC,OAAO,eAAe,uBAAuB,YAAY,aAAa,WAAW,iBAAiB,2BAA2B,qCAAqC,oCAAoC,kBAAkB,GAAG,uBAAuB,qBAAqB,mBAAmB,8BAA8B,OAAO,wBAAwB,uBAAuB,qBAAqB,yBAAyB,KAAK,qBAAqB,yBAAyB,+BAA+B,4BAA4B,gCAAgC,kBAAkB,mBAAmB,wBAAwB,yBAAyB,6BAA6B,4BAA4B,mBAAmB,sBAAsB,qBAAqB,uBAAuB,yBAAyB,KAAK,6BAA6B,sBAAsB,KAAK,eAAe,yBAAyB,qCAAqC,2BAA2B,GAAG,uBAAuB,qBAAqB,8BAA8B,OAAO,uBAAuB,gCAAgC,2BAA2B,oBAAoB,8BAA8B,sBAAsB,uBAAuB,8BAA8B,2BAA2B,6BAA6B,kCAAkC,+BAA+B,2BAA2B,sBAAsB,uBAAuB,0BAA0B,wDAAwD,wDAAwD,wCAAwC,2BAA2B,uBAAuB,4BAA4B,KAAK,aAAa,4BAA4B,kBAAkB,GAAG,uBAAuB,gCAAgC,KAAK,sBAAsB,uBAAuB,qBAAqB,KAAK;;AAEp1E;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD,IAAI;AACJ;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;;AAElE;AACA","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 5dee27df686d86490cad","/**\n * @abstract\n * @class Module\n * @classdesc All modules inherits from this class.\n *\n * @typedef {Module} Module\n * @property {Object} config - Editor user settings\n * @property {Object} Editor - List of Editor modules\n */\nexport default class Module {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({ config } = {}) {\n\n if (new.target === Module) {\n\n throw new TypeError('Constructors for abstract class Module are not allowed.');\n\n }\n\n /**\n * @type {EditorConfig}\n */\n this.config = config;\n\n /**\n * @type {EditorComponents}\n */\n this.Editor = null;\n\n }\n\n /**\n * Editor modules setter\n *\n * @param Editor\n * @param Editor.modules {@link CodexEditor#moduleInstances}\n * @param Editor.config {@link CodexEditor#configuration}\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/__module.js","/**\n * Codex Editor Util\n */\nexport default class Util {\n\n /**\n * Custom logger\n *\n * @param {string} msg - message\n * @param {string} type - logging type 'log'|'warn'|'error'|'info'\n * @param {*} args - argument to log with a message\n */\n static log(msg, type, args) {\n\n type = type || 'log';\n\n if (!args) {\n\n args = msg || 'undefined';\n msg = '[codex-editor]: %o';\n\n } else {\n\n msg = '[codex-editor]: ' + msg;\n\n }\n\n try{\n\n if ( 'console' in window && window.console[ type ] ) {\n\n if ( args ) window.console[ type ]( msg, args );\n else window.console[ type ]( msg );\n\n }\n\n } catch(e) {\n // do nothing\n }\n\n }\n\n /**\n * Returns basic keycodes as constants\n * @return {{}}\n */\n static get keyCodes() {\n\n return {\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n SHIFT: 16,\n CTRL: 17,\n ALT: 18,\n ESC: 27,\n SPACE: 32,\n LEFT: 37,\n UP: 38,\n DOWN: 40,\n RIGHT: 39,\n DELETE: 46,\n META: 91\n };\n\n }\n\n /**\n * @typedef {Object} ChainData\n * @property {Object} data - data that will be passed to the success or fallback\n * @property {Function} function - function's that must be called asynchronically\n */\n\n /**\n * Fires a promise sequence asyncronically\n *\n * @param {Object[]} chains - list or ChainData's\n * @param {Function} success - success callback\n * @param {Function} fallback - callback that fires in case of errors\n *\n * @return {Promise}\n */\n static sequence(chains, success = () => {}, fallback = () => {}) {\n\n return new Promise(function (resolve) {\n\n /**\n * pluck each element from queue\n * First, send resolved Promise as previous value\n * Each plugins \"prepare\" method returns a Promise, that's why\n * reduce current element will not be able to continue while can't get\n * a resolved Promise\n */\n chains.reduce(function (previousValue, currentValue, iteration) {\n\n return previousValue\n .then(() => waitNextBlock(currentValue, success, fallback))\n .then(() => {\n\n // finished\n if (iteration === chains.length - 1) {\n\n resolve();\n\n }\n\n });\n\n }, Promise.resolve());\n\n });\n\n /**\n * Decorator\n *\n * @param {ChainData} chainData\n *\n * @param {Function} successCallback\n * @param {Function} fallbackCallback\n *\n * @return {Promise}\n */\n function waitNextBlock(chainData, successCallback, fallbackCallback) {\n\n return new Promise(function (resolve) {\n\n chainData.function()\n .then(() => {\n\n successCallback(chainData.data || {});\n\n })\n .then(resolve)\n .catch(function () {\n\n fallbackCallback(chainData.data || {});\n\n // anyway, go ahead even it falls\n resolve();\n\n });\n\n });\n\n }\n\n }\n\n /**\n * Make array from array-like collection\n *\n * @param {*} collection\n *\n * @return {Array}\n */\n static array(collection) {\n\n return Array.prototype.slice.call(collection);\n\n }\n\n /**\n * Checks if object is empty\n *\n * @param {Object} object\n * @return {boolean}\n */\n static isEmpty(object) {\n\n return Object.keys(object).length === 0 && object.constructor === Object;\n\n }\n\n /**\n * Check if passed object is a Promise\n * @param {*} object - object to check\n * @return {Boolean}\n */\n static isPromise(object) {\n\n return Promise.resolve(object) === object;\n\n }\n\n /**\n * Check if passed element is contenteditable\n * @param element\n * @return {boolean}\n */\n static isContentEditable(element) {\n\n return element.contentEditable === 'true';\n\n }\n\n /**\n * Delays method execution\n *\n * @param method\n * @param timeout\n */\n static delay(method, timeout) {\n\n return function () {\n\n let context = this,\n args = arguments;\n\n window.setTimeout(() => method.apply(context, args), timeout);\n\n };\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/utils.js","/**\n * DOM manipulations helper\n */\nexport default class Dom {\n\n /**\n * Helper for making Elements with classname and attributes\n *\n * @param {string} tagName - new Element tag name\n * @param {array|string} classNames - list or name of CSS classname(s)\n * @param {Object} attributes - any attributes\n * @return {Element}\n */\n static make(tagName, classNames = null, attributes = {}) {\n\n let el = document.createElement(tagName);\n\n if ( Array.isArray(classNames) ) {\n\n el.classList.add(...classNames);\n\n } else if( classNames ) {\n\n el.classList.add(classNames);\n\n }\n\n for (let attrName in attributes) {\n\n el[attrName] = attributes[attrName];\n\n }\n\n return el;\n\n }\n\n /**\n * Creates Text Node with the passed content\n * @param {String} content - text content\n * @return {Text}\n */\n static text(content) {\n\n return document.createTextNode(content);\n\n }\n\n /**\n * Append one or several elements to the parent\n *\n * @param {Element} parent - where to append\n * @param {Element|Element[]} - element ore elements list\n */\n static append(parent, elements) {\n\n if ( Array.isArray(elements) ) {\n\n elements.forEach( el => parent.appendChild(el) );\n\n } else {\n\n parent.appendChild(elements);\n\n }\n\n }\n\n /**\n * Selector Decorator\n *\n * Returns first match\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n *\n * @returns {Element}\n */\n static find(el = document, selector) {\n\n return el.querySelector(selector);\n\n }\n\n /**\n * Selector Decorator.\n *\n * Returns all matches\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n * @returns {NodeList}\n */\n static findAll(el = document, selector) {\n\n return el.querySelectorAll(selector);\n\n }\n\n /**\n * Search for deepest node which is Leaf.\n * Leaf is the vertex that doesn't have any child nodes\n *\n * @description Method recursively goes throw the all Node until it finds the Leaf\n *\n * @param {Element} node - root Node. From this vertex we start Deep-first search {@link https://en.wikipedia.org/wiki/Depth-first_search}\n * @param {Boolean} atLast - find last text node\n * @return {Node} - it can be text Node or Element Node, so that caret will able to work with it\n */\n static getDeepestNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return an empty text node\n * But caret will not be placed in empty textNode, so we need textNode with zero-width char\n */\n if (this.isElement(node) && !this.isNativeInput(node)) {\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\n return node;\n\n }\n\n let childsLength = node.childNodes.length,\n last = childsLength - 1;\n\n if (atLast) {\n\n return this.getDeepestNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestNode(node.childNodes[0], false);\n\n }\n\n }\n\n /**\n * Check if object is DOM node\n *\n * @param {Object} node\n * @returns {boolean}\n */\n static isElement(node) {\n\n return node && typeof node === 'object' && node.nodeType && node.nodeType === Node.ELEMENT_NODE;\n\n }\n\n /**\n * Checks target if it is native input\n * @param {Element|String} target - HTML element or string\n * @return {Boolean}\n */\n static isNativeInput(target) {\n\n let nativeInputs = [\n 'INPUT',\n 'TEXTAREA'\n ];\n\n return target ? nativeInputs.includes(target.tagName) : false;\n\n }\n\n /**\n * Checks node if it is empty\n *\n * @description Method checks simple Node without any childs for emptiness\n * If you have Node with 2 or more children id depth, you better use {@link Dom#isEmpty} method\n *\n * @param {Node} node\n * @return {Boolean} true if it is empty\n */\n static isNodeEmpty(node) {\n\n let nodeText;\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n nodeText = node.value;\n\n } else {\n\n nodeText = node.textContent.replace('\\u200B', '');\n\n }\n\n return nodeText.trim().length === 0;\n\n }\n\n /**\n * checks node if it is doesn't have any child nodes\n * @param {Node} node\n * @return {boolean}\n */\n static isLeaf(node) {\n\n if (!node) {\n\n return false;\n\n }\n\n return node.childNodes.length === 0;\n\n }\n\n /**\n * breadth-first search (BFS)\n * {@link https://en.wikipedia.org/wiki/Breadth-first_search}\n *\n * @description Pushes to stack all DOM leafs and checks for emptiness\n *\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n leafs = [];\n\n if (!node) {\n\n return false;\n\n }\n\n treeWalker.push(node);\n\n while ( treeWalker.length > 0 ) {\n\n if ( this.isLeaf(node) ) {\n\n leafs.push(node);\n\n }\n\n while ( node && node.nextSibling ) {\n\n node = node.nextSibling;\n\n if (!node) continue;\n\n treeWalker.push(node);\n\n }\n\n node = treeWalker.shift();\n\n if (!node) continue;\n\n node = node.firstChild;\n treeWalker.push(node);\n\n }\n\n return leafs.every( leaf => this.isNodeEmpty(leaf)) ;\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.js","/**\n * Working with selection\n */\nexport default class Selection {\n\n /**\n * @constructor\n */\n constructor() {\n\n this.instance = null;\n this.selection = null;\n\n }\n\n /**\n * Returns window Selection\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Window/getSelection}\n * @return {Selection}\n */\n static get() {\n\n return window.getSelection();\n\n }\n\n /**\n * Returns selected anchor\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorNode}\n * @return {Node}\n */\n static getAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n /**\n * Returns selection offset according to the anchor node\n * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorOffset}\n * @return {Number}\n */\n static getAnchorOffset() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorOffset;\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/Selection.js","/**\n * Codex Editor\n *\n * Short Description (눈_눈;)\n * @version 2.0.0\n *\n * How to start?\n * Example:\n * new CodexEditor({\n * holderId : 'codex-editor',\n * initialBlock : 'text',\n * placeholder : 'Write your story....',\n * tools: {\n * quote: Quote,\n * anotherTool : AnotherTool\n * },\n * toolsConfig: {\n * quote: {\n * iconClassname : 'quote-icon',\n * displayInToolbox : true,\n * enableLineBreaks : true\n * },\n * anotherTool: {\n * iconClassname : 'tool-icon'\n * }\n * }\n * });\n *\n * - tools is an object: {\n * pluginName: PluginClass,\n * .....\n * }\n * - toolsConfig is an additional configuration that uses Codex Editor API\n * iconClassname - CSS classname of toolbox icon\n * displayInToolbox - if you want to see your Tool in toolbox hided in \"plus\" button, than set \"True\". By default : \"False\"\n * enableLineBreaks - by default enter creates new block that set as initialblock, but if you set this property \"True\", enter will break the lines in current block\n *\n * @author CodeX-Team \n *\n */\n\n/**\n * @typedef {CodexEditor} CodexEditor - editor class\n */\n\n/**\n * @typedef {Object} EditorConfig\n * @property {String} holderId - Element to append Editor\n * @property {Array} data - Blocks list in JSON-format\n * @property {Object} tools - Map for used Tools in format { name : Class, ... }\n * @property {String} initialBlock - This Tool will be added by default\n * @property {String} placeholder - First Block placeholder\n * @property {Object} sanitizer - @todo fill desc\n * @property {Boolean} hideToolbar - @todo fill desc\n * @property {Object} toolsConfig - tools configuration {@link tools#ToolConfig}\n */\n\n/**\n * Dynamically imported utils\n *\n * @typedef {Dom} $ - {@link components/dom.js}\n * @typedef {Util} _ - {@link components/utils.js}\n */\n\n'use strict';\n\n/**\n * Apply polyfills\n */\nimport 'components/polyfills';\n\n/**\n * Require Editor modules places in components/modules dir\n */\n// eslint-disable-next-line\nlet modules = editorModules.map( module => require('./components/modules/' + module ));\n\n/**\n * @class\n *\n * @classdesc CodeX Editor base class\n *\n * @property this.config - all settings\n * @property this.moduleInstances - constructed editor components\n *\n * @type {CodexEditor}\n */\nmodule.exports = class CodexEditor {\n\n /** Editor version */\n static get version() {\n\n return VERSION;\n\n }\n\n /**\n * @param {EditorConfig} config - user configuration\n *\n */\n constructor(config) {\n\n /**\n * Configuration object\n * @type {EditorConfig}\n */\n this.config = {};\n\n /**\n * @typedef {Object} EditorComponents\n * @property {BlockManager} BlockManager\n * @property {Tools} Tools\n * @property {Events} Events\n * @property {UI} UI\n * @property {Toolbar} Toolbar\n * @property {Toolbox} Toolbox\n * @property {Renderer} Renderer\n */\n this.moduleInstances = {};\n\n Promise.resolve()\n .then(() => {\n\n this.configuration = config;\n\n })\n .then(() => this.init())\n .then(() => this.start())\n .then(() => {\n\n console.log('CodeX Editor is ready!');\n\n })\n .catch(error => {\n\n console.log('CodeX Editor does not ready because of %o', error);\n\n });\n\n }\n\n /**\n * Setting for configuration\n * @param {EditorConfig} config\n */\n set configuration(config) {\n\n /**\n * Initlai block type\n * Uses in case when there is no items passed\n * @type {{type: (*), data: {text: null}}}\n */\n let initialBlock = {\n type : config.initialBlock,\n data : {}\n };\n\n this.config.holderId = config.holderId;\n this.config.placeholder = config.placeholder || 'write your story...';\n this.config.sanitizer = config.sanitizer || {\n p: true,\n b: true,\n a: true\n };\n\n this.config.hideToolbar = config.hideToolbar ? config.hideToolbar : false;\n this.config.tools = config.tools || {};\n this.config.toolsConfig = config.toolsConfig || {};\n this.config.data = config.data || {};\n\n /**\n * Initialize items to pass data to the Renderer\n */\n if (_.isEmpty(this.config.data)) {\n\n this.config.data = {};\n this.config.data.items = [ initialBlock ];\n\n } else {\n\n if (!this.config.data.items || this.config.data.items.length === 0) {\n\n this.config.data.items = [ initialBlock ];\n\n }\n\n }\n\n /**\n * If initial Block's Tool was not passed, use the first Tool in config.tools\n */\n if (!config.initialBlock) {\n\n for (this.config.initialBlock in this.config.tools) break;\n\n } else {\n\n this.config.initialBlock = config.initialBlock;\n\n }\n\n }\n\n /**\n * Returns private property\n * @returns {EditorConfig}\n */\n get configuration() {\n\n return this.config;\n\n }\n\n /**\n * Initializes modules:\n * - make and save instances\n * - configure\n */\n init() {\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n this.constructModules();\n\n /**\n * Modules configuration\n */\n this.configureModules();\n\n }\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n constructModules() {\n\n modules.forEach( Module => {\n\n try {\n\n /**\n * We use class name provided by displayName property\n *\n * On build, Babel will transform all Classes to the Functions so, name will always be 'Function'\n * To prevent this, we use 'babel-plugin-class-display-name' plugin\n * @see https://www.npmjs.com/package/babel-plugin-class-display-name\n */\n this.moduleInstances[Module.displayName] = new Module({\n config : this.configuration\n });\n\n } catch ( e ) {\n\n console.log('Module %o skipped because %o', Module, e);\n\n }\n\n });\n\n }\n\n /**\n * Modules instances configuration:\n * - pass other modules to the 'state' property\n * - ...\n */\n configureModules() {\n\n for(let name in this.moduleInstances) {\n\n /**\n * Module does not need self-instance\n */\n this.moduleInstances[name].state = this.getModulesDiff( name );\n\n }\n\n }\n\n /**\n * Return modules without passed name\n */\n getModulesDiff( name ) {\n\n let diff = {};\n\n for(let moduleName in this.moduleInstances) {\n\n /**\n * Skip module with passed name\n */\n if (moduleName === name) {\n\n continue;\n\n }\n diff[moduleName] = this.moduleInstances[moduleName];\n\n }\n\n return diff;\n\n }\n\n /**\n * Start Editor!\n *\n * Get list of modules that needs to be prepared and return a sequence (Promise)\n * @return {Promise}\n */\n start() {\n\n let prepareDecorator = module => module.prepare();\n\n return Promise.resolve()\n .then(prepareDecorator(this.moduleInstances.Tools))\n .then(prepareDecorator(this.moduleInstances.UI))\n .then(prepareDecorator(this.moduleInstances.BlockManager))\n .then(() => {\n\n return this.moduleInstances.Renderer.render(this.config.data.items);\n\n\n });\n\n }\n\n};\n\n// module.exports = (function (editor) {\n//\n// 'use strict';\n//\n// editor.version = VERSION;\n// editor.scriptPrefix = 'cdx-script-';\n//\n// var init = function () {\n//\n// editor.core = require('./modules/core');\n// editor.tools = require('./modules/tools');\n// editor.ui = require('./modules/ui');\n// editor.transport = require('./modules/transport');\n// editor.renderer = require('./modules/renderer');\n// editor.saver = require('./modules/saver');\n// editor.content = require('./modules/content');\n// editor.toolbar = require('./modules/toolbar/toolbar');\n// editor.callback = require('./modules/callbacks');\n// editor.draw = require('./modules/draw');\n// editor.caret = require('./modules/caret');\n// editor.notifications = require('./modules/notifications');\n// editor.parser = require('./modules/parser');\n// editor.sanitizer = require('./modules/sanitizer');\n// editor.listeners = require('./modules/listeners');\n// editor.destroyer = require('./modules/destroyer');\n// editor.paste = require('./modules/paste');\n//\n// };\n//\n// /**\n// * @public\n// * holds initial settings\n// */\n// editor.settings = {\n// tools : ['text', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n// holderId : 'codex-editor',\n//\n// // Type of block showing on empty editor\n// initialBlockPlugin: 'text'\n// };\n//\n// /**\n// * public\n// *\n// * Static nodes\n// */\n// editor.nodes = {\n// holder : null,\n// wrapper : null,\n// toolbar : null,\n// inlineToolbar : {\n// wrapper : null,\n// buttons : null,\n// actions : null\n// },\n// toolbox : null,\n// notifications : null,\n// plusButton : null,\n// showSettingsButton: null,\n// showTrashButton : null,\n// blockSettings : null,\n// pluginSettings : null,\n// defaultSettings : null,\n// toolbarButtons : {}, // { type : DomEl, ... }\n// redactor : null\n// };\n//\n// /**\n// * @public\n// *\n// * Output state\n// */\n// editor.state = {\n// jsonOutput : [],\n// blocks : [],\n// inputs : []\n// };\n//\n// /**\n// * @public\n// * Editor plugins\n// */\n// editor.tools = {};\n//\n// editor.start = function (userSettings) {\n//\n// init();\n//\n// editor.core.prepare(userSettings)\n//\n// // If all ok, make UI, bind events and parse initial-content\n// .then(editor.ui.prepare)\n// .then(editor.tools.prepare)\n// .then(editor.sanitizer.prepare)\n// .then(editor.paste.prepare)\n// .then(editor.transport.prepare)\n// .then(editor.renderer.makeBlocksFromData)\n// .then(editor.ui.saveInputs)\n// .catch(function (error) {\n//\n// editor.core.log('Initialization failed with error: %o', 'warn', error);\n//\n// });\n//\n// };\n//\n// return editor;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/codex.js","/**\n * Element.closest()\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Element/closest\n */\nif (!Element.prototype.matches)\n Element.prototype.matches = Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n\nif (!Element.prototype.closest)\n Element.prototype.closest = function (s) {\n\n var el = this;\n\n if (!document.documentElement.contains(el)) return null;\n do {\n\n if (el.matches(s)) return el;\n el = el.parentElement || el.parentNode;\n\n } while (el !== null);\n return null;\n\n };\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/polyfills.js","var map = {\n\t\"./blockManager.js\": 7,\n\t\"./caret.js\": 9,\n\t\"./events.js\": 10,\n\t\"./listeners.js\": 11,\n\t\"./renderer.js\": 12,\n\t\"./sanitizer.js\": 13,\n\t\"./saver.js\": 15,\n\t\"./toolbar.js\": 16,\n\t\"./toolbox.js\": 17,\n\t\"./tools.js\": 18,\n\t\"./ui.js\": 19\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 6;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/modules nonrecursive [^_](blockManager.js|caret.js|events.js|listeners.js|renderer.js|sanitizer.js|saver.js|toolbar.js|toolbox.js|tools.js|ui.js)$\n// module id = 6\n// module chunks = 0","/**\n * @class BlockManager\n * @classdesc Manage editor`s blocks storage and appearance\n *\n * @module BlockManager\n *\n * @version 2.0.0\n */\n\nimport Block from '../block';\nimport Selection from '../Selection';\n\n/**\n * @typedef {BlockManager} BlockManager\n * @property {Number} currentBlockIndex - Index of current working block\n * @property {Proxy} _blocks - Proxy for Blocks instance {@link Blocks}\n */\nexport default class BlockManager extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n /**\n * Proxy for Blocks instance {@link Blocks}\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = null;\n\n /**\n * Index of current working block\n *\n * @type {number}\n * @private\n */\n this.currentBlockIndex = -1;\n\n }\n\n /**\n * Should be called after Editor.UI preparation\n * Define this._blocks property\n *\n * @returns {Promise}\n */\n prepare() {\n\n return new Promise(resolve => {\n\n let blocks = new Blocks(this.Editor.UI.nodes.redactor);\n\n /**\n * We need to use Proxy to overload set/get [] operator.\n * So we can use array-like syntax to access blocks\n *\n * @example\n * this._blocks[0] = new Block(...);\n *\n * block = this._blocks[0];\n *\n * @todo proxy the enumerate method\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = new Proxy(blocks, {\n set: Blocks.set,\n get: Blocks.get\n });\n\n resolve();\n\n });\n\n }\n\n /**\n * Creates Block instance by tool name\n *\n * @param {String} toolName - tools passed in editor config {@link EditorConfig#tools}\n * @param {Object} data - constructor params\n *\n * @return {Block}\n */\n composeBlock(toolName, data) {\n\n let toolInstance = this.Editor.Tools.construct(toolName, data),\n block = new Block(toolName, toolInstance);\n\n this.bindEvents(block);\n\n /**\n * Apply callback before inserting html\n */\n block.call('appendCallback', {});\n\n return block;\n\n }\n\n /**\n * Bind Events\n * @param {Object} block\n */\n bindEvents(block) {\n\n /**\n * keydown on block\n * @todo move to the keydown module\n */\n this.Editor.Listeners.on(block.pluginsContent, 'keydown', (event) => this.keyDownOnBlock(event));\n\n }\n\n /**\n * @todo move to the keydown module\n * @param {MouseEvent} event\n */\n keyDownOnBlock(event) {\n\n switch(event.keyCode) {\n\n case _.keyCodes.ENTER:\n // this.enterPressedOnPluginsContent(event);\n break;\n case _.keyCodes.DOWN:\n case _.keyCodes.RIGHT:\n this.navigateNext();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.navigatePrevious();\n break;\n\n }\n\n }\n\n /**\n * Set's caret to the next Block\n * Before moving caret, we should check if caret position is at the end of Plugins node\n * Using {@link Dom#getDeepestNode} to get a last node and match with current selection\n */\n navigateNext() {\n\n let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getAnchorOffset() === textNodeLength) {\n\n let nextBlock = this.nextBlock;\n\n if (!nextBlock) return;\n\n this.Editor.Caret.setToBlock( nextBlock );\n\n }\n\n }\n\n /**\n * Set's caret to the previous Block\n * Before moving caret, we should check if caret position is at the end of Plugins node\n * Using {@link Dom#getDeepestNode} to get a last node and match with current selection\n */\n navigatePrevious() {\n\n let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n if (Selection.getAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getAnchorOffset() === 0) {\n\n let previousBlock = this.previousBlock;\n\n if (!previousBlock) return;\n\n this.Editor.Caret.setToBlock( previousBlock, textNodeLength, true );\n\n }\n\n }\n\n /**\n * Insert new block into _blocks\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n insert(toolName, data = {}) {\n\n\n let block = this.composeBlock(toolName, data);\n\n this._blocks[++this.currentBlockIndex] = block;\n this.Editor.Caret.setToBlock(block);\n\n }\n\n /**\n * Replace current working block\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n replace(toolName, data = {}) {\n\n let block = this.composeBlock(toolName, data);\n\n this._blocks.insert(this.currentBlockIndex, block, true);\n\n }\n\n /**\n * returns last Block\n * @return {Block}\n */\n get lastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n * Returns Block by passed index\n * @param {Number} index\n * @return {Block}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Get Block instance by html element\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`),\n index = nodes.indexOf(firstLevelBlock);\n\n if (index >= 0) {\n\n return this._blocks[index];\n\n }\n\n }\n\n /**\n * Get current Block instance\n *\n * @return {Block}\n */\n get currentBlock() {\n\n return this._blocks[this.currentBlockIndex];\n\n }\n\n /**\n * Returns next Block instance\n * @return {Block|null}\n */\n get nextBlock() {\n\n let isLastBlock = this.currentBlockIndex === (this._blocks.length - 1);\n\n if (isLastBlock) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex + 1];\n\n }\n\n /**\n * Returns previous Block instance\n * @return {Block|null}\n */\n get previousBlock() {\n\n let isFirstBlock = this.currentBlockIndex === 0;\n\n if (isFirstBlock) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex - 1];\n\n }\n\n /**\n * Get working html element\n *\n * @return {HTMLElement}\n */\n get currentNode() {\n\n return this._blocks.nodes[this.currentBlockIndex];\n\n }\n\n /**\n * Set currentBlockIndex to passed block\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes,\n firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`);\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(firstLevelBlock);\n\n /**\n * Remove previous selected Block's state\n */\n this._blocks.array.forEach( block => block.selected = false);\n\n /**\n * Mark current Block as selected\n * @type {boolean}\n */\n this.currentBlock.selected = true;\n\n }\n\n /**\n * Get array of Block instances\n *\n * @returns {Block[]} {@link Blocks#array}\n */\n get blocks() {\n\n return this._blocks.array;\n\n }\n\n /**\n * 1) Find first-level Block from passed child Node\n * 2) Mark it as current\n *\n * @param {Element|Text} childNode - look ahead from this node.\n * @throws Error - when passed Node is not included at the Block\n */\n setCurrentBlockByChildNode(childNode) {\n\n /**\n * If node is Text TextNode\n */\n if (!$.isElement(childNode)) {\n\n childNode = childNode.parentNode;\n\n }\n\n let parentFirstLevelBlock = childNode.closest(`.${Block.CSS.wrapper}`);\n\n if (parentFirstLevelBlock) {\n\n this.currentNode = parentFirstLevelBlock;\n\n } else {\n\n throw new Error('Can not find a Block from this child Node');\n\n }\n\n }\n\n}\n\n/**\n * @class Blocks\n * @classdesc Class to work with Block instances array\n *\n * @private\n *\n * @property {HTMLElement} workingArea — editor`s working node\n *\n */\nclass Blocks {\n\n /**\n * @constructor\n *\n * @param {HTMLElement} workingArea — editor`s working node\n */\n constructor(workingArea) {\n\n this.blocks = [];\n this.workingArea = workingArea;\n\n }\n\n /**\n * Push back new Block\n *\n * @param {Block} block\n */\n push(block) {\n\n this.blocks.push(block);\n this.workingArea.appendChild(block.html);\n\n }\n\n /**\n * Insert new Block at passed index\n *\n * @param {Number} index — index to insert Block\n * @param {Block} block — Block to insert\n * @param {Boolean} replace — it true, replace block on given index\n */\n insert(index, block, replace = false) {\n\n if (!this.length) {\n\n this.push(block);\n return;\n\n }\n\n if (index > this.length) {\n\n index = this.length;\n\n }\n\n if (replace) {\n\n this.blocks[index].html.remove();\n\n }\n\n let deleteCount = replace ? 1 : 0;\n\n this.blocks.splice(index, deleteCount, block);\n\n if (index > 0) {\n\n let previousBlock = this.blocks[index - 1];\n\n previousBlock.html.insertAdjacentElement('afterend', block.html);\n\n } else {\n\n let nextBlock = this.blocks[index + 1];\n\n if (nextBlock) {\n\n nextBlock.html.insertAdjacentElement('beforebegin', block.html);\n\n } else {\n\n this.workingArea.appendChild(block.html);\n\n }\n\n }\n\n }\n\n /**\n * Insert Block after passed target\n *\n * @todo decide if this method is necessary\n *\n * @param {Block} targetBlock — target after wich Block should be inserted\n * @param {Block} newBlock — Block to insert\n */\n insertAfter(targetBlock, newBlock) {\n\n let index = this.blocks.indexOf(targetBlock);\n\n this.insert(index + 1, newBlock);\n\n }\n\n /**\n * Get Block by index\n *\n * @param {Number} index — Block index\n * @returns {Block}\n */\n get(index) {\n\n return this.blocks[index];\n\n }\n\n /**\n * Return index of passed Block\n *\n * @param {Block} block\n * @returns {Number}\n */\n indexOf(block) {\n\n return this.blocks.indexOf(block);\n\n }\n\n /**\n * Get length of Block instances array\n *\n * @returns {Number}\n */\n get length() {\n\n return this.blocks.length;\n\n }\n\n /**\n * Get Block instances array\n *\n * @returns {Block[]}\n */\n get array() {\n\n return this.blocks;\n\n }\n\n /**\n * Get blocks html elements array\n *\n * @returns {HTMLElement[]}\n */\n get nodes() {\n\n return _.array(this.workingArea.children);\n\n }\n\n /**\n * Proxy trap to implement array-like setter\n *\n * @example\n * blocks[0] = new Block(...)\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — block index\n * @param {Block} block — Block to set\n * @returns {Boolean}\n */\n static set(instance, index, block) {\n\n if (isNaN(Number(index))) {\n\n return false;\n\n }\n\n instance.insert(index, block);\n\n return true;\n\n }\n\n /**\n * Proxy trap to implement array-like getter\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — Block index\n * @returns {Block|*}\n */\n static get(instance, index) {\n\n if (isNaN(Number(index))) {\n\n return instance[index];\n\n }\n\n return instance.get(index);\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/blockManager.js","/**\n *\n * @class Block\n * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool\n *\n * @property {Tool} tool — current block tool (Paragraph, for example)\n * @property {Object} CSS — block`s css classes\n *\n */\n\n/**\n * @classdesc Abstract Block class that contains Block information, Tool name and Tool class instance\n *\n * @property tool - Tool instance\n * @property html - Returns HTML content of plugin\n * @property wrapper - Div element that wraps block content with Tool's content. Has `ce-block` CSS class\n * @property contentNode - Div element that wraps Tool's content. Has `ce-block__content` CSS class\n * @property pluginsContent - HTML content that returns by Tool's render function\n */\nexport default class Block {\n\n /**\n * @constructor\n * @param {String} toolName - Tool name that passed on initialization\n * @param {Object} toolInstance — passed Tool`s instance that rendered the Block\n */\n constructor(toolName, toolInstance) {\n\n this.name = toolName;\n this.tool = toolInstance;\n this._html = this.compose();\n\n }\n\n /**\n * CSS classes for the Block\n * @return {{wrapper: string, content: string}}\n */\n static get CSS() {\n\n return {\n wrapper: 'ce-block',\n content: 'ce-block__content',\n selected: 'ce-block--selected'\n };\n\n }\n\n /**\n * Make default Block wrappers and put Tool`s content there\n * @returns {HTMLDivElement}\n */\n compose() {\n\n this.wrapper = $.make('div', Block.CSS.wrapper);\n this.contentNode = $.make('div', Block.CSS.content);\n this.pluginsContent = this.tool.render();\n\n this.contentNode.appendChild(this.pluginsContent);\n this.wrapper.appendChild(this.contentNode);\n\n return this.wrapper;\n\n }\n\n /**\n * Calls Tool's method\n *\n * Method checks tool property {MethodName}. Fires method with passes params If it is instance of Function\n *\n * @param {String} methodName\n * @param {Object} params\n */\n call(methodName, params) {\n\n /**\n * call Tool's method with the instance context\n */\n if (this.tool[methodName] && this.tool[methodName] instanceof Function) {\n\n this.tool[methodName].call(this.tool, params);\n\n }\n\n }\n\n /**\n * Get Block`s HTML\n * @returns {HTMLElement}\n */\n get html() {\n\n return this._html;\n\n }\n\n /**\n * Get Block's JSON data\n * @return {Object}\n */\n get data() {\n\n return this.save();\n\n }\n\n /**\n * Extracts data from Block\n * Groups Tool's save processing time\n * @return {Object}\n */\n save() {\n\n let extractedBlock = this.tool.save(this.pluginsContent);\n\n /** Measuring execution time*/\n let measuringStart = window.performance.now(),\n measuringEnd;\n\n return Promise.resolve(extractedBlock)\n .then((finishedExtraction) => {\n\n /** measure promise execution */\n measuringEnd = window.performance.now();\n\n return {\n tool: this.name,\n data: finishedExtraction,\n time : measuringEnd - measuringStart\n };\n\n })\n .catch(function (error) {\n\n _.log(`Saving proccess for ${this.tool.name} tool failed due to the ${error}`, 'log', 'red');\n\n });\n\n }\n\n /**\n * Uses Tool's validation method to check the correctness of output data\n * Tool's validation method is optional\n *\n * @description Method also can return data if it passed the validation\n *\n * @param {Object} data\n * @returns {Boolean|Object} valid\n */\n validateData(data) {\n\n let isValid = true;\n\n if (this.tool.validate instanceof Function) {\n\n isValid = this.tool.validate(data);\n\n }\n\n if (!isValid) {\n\n return false;\n\n }\n\n return data;\n\n }\n\n /**\n * Check block for emptiness\n * @return {Boolean}\n */\n get isEmpty() {\n\n /**\n * Allow Tool to represent decorative contentless blocks: for example \"* * *\"-tool\n * That Tools are not empty\n */\n if (this.tool.contentless) {\n\n return false;\n\n }\n\n let emptyText = $.isEmpty(this.pluginsContent),\n emptyMedia = !this.hasMedia;\n\n return emptyText && emptyMedia;\n\n }\n\n /**\n * Check if block has a media content such as images, iframes and other\n * @return {Boolean}\n */\n get hasMedia() {\n\n /**\n * This tags represents media-content\n * @type {string[]}\n */\n const mediaTags = [\n 'img',\n 'iframe',\n 'video',\n 'audio',\n 'source',\n 'input',\n 'textarea',\n 'twitterwidget'\n ];\n\n return !!this._html.querySelector(mediaTags.join(','));\n\n }\n\n /**\n * Set selected state\n * @param {Boolean} state - 'true' to select, 'false' to remove selection\n */\n set selected(state) {\n\n /**\n * We don't need to mark Block as Selected when it is not empty\n */\n if (state === true && !this.isEmpty) {\n\n this._html.classList.add(Block.CSS.selected);\n\n } else {\n\n this._html.classList.remove(Block.CSS.selected);\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/block.js","/**\n * @class Caret\n * @classdesc Contains methods for working Caret\n *\n * Uses Range methods to manipulate with caret\n *\n * @module Caret\n *\n * @version 2.0.0\n */\n\n/**\n * @typedef {Caret} Caret\n */\nimport Selection from '../Selection';\n\nexport default class Caret extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * Method gets Block instance and puts caret to the text node with offset\n * There two ways that method applies caret position:\n * - first found text node: sets at the beginning, but you can pass an offset\n * - last found text node: sets at the end of the node. Also, you can customize the behaviour\n *\n * @param {Block} block - Block class\n * @param {Number} offset - caret offset regarding to the text node\n * @param {Boolean} atEnd - put caret at the end of the text node or not\n */\n setToBlock(block, offset = 0, atEnd = false) {\n\n let element = block.pluginsContent;\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestNode(element, atEnd);\n\n if (atEnd || offset > nodeToSet.length) {\n\n offset = nodeToSet.length;\n\n }\n\n /** if found deepest node is native input */\n if ($.isNativeInput(nodeToSet)) {\n\n nodeToSet.focus();\n return;\n\n }\n\n /**\n * @todo try to fix via Promises or use querySelectorAll to not to use timeout\n */\n _.delay( () => this.set(nodeToSet, offset), 20)();\n\n this.Editor.BlockManager.currentNode = block.wrapper;\n\n }\n\n /**\n * Creates Document Range and sets caret to the element with offset\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n */\n set( element, offset = 0) {\n\n let range = document.createRange(),\n selection = Selection.get();\n\n range.setStart(element, offset);\n range.setEnd(element, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n };\n\n /**\n * Set Caret to the last Block\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let lastBlock = this.Editor.BlockManager.lastBlock;\n\n if (!lastBlock) return;\n\n /**\n * If last block is empty and it is an initialBlock, set to that.\n * Otherwise, append new empty block and set to that\n */\n if (lastBlock.isEmpty) {\n\n this.setToBlock(lastBlock);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/caret.js","/**\n * @module eventDispatcher\n *\n * Has two important methods:\n * - {Function} on - appends subscriber to the event. If event doesn't exist - creates new one\n * - {Function} emit - fires all subscribers with data\n *\n * @version 1.0.0\n *\n * @typedef {Events} Events\n * @property {Object} subscribers - all subscribers grouped by event name\n */\nexport default class Events extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n this.subscribers = {};\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Function} callback - subscriber\n */\n on(eventName, callback) {\n\n if (!(eventName in this.subscribers)) {\n\n this.subscribers[eventName] = [];\n\n }\n\n // group by events\n this.subscribers[eventName].push(callback);\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Object} data - subscribers get this data when they were fired\n */\n emit(eventName, data) {\n\n this.subscribers[eventName].reduce(function (previousData, currentHandler) {\n\n let newData = currentHandler(previousData);\n\n return newData ? newData : previousData;\n\n }, data);\n\n }\n\n /**\n * Destroyer\n * clears subsribers list\n */\n destroy() {\n\n this.subscribers = null;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/events.js","/**\n * Codex Editor Listeners module\n *\n * @module Listeners\n *\n * Module-decorator for event listeners assignment\n *\n * @author Codex Team\n * @version 2.0.0\n */\n\n/**\n * @typedef {Listeners} Listeners\n * @property {Array} allListeners\n */\n\nexport default class Listeners extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n this.allListeners = [];\n\n }\n\n /**\n * Assigns event listener on element\n *\n * @param {Element} element - DOM element that needs to be listened\n * @param {String} eventType - event type\n * @param {Function} handler - method that will be fired on event\n * @param {Boolean} useCapture - use event bubbling\n */\n on(element, eventType, handler, useCapture = false) {\n\n let assignedEventData = {\n element,\n eventType,\n handler,\n useCapture\n };\n\n let alreadyExist = this.findOne(element, eventType, handler);\n\n if (alreadyExist) return;\n\n this.allListeners.push(assignedEventData);\n element.addEventListener(eventType, handler, useCapture);\n\n }\n\n /**\n * Removes event listener from element\n *\n * @param {Element} element - DOM element that we removing listener\n * @param {String} eventType - event type\n * @param {Function} handler - remove handler, if element listens several handlers on the same event type\n * @param {Boolean} useCapture - use event bubbling\n */\n off(element, eventType, handler, useCapture = false) {\n\n let existingListeners = this.findAll(element, eventType, handler);\n\n for (let i = 0; i < existingListeners.length; i++) {\n\n let index = this.allListeners.indexOf(existingListeners[i]);\n\n if (index > 0) {\n\n this.allListeners.splice(index, 1);\n\n }\n\n }\n\n element.removeEventListener(eventType, handler, useCapture);\n\n\n }\n\n /**\n * Search method: looks for listener by passed element\n * @param {Element} element - searching element\n * @returns {Array} listeners that found on element\n */\n findByElement(element) {\n\n let listenersOnElement = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.element === element) {\n\n listenersOnElement.push(listener);\n\n }\n\n }\n\n return listenersOnElement;\n\n }\n\n /**\n * Search method: looks for listener by passed event type\n * @param {String} eventType\n * @return {Array} listeners that found on element\n */\n findByType(eventType) {\n\n let listenersWithType = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.type === eventType) {\n\n listenersWithType.push(listener);\n\n }\n\n }\n\n return listenersWithType;\n\n }\n\n /**\n * Search method: looks for listener by passed handler\n * @param {Function} handler\n * @return {Array} listeners that found on element\n */\n findByHandler(handler) {\n\n let listenersWithHandler = [];\n\n for (let i = 0; i < this.allListeners.length; i++) {\n\n let listener = this.allListeners[i];\n\n if (listener.handler === handler) {\n\n listenersWithHandler.push(listener);\n\n }\n\n }\n\n return listenersWithHandler;\n\n }\n\n /**\n * @param {Element} element\n * @param {String} eventType\n * @param {Function} handler\n * @return {Element|null}\n */\n findOne(element, eventType, handler) {\n\n let foundListeners = this.findAll(element, eventType, handler);\n\n return foundListeners.length > 0 ? foundListeners[0] : null;\n\n }\n\n /**\n * @param {Element} element\n * @param {String} eventType\n * @param {Function} handler\n * @return {Array}\n */\n findAll(element, eventType, handler) {\n\n let foundAllListeners,\n foundByElements = [],\n foundByEventType = [],\n foundByHandler = [];\n\n if (element)\n foundByElements = this.findByElement(element);\n\n if (eventType)\n foundByEventType = this.findByType(eventType);\n\n if (handler)\n foundByHandler = this.findByHandler(handler);\n\n foundAllListeners = foundByElements.concat(foundByEventType, foundByHandler);\n\n return foundAllListeners;\n\n }\n\n /**\n * Removes all listeners\n */\n removeAll() {\n\n this.allListeners.map( (current) => {\n\n current.element.removeEventListener(current.eventType, current.handler);\n\n });\n\n this.allListeners = [];\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/listeners.js","/**\n * Codex Editor Renderer Module\n *\n * @module Renderer\n * @author CodeX Team\n *\n * @version 2.0.0\n */\nexport default class Renderer extends Module {\n\n /**\n * @constructor\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * @typedef {Object} RendererItems\n * @property {String} type - tool name\n * @property {Object} data - tool data\n */\n\n /**\n * @example\n *\n * items: [\n * {\n * type : 'paragraph',\n * data : {\n * text : 'Hello from Codex!'\n * }\n * },\n * {\n * type : 'paragraph',\n * data : {\n * text : 'Leave feedback if you like it!'\n * }\n * },\n * ]\n *\n */\n\n /**\n * Make plugin blocks from array of plugin`s data\n * @param {RendererItems[]} items\n */\n render(items) {\n\n let chainData = [];\n\n for (let i = 0; i < items.length; i++) {\n\n chainData.push({\n function: () => this.insertBlock(items[i])\n });\n\n }\n\n return _.sequence(chainData);\n\n }\n\n /**\n * Get plugin instance\n * Add plugin instance to BlockManager\n * Insert block to working zone\n *\n * @param {Object} item\n * @returns {Promise.}\n * @private\n */\n insertBlock(item) {\n\n let tool = item.type,\n data = item.data;\n\n this.Editor.BlockManager.insert(tool, data);\n\n return Promise.resolve();\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/renderer.js","/**\n * CodeX Sanitizer\n *\n * @module Sanitizer\n * Clears HTML from taint tags\n *\n * @version 2.0.0\n *\n * @example\n * Module can be used within two ways:\n * 1) When you have an instance\n * - this.Editor.Sanitizer.clean(yourTaintString);\n * 2) As static method\n * - CodexEditor.Sanitizer.clean(yourTaintString, yourCustomConfiguration);\n *\n * {@link SanitizerConfig}\n */\n\n\n/**\n * @typedef {Object} SanitizerConfig\n * @property {Object} tags - define tags restrictions\n *\n * @example\n *\n * tags : {\n * p: true,\n * a: {\n * href: true,\n * rel: \"nofollow\",\n * target: \"_blank\"\n * }\n * }\n */\nexport default class Sanitizer extends Module {\n\n /**\n * Initializes Sanitizer module\n * Sets default configuration if custom not exists\n *\n * @property {SanitizerConfig} this.defaultConfig\n * @property {HTMLJanitor} this._sanitizerInstance - Sanitizer library\n *\n * @param {SanitizerConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n // default config\n this.defaultConfig = null;\n this._sanitizerInstance = null;\n\n /** Custom configuration */\n this.sanitizerConfig = config.settings ? config.settings.sanitizer : {};\n\n /** HTML Janitor library */\n this.sanitizerInstance = require('html-janitor');\n\n }\n\n /**\n * If developer uses editor's API, then he can customize sanitize restrictions.\n * Or, sanitizing config can be defined globally in editors initialization. That config will be used everywhere\n * At least, if there is no config overrides, that API uses Default configuration\n *\n * @uses https://www.npmjs.com/package/html-janitor\n *\n * @param {HTMLJanitor} library - sanitizer extension\n */\n set sanitizerInstance(library) {\n\n this._sanitizerInstance = new library(this.defaultConfig);\n\n }\n\n /**\n * Sets sanitizer configuration. Uses default config if user didn't pass the restriction\n * @param {SanitizerConfig} config\n */\n set sanitizerConfig(config) {\n\n if (_.isEmpty(config)) {\n\n this.defaultConfig = {\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: 'nofollow'\n }\n }\n };\n\n } else {\n\n this.defaultConfig = config;\n\n }\n\n }\n\n /**\n * Cleans string from unwanted tags\n * @param {String} taintString - HTML string\n * @param {Object} customConfig - custom sanitizer configuration. Method uses default if param is empty\n * @return {String} clean HTML\n */\n clean(taintString, customConfig = {}) {\n\n if (_.isEmpty(customConfig)) {\n\n return this._sanitizerInstance.clean(taintString);\n\n } else {\n\n return Sanitizer.clean(taintString, customConfig);\n\n }\n\n\n }\n\n /**\n * Cleans string from unwanted tags\n * @static\n *\n * Method allows to use default config\n *\n * @param {String} taintString - taint string\n * @param {SanitizerConfig} customConfig - allowed tags\n *\n * @return {String} clean HTML\n */\n static clean(taintString, customConfig) {\n\n let newInstance = Sanitizer(customConfig);\n\n return newInstance.clean(taintString);\n\n }\n\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/sanitizer.js","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('html-janitor', factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.HTMLJanitor = factory();\n }\n}(this, function () {\n\n /**\n * @param {Object} config.tags Dictionary of allowed tags.\n * @param {boolean} config.keepNestedBlockElements Default false.\n */\n function HTMLJanitor(config) {\n\n var tagDefinitions = config['tags'];\n var tags = Object.keys(tagDefinitions);\n\n var validConfigValues = tags\n .map(function(k) { return typeof tagDefinitions[k]; })\n .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });\n\n if(!validConfigValues) {\n throw new Error(\"The configuration was invalid\");\n }\n\n this.config = config;\n }\n\n // TODO: not exhaustive?\n var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];\n function isBlockElement(node) {\n return blockElementNames.indexOf(node.nodeName) !== -1;\n }\n\n var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];\n function isInlineElement(node) {\n return inlineElementNames.indexOf(node.nodeName) !== -1;\n }\n\n HTMLJanitor.prototype.clean = function (html) {\n var sandbox = document.createElement('div');\n sandbox.innerHTML = html;\n\n this._sanitize(sandbox);\n\n return sandbox.innerHTML;\n };\n\n HTMLJanitor.prototype._sanitize = function (parentNode) {\n var treeWalker = createTreeWalker(parentNode);\n var node = treeWalker.firstChild();\n if (!node) { return; }\n\n do {\n // Ignore nodes that have already been sanitized\n if (node._sanitized) {\n continue;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // If this text node is just whitespace and the previous or next element\n // sibling is a block element, remove it\n // N.B.: This heuristic could change. Very specific to a bug with\n // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output\n // FIXME: make this an option?\n if (node.data.trim() === ''\n && ((node.previousElementSibling && isBlockElement(node.previousElementSibling))\n || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n } else {\n continue;\n }\n }\n\n // Remove all comments\n if (node.nodeType === Node.COMMENT_NODE) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n }\n\n var isInline = isInlineElement(node);\n var containsBlockElement;\n if (isInline) {\n containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);\n }\n\n // Block elements should not be nested (e.g.

  • ...); if\n // they are, we want to unwrap the inner block element.\n var isNotTopContainer = !! parentNode.parentNode;\n var isNestedBlockElement =\n isBlockElement(parentNode) &&\n isBlockElement(node) &&\n isNotTopContainer;\n\n var nodeName = node.nodeName.toLowerCase();\n\n var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);\n\n var isInvalid = isInline && containsBlockElement;\n\n // Drop tag entirely according to the whitelist *and* if the markup\n // is invalid.\n if (isInvalid || shouldRejectNode(node, allowedAttrs)\n || (!this.config.keepNestedBlockElements && isNestedBlockElement)) {\n // Do not keep the inner text of SCRIPT/STYLE elements.\n if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {\n while (node.childNodes.length > 0) {\n parentNode.insertBefore(node.childNodes[0], node);\n }\n }\n parentNode.removeChild(node);\n\n this._sanitize(parentNode);\n break;\n }\n\n // Sanitize attributes\n for (var a = 0; a < node.attributes.length; a += 1) {\n var attr = node.attributes[a];\n\n if (shouldRejectAttr(attr, allowedAttrs, node)) {\n node.removeAttribute(attr.name);\n // Shift the array to continue looping.\n a = a - 1;\n }\n }\n\n // Sanitize children\n this._sanitize(node);\n\n // Mark node as sanitized so it's ignored in future runs\n node._sanitized = true;\n } while ((node = treeWalker.nextSibling()));\n };\n\n function createTreeWalker(node) {\n return document.createTreeWalker(node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,\n null, false);\n }\n\n function getAllowedAttrs(config, nodeName, node){\n if (typeof config.tags[nodeName] === 'function') {\n return config.tags[nodeName](node);\n } else {\n return config.tags[nodeName];\n }\n }\n\n function shouldRejectNode(node, allowedAttrs){\n if (typeof allowedAttrs === 'undefined') {\n return true;\n } else if (typeof allowedAttrs === 'boolean') {\n return !allowedAttrs;\n }\n\n return false;\n }\n\n function shouldRejectAttr(attr, allowedAttrs, node){\n var attrName = attr.name.toLowerCase();\n\n if (allowedAttrs === true){\n return false;\n } else if (typeof allowedAttrs[attrName] === 'function'){\n return !allowedAttrs[attrName](attr.value, node);\n } else if (typeof allowedAttrs[attrName] === 'undefined'){\n return true;\n } else if (allowedAttrs[attrName] === false) {\n return true;\n } else if (typeof allowedAttrs[attrName] === 'string') {\n return (allowedAttrs[attrName] !== attr.value);\n }\n\n return false;\n }\n\n return HTMLJanitor;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/html-janitor/src/html-janitor.js\n// module id = 14\n// module chunks = 0","/**\n * Codex Editor Saver\n *\n * @module Saver\n * @author Codex Team\n * @version 2.0.0\n */\n\n/**\n * @typedef {Object} SavedData\n * @property {Date} time - saving proccess time\n * @property {Object} items - extracted data\n * @property {String} version - CodexEditor version\n */\n\n/**\n * @classdesc This method reduces all Blocks asyncronically and calls Block's save method to extract data\n *\n * @typedef {Saver} Saver\n * @property {Element} html - Editor HTML content\n * @property {String} json - Editor JSON output\n */\n\nexport default class Saver extends Module {\n\n /**\n * @constructor\n * @param config\n */\n constructor({config}) {\n\n super({config});\n\n this.output = null;\n this.blocksData = [];\n\n }\n\n /**\n * Composes new chain of Promises to fire them alternatelly\n * @return {SavedData}\n */\n save() {\n\n let blocks = this.Editor.BlockManager.blocks,\n chainData = [];\n\n blocks.forEach((block) => {\n\n chainData.push(block.data);\n\n });\n\n return Promise.all(chainData)\n .then((allExtractedData) => this.makeOutput(allExtractedData))\n .then((outputData) => {\n\n return outputData;\n\n });\n\n }\n\n /**\n * Creates output object with saved data, time and version of editor\n * @param {Object} allExtractedData\n * @return {SavedData}\n */\n makeOutput(allExtractedData) {\n\n let items = [],\n totalTime = 0;\n\n console.groupCollapsed('[CodexEditor saving]:');\n\n allExtractedData.forEach((extraction, index) => {\n\n /** Group process info */\n console.log(`«${extraction.tool}» saving info`, extraction);\n totalTime += extraction.time;\n items.push(extraction.data);\n\n });\n\n console.log('Total', totalTime);\n console.groupEnd();\n\n return {\n time : +new Date(),\n items : items,\n version : VERSION,\n };\n\n }\n\n}\n\n// module.exports = (function (saver) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * @public\n// * Save blocks\n// */\n// saver.save = function () {\n//\n// /** Save html content of redactor to memory */\n// editor.state.html = editor.nodes.redactor.innerHTML;\n//\n// /** Clean jsonOutput state */\n// editor.state.jsonOutput = [];\n//\n// return saveBlocks(editor.nodes.redactor.childNodes);\n//\n// };\n//\n// /**\n// * @private\n// * Save each block data\n// *\n// * @param blocks\n// * @returns {Promise.}\n// */\n// let saveBlocks = function (blocks) {\n//\n// let data = [];\n//\n// for(let index = 0; index < blocks.length; index++) {\n//\n// data.push(getBlockData(blocks[index]));\n//\n// }\n//\n// return Promise.all(data)\n// .then(makeOutput)\n// .catch(editor.core.log);\n//\n// };\n//\n// /** Save and validate block data */\n// let getBlockData = function (block) {\n//\n// return saveBlockData(block)\n// .then(validateBlockData)\n// .catch(editor.core.log);\n//\n// };\n//\n// /**\n// * @private\n// * Call block`s plugin save method and return saved data\n// *\n// * @param block\n// * @returns {Object}\n// */\n// let saveBlockData = function (block) {\n//\n// let pluginName = block.dataset.tool;\n//\n// /** Check for plugin existence */\n// if (!editor.tools[pluginName]) {\n//\n// editor.core.log(`Plugin «${pluginName}» not found`, 'error');\n// return {data: null, pluginName: null};\n//\n// }\n//\n// /** Check for plugin having save method */\n// if (typeof editor.tools[pluginName].save !== 'function') {\n//\n// editor.core.log(`Plugin «${pluginName}» must have save method`, 'error');\n// return {data: null, pluginName: null};\n//\n// }\n//\n// /** Result saver */\n// let blockContent = block.childNodes[0],\n// pluginsContent = blockContent.childNodes[0],\n// position = pluginsContent.dataset.inputPosition;\n//\n// /** If plugin wasn't available then return data from cache */\n// if ( editor.tools[pluginName].available === false ) {\n//\n// return Promise.resolve({data: codex.editor.state.blocks.items[position].data, pluginName});\n//\n// }\n//\n// return Promise.resolve(pluginsContent)\n// .then(editor.tools[pluginName].save)\n// .then(data => Object({data, pluginName}));\n//\n// };\n//\n// /**\n// * Call plugin`s validate method. Return false if validation failed\n// *\n// * @param data\n// * @param pluginName\n// * @returns {Object|Boolean}\n// */\n// let validateBlockData = function ({data, pluginName}) {\n//\n// if (!data || !pluginName) {\n//\n// return false;\n//\n// }\n//\n// if (editor.tools[pluginName].validate) {\n//\n// let result = editor.tools[pluginName].validate(data);\n//\n// /**\n// * Do not allow invalid data\n// */\n// if (!result) {\n//\n// return false;\n//\n// }\n//\n// }\n//\n// return {data, pluginName};\n//\n//\n// };\n//\n// /**\n// * Compile article output\n// *\n// * @param savedData\n// * @returns {{time: number, version, items: (*|Array)}}\n// */\n// let makeOutput = function (savedData) {\n//\n// savedData = savedData.filter(blockData => blockData);\n//\n// let items = savedData.map(blockData => Object({type: blockData.pluginName, data: blockData.data}));\n//\n// editor.state.jsonOutput = items;\n//\n// return {\n// id: editor.state.blocks.id || null,\n// time: +new Date(),\n// version: editor.version,\n// items\n// };\n//\n// };\n//\n// return saver;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/saver.js","/**\n *\n * «Toolbar» is the node that moves up/down over current block\n *\n * ______________________________________ Toolbar ____________________________________________\n * | |\n * | ..................... Content .................... ......... Block Actions .......... |\n * | . . . . |\n * | . . . [Open Settings] [Remove Block] . |\n * | . [Plus Button] [Toolbox: {Tool1}, {Tool2}] . . . |\n * | . . . [Settings Panel] . |\n * | .................................................. .................................. |\n * | |\n * |___________________________________________________________________________________________|\n *\n *\n * Toolbox — its an Element contains tools buttons. Can be shown by Plus Button.\n *\n * _______________ Toolbox _______________\n * | |\n * | [Header] [Image] [List] [Quote] ... |\n * |_______________________________________|\n *\n *\n * Settings Panel — is an Element with block settings:\n *\n * ____ Settings Panel ____\n * | ...................... |\n * | . Tool Settings . |\n * | ...................... |\n * | . Default Settings . |\n * | ...................... |\n * |________________________|\n *\n *\n * @class\n * @classdesc Toolbar module\n *\n * @typedef {Toolbar} Toolbar\n * @property {Object} nodes\n * @property {Element} nodes.wrapper - Toolbar main element\n * @property {Element} nodes.content - Zone with Plus button and toolbox.\n * @property {Element} nodes.actions - Zone with Block Settings and Remove Button\n * @property {Element} nodes.plusButton - Button that opens or closes Toolbox\n * @property {Element} nodes.toolbox - Container for tools\n * @property {Element} nodes.settingsToggler - open/close Settings Panel button\n * @property {Element} nodes.removeBlockButton - Remove Block button\n * @property {Element} nodes.settings - Settings Panel\n * @property {Element} nodes.pluginSettings - Plugin Settings section of Settings Panel\n * @property {Element} nodes.defaultSettings - Default Settings section of Settings Panel\n */\nexport default class Toolbar extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n wrapper : null,\n content : null,\n actions : null,\n\n // Content Zone\n plusButton : null,\n\n // Actions Zone\n settingsToggler : null,\n removeBlockButton: null,\n settings: null,\n\n // Settings Zone: Plugin Settings and Default Settings\n pluginSettings: null,\n defaultSettings: null,\n };\n\n }\n\n /**\n * CSS styles\n * @return {Object}\n * @constructor\n */\n static get CSS() {\n\n return {\n toolbar: 'ce-toolbar',\n content: 'ce-toolbar__content',\n actions: 'ce-toolbar__actions',\n\n toolbarOpened: 'ce-toolbar--opened',\n\n // Content Zone\n plusButton: 'ce-toolbar__plus',\n plusButtonHidden: 'ce-toolbar__plus--hidden',\n\n // Actions Zone\n settingsToggler: 'ce-toolbar__settings-btn',\n removeBlockButton: 'ce-toolbar__remove-btn',\n\n // Settings Panel\n settings: 'ce-settings',\n defaultSettings: 'ce-settings_default',\n pluginSettings: 'ce-settings_plugin',\n };\n\n }\n\n /**\n * Makes toolbar\n */\n make() {\n\n this.nodes.wrapper = $.make('div', Toolbar.CSS.toolbar);\n\n /**\n * Make Content Zone and Actions Zone\n */\n ['content', 'actions'].forEach( el => {\n\n this.nodes[el] = $.make('div', Toolbar.CSS[el]);\n $.append(this.nodes.wrapper, this.nodes[el]);\n\n });\n\n\n /**\n * Fill Content Zone:\n * - Plus Button\n * - Toolbox\n */\n this.nodes.plusButton = $.make('div', Toolbar.CSS.plusButton);\n $.append(this.nodes.content, this.nodes.plusButton);\n this.nodes.plusButton.addEventListener('click', event => this.plusButtonClicked(event), false);\n\n\n /**\n * Make a Toolbox\n */\n this.Editor.Toolbox.make();\n\n /**\n * Fill Actions Zone:\n * - Settings Toggler\n * - Remove Block Button\n * - Settings Panel\n */\n this.nodes.settingsToggler = $.make('span', Toolbar.CSS.settingsToggler);\n this.nodes.removeBlockButton = this.makeRemoveBlockButton();\n\n $.append(this.nodes.actions, [this.nodes.settingsToggler, this.nodes.removeBlockButton]);\n\n /**\n * Make and append Settings Panel\n */\n this.makeBlockSettingsPanel();\n\n /**\n * Append toolbar to the Editor\n */\n $.append(this.Editor.UI.nodes.wrapper, this.nodes.wrapper);\n\n }\n\n /**\n * Panel with block settings with 2 sections:\n *\n * @return {Element}\n */\n makeBlockSettingsPanel() {\n\n this.nodes.settings = $.make('div', Toolbar.CSS.settings);\n\n this.nodes.pluginSettings = $.make('div', Toolbar.CSS.pluginSettings);\n this.nodes.defaultSettings = $.make('div', Toolbar.CSS.defaultSettings);\n\n $.append(this.nodes.settings, [this.nodes.pluginSettings, this.nodes.defaultSettings]);\n $.append(this.nodes.actions, this.nodes.settings);\n\n }\n\n /**\n * Makes Remove Block button, and confirmation panel\n * @return {Element} wrapper with button and panel\n */\n makeRemoveBlockButton() {\n\n /**\n * @todo add confirmation panel and handlers\n * @see {@link settings#makeRemoveBlockButton}\n */\n return $.make('span', Toolbar.CSS.removeBlockButton);\n\n }\n\n /**\n * Move Toolbar to the Current Block\n */\n move() {\n\n /** Close Toolbox when we move toolbar */\n this.Editor.Toolbox.close();\n\n let currentNode = this.Editor.BlockManager.currentNode;\n\n /**\n * If no one Block selected as a Current\n */\n if (!currentNode) {\n\n return;\n\n }\n\n /**\n * @todo Compute dynamically on prepare\n * @type {number}\n */\n const defaultToolbarHeight = 49;\n const defaultOffset = 34;\n\n var newYCoordinate = currentNode.offsetTop - (defaultToolbarHeight / 2) + defaultOffset;\n\n this.nodes.wrapper.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n // editor.toolbar.settings.hideRemoveActions();\n\n }\n\n /**\n * Open Toolbar with Plus Button\n */\n open() {\n\n this.nodes.wrapper.classList.add(Toolbar.CSS.toolbarOpened);\n\n }\n\n /**\n * Close the Toolbar\n */\n close() {\n\n this.nodes.wrapper.classList.remove(Toolbar.CSS.toolbarOpened);\n\n }\n\n /**\n * Plus Button public methods\n * @return {{hide: function(): void, show: function(): void}}\n */\n get plusButton() {\n\n return {\n hide: () => this.nodes.plusButton.classList.add(Toolbar.CSS.plusButtonHidden),\n show: () => this.nodes.plusButton.classList.remove(Toolbar.CSS.plusButtonHidden)\n };\n\n }\n\n /**\n * Handler for Plus Button\n * @param {MouseEvent} event\n */\n plusButtonClicked(event) {\n\n this.Editor.Toolbox.toggle();\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar.js","/**\n * @class Toolbox\n * @classdesc Holder for Tools\n *\n * @typedef {Toolbox} Toolbox\n * @property {Boolean} opened - opening state\n * @property {Object} nodes - Toolbox nodes\n * @property {Object} CSS - CSS class names\n *\n */\nexport default class Toolbox extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n toolbox: null,\n buttons: []\n };\n\n /**\n * Opening state\n * @type {boolean}\n */\n this.opened = false;\n\n }\n\n /**\n * CSS styles\n * @return {{toolbox: string, toolboxButton: string, toolboxOpened: string}}\n */\n static get CSS() {\n\n return {\n toolbox: 'ce-toolbox',\n toolboxButton: 'ce-toolbox__button',\n toolboxOpened: 'ce-toolbox--opened',\n };\n\n }\n\n /**\n * Makes the Toolbox\n */\n make() {\n\n this.nodes.toolbox = $.make('div', Toolbox.CSS.toolbox);\n $.append(this.Editor.Toolbar.nodes.content, this.nodes.toolbox);\n\n this.addTools();\n\n }\n\n /**\n * Iterates available tools and appends them to the Toolbox\n */\n addTools() {\n\n let tools = this.Editor.Tools.toolsAvailable;\n\n for (let toolName in tools) {\n\n this.addTool(toolName, tools[toolName]);\n\n }\n\n }\n\n /**\n * Append Tool to the Toolbox\n *\n * @param {string} toolName - tool name\n * @param {Tool} tool - tool class\n */\n addTool(toolName, tool) {\n\n if (tool.displayInToolbox && !tool.iconClassName) {\n\n _.log('Toolbar icon class name is missed. Tool %o skipped', 'warn', toolName);\n return;\n\n }\n\n /**\n * @todo Add checkup for the render method\n */\n // if (typeof tool.render !== 'function') {\n //\n // _.log('render method missed. Tool %o skipped', 'warn', tool);\n // return;\n //\n // }\n\n /**\n * Skip tools that pass 'displayInToolbox=false'\n */\n if (!tool.displayInToolbox) {\n\n return;\n\n }\n\n let button = $.make('li', [Toolbox.CSS.toolboxButton, tool.iconClassName], {\n title: toolName\n });\n\n /**\n * Save tool's name in the button data-name\n */\n button.dataset.name = toolName;\n\n $.append(this.nodes.toolbox, button);\n\n this.nodes.toolbox.appendChild(button);\n this.nodes.buttons.push(button);\n\n /**\n * @todo add event with module Listeners\n */\n // this.Editor.Listeners.add();\n button.addEventListener('click', event => {\n\n this.buttonClicked(event);\n\n }, false);\n\n }\n\n /**\n * Toolbox button click listener\n * 1) if block is empty -> replace\n * 2) if block is not empty -> add new block below\n *\n * @param {MouseEvent} event\n */\n buttonClicked(event) {\n\n let toolButton = event.target,\n toolName = toolButton.dataset.name,\n tool = this.Editor.Tools.toolClasses[toolName];\n\n /**\n * @type {Block}\n */\n let currentBlock = this.Editor.BlockManager.currentBlock;\n\n /**\n * We do replace if:\n * - block is empty\n * - block is not irreplaceable\n * @type {Array}\n */\n if (!tool.irreplaceable && currentBlock.isEmpty) {\n\n this.Editor.BlockManager.replace(toolName);\n\n } else {\n\n this.Editor.BlockManager.insert(toolName);\n\n }\n\n /**\n * @todo set caret to the new block\n */\n\n // window.setTimeout(function () {\n\n /** Set caret to current block */\n // editor.caret.setToBlock(currentInputIndex);\n\n // }, 10);\n\n /**\n * Move toolbar when node is changed\n */\n this.Editor.Toolbar.move();\n\n }\n\n /**\n * Open Toolbox with Tools\n */\n open() {\n\n this.nodes.toolbox.classList.add(Toolbox.CSS.toolboxOpened);\n this.opened = true;\n\n }\n\n /**\n * Close Toolbox\n */\n close() {\n\n this.nodes.toolbox.classList.remove(Toolbox.CSS.toolboxOpened);\n this.opened = false;\n\n }\n\n /**\n * Close Toolbox\n */\n toggle() {\n\n if (!this.opened) {\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbox.js","/**\n * @module Codex Editor Tools Submodule\n *\n * Creates Instances from Plugins and binds external config to the instances\n */\n\n/**\n * Each Tool must contain the following important objects:\n *\n * @typedef {Object} ToolConfig {@link docs/tools.md}\n * @property {String} iconClassname - this a icon in toolbar\n * @property {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @property {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n * @property render @todo add description\n * @property save @todo add description\n * @property settings @todo add description\n * @property validate - method that validates output data before saving\n */\n\n/**\n * @typedef {Function} Tool {@link docs/tools.md}\n * @property {Boolean} displayInToolbox - By default, tools won't be added in the Toolbox. Pass true to add.\n * @property {String} iconClassName - CSS class name for the Toolbox button\n * @property {Boolean} irreplaceable - Toolbox behaviour: replace or add new block below\n * @property render\n * @property save\n * @property settings\n * @property validate\n *\n * @todo update according to current API\n * @todo describe Tool in the {@link docs/tools.md}\n */\n\n/**\n * Class properties:\n *\n * @typedef {Tools} Tools\n * @property {Tools[]} toolsAvailable - available Tools\n * @property {Tools[]} toolsUnavailable - unavailable Tools\n * @property {Object} toolsClasses - all classes\n * @property {EditorConfig} config - Editor config\n */\nexport default class Tools extends Module {\n\n /**\n * Returns available Tools\n * @return {Tool[]}\n */\n get available() {\n\n return this.toolsAvailable;\n\n }\n\n /**\n * Returns unavailable Tools\n * @return {Tool[]}\n */\n get unavailable() {\n\n return this.toolsUnavailable;\n\n }\n\n /**\n * Static getter for default Tool config fields\n *\n * @usage Tools.defaultConfig.displayInToolbox\n * @return {ToolConfig}\n */\n static get defaultConfig() {\n\n return {\n iconClassName : '',\n displayInToolbox : false,\n enableLineBreaks : false,\n irreplaceable : false\n };\n\n }\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n /**\n * Map {name: Class, ...} where:\n * name — block type name in JSON. Got from EditorConfig.tools keys\n * @type {Object}\n */\n this.toolClasses = {};\n\n /**\n * Available tools list\n * {name: Class, ...}\n * @type {Object}\n */\n this.toolsAvailable = {};\n\n /**\n * Tools that rejected a prepare method\n * {name: Class, ... }\n * @type {Object}\n */\n this.toolsUnavailable = {};\n\n }\n\n /**\n * Creates instances via passed or default configuration\n * @return {Promise}\n */\n prepare() {\n\n if (!this.config.hasOwnProperty('tools')) {\n\n return Promise.reject(\"Can't start without tools\");\n\n }\n\n for(let toolName in this.config.tools) {\n\n this.toolClasses[toolName] = this.config.tools[toolName];\n\n }\n\n /**\n * getting classes that has prepare method\n */\n let sequenceData = this.getListOfPrepareFunctions();\n\n /**\n * if sequence data contains nothing then resolve current chain and run other module prepare\n */\n if (sequenceData.length === 0) {\n\n return Promise.resolve();\n\n }\n\n /**\n * to see how it works {@link Util#sequence}\n */\n return _.sequence(sequenceData, (data) => {\n\n this.success(data);\n\n }, (data) => {\n\n this.fallback(data);\n\n });\n\n }\n\n /**\n * Binds prepare function of plugins with user or default config\n * @return {Array} list of functions that needs to be fired sequentially\n */\n getListOfPrepareFunctions() {\n\n let toolPreparationList = [];\n\n for(let toolName in this.toolClasses) {\n\n let toolClass = this.toolClasses[toolName];\n\n if (typeof toolClass.prepare === 'function') {\n\n toolPreparationList.push({\n function : toolClass.prepare,\n data : {\n toolName\n }\n });\n\n } else {\n\n /**\n * If Tool hasn't a prepare method, mark it as available\n */\n this.toolsAvailable[toolName] = toolClass;\n\n }\n\n }\n\n return toolPreparationList;\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to available list\n */\n success(data) {\n\n this.toolsAvailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to unavailable list\n */\n fallback(data) {\n\n this.toolsUnavailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * Return tool`a instance\n *\n * @param {String} tool — tool name\n * @param {Object} data — initial data\n *\n * @todo throw exceptions if tool doesnt exist\n *\n */\n construct(tool, data) {\n\n let plugin = this.toolClasses[tool],\n config = this.config.toolsConfig[tool];\n\n if (!config) {\n\n config = this.defaultConfig;\n\n }\n\n let instance = new plugin(data, config);\n\n return instance;\n\n }\n\n /**\n * Check if passed Tool is an instance of Initial Block Tool\n * @param {Tool} tool - Tool to check\n * @return {Boolean}\n */\n isInitial(tool) {\n\n return tool instanceof this.available[this.config.initialBlock];\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/tools.js","/**\n * Module UI\n *\n * @type {UI}\n */\n// let className = {\n\n/**\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\n */\n// BLOCK_CLASSNAME : 'ce-block',\n\n/**\n * @const {String} wrapper for plugins content\n */\n// BLOCK_CONTENT : 'ce-block__content',\n\n/**\n * @const {String} BLOCK_STRETCHED - makes block stretched\n */\n// BLOCK_STRETCHED : 'ce-block--stretched',\n\n/**\n * @const {String} BLOCK_HIGHLIGHTED - adds background\n */\n// BLOCK_HIGHLIGHTED : 'ce-block--focused',\n\n/**\n * @const {String} - for all default settings\n */\n// SETTINGS_ITEM : 'ce-settings__item'\n// };\n\n// import Block from '../block';\n\n/**\n * @class\n *\n * @classdesc Makes CodeX Editor UI:\n * \n * \n * \n * \n * \n *\n * @typedef {UI} UI\n * @property {EditorConfig} config - editor configuration {@link CodexEditor#configuration}\n * @property {Object} Editor - available editor modules {@link CodexEditor#moduleInstances}\n * @property {Object} nodes -\n * @property {Element} nodes.holder - element where we need to append redactor\n * @property {Element} nodes.wrapper - \n * @property {Element} nodes.redactor - \n */\nexport default class UI extends Module {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({config}) {\n\n super({config});\n\n this.nodes = {\n holder: null,\n wrapper: null,\n redactor: null\n };\n\n }\n\n /**\n * Making main interface\n */\n prepare() {\n\n return this.make()\n /**\n * Make toolbar\n */\n .then(() => this.Editor.Toolbar.make())\n /**\n * Load and append CSS\n */\n .then(() => this.loadStyles())\n /**\n * Bind events for the UI elements\n */\n .then(() => this.bindEvents())\n\n /** Make container for inline toolbar */\n // .then(makeInlineToolbar_)\n\n /** Add inline toolbar tools */\n // .then(addInlineToolbarTools_)\n\n /** Draw wrapper for notifications */\n // .then(makeNotificationHolder_)\n\n /** Add eventlisteners to redactor elements */\n // .then(bindEvents_)\n\n .catch(e => {\n\n console.error(e);\n\n // editor.core.log(\"Can't draw editor interface\");\n\n });\n\n }\n\n /**\n * CodeX Editor UI CSS class names\n * @return {{editorWrapper: string, editorZone: string, block: string}}\n */\n get CSS() {\n\n return {\n editorWrapper : 'codex-editor',\n editorZone : 'codex-editor__redactor',\n };\n\n }\n\n /**\n * Makes CodeX Editor interface\n * @return {Promise}\n */\n make() {\n\n return new Promise( (resolve, reject) => {\n\n /**\n * Element where we need to append CodeX Editor\n * @type {Element}\n */\n this.nodes.holder = document.getElementById(this.config.holderId);\n\n if (!this.nodes.holder) {\n\n reject(Error(\"Holder wasn't found by ID: #\" + this.config.holderId));\n return;\n\n }\n\n /**\n * Create and save main UI elements\n */\n this.nodes.wrapper = $.make('div', this.CSS.editorWrapper);\n this.nodes.redactor = $.make('div', this.CSS.editorZone);\n\n this.nodes.wrapper.appendChild(this.nodes.redactor);\n this.nodes.holder.appendChild(this.nodes.wrapper);\n\n resolve();\n\n });\n\n }\n\n /**\n * Appends CSS\n */\n loadStyles() {\n\n /**\n * Load CSS\n */\n let styles = require('../../styles/main.css');\n\n /**\n * Make tag\n */\n let tag = $.make('style', null, {\n textContent: styles.toString()\n });\n\n /**\n * Append styles\n */\n $.append(document.head, tag);\n\n }\n\n /**\n * Bind events on the CodeX Editor interface\n */\n bindEvents() {\n\n /**\n * @todo bind events with the Listeners module\n */\n this.nodes.redactor.addEventListener('click', event => this.redactorClicked(event), false );\n\n }\n\n /**\n * All clicks on the redactor zone\n *\n * @param {MouseEvent} event\n *\n * @description\n * 1. Save clicked Block as a current {@link BlockManager#currentNode}\n * it uses for the following:\n * - add CSS modifier for the selected Block\n * - on Enter press, we make a new Block under that\n *\n * 2. Move and show the Toolbar\n *\n * 3. Set a Caret\n *\n * 4. By clicks on the Editor's bottom zone:\n * - if last Block is empty, set a Caret to this\n * - otherwise, add a new empty Block and set a Caret to that\n *\n * 5. Hide the Inline Toolbar\n *\n * @see selectClickedBlock\n *\n */\n redactorClicked(event) {\n\n let clickedNode = event.target;\n\n /**\n * Select clicked Block as Current\n */\n try {\n\n this.Editor.BlockManager.setCurrentBlockByChildNode(clickedNode);\n\n /**\n * If clicked outside first-level Blocks, set Caret to the last empty Block\n */\n\n } catch (e) {\n\n this.Editor.Caret.setToTheLastBlock();\n\n }\n\n\n\n\n /**\n * @todo hide the Inline Toolbar\n */\n // var selectedText = editor.toolbar.inline.getSelectionText(),\n // firstLevelBlock;\n\n /** If selection range took off, then we hide inline toolbar */\n // if (selectedText.length === 0) {\n\n // editor.toolbar.inline.close();\n\n // }\n\n /**\n *\n\n /** Update current input index in memory when caret focused into existed input */\n // if (event.target.contentEditable == 'true') {\n //\n // editor.caret.saveCurrentInputIndex();\n //\n // }\n\n // if (editor.content.currentNode === null) {\n //\n // /**\n // * If inputs in redactor does not exits, then we put input index 0 not -1\n // */\n // var indexOfLastInput = editor.state.inputs.length > 0 ? editor.state.inputs.length - 1 : 0;\n //\n // /** If we have any inputs */\n // if (editor.state.inputs.length) {\n //\n // /** getting firstlevel parent of input */\n // firstLevelBlock = editor.content.getFirstLevelBlock(editor.state.inputs[indexOfLastInput]);\n //\n // }\n //\n // /** If input is empty, then we set caret to the last input */\n // if (editor.state.inputs.length && editor.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == editor.settings.initialBlockPlugin) {\n //\n // editor.caret.setToBlock(indexOfLastInput);\n //\n // } else {\n //\n // /** Create new input when caret clicked in redactors area */\n // var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n //\n // editor.content.insertBlock({\n // type : NEW_BLOCK_TYPE,\n // block : editor.tools[NEW_BLOCK_TYPE].render()\n // });\n //\n // /** If there is no inputs except inserted */\n // if (editor.state.inputs.length === 1) {\n //\n // editor.caret.setToBlock(indexOfLastInput);\n //\n // } else {\n //\n // /** Set caret to this appended input */\n // editor.caret.setToNextBlock(indexOfLastInput);\n //\n // }\n //\n // }\n //\n // } else {\n //\n // /** Close all panels */\n // editor.toolbar.settings.close();\n // editor.toolbar.toolbox.close();\n //\n // }\n //\n /**\n * Move toolbar and open\n */\n this.Editor.Toolbar.move();\n this.Editor.Toolbar.open();\n //\n // var inputIsEmpty = !editor.content.currentNode.textContent.trim(),\n // currentNodeType = editor.content.currentNode.dataset.tool,\n // isInitialType = currentNodeType == editor.settings.initialBlockPlugin;\n //\n //\n\n /**\n * Hide the Plus Button\n * */\n this.Editor.Toolbar.plusButton.hide();\n\n /**\n * Show the Plus Button if:\n * - Block is an initial-block (Text)\n * - Block is empty\n */\n let isInitialBlock = this.Editor.Tools.isInitial(this.Editor.BlockManager.currentBlock.tool),\n isEmptyBlock = this.Editor.BlockManager.currentBlock.isEmpty;\n\n if (isInitialBlock && isEmptyBlock) {\n\n this.Editor.Toolbar.plusButton.show();\n\n }\n\n }\n\n}\n\n// /**\n// * Codex Editor UI module\n// *\n// * @author Codex Team\n// * @version 1.2.0\n// */\n//\n// module.exports = (function (ui) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * Basic editor classnames\n// */\n// ui.prepare = function () {\n//\n\n//\n// };\n//\n// /** Draw notifications holder */\n// var makeNotificationHolder_ = function () {\n//\n// /** Append block with notifications to the document */\n// editor.nodes.notifications = editor.notifications.createHolder();\n//\n// };\n//\n//\n// var addInlineToolbarTools_ = function () {\n//\n// var tools = {\n//\n// bold: {\n// icon : 'ce-icon-bold',\n// command : 'bold'\n// },\n//\n// italic: {\n// icon : 'ce-icon-italic',\n// command : 'italic'\n// },\n//\n// link: {\n// icon : 'ce-icon-link',\n// command : 'createLink'\n// }\n// };\n//\n// var toolButton,\n// tool;\n//\n// for(var name in tools) {\n//\n// tool = tools[name];\n//\n// toolButton = editor.draw.toolbarButtonInline(name, tool.icon);\n//\n// editor.nodes.inlineToolbar.buttons.appendChild(toolButton);\n// /**\n// * Add callbacks to this buttons\n// */\n// editor.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n//\n// }\n//\n// };\n//\n// /**\n// * @private\n// * Bind editor UI events\n// */\n// var bindEvents_ = function () {\n//\n// editor.core.log('ui.bindEvents fired', 'info');\n//\n// // window.addEventListener('error', function (errorMsg, url, lineNumber) {\n// // editor.notifications.errorThrown(errorMsg, event);\n// // }, false );\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keydown', editor.callback.globalKeydown, false);\n//\n// /** All keydowns on Redactor zone */\n// editor.listeners.add(editor.nodes.redactor, 'keydown', editor.callback.redactorKeyDown, false);\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keyup', editor.callback.globalKeyup, false );\n//\n// /**\n// * Mouse click to radactor\n// */\n// editor.listeners.add(editor.nodes.redactor, 'click', editor.callback.redactorClicked, false );\n//\n// /**\n// * Clicks to the Plus button\n// */\n// editor.listeners.add(editor.nodes.plusButton, 'click', editor.callback.plusButtonClicked, false);\n//\n// /**\n// * Clicks to SETTINGS button in toolbar\n// */\n// editor.listeners.add(editor.nodes.showSettingsButton, 'click', editor.callback.showSettingsButtonClicked, false );\n//\n// /** Bind click listeners on toolbar buttons */\n// for (var button in editor.nodes.toolbarButtons) {\n//\n// editor.listeners.add(editor.nodes.toolbarButtons[button], 'click', editor.callback.toolbarButtonClicked, false);\n//\n// }\n//\n// };\n//\n// ui.addBlockHandlers = function (block) {\n//\n// if (!block) return;\n//\n// /**\n// * Block keydowns\n// */\n// editor.listeners.add(block, 'keydown', editor.callback.blockKeydown, false);\n//\n// /**\n// * Pasting content from another source\n// * We have two type of sanitization\n// * First - uses deep-first search algorithm to get sub nodes,\n// * sanitizes whole Block_content and replaces cleared nodes\n// * This method is deprecated\n// * Method is used in editor.callback.blockPaste(event)\n// *\n// * Secont - uses Mutation observer.\n// * Observer \"observe\" DOM changes and send changings to callback.\n// * Callback gets changed node, not whole Block_content.\n// * Inserted or changed node, which we've gotten have been cleared and replaced with diry node\n// *\n// * Method is used in editor.callback.blockPasteViaSanitize(event)\n// *\n// * @uses html-janitor\n// * @example editor.callback.blockPasteViaSanitize(event), the second method.\n// *\n// */\n// editor.listeners.add(block, 'paste', editor.paste.blockPasteCallback, false);\n//\n// /**\n// * Show inline toolbar for selected text\n// */\n// editor.listeners.add(block, 'mouseup', editor.toolbar.inline.show, false);\n// editor.listeners.add(block, 'keyup', editor.toolbar.inline.show, false);\n//\n// };\n//\n// /** getting all contenteditable elements */\n// ui.saveInputs = function () {\n//\n// var redactor = editor.nodes.redactor;\n//\n// editor.state.inputs = [];\n//\n// /** Save all inputs in global variable state */\n// var inputs = redactor.querySelectorAll('[contenteditable], input, textarea');\n//\n// Array.prototype.map.call(inputs, function (current) {\n//\n// if (!current.type || current.type == 'text' || current.type == 'textarea') {\n//\n// editor.state.inputs.push(current);\n//\n// }\n//\n// });\n//\n// };\n//\n// /**\n// * Adds first initial block on empty redactor\n// */\n// ui.addInitialBlock = function () {\n//\n// var initialBlockType = editor.settings.initialBlockPlugin,\n// initialBlock;\n//\n// if ( !editor.tools[initialBlockType] ) {\n//\n// editor.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n// return;\n//\n// }\n//\n// initialBlock = editor.tools[initialBlockType].render();\n//\n// initialBlock.setAttribute('data-placeholder', editor.settings.placeholder);\n//\n// editor.content.insertBlock({\n// type : initialBlockType,\n// block : initialBlock\n// });\n//\n// editor.content.workingNodeChanged(initialBlock);\n//\n// };\n//\n// ui.setInlineToolbarButtonBehaviour = function (button, type) {\n//\n// editor.listeners.add(button, 'mousedown', function (event) {\n//\n// editor.toolbar.inline.toolClicked(event, type);\n//\n// }, false);\n//\n// };\n//\n// return ui;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/ui.js","exports = module.exports = require(\"../../node_modules/css-loader/lib/css-base.js\")(undefined);\n// imports\n\n\n// module\nexports.push([module.id, \":root {\\n\\n /**\\n * Toolbar buttons\\n */\\n\\n /**\\n * Block content width\\n */\\n\\n /**\\n * Toolbar Plus Button and Toolbox buttons height and width\\n */\\n\\n}\\n/**\\n* Editor wrapper\\n*/\\n.codex-editor {\\n position: relative;\\n border: 1px solid #ccc;\\n padding: 10px;\\n box-sizing: border-box;\\n}\\n.codex-editor .hide {\\n display: none;\\n }\\n.codex-editor__redactor {\\n padding-bottom: 300px;\\n }\\n.ce-toolbar {\\n position: absolute;\\n left: 0;\\n right: 0;\\n top: 0;\\n /*opacity: 0;*/\\n /*visibility: hidden;*/\\n transition: opacity 100ms ease;\\n will-change: opacity, transform;\\n display: none;\\n}\\n.ce-toolbar--opened {\\n display: block;\\n /*opacity: 1;*/\\n /*visibility: visible;*/\\n }\\n.ce-toolbar__content {\\n max-width: 650px;\\n margin: 0 auto;\\n position: relative;\\n }\\n.ce-toolbar__plus {\\n position: absolute;\\n left: calc(-34px - 10px);\\n display: inline-block;\\n background-color: #eff2f5;\\n width: 34px;\\n height: 34px;\\n line-height: 34px;\\n text-align: center;\\n border-radius: 50%\\n }\\n.ce-toolbar__plus::after {\\n content: '+';\\n font-size: 26px;\\n display: block;\\n margin-top: -2px;\\n margin-right: -2px;\\n\\n}\\n.ce-toolbar__plus--hidden {\\n display: none;\\n\\n}\\n.ce-toolbox {\\n visibility: hidden;\\n transition: opacity 100ms ease;\\n will-change: opacity;\\n}\\n.ce-toolbox--opened {\\n opacity: 1;\\n visibility: visible;\\n }\\n.ce-toolbox__button {\\n display: inline-block;\\n list-style: none;\\n margin: 0;\\n background: #eff2f5;\\n width: 34px;\\n height: 34px;\\n border-radius: 30px;\\n overflow: hidden;\\n text-align: center;\\n line-height: 34px\\n }\\n.ce-toolbox__button::before {\\n content: attr(title);\\n font-size: 22px;\\n font-weight: 500;\\n letter-spacing: 1em;\\n -webkit-font-feature-settings: \\\"smcp\\\", \\\"c2sc\\\";\\n font-feature-settings: \\\"smcp\\\", \\\"c2sc\\\";\\n font-variant-caps: all-small-caps;\\n padding-left: 11.5px;\\n margin-top: -1px;\\n display: inline-block;\\n\\n}\\n.ce-block {\\n border: 1px dotted #ccc;\\n margin: 2px 0;\\n}\\n.ce-block--selected {\\n background-color: #eff2f5;\\n }\\n.ce-block__content {\\n max-width: 650px;\\n margin: 0 auto;\\n }\\n\", \"\"]);\n\n// exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/styles/main.css\n// module id = 20\n// module chunks = 0","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t// when a module is imported multiple times with different media queries.\n\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/css-loader/lib/css-base.js\n// module id = 21\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/src/components/modules/listeners.js b/src/components/modules/listeners.js index eeba4ce5..f646c2a6 100644 --- a/src/components/modules/listeners.js +++ b/src/components/modules/listeners.js @@ -206,10 +206,12 @@ export default class Listeners extends Module { this.allListeners.map( (current) => { - this.off(current.element, current.type, current.handler); + current.element.removeEventListener(current.eventType, current.handler); }); + this.allListeners = []; + } } \ No newline at end of file From 3ae2f9b8d696ed5e14c09a75bc4a490060023bc2 Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Mon, 8 Jan 2018 14:11:50 +0300 Subject: [PATCH 6/6] ups --- docs/listeners.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 docs/listeners.md diff --git a/docs/listeners.md b/docs/listeners.md deleted file mode 100644 index 9848685d..00000000 --- a/docs/listeners.md +++ /dev/null @@ -1 +0,0 @@ -# CodeX Editor Listeners \ No newline at end of file