From c2acc2582554267a97b241fd5f3a57755da30bb0 Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Wed, 27 Dec 2017 08:47:30 +0300 Subject: [PATCH 01/14] Caret module: initial --- build/codex-editor.js | 445 +++++++++++++++++++++++-- build/codex-editor.js.map | 2 +- example/example.html | 2 +- src/components/dom.js | 164 ++++++++- src/components/modules/blockManager.js | 97 ++++++ src/components/modules/caret.js | 64 +++- src/components/modules/ui.js | 28 ++ src/components/utils.js | 51 +++ src/styles/toolbar.css | 10 +- 9 files changed, 811 insertions(+), 52 deletions(-) diff --git a/build/codex-editor.js b/build/codex-editor.js index b7908219..8f819694 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -199,6 +199,15 @@ var Util = function () { } } + /** + * Returns basic keycodes as constants + * @return {{}} + */ + + }, { + key: 'sequence', + + /** * @typedef {Object} ChainData * @property {Object} data - data that will be passed to the success or fallback @@ -214,9 +223,6 @@ var Util = function () { * * @return {Promise} */ - - }, { - key: 'sequence', value: function sequence(chains) { var success = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {}; var fallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {}; @@ -315,6 +321,57 @@ var Util = function () { return Promise.resolve(object) === object; } + + /** + * Check if passed element is contenteditable + * @param element + * @return {boolean} + */ + + }, { + key: 'isContentEditable', + value: function isContentEditable(element) { + + return element.contentEditable === 'true'; + } + }, { + key: 'keyCodes', + get: function get() { + + return { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + ESC: 27, + SPACE: 32, + LEFT: 37, + UP: 38, + DOWN: 40, + RIGHT: 39, + DELETE: 46, + META: 91 + }; + } + + /** + * Returns basic nodetypes as contants + * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}} + */ + + }, { + key: 'nodeTypes', + get: function get() { + + return { + TAG: 1, + TEXT: 3, + COMMENT: 8, + DOCUMENT_FRAGMENT: 11 + }; + } }]); return Util; @@ -345,7 +402,7 @@ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** - * DOM manupulations helper + * DOM manipulations helper */ var Dom = function () { function Dom() { @@ -388,6 +445,20 @@ var Dom = function () { return el; } + /** + * Creates text Node with content + * + * @param {String} content - text content + * @return {Text} + */ + + }, { + key: 'text', + value: function text(content) { + + return document.createTextNode(content); + } + /** * Append one or several elements to the parent * @@ -451,6 +522,52 @@ var Dom = function () { return el.querySelectorAll(selector); } + /** + * Search for deepest node + * + * @param {Element} node - start Node + * @param {Boolean} atLast - find last text node + * @return {*} + */ + + }, { + key: 'getDeepestTextNode', + value: function getDeepestTextNode(node) { + var atLast = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + + if (node.childNodes.length === 0) { + + /** + * We need to return empty text node + * But caret will not be placed in empty textNode, so we need textNode with zero-width char + */ + if (this.isElement(node)) { + + /** and it is not native input */ + if (!this.isNativeInput(node)) { + + var emptyTextNode = this.text('\u200B'); + + node.appendChild(emptyTextNode); + } + } + + return node; + } + + var childsLength = node.childNodes.length, + last = childsLength - 1; + + if (atLast) { + + return this.getDeepestTextNode(node.childNodes[last], atLast); + } else { + + return this.getDeepestTextNode(node.childNodes[0], false); + } + } + /** * Check if object is DOM node * @@ -464,6 +581,96 @@ var Dom = function () { return node && (typeof node === 'undefined' ? 'undefined' : _typeof(node)) === 'object' && node.nodeType && node.nodeType === Node.ELEMENT_NODE; } + + /** + * Checks target if it is native input + * @param {Element|*} target - HTML element or string + * @return {boolean} + */ + + }, { + key: 'isNativeInput', + value: function isNativeInput(target) { + + var nativeInputs = ['INPUT', 'TEXTAREA']; + + return nativeInputs.indexOf(target.tagName) !== -1; + } + }, { + key: 'isEmpty', + value: function isEmpty(node) { + var _this = this; + + var treeWalker = [], + stack = []; + + treeWalker.push(node); + + while (treeWalker.length > 0) { + + if (node && node.childNodes.length === 0) { + + stack.push(node); + } + + while (node && node.nextSibling) { + + node = node.nextSibling; + + if (!node) continue; + + if (node.childNodes.length === 0) { + + stack.push(node); + } + + treeWalker.push(node); + } + + node = treeWalker.shift(); + + if (!node) continue; + + node = node.firstChild; + treeWalker.push(node); + } + + var isEmpty = true; + + stack.forEach(function (node) { + + if (_this.isElement(node)) { + + if (_this.isNativeInput(node)) { + + node = node.value; + + if (node.trim()) { + + isEmpty = false; + } + } else { + + node = node.textContent.replace('\u200B', ''); + + if (node.trim()) { + + isEmpty = false; + } + } + } else { + + node = node.textContent.replace('\u200B', ''); + + if (node.trim()) { + + isEmpty = false; + } + } + }); + + return isEmpty; + } }]); return Dom; @@ -1263,7 +1470,7 @@ webpackContext.id = 6; /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(Module, $, _) { +/* WEBPACK VAR INJECTION */(function(Module, _, $) { Object.defineProperty(exports, "__esModule", { value: true @@ -1382,6 +1589,8 @@ var BlockManager = function (_Module) { var toolInstance = this.Editor.Tools.construct(toolName, data), block = new _block2.default(toolName, toolInstance); + this.bindEvents(block); + /** * Apply callback before inserting html */ @@ -1390,6 +1599,73 @@ var BlockManager = function (_Module) { return block; } + /** + * Bind Events + * @param {Object} block + */ + + }, { + key: 'bindEvents', + value: function bindEvents(block) { + var _this3 = this; + + /** contentNode click handler */ + block.wrapper.addEventListener('click', function (event) { + return _this3.wrapperClicked(event); + }, false); + + /** keydown on block */ + block.pluginsContent.addEventListener('keydown', function (event) { + return _this3.keyDownOnBlock(event); + }, false); + } + + /** + * Highlight clicked block + * @param {MouseEvent} event + */ + + }, { + key: 'wrapperClicked', + value: function wrapperClicked(event) { + + this.setCurrentBlockByChildNode(event.target); + } + + /** + * + * @param {MouseEvent} event + */ + + }, { + key: 'keyDownOnBlock', + value: function keyDownOnBlock(event) { + + switch (event.keyCode) { + + case _.keyCodes.ENTER: + this.enterPressedOnPluginsContent(event); + break; + case _.keyCodes.DOWN: + case _.keyCodes.RIGHT: + this.blockRightOrDownArrowPressed(event); + break; + + } + } + + /** + * + * @param event + */ + + }, { + key: 'blockRightOrDownArrowPressed', + value: function blockRightOrDownArrowPressed(event) { + + console.log(this.getNextBlock()); + } + /** * Insert new block into _blocks * @@ -1406,6 +1682,8 @@ var BlockManager = function (_Module) { var block = this.composeBlock(toolName, data); this._blocks[++this.currentBlockIndex] = block; + + this.Editor.Caret.set(block.pluginsContent); } /** @@ -1426,6 +1704,42 @@ var BlockManager = function (_Module) { this._blocks.insert(this.currentBlockIndex, block, true); } + /** + * + * @return {*} + */ + + }, { + key: 'getLastBlock', + value: function getLastBlock() { + + return this._blocks[this._blocks.length - 1]; + } + + /** + * + * @param index + * @return {*} + */ + + }, { + key: 'getBlockByIndex', + value: function getBlockByIndex(index) { + + return this._blocks[index]; + } + }, { + key: 'getNextBlock', + value: function getNextBlock() { + + if (this.currentBlockIndex + 1 > this._blocks.length - 1) { + + return null; + } + + return this._blocks[this.currentBlockIndex + 1]; + } + /** * Get Block instance by html element * @@ -1554,6 +1868,13 @@ var BlockManager = function (_Module) { return BlockManager; }(Module); +BlockManager.displayName = 'BlockManager'; +exports.default = BlockManager; + +var BlockMethods = function BlockMethods() { + _classCallCheck(this, BlockMethods); +}; + /** * @class Blocks * @classdesc Class to work with Block instances array @@ -1565,8 +1886,7 @@ var BlockManager = function (_Module) { */ -BlockManager.displayName = 'BlockManager'; -exports.default = BlockManager; +BlockMethods.displayName = 'BlockMethods'; var Blocks = function () { @@ -1787,14 +2107,14 @@ var Blocks = function () { Blocks.displayName = 'Blocks'; module.exports = exports['default']; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(2), __webpack_require__(1))) +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(1), __webpack_require__(2))) /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(Module) { +/* WEBPACK VAR INJECTION */(function(Module, $) { Object.defineProperty(exports, "__esModule", { value: true @@ -1829,14 +2149,52 @@ var Caret = function (_Module) { } /** - * Set Caret to the last Block - * - * If last block is not empty, append another empty block + * Creates Document Range and sets caret to the element. + * @param {Element} element - target node. + * @param {Number} offset - offset */ _createClass(Caret, [{ - key: 'setToTheLastBlock', + key: "set", + value: function set(element) { + var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + + + /** If Element is INPUT */ + if ($.isNativeInput(element)) { + + element.focus(); + return; + } + + var nodeToSet = $.getDeepestTextNode(element, true); + + /** if found deepest node is native input */ + if ($.isNativeInput(nodeToSet)) { + + nodeToSet.focus(); + return; + } + + var range = document.createRange(), + selection = window.getSelection(); + + range.setStart(nodeToSet, offset); + range.setEnd(nodeToSet, offset); + + selection.removeAllRanges(); + selection.addRange(range); + } + }, { + key: "setToTheLastBlock", + + + /** + * Set Caret to the last Block + * + * If last block is not empty, append another empty block + */ value: function setToTheLastBlock() { var blocks = this.Editor.BlockManager.blocks, @@ -1902,31 +2260,31 @@ var Caret = function (_Module) { // } } - /** - * Set caret to the passed Node - * @param {Element} node - content-editable Element - */ + // /** + // * Set caret to the passed Node + // * @param {Element} node - content-editable Element + // */ + // set(node) { + // + // /** + // * @todo add working with Selection + // * tmp: work with textContent + // */ + // + // node.textContent += '|'; + // + // } - }, { - key: 'set', - value: function set(node) { - /** - * @todo add working with Selection - * tmp: work with textContent - */ - - node.textContent += '|'; - } }]); return Caret; }(Module); -Caret.displayName = 'Caret'; +Caret.displayName = "Caret"; exports.default = Caret; -module.exports = exports['default']; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0))) +module.exports = exports["default"]; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(2))) /***/ }), /* 9 */ @@ -3987,6 +4345,13 @@ var UI = function (_Module) { var clickedNode = event.target; + console.log('click', clickedNode); + if (clickedNode.classList.contains(this.CSS.editorZone)) { + + this.clickedOnRedactorZone(event); + return; + } + /** * Select clicked Block as Current */ @@ -4106,6 +4471,24 @@ var UI = function (_Module) { this.Editor.Toolbar.plusButton.show(); } } + }, { + key: 'clickedOnRedactorZone', + value: function clickedOnRedactorZone(event) { + + var lastBlock = this.Editor.BlockManager.getLastBlock(), + pluginsContent = lastBlock.pluginsContent; + + /** + * If last block has text content, then insert new Block after + */ + if (!$.isEmpty(pluginsContent)) { + + this.Editor.BlockManager.insert(this.config.initialBlock, {}); + } else { + + this.Editor.Caret.set(pluginsContent); + } + } }, { key: 'CSS', get: function get() { @@ -4350,7 +4733,7 @@ exports = module.exports = __webpack_require__(19)(undefined); // module -exports.push([module.i, ":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}\n.ce-toolbar--opened {\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", ""]); +exports.push([module.i, ":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", ""]); // exports diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 342ef3e4..f354e3d9 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 25b8f8d4aadd3e82ef8d","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","Dom","tagName","classNames","attributes","el","document","createElement","isArray","classList","add","attrName","parent","elements","forEach","appendChild","selector","querySelector","querySelectorAll","node","nodeType","Node","ELEMENT_NODE","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","content","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","textContent","trim","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","composeBlock","insert","element","index","indexOf","childNode","isElement","parentFirstLevelBlock","currentNode","Error","array","currentBlock","workingArea","push","html","replace","deleteCount","splice","previousBlock","insertAdjacentElement","nextBlock","targetBlock","newBlock","children","instance","isNaN","Number","Caret","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","addEventListener","plusButtonClicked","event","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","bindEvents","getElementById","editorWrapper","editorZone","styles","tag","toString","head","redactorClicked","clickedNode","setCurrentBlockByChildNode","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock"],"mappings":"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Acd,UAAUQ,YAAV,CAAlB;;AAEA,mBAAOM,YAAYL,KAAZ,CAAkBF,WAAlB,CAAP;AAEH;;;;EA3GkC7M,M;;;kBAAlBsM,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,YAATpN,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,cAAKqN,MAAL,GAAc,IAAd;AACA,cAAKC,UAAL,GAAkB,EAAlB;;AALkB;AAOrB;;AAED;;;;;;;;+BAIO;AAAA;;AAEH,gBAAIlE,SAAS,KAAKhJ,MAAL,CAAYuH,YAAZ,CAAyByB,MAAtC;AAAA,gBACI5H,YAAY,EADhB;;AAGA4H,mBAAOhG,OAAP,CAAe,UAACwG,KAAD,EAAW;;AAEtBpI,0BAAUkJ,IAAV,CAAed,MAAMhI,IAArB;AAEH,aAJD;;AAMA,mBAAOb,QAAQwM,GAAR,CAAY/L,SAAZ,EACFH,IADE,CACG,UAACmM,gBAAD;AAAA,uBAAsB,OAAKC,UAAL,CAAgBD,gBAAhB,CAAtB;AAAA,aADH,EAEFnM,IAFE,CAEG,UAACqM,UAAD,EAAgB;;AAElB,uBAAOA,UAAP;AAEH,aANE,CAAP;AAQH;;AAED;;;;;;;;mCAKWF,gB,EAAkB;;AAEzB,gBAAI3F,QAAQ,EAAZ;AAAA,gBACI8F,YAAY,CADhB;;AAGAjN,oBAAQkN,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBpK,OAAjB,CAAyB,UAACyK,UAAD,EAAa7D,KAAb,EAAuB;;AAE5C;AACAtJ,wBAAQ+E,GAAR,UAAgBoI,WAAW5J,IAA3B,uBAAgD4J,UAAhD;AACAF,6BAAaE,WAAWvI,IAAxB;AACAuC,sBAAM6C,IAAN,CAAWmD,WAAWjM,IAAtB;AAEH,aAPD;;AASAlB,oBAAQ+E,GAAR,CAAY,OAAZ,EAAqBkI,SAArB;AACAjN,oBAAQoN,QAAR;;AAEA,mBAAO;AACHxI,sBAAU,CAAC,IAAIyI,IAAJ,EADR;AAEHlG,uBAAUA,KAFP;AAGHmG,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8BlO,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;;;;kBAvOqBqN,K;;;;;;;;;;;;;;;;;;;;;;;ACvBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmDqBc,O;;;AAEjB;;;AAGA,yBAAsB;AAAA,QAATlO,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAKsJ,KAAL,GAAa;AACTlF,eAAU,IADD;AAETK,eAAU,IAFD;AAGT0J,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,WAAKlF,KAAL,CAAWlF,OAAX,GAAqBC,EAAEC,IAAF,CAAO,KAAP,EAAc4J,QAAQ3J,GAAR,CAAYkK,OAA1B,CAArB;;AAEA;;;AAGA,OAAC,SAAD,EAAa,SAAb,EAAwBrL,OAAxB,CAAiC,cAAM;;AAEnC,eAAKkG,KAAL,CAAW3G,EAAX,IAAiB0B,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;;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,WAAKrS,MAAL,CAAY8N,OAAZ,CAAoB6C,IAApB;AACA,WAAK3Q,MAAL,CAAY8N,OAAZ,CAAoB+C,IAApB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA,WAAK7Q,MAAL,CAAY8N,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;;AAEA;;;;;AAKA,UAAI8C,iBAAiB,KAAKtS,MAAL,CAAYqH,KAAZ,CAAkBkL,SAAlB,CAA4B,KAAKvS,MAAL,CAAYuH,YAAZ,CAAyB6C,YAAzB,CAAsCvG,IAAlE,CAArB;AAAA,UACI2O,eAAe,KAAKxS,MAAL,CAAYuH,YAAZ,CAAyB6C,YAAzB,CAAsCnE,OADzD;;AAGA,UAAIqM,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAKxS,MAAL,CAAY8N,OAAZ,CAAoBE,UAApB,CAA+B0B,IAA/B;AAEH;AAEJ;;;wBA3OS;;AAEN,aAAO;AACHkC,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2BlS,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;;;;kBApgBqB2H,E;;;;;;;;ACrDrB;AACA;;;AAGA;AACA,gCAAiC,sLAAsL,4CAA4C,yBAAyB,6BAA6B,oBAAoB,6BAA6B,GAAG,uBAAuB,wBAAwB,OAAO,2BAA2B,gCAAgC,OAAO,eAAe,uBAAuB,YAAY,aAAa,WAAW,eAAe,uBAAuB,mCAAmC,oCAAoC,GAAG,uBAAuB,iBAAiB,0BAA0B,KAAK,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;;AAE7xE;;;;;;;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 25b8f8d4aadd3e82ef8d","/**\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 * @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\n\n// WEBPACK FOOTER //\n// ./src/components/utils.js","/**\n * DOM manupulations 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 var 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 * 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 * 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\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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\nimport Block from '../block';\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 /**\n * Apply callback before inserting html\n */\n block.call('appendCallback', {});\n\n return block;\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\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 * Get Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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 * @class Caret\n * @classdesc Contains methods for working Caret\n *\n * @typedef {Caret} Caret\n */\nexport default class Caret extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * Set Caret to the last Block\n *\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let blocks = this.Editor.BlockManager.blocks,\n lastBlock;\n\n if (blocks.length) {\n\n lastBlock = blocks[blocks.length - 1];\n\n }\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.set(lastBlock.html);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\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 }\n\n /**\n * Set caret to the passed Node\n * @param {Element} node - content-editable Element\n */\n set(node) {\n\n /**\n * @todo add working with Selection\n * tmp: work with textContent\n */\n\n node.textContent += '|';\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 = 12\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\nimport 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}\\n.ce-toolbar--opened {\\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 = 18\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 = 19\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 6c85f5abf728ab1612e6","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","TAG","TEXT","COMMENT","DOCUMENT_FRAGMENT","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","getDeepestTextNode","nodeType","Node","ELEMENT_NODE","nativeInputs","indexOf","treeWalker","stack","push","nextSibling","shift","firstChild","isEmpty","value","trim","textContent","replace","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","wrapperClicked","keyDownOnBlock","setCurrentBlockByChildNode","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","getNextBlock","composeBlock","Caret","insert","index","childNode","parentFirstLevelBlock","currentNode","Error","array","currentBlock","BlockMethods","workingArea","html","deleteCount","splice","previousBlock","insertAdjacentElement","nextBlock","targetBlock","newBlock","children","instance","isNaN","Number","offset","focus","nodeToSet","range","createRange","selection","getSelection","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","clickedOnRedactorZone","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","getLastBlock"],"mappings":"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AiBxM,OAAjB,CAAyB,UAAC6M,UAAD,EAAapE,KAAb,EAAuB;;AAE5C;AACAzM,wBAAQ0H,GAAR,UAAgBmJ,WAAW1K,IAA3B,uBAAgD0K,UAAhD;AACAF,6BAAaE,WAAWtJ,IAAxB;AACAoC,sBAAMrE,IAAN,CAAWuL,WAAW3P,IAAtB;AAEH,aAPD;;AASAlB,oBAAQ0H,GAAR,CAAY,OAAZ,EAAqBiJ,SAArB;AACA3Q,oBAAQ8Q,QAAR;;AAEA,mBAAO;AACHvJ,sBAAU,CAAC,IAAIwJ,IAAJ,EADR;AAEHpH,uBAAUA,KAFP;AAGHqH,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8B5R,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;;;;kBAvOqB+Q,K;;;;;;;;;;;;;;;;;;;;;;;ACvB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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAhiBqBmK,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 6c85f5abf728ab1612e6","/**\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 * Returns basic nodetypes as contants\n * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}}\n */\n static get nodeTypes() {\n\n return {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8,\n DOCUMENT_FRAGMENT: 11\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\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 var 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 content\n *\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\n *\n * @param {Element} node - start Node\n * @param {Boolean} atLast - find last text node\n * @return {*}\n */\n static getDeepestTextNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return 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)) {\n\n /** and it is not native input */\n if (!this.isNativeInput(node)) {\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\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.getDeepestTextNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestTextNode(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|*} 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 nativeInputs.indexOf(target.tagName) !== -1;\n\n }\n\n static isEmpty(node) {\n\n let treeWalker = [],\n stack = [];\n\n treeWalker.push(node);\n\n while ( treeWalker.length > 0 ) {\n\n if (node && node.childNodes.length === 0) {\n\n stack.push(node);\n\n }\n\n while ( node && node.nextSibling ) {\n\n node = node.nextSibling;\n\n if (!node) continue;\n\n if (node.childNodes.length === 0) {\n\n stack.push(node);\n\n }\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 let isEmpty = true;\n\n stack.forEach( (node) => {\n\n if ( this.isElement(node) ) {\n\n if ( this.isNativeInput(node) ) {\n\n node = node.value;\n\n if ( node.trim() ) {\n\n isEmpty = false;\n\n }\n\n } else {\n\n node = node.textContent.replace('\\u200B', '');\n\n if ( node.trim() ) {\n\n isEmpty = false;\n\n }\n\n }\n\n } else {\n\n node = node.textContent.replace('\\u200B', '');\n\n if ( node.trim() ) {\n\n isEmpty = false;\n\n }\n\n }\n\n });\n \n return isEmpty;\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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\nimport Block from '../block';\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 /** contentNode click handler */\n block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false);\n\n /** keydown on block */\n block.pluginsContent.addEventListener('keydown', (event) => this.keyDownOnBlock(event), false);\n\n }\n\n /**\n * Highlight clicked block\n * @param {MouseEvent} event\n */\n wrapperClicked(event) {\n\n this.setCurrentBlockByChildNode(event.target);\n\n }\n\n /**\n *\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.blockRightOrDownArrowPressed(event);\n break;\n\n }\n\n }\n\n /**\n *\n * @param event\n */\n blockRightOrDownArrowPressed(event) {\n\n console.log(this.getNextBlock());\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\n this.Editor.Caret.set(block.pluginsContent);\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 *\n * @return {*}\n */\n getLastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n *\n * @param index\n * @return {*}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n getNextBlock() {\n\n if (this.currentBlockIndex + 1 > this._blocks.length - 1) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex + 1];\n\n }\n\n /**\n * Get Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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\nclass BlockMethods {\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 * @class Caret\n * @classdesc Contains methods for working Caret\n *\n * @typedef {Caret} Caret\n */\nexport default class Caret extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * Creates Document Range and sets caret to the element.\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n */\n set( element, offset = 0) {\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestTextNode(element, true);\n\n /** if found deepest node is native input */\n if ($.isNativeInput(nodeToSet)) {\n\n nodeToSet.focus();\n return;\n\n }\n\n let range = document.createRange(),\n selection = window.getSelection();\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n };\n\n /**\n * Set Caret to the last Block\n *\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let blocks = this.Editor.BlockManager.blocks,\n lastBlock;\n\n if (blocks.length) {\n\n lastBlock = blocks[blocks.length - 1];\n\n }\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.set(lastBlock.html);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\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 }\n\n // /**\n // * Set caret to the passed Node\n // * @param {Element} node - content-editable Element\n // */\n // set(node) {\n //\n // /**\n // * @todo add working with Selection\n // * tmp: work with textContent\n // */\n //\n // node.textContent += '|';\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.getLastBlock(),\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/example/example.html b/example/example.html index 3d7ce242..113cc5ac 100644 --- a/example/example.html +++ b/example/example.html @@ -82,7 +82,7 @@ { type : 'text', data : { - text : 'Пишите нам на team@ifmo.su' + text : '

    ' } }, ] diff --git a/src/components/dom.js b/src/components/dom.js index 1a1897a5..50dbedc4 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -1,5 +1,5 @@ /** - * DOM manupulations helper + * DOM manipulations helper */ export default class Dom { @@ -35,6 +35,18 @@ export default class Dom { } + /** + * Creates text Node with content + * + * @param {String} content - text content + * @return {Text} + */ + static text(content) { + + return document.createTextNode(content); + + } + /** * Append one or several elements to the parent * @@ -86,6 +98,54 @@ export default class Dom { } + /** + * Search for deepest node + * + * @param {Element} node - start Node + * @param {Boolean} atLast - find last text node + * @return {*} + */ + static getDeepestTextNode(node, atLast = false) { + + if (node.childNodes.length === 0) { + + /** + * We need to return empty text node + * But caret will not be placed in empty textNode, so we need textNode with zero-width char + */ + if (this.isElement(node)) { + + /** and it is not native input */ + if (!this.isNativeInput(node)) { + + let emptyTextNode = this.text('\u200B'); + + node.appendChild(emptyTextNode); + + } + + + } + + return node; + + } + + let childsLength = node.childNodes.length, + last = childsLength - 1; + + if (atLast) { + + return this.getDeepestTextNode(node.childNodes[last], atLast); + + } else { + + return this.getDeepestTextNode(node.childNodes[0], false); + + } + + } + /** * Check if object is DOM node * @@ -98,4 +158,106 @@ export default class Dom { } + /** + * Checks target if it is native input + * @param {Element|*} target - HTML element or string + * @return {boolean} + */ + static isNativeInput(target) { + + let nativeInputs = [ + 'INPUT', + 'TEXTAREA' + ]; + + return nativeInputs.indexOf(target.tagName) !== -1; + + } + + static isEmpty(node) { + + let treeWalker = [], + stack = []; + + treeWalker.push(node); + + while ( treeWalker.length > 0 ) { + + if (node && node.childNodes.length === 0) { + + stack.push(node); + + } + + while ( node && node.nextSibling ) { + + node = node.nextSibling; + + if (!node) continue; + + if (node.childNodes.length === 0) { + + stack.push(node); + + } + + treeWalker.push(node); + + } + + node = treeWalker.shift(); + + if (!node) continue; + + node = node.firstChild; + treeWalker.push(node); + + } + + let isEmpty = true; + + stack.forEach( (node) => { + + if ( this.isElement(node) ) { + + if ( this.isNativeInput(node) ) { + + node = node.value; + + if ( node.trim() ) { + + isEmpty = false; + + } + + } else { + + node = node.textContent.replace('\u200B', ''); + + if ( node.trim() ) { + + isEmpty = false; + + } + + } + + } else { + + node = node.textContent.replace('\u200B', ''); + + if ( node.trim() ) { + + isEmpty = false; + + } + + } + + }); + + return isEmpty; + + } + }; \ No newline at end of file diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index 792df0f2..e607ef76 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -90,6 +90,8 @@ export default class BlockManager extends Module { let toolInstance = this.Editor.Tools.construct(toolName, data), block = new Block(toolName, toolInstance); + this.bindEvents(block); + /** * Apply callback before inserting html */ @@ -99,6 +101,60 @@ export default class BlockManager extends Module { } + /** + * Bind Events + * @param {Object} block + */ + bindEvents(block) { + + /** contentNode click handler */ + block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false); + + /** keydown on block */ + block.pluginsContent.addEventListener('keydown', (event) => this.keyDownOnBlock(event), false); + + } + + /** + * Highlight clicked block + * @param {MouseEvent} event + */ + wrapperClicked(event) { + + this.setCurrentBlockByChildNode(event.target); + + } + + /** + * + * @param {MouseEvent} event + */ + keyDownOnBlock(event) { + + switch(event.keyCode) { + + case _.keyCodes.ENTER: + this.enterPressedOnPluginsContent(event); + break; + case _.keyCodes.DOWN: + case _.keyCodes.RIGHT: + this.blockRightOrDownArrowPressed(event); + break; + + } + + } + + /** + * + * @param event + */ + blockRightOrDownArrowPressed(event) { + + console.log(this.getNextBlock()); + + } + /** * Insert new block into _blocks * @@ -112,6 +168,8 @@ export default class BlockManager extends Module { this._blocks[++this.currentBlockIndex] = block; + this.Editor.Caret.set(block.pluginsContent); + } /** @@ -128,6 +186,39 @@ export default class BlockManager extends Module { } + /** + * + * @return {*} + */ + getLastBlock() { + + return this._blocks[this._blocks.length - 1]; + + } + + /** + * + * @param index + * @return {*} + */ + getBlockByIndex(index) { + + return this._blocks[index]; + + } + + getNextBlock() { + + if (this.currentBlockIndex + 1 > this._blocks.length - 1) { + + return null; + + } + + return this._blocks[this.currentBlockIndex + 1]; + + } + /** * Get Block instance by html element * @@ -244,6 +335,12 @@ export default class BlockManager extends Module { } +} + +class BlockMethods { + + + } /** diff --git a/src/components/modules/caret.js b/src/components/modules/caret.js index e51aefc6..255886de 100644 --- a/src/components/modules/caret.js +++ b/src/components/modules/caret.js @@ -15,6 +15,42 @@ export default class Caret extends Module { } + /** + * Creates Document Range and sets caret to the element. + * @param {Element} element - target node. + * @param {Number} offset - offset + */ + set( element, offset = 0) { + + /** If Element is INPUT */ + if ($.isNativeInput(element)) { + + element.focus(); + return; + + } + + let nodeToSet = $.getDeepestTextNode(element, true); + + /** if found deepest node is native input */ + if ($.isNativeInput(nodeToSet)) { + + nodeToSet.focus(); + return; + + } + + let range = document.createRange(), + selection = window.getSelection(); + + range.setStart(nodeToSet, offset); + range.setEnd(nodeToSet, offset); + + selection.removeAllRanges(); + selection.addRange(range); + + }; + /** * Set Caret to the last Block * @@ -90,20 +126,20 @@ export default class Caret extends Module { } - /** - * Set caret to the passed Node - * @param {Element} node - content-editable Element - */ - set(node) { - - /** - * @todo add working with Selection - * tmp: work with textContent - */ - - node.textContent += '|'; - - } + // /** + // * Set caret to the passed Node + // * @param {Element} node - content-editable Element + // */ + // set(node) { + // + // /** + // * @todo add working with Selection + // * tmp: work with textContent + // */ + // + // node.textContent += '|'; + // + // } } \ No newline at end of file diff --git a/src/components/modules/ui.js b/src/components/modules/ui.js index f76508de..3d91b64c 100644 --- a/src/components/modules/ui.js +++ b/src/components/modules/ui.js @@ -224,6 +224,14 @@ export default class UI extends Module { let clickedNode = event.target; + console.log('click', clickedNode); + if ( clickedNode.classList.contains(this.CSS.editorZone) ) { + + this.clickedOnRedactorZone(event); + return; + + } + /** * Select clicked Block as Current */ @@ -352,6 +360,26 @@ export default class UI extends Module { } + clickedOnRedactorZone(event) { + + let lastBlock = this.Editor.BlockManager.getLastBlock(), + pluginsContent = lastBlock.pluginsContent; + + /** + * If last block has text content, then insert new Block after + */ + if (!$.isEmpty(pluginsContent)) { + + this.Editor.BlockManager.insert(this.config.initialBlock, {}); + + } else { + + this.Editor.Caret.set(pluginsContent); + + } + + } + } // /** diff --git a/src/components/utils.js b/src/components/utils.js index fade4849..777f97dd 100644 --- a/src/components/utils.js +++ b/src/components/utils.js @@ -40,6 +40,46 @@ export default class Util { } + /** + * Returns basic keycodes as constants + * @return {{}} + */ + static get keyCodes() { + + return { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + ESC: 27, + SPACE: 32, + LEFT: 37, + UP: 38, + DOWN: 40, + RIGHT: 39, + DELETE: 46, + META: 91 + }; + + } + + /** + * Returns basic nodetypes as contants + * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}} + */ + static get nodeTypes() { + + return { + TAG : 1, + TEXT : 3, + COMMENT : 8, + DOCUMENT_FRAGMENT: 11 + }; + + } + /** * @typedef {Object} ChainData * @property {Object} data - data that will be passed to the success or fallback @@ -157,4 +197,15 @@ export default class Util { } + /** + * Check if passed element is contenteditable + * @param element + * @return {boolean} + */ + static isContentEditable(element) { + + return element.contentEditable === 'true'; + + } + }; \ No newline at end of file diff --git a/src/styles/toolbar.css b/src/styles/toolbar.css index 38cc6bdf..884c093f 100644 --- a/src/styles/toolbar.css +++ b/src/styles/toolbar.css @@ -3,14 +3,16 @@ left: 0; right: 0; top: 0; - opacity: 0; - visibility: hidden; + /*opacity: 0;*/ + /*visibility: hidden;*/ transition: opacity 100ms ease; will-change: opacity, transform; + display: none; &--opened { - opacity: 1; - visibility: visible; + display: block; + /*opacity: 1;*/ + /*visibility: visible;*/ } &__content { From cfef2bb7e2ef506dfbd3a136dcd0e286ac171c36 Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Thu, 28 Dec 2017 21:41:47 +0300 Subject: [PATCH 02/14] improvements --- build/codex-editor.js | 79 +++++++++++++++++++---------------- build/codex-editor.js.map | 2 +- src/components/dom.js | 87 ++++++++++++++++++++------------------- 3 files changed, 88 insertions(+), 80 deletions(-) diff --git a/build/codex-editor.js b/build/codex-editor.js index 8f819694..e046caa6 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -596,10 +596,51 @@ var Dom = function () { return nativeInputs.indexOf(target.tagName) !== -1; } + + /** + * Checks node if it is empty + * It must be node without childNodes + * @param {Node} node + * + * @return {Boolean} true if it is empty + */ + + }, { + key: 'checkNodeEmpty', + value: function checkNodeEmpty(node) { + + if (this.isElement(node) && this.isNativeInput(node)) { + + node = node.value; + + if (node.trim()) { + + return false; + } + } else { + + node = node.textContent.replace('\u200B', ''); + + if (node.trim()) { + + return false; + } + } + + return true; + } + + /** + * breadth-first search + * + * Pushes to stack all DOM leafs and checks for emptiness + * @param {Node} node + * @return {boolean} + */ + }, { key: 'isEmpty', value: function isEmpty(node) { - var _this = this; var treeWalker = [], stack = []; @@ -635,41 +676,7 @@ var Dom = function () { treeWalker.push(node); } - var isEmpty = true; - - stack.forEach(function (node) { - - if (_this.isElement(node)) { - - if (_this.isNativeInput(node)) { - - node = node.value; - - if (node.trim()) { - - isEmpty = false; - } - } else { - - node = node.textContent.replace('\u200B', ''); - - if (node.trim()) { - - isEmpty = false; - } - } - } else { - - node = node.textContent.replace('\u200B', ''); - - if (node.trim()) { - - isEmpty = false; - } - } - }); - - return isEmpty; + return stack.every(this.checkNodeEmpty); } }]); diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index f354e3d9..290e5e67 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 6c85f5abf728ab1612e6","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","TAG","TEXT","COMMENT","DOCUMENT_FRAGMENT","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","getDeepestTextNode","nodeType","Node","ELEMENT_NODE","nativeInputs","indexOf","treeWalker","stack","push","nextSibling","shift","firstChild","isEmpty","value","trim","textContent","replace","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","wrapperClicked","keyDownOnBlock","setCurrentBlockByChildNode","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","getNextBlock","composeBlock","Caret","insert","index","childNode","parentFirstLevelBlock","currentNode","Error","array","currentBlock","BlockMethods","workingArea","html","deleteCount","splice","previousBlock","insertAdjacentElement","nextBlock","targetBlock","newBlock","children","instance","isNaN","Number","offset","focus","nodeToSet","range","createRange","selection","getSelection","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","clickedOnRedactorZone","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","getLastBlock"],"mappings":"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AiBxM,OAAjB,CAAyB,UAAC6M,UAAD,EAAapE,KAAb,EAAuB;;AAE5C;AACAzM,wBAAQ0H,GAAR,UAAgBmJ,WAAW1K,IAA3B,uBAAgD0K,UAAhD;AACAF,6BAAaE,WAAWtJ,IAAxB;AACAoC,sBAAMrE,IAAN,CAAWuL,WAAW3P,IAAtB;AAEH,aAPD;;AASAlB,oBAAQ0H,GAAR,CAAY,OAAZ,EAAqBiJ,SAArB;AACA3Q,oBAAQ8Q,QAAR;;AAEA,mBAAO;AACHvJ,sBAAU,CAAC,IAAIwJ,IAAJ,EADR;AAEHpH,uBAAUA,KAFP;AAGHqH,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8B5R,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;;;;kBAvOqB+Q,K;;;;;;;;;;;;;;;;;;;;;;;ACvB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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAhiBqBmK,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 6c85f5abf728ab1612e6","/**\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 * Returns basic nodetypes as contants\n * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}}\n */\n static get nodeTypes() {\n\n return {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8,\n DOCUMENT_FRAGMENT: 11\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\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 var 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 content\n *\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\n *\n * @param {Element} node - start Node\n * @param {Boolean} atLast - find last text node\n * @return {*}\n */\n static getDeepestTextNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return 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)) {\n\n /** and it is not native input */\n if (!this.isNativeInput(node)) {\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\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.getDeepestTextNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestTextNode(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|*} 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 nativeInputs.indexOf(target.tagName) !== -1;\n\n }\n\n static isEmpty(node) {\n\n let treeWalker = [],\n stack = [];\n\n treeWalker.push(node);\n\n while ( treeWalker.length > 0 ) {\n\n if (node && node.childNodes.length === 0) {\n\n stack.push(node);\n\n }\n\n while ( node && node.nextSibling ) {\n\n node = node.nextSibling;\n\n if (!node) continue;\n\n if (node.childNodes.length === 0) {\n\n stack.push(node);\n\n }\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 let isEmpty = true;\n\n stack.forEach( (node) => {\n\n if ( this.isElement(node) ) {\n\n if ( this.isNativeInput(node) ) {\n\n node = node.value;\n\n if ( node.trim() ) {\n\n isEmpty = false;\n\n }\n\n } else {\n\n node = node.textContent.replace('\\u200B', '');\n\n if ( node.trim() ) {\n\n isEmpty = false;\n\n }\n\n }\n\n } else {\n\n node = node.textContent.replace('\\u200B', '');\n\n if ( node.trim() ) {\n\n isEmpty = false;\n\n }\n\n }\n\n });\n \n return isEmpty;\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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\nimport Block from '../block';\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 /** contentNode click handler */\n block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false);\n\n /** keydown on block */\n block.pluginsContent.addEventListener('keydown', (event) => this.keyDownOnBlock(event), false);\n\n }\n\n /**\n * Highlight clicked block\n * @param {MouseEvent} event\n */\n wrapperClicked(event) {\n\n this.setCurrentBlockByChildNode(event.target);\n\n }\n\n /**\n *\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.blockRightOrDownArrowPressed(event);\n break;\n\n }\n\n }\n\n /**\n *\n * @param event\n */\n blockRightOrDownArrowPressed(event) {\n\n console.log(this.getNextBlock());\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\n this.Editor.Caret.set(block.pluginsContent);\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 *\n * @return {*}\n */\n getLastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n *\n * @param index\n * @return {*}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n getNextBlock() {\n\n if (this.currentBlockIndex + 1 > this._blocks.length - 1) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex + 1];\n\n }\n\n /**\n * Get Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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\nclass BlockMethods {\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 * @class Caret\n * @classdesc Contains methods for working Caret\n *\n * @typedef {Caret} Caret\n */\nexport default class Caret extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * Creates Document Range and sets caret to the element.\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n */\n set( element, offset = 0) {\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestTextNode(element, true);\n\n /** if found deepest node is native input */\n if ($.isNativeInput(nodeToSet)) {\n\n nodeToSet.focus();\n return;\n\n }\n\n let range = document.createRange(),\n selection = window.getSelection();\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n };\n\n /**\n * Set Caret to the last Block\n *\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let blocks = this.Editor.BlockManager.blocks,\n lastBlock;\n\n if (blocks.length) {\n\n lastBlock = blocks[blocks.length - 1];\n\n }\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.set(lastBlock.html);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\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 }\n\n // /**\n // * Set caret to the passed Node\n // * @param {Element} node - content-editable Element\n // */\n // set(node) {\n //\n // /**\n // * @todo add working with Selection\n // * tmp: work with textContent\n // */\n //\n // node.textContent += '|';\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.getLastBlock(),\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap e9b8a994bc6ec6db9157","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","TAG","TEXT","COMMENT","DOCUMENT_FRAGMENT","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","getDeepestTextNode","nodeType","Node","ELEMENT_NODE","nativeInputs","indexOf","value","trim","textContent","replace","treeWalker","stack","push","nextSibling","shift","firstChild","every","checkNodeEmpty","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","wrapperClicked","keyDownOnBlock","setCurrentBlockByChildNode","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","getNextBlock","composeBlock","Caret","insert","index","childNode","parentFirstLevelBlock","currentNode","Error","array","currentBlock","BlockMethods","workingArea","html","deleteCount","splice","previousBlock","insertAdjacentElement","nextBlock","targetBlock","newBlock","children","instance","isNaN","Number","offset","focus","nodeToSet","range","createRange","selection","getSelection","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","clickedOnRedactorZone","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","getLastBlock"],"mappings":"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AWqL,WAAW7P,IAAtB;AAEH,aAPD;;AASAlB,oBAAQ2H,GAAR,CAAY,OAAZ,EAAqBkJ,SAArB;AACA7Q,oBAAQgR,QAAR;;AAEA,mBAAO;AACHxJ,sBAAU,CAAC,IAAIyJ,IAAJ,EADR;AAEHpH,uBAAUA,KAFP;AAGHqH,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8B9R,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;;;;kBAvOqBiR,K;;;;;;;;;;;;;;;;;;;;;;;ACvBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmDqBc,O;;;AAEjB;;;AAGA,yBAAsB;AAAA,QAAT9R,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAKgM,KAAL,GAAa;AACT/E,eAAU,IADD;AAET3C,eAAU,IAFD;AAGTyN,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,WAAKpG,KAAL,CAAW/E,OAAX,GAAqBC,EAAEC,IAAF,CAAO,KAAP,EAAc2K,QAAQ1K,GAAR,CAAYiL,OAA1B,CAArB;;AAEA;;;AAGA,OAAC,SAAD,EAAa,SAAb,EAAwB3N,OAAxB,CAAiC,cAAM;;AAEnC,eAAKsH,KAAL,CAAWjI,EAAX,IAAiBmD,EAAEC,IAAF,CAAO,KAAP,EAAc2K,QAAQ1K,GAAR,CAAYrD,EAAZ,CAAd,CAAjB;AACAmD,UAAEoL,MAAF,CAAS,OAAKtG,KAAL,CAAW/E,OAApB,EAA6B,OAAK+E,KAAL,CAAWjI,EAAX,CAA7B;AAEH,OALD;;AAQA;;;;;AAKA,WAAKiI,KAAL,CAAWgG,UAAX,GAAwB9K,EAAEC,IAAF,CAAO,KAAP,EAAc2K,QAAQ1K,GAAR,CAAY4K,UAA1B,CAAxB;AACA9K,QAAEoL,MAAF,CAAS,KAAKtG,KAAL,CAAW1H,OAApB,EAA6B,KAAK0H,KAAL,CAAWgG,UAAxC;AACA,WAAKhG,KAAL,CAAWgG,UAAX,CAAsBxF,gBAAtB,CAAuC,OAAvC,EAAgD;AAAA,eAAS,OAAK+F,iBAAL,CAAuB9F,KAAvB,CAAT;AAAA,OAAhD,EAAwF,KAAxF;;AAGA;;;AAGA,WAAKrM,MAAL,CAAYoS,OAAZ,CAAoBrL,IAApB;;AAEA;;;;;;AAMA,WAAK6E,KAAL,CAAWiG,eAAX,GAA8B/K,EAAEC,IAAF,CAAO,MAAP,EAAe2K,QAAQ1K,GAAR,CAAY6K,eAA3B,CAA9B;AACA,WAAKjG,KAAL,CAAWkG,iBAAX,GAA+B,KAAKO,qBAAL,EAA/B;;AAEAvL,QAAEoL,MAAF,CAAS,KAAKtG,KAAL,CAAW+F,OAApB,EAA6B,CAAC,KAAK/F,KAAL,CAAWiG,eAAZ,EAA6B,KAAKjG,KAAL,CAAWkG,iBAAxC,CAA7B;;AAEA;;;AAGA,WAAKQ,sBAAL;;AAEA;;;AAGAxL,QAAEoL,MAAF,CAAS,KAAKlS,MAAL,CAAYgK,EAAZ,CAAe4B,KAAf,CAAqB/E,OAA9B,EAAuC,KAAK+E,KAAL,CAAW/E,OAAlD;AAEH;;AAED;;;;;;;;6CAKyB;;AAErB,WAAK+E,KAAL,CAAWqE,QAAX,GAAsBnJ,EAAEC,IAAF,CAAO,KAAP,EAAc2K,QAAQ1K,GAAR,CAAYiJ,QAA1B,CAAtB;;AAEA,WAAKrE,KAAL,CAAWmG,cAAX,GAA4BjL,EAAEC,IAAF,CAAO,KAAP,EAAc2K,QAAQ1K,GAAR,CAAY+K,cAA1B,CAA5B;AACA,WAAKnG,KAAL,CAAWoG,eAAX,GAA6BlL,EAAEC,IAAF,CAAO,KAAP,EAAc2K,QAAQ1K,GAAR,CAAYgL,eAA1B,CAA7B;;AAEAlL,QAAEoL,MAAF,CAAS,KAAKtG,KAAL,CAAWqE,QAApB,EAA8B,CAAC,KAAKrE,KAAL,CAAWmG,cAAZ,EAA4B,KAAKnG,KAAL,CAAWoG,eAAvC,CAA9B;AACAlL,QAAEoL,MAAF,CAAS,KAAKtG,KAAL,CAAW+F,OAApB,EAA6B,KAAK/F,KAAL,CAAWqE,QAAxC;AAEH;;AAED;;;;;;;4CAIwB;;AAEpB;;;;AAIA,aAAOnJ,EAAEC,IAAF,CAAO,MAAP,EAAe2K,QAAQ1K,GAAR,CAAY8K,iBAA3B,CAAP;AAEH;;AAED;;;;;;2BAGO;;AAEH;AACA,WAAK9R,MAAL,CAAYoS,OAAZ,CAAoBG,KAApB;;AAEA,UAAInF,cAAc,KAAKpN,MAAL,CAAYiK,YAAZ,CAAyBmD,WAA3C;;AAEA;;;AAGA,UAAI,CAACA,WAAL,EAAkB;;AAEd;AAEH;;AAED;;;;AAIA,UAAMoF,uBAAuB,EAA7B;AACA,UAAMC,gBAAgB,EAAtB;;AAEA,UAAIC,iBAAiBtF,YAAYuF,SAAZ,GAAyBH,uBAAuB,CAAhD,GAAqDC,aAA1E;;AAEA,WAAK7G,KAAL,CAAW/E,OAAX,CAAmB+L,KAAnB,CAAyBC,SAAzB,uBAAuDC,KAAKC,KAAL,CAAWL,cAAX,CAAvD;;AAEA;AACA;AAEH;;AAED;;;;;;2BAGO;;AAEH,WAAK9G,KAAL,CAAW/E,OAAX,CAAmB9C,SAAnB,CAA6BC,GAA7B,CAAiC0N,QAAQ1K,GAAR,CAAYgM,aAA7C;AAEH;;AAED;;;;;;4BAGQ;;AAEJ,WAAKpH,KAAL,CAAW/E,OAAX,CAAmB9C,SAAnB,CAA6B8E,MAA7B,CAAoC6I,QAAQ1K,GAAR,CAAYgM,aAAhD;AAEH;;AAED;;;;;;;;;AAaA;;;;sCAIkB3G,K,EAAO;;AAErB,WAAKrM,MAAL,CAAYoS,OAAZ,CAAoBa,MAApB;AAEH;;;wBAjBgB;AAAA;;AAEb,aAAO;AACHC,cAAM;AAAA,iBAAM,OAAKtH,KAAL,CAAWgG,UAAX,CAAsB7N,SAAtB,CAAgCC,GAAhC,CAAoC0N,QAAQ1K,GAAR,CAAYmM,gBAAhD,CAAN;AAAA,SADH;AAEHC,cAAM;AAAA,iBAAM,OAAKxH,KAAL,CAAWgG,UAAX,CAAsB7N,SAAtB,CAAgC8E,MAAhC,CAAuC6I,QAAQ1K,GAAR,CAAYmM,gBAAnD,CAAN;AAAA;AAFH,OAAP;AAKH;;;wBAhLgB;;AAEb,aAAO;AACHlB,iBAAS,YADN;AAEH/N,iBAAS,qBAFN;AAGHyN,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;;;;EAzDgCpS,M;;;kBAAhB+R,O;;;;;;;;;;;;;;;;;;;;;;;ACnDrB;;;;;;;;;;IAUqBU,O;;;AAEjB;;;AAGA,2BAAsB;AAAA,YAATxS,MAAS,QAATA,MAAS;;AAAA;;AAAA,sHAEZ,EAACA,cAAD,EAFY;;AAIlB,cAAKgM,KAAL,GAAa;AACTyH,qBAAS,IADA;AAETC,qBAAS;AAFA,SAAb;;AAKA;;;;AAIA,cAAKC,MAAL,GAAc,KAAd;;AAbkB;AAerB;;AAED;;;;;;;;;;AAcA;;;+BAGO;;AAEH,iBAAK3H,KAAL,CAAWyH,OAAX,GAAqBvM,EAAEC,IAAF,CAAO,KAAP,EAAcqL,QAAQpL,GAAR,CAAYqM,OAA1B,CAArB;AACAvM,cAAEoL,MAAF,CAAS,KAAKlS,MAAL,CAAY0R,OAAZ,CAAoB9F,KAApB,CAA0B1H,OAAnC,EAA4C,KAAK0H,KAAL,CAAWyH,OAAvD;;AAEA,iBAAKG,QAAL;AAEH;;AAED;;;;;;mCAGW;;AAEP,gBAAI5I,QAAQ,KAAK5K,MAAL,CAAY+J,KAAZ,CAAkB0J,cAA9B;;AAEA,iBAAK,IAAIlN,QAAT,IAAqBqE,KAArB,EAA4B;;AAExB,qBAAK8I,OAAL,CAAanN,QAAb,EAAuBqE,MAAMrE,QAAN,CAAvB;AAEH;AAEJ;;AAED;;;;;;;;;gCAMQA,Q,EAAUG,I,EAAM;AAAA;;AAEpB,gBAAIA,KAAKiN,gBAAL,IAAyB,CAACjN,KAAKkN,aAAnC,EAAkD;;AAE9C5L,kBAAEC,GAAF,CAAM,oDAAN,EAA4D,MAA5D,EAAoE1B,QAApE;AACA;AAEH;;AAED;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA,gBAAI,CAACG,KAAKiN,gBAAV,EAA4B;;AAExB;AAEH;;AAED,gBAAIE,SAAS/M,EAAEC,IAAF,CAAO,IAAP,EAAa,CAACqL,QAAQpL,GAAR,CAAY8M,aAAb,EAA4BpN,KAAKkN,aAAjC,CAAb,EAA8D;AACvEG,uBAAOxN;AADgE,aAA9D,CAAb;;AAIA;;;AAGAsN,mBAAOG,OAAP,CAAevN,IAAf,GAAsBF,QAAtB;;AAEAO,cAAEoL,MAAF,CAAS,KAAKtG,KAAL,CAAWyH,OAApB,EAA6BQ,MAA7B;;AAEA,iBAAKjI,KAAL,CAAWyH,OAAX,CAAmB9O,WAAnB,CAA+BsP,MAA/B;AACA,iBAAKjI,KAAL,CAAW0H,OAAX,CAAmBtN,IAAnB,CAAwB6N,MAAxB;;AAEA;;;AAGA;AACAA,mBAAOzH,gBAAP,CAAwB,OAAxB,EAAiC,iBAAS;;AAEtC,uBAAK6H,aAAL,CAAmB5H,KAAnB;AAEH,aAJD,EAIG,KAJH;AAMH;;AAED;;;;;;;;;;sCAOcA,K,EAAO;;AAEjB,gBAAI6H,aAAa7H,MAAMvM,MAAvB;AAAA,gBACIyG,WAAW2N,WAAWF,OAAX,CAAmBvN,IADlC;AAAA,gBAEIC,OAAO,KAAK1G,MAAL,CAAY+J,KAAZ,CAAkBoK,WAAlB,CAA8B5N,QAA9B,CAFX;;AAIA;;;AAGA,gBAAIgH,eAAe,KAAKvN,MAAL,CAAYiK,YAAZ,CAAyBsD,YAA5C;;AAEA;;;;;;AAMA,gBAAI,CAAC7G,KAAK0N,aAAN,IAAuB7G,aAAa5E,OAAxC,EAAiD;;AAE7C,qBAAK3I,MAAL,CAAYiK,YAAZ,CAAyBpE,OAAzB,CAAiCU,QAAjC;AAEH,aAJD,MAIO;;AAEH,qBAAKvG,MAAL,CAAYiK,YAAZ,CAAyB+C,MAAzB,CAAgCzG,QAAhC;AAEH;;AAED;;;;AAIA;;AAEA;AACA;;AAEA;;AAEA;;;AAGA,iBAAKvG,MAAL,CAAY0R,OAAZ,CAAoB2C,IAApB;AAEH;;AAED;;;;;;+BAGO;;AAEH,iBAAKzI,KAAL,CAAWyH,OAAX,CAAmBtP,SAAnB,CAA6BC,GAA7B,CAAiCoO,QAAQpL,GAAR,CAAYsN,aAA7C;AACA,iBAAKf,MAAL,GAAc,IAAd;AAEH;;AAED;;;;;;gCAGQ;;AAEJ,iBAAK3H,KAAL,CAAWyH,OAAX,CAAmBtP,SAAnB,CAA6B8E,MAA7B,CAAoCuJ,QAAQpL,GAAR,CAAYsN,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;;;;EAlCgC3U,M;;;kBAAhByS,O;;;;;;;;;;;;;;;;;;;;;;;ACVrB;;;;;;AAMA;;;;;;;;;;;;;AAaA;;;;;;;;;;;;;;AAcA;;;;;;;;;IASqBrI,K;;;;;;;AAEjB;;;;4BAIgB;;AAEZ,mBAAO,KAAK0J,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,YAATxU,MAAS,QAATA,MAAS;;AAAA;;AAIlB;;;;;AAJkB,kHAEZ,EAACA,cAAD,EAFY;;AASlB,cAAKuU,WAAL,GAAmB,EAAnB;;AAEA;;;;;AAKA,cAAKV,cAAL,GAAsB,EAAtB;;AAEA;;;;;AAKA,cAAKe,gBAAL,GAAwB,EAAxB;;AAvBkB;AAyBrB;;AAED;;;;;;;;kCAIU;AAAA;;AAEN,gBAAI,CAAC,KAAK5U,MAAL,CAAY8U,cAAZ,CAA2B,OAA3B,CAAL,EAA0C;;AAEtC,uBAAO/T,QAAQgU,MAAR,CAAe,2BAAf,CAAP;AAEH;;AAED,iBAAI,IAAIpO,QAAR,IAAoB,KAAK3G,MAAL,CAAYgL,KAAhC,EAAuC;;AAEnC,qBAAKuJ,WAAL,CAAiB5N,QAAjB,IAA6B,KAAK3G,MAAL,CAAYgL,KAAZ,CAAkBrE,QAAlB,CAA7B;AAEH;;AAED;;;AAGA,gBAAIqO,eAAe,KAAKC,yBAAL,EAAnB;;AAEA;;;AAGA,gBAAID,aAAazT,MAAb,KAAwB,CAA5B,EAA+B;;AAE3B,uBAAOR,QAAQC,OAAR,EAAP;AAEH;;AAED;;;AAGA,mBAAOoH,EAAE2H,QAAF,CAAWiF,YAAX,EAAyB,UAACpT,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,gBAAIsT,sBAAsB,EAA1B;;AAEA,iBAAI,IAAIvO,QAAR,IAAoB,KAAK4N,WAAzB,EAAsC;;AAElC,oBAAIY,YAAY,KAAKZ,WAAL,CAAiB5N,QAAjB,CAAhB;;AAEA,oBAAI,OAAOwO,UAAUjL,OAAjB,KAA6B,UAAjC,EAA6C;;AAEzCgL,wCAAoB9O,IAApB,CAAyB;AACrBzE,kCAAWwT,UAAUjL,OADA;AAErBtI,8BAAO;AACH+E;AADG;AAFc,qBAAzB;AAOH,iBATD,MASO;;AAEH;;;AAGA,yBAAKkN,cAAL,CAAoBlN,QAApB,IAAgCwO,SAAhC;AAEH;AAEJ;;AAED,mBAAOD,mBAAP;AAEH;;AAED;;;;;;gCAGQtT,I,EAAM;;AAEV,iBAAKiS,cAAL,CAAoBjS,KAAK+E,QAAzB,IAAqC,KAAK4N,WAAL,CAAiB3S,KAAK+E,QAAtB,CAArC;AAEH;;AAED;;;;;;iCAGS/E,I,EAAM;;AAEX,iBAAKgT,gBAAL,CAAsBhT,KAAK+E,QAA3B,IAAuC,KAAK4N,WAAL,CAAiB3S,KAAK+E,QAAtB,CAAvC;AAEH;;AAED;;;;;;;;;;;;kCASUG,I,EAAMlF,I,EAAM;;AAElB,gBAAIwT,SAAS,KAAKb,WAAL,CAAiBzN,IAAjB,CAAb;AAAA,gBACI9G,SAAS,KAAKA,MAAL,CAAYiL,WAAZ,CAAwBnE,IAAxB,CADb;;AAGA,gBAAI,CAAC9G,MAAL,EAAa;;AAETA,yBAAS,KAAKkQ,aAAd;AAEH;;AAED,gBAAI3B,WAAW,IAAI6G,MAAJ,CAAWxT,IAAX,EAAiB5B,MAAjB,CAAf;;AAEA,mBAAOuO,QAAP;AAEH;;AAED;;;;;;;;kCAKUzH,I,EAAM;;AAEZ,mBAAOA,gBAAgB,KAAKuO,SAAL,CAAe,KAAKrV,MAAL,CAAYwK,YAA3B,CAAvB;AAEH;;;;EA/M8BzK,M;;;kBAAdoK,K;;;;;;;;;;;;;;;;;ACTrB;;;;;;;;;;+eAjCA;;;;;AAKA;;AAEA;;;AAGA;;AAEA;;;AAGA;;AAEA;;;AAGA;;AAEA;;;AAGA;;AAEA;;;AAGA;AACA;;AAIA;;;;;;;;;;;;;;;;;;IAkBqBC,E;;;AAEjB;;;;;AAKA,oBAAsB;AAAA,QAATpK,MAAS,QAATA,MAAS;;AAAA;;AAAA,wGAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAKgM,KAAL,GAAa;AACTsJ,cAAQ,IADC;AAETrO,eAAS,IAFA;AAGTgF,gBAAU;AAHD,KAAb;;AAJkB;AAUrB;;AAED;;;;;;;8BAGU;AAAA;;AAEN,aAAO,KAAK9E,IAAL;AACH;;;AADG,OAIF9F,IAJE,CAIG;AAAA,eAAM,OAAKjB,MAAL,CAAY0R,OAAZ,CAAoB3K,IAApB,EAAN;AAAA,OAJH;AAKH;;;AALG,OAQF9F,IARE,CAQG;AAAA,eAAM,OAAKkU,UAAL,EAAN;AAAA,OARH;AASH;;;AATG,OAYFlU,IAZE,CAYG;AAAA,eAAM,OAAKkL,UAAL,EAAN;AAAA,OAZH;;AAcP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAxBO,OA0BF1K,KA1BE,CA0BI,aAAK;;AAERnB,gBAAQyH,KAAR,CAAcxH,CAAd;;AAEJ;AAEC,OAhCE,CAAP;AAkCH;;AAED;;;;;;;;;AAaA;;;;2BAIO;AAAA;;AAEH,aAAO,IAAII,OAAJ,CAAa,UAACC,OAAD,EAAU+T,MAAV,EAAqB;;AAErC;;;;AAIA,eAAK/I,KAAL,CAAWsJ,MAAX,GAAoBtR,SAASwR,cAAT,CAAwB,OAAKxV,MAAL,CAAYyK,QAApC,CAApB;;AAEA,YAAI,CAAC,OAAKuB,KAAL,CAAWsJ,MAAhB,EAAwB;;AAEpBP,iBAAOtH,MAAM,iCAAiC,OAAKzN,MAAL,CAAYyK,QAAnD,CAAP;AACA;AAEH;;AAED;;;AAGA,eAAKuB,KAAL,CAAW/E,OAAX,GAAsBC,EAAEC,IAAF,CAAO,KAAP,EAAc,OAAKC,GAAL,CAASqO,aAAvB,CAAtB;AACA,eAAKzJ,KAAL,CAAWC,QAAX,GAAsB/E,EAAEC,IAAF,CAAO,KAAP,EAAc,OAAKC,GAAL,CAASsO,UAAvB,CAAtB;;AAEA,eAAK1J,KAAL,CAAW/E,OAAX,CAAmBtC,WAAnB,CAA+B,OAAKqH,KAAL,CAAWC,QAA1C;AACA,eAAKD,KAAL,CAAWsJ,MAAX,CAAkB3Q,WAAlB,CAA8B,OAAKqH,KAAL,CAAW/E,OAAzC;;AAEAjG;AAEH,OA1BM,CAAP;AA4BH;;AAED;;;;;;iCAGa;;AAET;;;AAGA,UAAI2U,SAAS,mBAAApF,CAAQ,EAAR,CAAb;;AAEA;;;AAGA,UAAIqF,MAAM1O,EAAEC,IAAF,CAAO,OAAP,EAAgB,IAAhB,EAAsB;AAC5BnB,qBAAa2P,OAAOE,QAAP;AADe,OAAtB,CAAV;;AAIA;;;AAGA3O,QAAEoL,MAAF,CAAStO,SAAS8R,IAAlB,EAAwBF,GAAxB;AAEH;;AAED;;;;;;iCAGa;AAAA;;AAET;;;AAGA,WAAK5J,KAAL,CAAWC,QAAX,CAAoBO,gBAApB,CAAqC,OAArC,EAA8C;AAAA,eAAS,OAAKuJ,eAAL,CAAqBtJ,KAArB,CAAT;AAAA,OAA9C,EAAoF,KAApF;AAEH;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAwBgBA,K,EAAO;;AAEnB,UAAIuJ,cAAcvJ,MAAMvM,MAAxB;;AAEAQ,cAAQ2H,GAAR,CAAY,OAAZ,EAAqB2N,WAArB;AACA,UAAKA,YAAY7R,SAAZ,CAAsBsH,QAAtB,CAA+B,KAAKrE,GAAL,CAASsO,UAAxC,CAAL,EAA2D;;AAEvD,aAAKO,qBAAL,CAA2BxJ,KAA3B;AACA;AAEH;;AAED;;;AAGA,UAAI;;AAEA,aAAKrM,MAAL,CAAYiK,YAAZ,CAAyBuC,0BAAzB,CAAoDoJ,WAApD;;AAEJ;;;AAIC,OARD,CAQE,OAAOrV,CAAP,EAAU;;AAER,aAAKP,MAAL,CAAY+M,KAAZ,CAAkB+I,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,WAAK9V,MAAL,CAAY0R,OAAZ,CAAoB2C,IAApB;AACA,WAAKrU,MAAL,CAAY0R,OAAZ,CAAoB6C,IAApB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;AAGA,WAAKvU,MAAL,CAAY0R,OAAZ,CAAoBE,UAApB,CAA+BsB,IAA/B;;AAEA;;;;;AAKA,UAAI6C,iBAAiB,KAAK/V,MAAL,CAAY+J,KAAZ,CAAkBiM,SAAlB,CAA4B,KAAKhW,MAAL,CAAYiK,YAAZ,CAAyBsD,YAAzB,CAAsC7G,IAAlE,CAArB;AAAA,UACIuP,eAAe,KAAKjW,MAAL,CAAYiK,YAAZ,CAAyBsD,YAAzB,CAAsC5E,OADzD;;AAGA,UAAIoN,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAKjW,MAAL,CAAY0R,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;AAEH;AAEJ;;;0CAEqB/G,K,EAAO;;AAEzB,UAAI4C,YAAY,KAAKjP,MAAL,CAAYiK,YAAZ,CAAyBiM,YAAzB,EAAhB;AAAA,UACIhP,iBAAiB+H,UAAU/H,cAD/B;;AAGA;;;AAGA,UAAI,CAACJ,EAAE6B,OAAF,CAAUzB,cAAV,CAAL,EAAgC;;AAE5B,aAAKlH,MAAL,CAAYiK,YAAZ,CAAyB+C,MAAzB,CAAgC,KAAKpN,MAAL,CAAYwK,YAA5C,EAA0D,EAA1D;AAEH,OAJD,MAIO;;AAEH,aAAKpK,MAAL,CAAY+M,KAAZ,CAAkBhB,GAAlB,CAAsB7E,cAAtB;AAEH;AAEJ;;;wBAvQS;;AAEN,aAAO;AACHmO,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2B3V,M;;AA2UhC;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;;;;kBAhiBqBqK,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 e9b8a994bc6ec6db9157","/**\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 * Returns basic nodetypes as contants\n * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}}\n */\n static get nodeTypes() {\n\n return {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8,\n DOCUMENT_FRAGMENT: 11\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\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 var 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 content\n *\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\n *\n * @param {Element} node - start Node\n * @param {Boolean} atLast - find last text node\n * @return {*}\n */\n static getDeepestTextNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return 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)) {\n\n /** and it is not native input */\n if (!this.isNativeInput(node)) {\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\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.getDeepestTextNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestTextNode(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|*} 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 nativeInputs.indexOf(target.tagName) !== -1;\n\n }\n\n /**\n * Checks node if it is empty\n * It must be node without childNodes\n * @param {Node} node\n *\n * @return {Boolean} true if it is empty\n */\n static checkNodeEmpty(node) {\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n node = node.value;\n\n if ( node.trim() ) {\n\n return false;\n\n }\n\n\n } else {\n\n node = node.textContent.replace('\\u200B', '');\n\n if ( node.trim() ) {\n\n return false;\n\n }\n\n }\n\n return true;\n\n }\n\n /**\n * breadth-first search\n *\n * Pushes to stack all DOM leafs and checks for emptiness\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n stack = [];\n\n treeWalker.push(node);\n\n while ( treeWalker.length > 0 ) {\n\n if (node && node.childNodes.length === 0) {\n\n stack.push(node);\n\n }\n\n while ( node && node.nextSibling ) {\n\n node = node.nextSibling;\n\n if (!node) continue;\n\n if (node.childNodes.length === 0) {\n\n stack.push(node);\n\n }\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 stack.every( this.checkNodeEmpty );\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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\nimport Block from '../block';\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 /** contentNode click handler */\n block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false);\n\n /** keydown on block */\n block.pluginsContent.addEventListener('keydown', (event) => this.keyDownOnBlock(event), false);\n\n }\n\n /**\n * Highlight clicked block\n * @param {MouseEvent} event\n */\n wrapperClicked(event) {\n\n this.setCurrentBlockByChildNode(event.target);\n\n }\n\n /**\n *\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.blockRightOrDownArrowPressed(event);\n break;\n\n }\n\n }\n\n /**\n *\n * @param event\n */\n blockRightOrDownArrowPressed(event) {\n\n console.log(this.getNextBlock());\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\n this.Editor.Caret.set(block.pluginsContent);\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 *\n * @return {*}\n */\n getLastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n *\n * @param index\n * @return {*}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n getNextBlock() {\n\n if (this.currentBlockIndex + 1 > this._blocks.length - 1) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex + 1];\n\n }\n\n /**\n * Get Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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\nclass BlockMethods {\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 * @class Caret\n * @classdesc Contains methods for working Caret\n *\n * @typedef {Caret} Caret\n */\nexport default class Caret extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * Creates Document Range and sets caret to the element.\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n */\n set( element, offset = 0) {\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestTextNode(element, true);\n\n /** if found deepest node is native input */\n if ($.isNativeInput(nodeToSet)) {\n\n nodeToSet.focus();\n return;\n\n }\n\n let range = document.createRange(),\n selection = window.getSelection();\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n };\n\n /**\n * Set Caret to the last Block\n *\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let blocks = this.Editor.BlockManager.blocks,\n lastBlock;\n\n if (blocks.length) {\n\n lastBlock = blocks[blocks.length - 1];\n\n }\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.set(lastBlock.html);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\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 }\n\n // /**\n // * Set caret to the passed Node\n // * @param {Element} node - content-editable Element\n // */\n // set(node) {\n //\n // /**\n // * @todo add working with Selection\n // * tmp: work with textContent\n // */\n //\n // node.textContent += '|';\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.getLastBlock(),\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/src/components/dom.js b/src/components/dom.js index 50dbedc4..d31a14a9 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -174,6 +174,49 @@ export default class Dom { } + /** + * Checks node if it is empty + * It must be node without childNodes + * @param {Node} node + * + * @return {Boolean} true if it is empty + */ + static checkNodeEmpty(node) { + + if ( this.isElement(node) && this.isNativeInput(node) ) { + + node = node.value; + + if ( node.trim() ) { + + return false; + + } + + + } else { + + node = node.textContent.replace('\u200B', ''); + + if ( node.trim() ) { + + return false; + + } + + } + + return true; + + } + + /** + * breadth-first search + * + * Pushes to stack all DOM leafs and checks for emptiness + * @param {Node} node + * @return {boolean} + */ static isEmpty(node) { let treeWalker = [], @@ -214,49 +257,7 @@ export default class Dom { } - let isEmpty = true; - - stack.forEach( (node) => { - - if ( this.isElement(node) ) { - - if ( this.isNativeInput(node) ) { - - node = node.value; - - if ( node.trim() ) { - - isEmpty = false; - - } - - } else { - - node = node.textContent.replace('\u200B', ''); - - if ( node.trim() ) { - - isEmpty = false; - - } - - } - - } else { - - node = node.textContent.replace('\u200B', ''); - - if ( node.trim() ) { - - isEmpty = false; - - } - - } - - }); - - return isEmpty; + return stack.every( this.checkNodeEmpty ); } From 2e6b107bef101d8adec0141b730b4b1bf030741b Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Fri, 29 Dec 2017 01:28:54 +0300 Subject: [PATCH 03/14] moving caret initial --- build/codex-editor.js | 251 ++++++++++++++++++++++--- build/codex-editor.js.map | 2 +- example/example.html | 6 + src/components/dom.js | 11 +- src/components/modules/blockManager.js | 90 ++++++++- src/components/modules/caret.js | 31 ++- src/components/selection.js | 46 +++++ src/components/utils.js | 19 ++ 8 files changed, 413 insertions(+), 43 deletions(-) create mode 100644 src/components/selection.js diff --git a/build/codex-editor.js b/build/codex-editor.js index e046caa6..cf9565b0 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -334,6 +334,28 @@ var Util = function () { return element.contentEditable === 'true'; } + + /** + * Delays method execution + * + * @param method + * @param timeout + */ + + }, { + key: 'delay', + value: function delay(method, timeout) { + + return function () { + + var context = this, + args = arguments; + + window.setTimeout(function () { + return method.apply(context, args); + }, timeout); + }; + } }, { key: 'keyCodes', get: function get() { @@ -594,7 +616,7 @@ var Dom = function () { var nativeInputs = ['INPUT', 'TEXTAREA']; - return nativeInputs.indexOf(target.tagName) !== -1; + return target ? nativeInputs.indexOf(target.tagName) !== -1 : false; } /** @@ -641,10 +663,16 @@ var Dom = function () { }, { key: 'isEmpty', value: function isEmpty(node) { + var _this = this; var treeWalker = [], stack = []; + if (!node) { + + return false; + } + treeWalker.push(node); while (treeWalker.length > 0) { @@ -676,7 +704,9 @@ var Dom = function () { treeWalker.push(node); } - return stack.every(this.checkNodeEmpty); + return stack.every(function (node) { + return _this.checkNodeEmpty(node); + }); } }]); @@ -1489,6 +1519,10 @@ var _block = __webpack_require__(3); var _block2 = _interopRequireDefault(_block); +var _Selection = __webpack_require__(20); + +var _Selection2 = _interopRequireDefault(_Selection); + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -1655,7 +1689,11 @@ var BlockManager = function (_Module) { break; case _.keyCodes.DOWN: case _.keyCodes.RIGHT: - this.blockRightOrDownArrowPressed(event); + this.blockRightOrDownArrowPressed(); + break; + case _.keyCodes.UP: + case _.keyCodes.LEFT: + this.blockLeftOrUpArrowPressed(); break; } @@ -1663,14 +1701,62 @@ var BlockManager = function (_Module) { /** * - * @param event */ }, { key: 'blockRightOrDownArrowPressed', - value: function blockRightOrDownArrowPressed(event) { + value: function blockRightOrDownArrowPressed() { - console.log(this.getNextBlock()); + var currentBlock = this.currentBlock, + lastTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, true), + textNodeLength = lastTextNode.length; + + console.log('here right'); + console.log(_Selection2.default.getSelectionAnchorNode()); + console.log(lastTextNode); + + if (_Selection2.default.getSelectionAnchorNode() !== lastTextNode) { + + return; + } + + console.log(lastTextNode); + if (_Selection2.default.getSelectionAnchorOffset() === textNodeLength) { + + var nextBlock = this.getNextBlock(); + + if (!nextBlock) return; + + // this.currentNode = nextBlock.pluginsContent; + this.Editor.Caret.set(nextBlock.pluginsContent); + } + } + }, { + key: 'blockLeftOrUpArrowPressed', + value: function blockLeftOrUpArrowPressed() { + + var currentBlock = this.currentBlock, + firstTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, false), + textNodeLength = firstTextNode.length; + + console.log('here left'); + console.log(_Selection2.default.getSelectionAnchorNode()); + console.log(firstTextNode); + + if (_Selection2.default.getSelectionAnchorNode() !== firstTextNode) { + + return; + } + + if (_Selection2.default.getSelectionAnchorOffset() === 0) { + + var previousBlock = this.getPreviousBlock(); + + if (!previousBlock) return; + + // this.currentNode = previousBlock.pluginsContent; + this.Editor.Caret.set(previousBlock.pluginsContent, textNodeLength, true); + } } /** @@ -1735,11 +1821,19 @@ var BlockManager = function (_Module) { return this._blocks[index]; } + + /** + * Returns next Block instance + * @return {*} + */ + }, { key: 'getNextBlock', value: function getNextBlock() { - if (this.currentBlockIndex + 1 > this._blocks.length - 1) { + var isLastBlock = this.currentBlockIndex === this._blocks.length - 1; + + if (isLastBlock) { return null; } @@ -1747,6 +1841,24 @@ var BlockManager = function (_Module) { return this._blocks[this.currentBlockIndex + 1]; } + /** + * Returns previous Block instance + */ + + }, { + key: 'getPreviousBlock', + value: function getPreviousBlock() { + + var isFirstBlock = this.currentBlockIndex === 0; + + if (isFirstBlock) { + + return null; + } + + return this._blocks[this.currentBlockIndex - 1]; + } + /** * Get Block instance by html element * @@ -2121,7 +2233,7 @@ module.exports = exports['default']; /***/ (function(module, exports, __webpack_require__) { "use strict"; -/* WEBPACK VAR INJECTION */(function(Module, $) { +/* WEBPACK VAR INJECTION */(function(Module, $, _) { Object.defineProperty(exports, "__esModule", { value: true @@ -2129,18 +2241,24 @@ Object.defineProperty(exports, "__esModule", { 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; }; }(); +var _Selection = __webpack_require__(20); + +var _Selection2 = _interopRequireDefault(_Selection); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + 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; } +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; } /** + * @class Caret + * @classdesc Contains methods for working Caret + * + * @typedef {Caret} Caret + */ + -/** - * @class Caret - * @classdesc Contains methods for working Caret - * - * @typedef {Caret} Caret - */ var Caret = function (_Module) { _inherits(Caret, _Module); @@ -2159,13 +2277,15 @@ var Caret = function (_Module) { * Creates Document Range and sets caret to the element. * @param {Element} element - target node. * @param {Number} offset - offset + * @param {Boolean} atEnd */ _createClass(Caret, [{ - key: "set", + key: 'set', value: function set(element) { var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + var atEnd = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; /** If Element is INPUT */ @@ -2175,7 +2295,12 @@ var Caret = function (_Module) { return; } - var nodeToSet = $.getDeepestTextNode(element, true); + var nodeToSet = $.getDeepestTextNode(element, atEnd); + + if (atEnd) { + + offset = nodeToSet.length; + } /** if found deepest node is native input */ if ($.isNativeInput(nodeToSet)) { @@ -2184,17 +2309,22 @@ var Caret = function (_Module) { return; } - var range = document.createRange(), - selection = window.getSelection(); + function _set() { - range.setStart(nodeToSet, offset); - range.setEnd(nodeToSet, offset); + var range = document.createRange(), + selection = _Selection2.default.getSelection(); - selection.removeAllRanges(); - selection.addRange(range); + range.setStart(nodeToSet, offset); + range.setEnd(nodeToSet, offset); + + selection.removeAllRanges(); + selection.addRange(range); + } + + _.delay(_set, 20)(); } }, { - key: "setToTheLastBlock", + key: 'setToTheLastBlock', /** @@ -2288,10 +2418,10 @@ var Caret = function (_Module) { return Caret; }(Module); -Caret.displayName = "Caret"; +Caret.displayName = 'Caret'; exports.default = Caret; -module.exports = exports["default"]; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(2))) +module.exports = exports['default']; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(2), __webpack_require__(1))) /***/ }), /* 9 */ @@ -4827,6 +4957,73 @@ function toComment(sourceMap) { } +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +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"); } } + +/** + * Working with selection + */ +var Selection = function () { + + /** + * @constructor + */ + function Selection() { + _classCallCheck(this, Selection); + + this.instance = null; + this.selection = null; + } + + _createClass(Selection, null, [{ + key: "getSelection", + value: function getSelection() { + + return window.getSelection(); + } + }, { + key: "getSelectionAnchorNode", + value: function getSelectionAnchorNode() { + + var selection = window.getSelection(); + + if (selection) { + + return selection.anchorNode; + } + } + }, { + key: "getSelectionAnchorOffset", + value: function getSelectionAnchorOffset() { + + var selection = window.getSelection(); + + if (selection) { + + return selection.anchorOffset; + } + } + }]); + + return Selection; +}(); + +Selection.displayName = "Selection"; +exports.default = Selection; +module.exports = exports["default"]; + /***/ }) /******/ ]); //# sourceMappingURL=codex-editor.js.map \ No newline at end of file diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 290e5e67..1c0529cb 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap e9b8a994bc6ec6db9157","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","TAG","TEXT","COMMENT","DOCUMENT_FRAGMENT","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","getDeepestTextNode","nodeType","Node","ELEMENT_NODE","nativeInputs","indexOf","value","trim","textContent","replace","treeWalker","stack","push","nextSibling","shift","firstChild","every","checkNodeEmpty","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","wrapperClicked","keyDownOnBlock","setCurrentBlockByChildNode","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","getNextBlock","composeBlock","Caret","insert","index","childNode","parentFirstLevelBlock","currentNode","Error","array","currentBlock","BlockMethods","workingArea","html","deleteCount","splice","previousBlock","insertAdjacentElement","nextBlock","targetBlock","newBlock","children","instance","isNaN","Number","offset","focus","nodeToSet","range","createRange","selection","getSelection","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","clickedOnRedactorZone","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","getLastBlock"],"mappings":"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AWqL,WAAW7P,IAAtB;AAEH,aAPD;;AASAlB,oBAAQ2H,GAAR,CAAY,OAAZ,EAAqBkJ,SAArB;AACA7Q,oBAAQgR,QAAR;;AAEA,mBAAO;AACHxJ,sBAAU,CAAC,IAAIyJ,IAAJ,EADR;AAEHpH,uBAAUA,KAFP;AAGHqH,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8B9R,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;;;;kBAvOqBiR,K;;;;;;;;;;;;;;;;;;;;;;;ACvBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmDqBc,O;;;AAEjB;;;AAGA,yBAAsB;AAAA,QAAT9R,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAKg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AAsC7G,IAAlE,CAArB;AAAA,UACIuP,eAAe,KAAKjW,MAAL,CAAYiK,YAAZ,CAAyBsD,YAAzB,CAAsC5E,OADzD;;AAGA,UAAIoN,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAKjW,MAAL,CAAY0R,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;AAEH;AAEJ;;;0CAEqB/G,K,EAAO;;AAEzB,UAAI4C,YAAY,KAAKjP,MAAL,CAAYiK,YAAZ,CAAyBiM,YAAzB,EAAhB;AAAA,UACIhP,iBAAiB+H,UAAU/H,cAD/B;;AAGA;;;AAGA,UAAI,CAACJ,EAAE6B,OAAF,CAAUzB,cAAV,CAAL,EAAgC;;AAE5B,aAAKlH,MAAL,CAAYiK,YAAZ,CAAyB+C,MAAzB,CAAgC,KAAKpN,MAAL,CAAYwK,YAA5C,EAA0D,EAA1D;AAEH,OAJD,MAIO;;AAEH,aAAKpK,MAAL,CAAY+M,KAAZ,CAAkBhB,GAAlB,CAAsB7E,cAAtB;AAEH;AAEJ;;;wBAvQS;;AAEN,aAAO;AACHmO,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2B3V,M;;AA2UhC;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;;;;kBAhiBqBqK,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 e9b8a994bc6ec6db9157","/**\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 * Returns basic nodetypes as contants\n * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}}\n */\n static get nodeTypes() {\n\n return {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8,\n DOCUMENT_FRAGMENT: 11\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\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 var 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 content\n *\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\n *\n * @param {Element} node - start Node\n * @param {Boolean} atLast - find last text node\n * @return {*}\n */\n static getDeepestTextNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return 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)) {\n\n /** and it is not native input */\n if (!this.isNativeInput(node)) {\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\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.getDeepestTextNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestTextNode(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|*} 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 nativeInputs.indexOf(target.tagName) !== -1;\n\n }\n\n /**\n * Checks node if it is empty\n * It must be node without childNodes\n * @param {Node} node\n *\n * @return {Boolean} true if it is empty\n */\n static checkNodeEmpty(node) {\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n node = node.value;\n\n if ( node.trim() ) {\n\n return false;\n\n }\n\n\n } else {\n\n node = node.textContent.replace('\\u200B', '');\n\n if ( node.trim() ) {\n\n return false;\n\n }\n\n }\n\n return true;\n\n }\n\n /**\n * breadth-first search\n *\n * Pushes to stack all DOM leafs and checks for emptiness\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n stack = [];\n\n treeWalker.push(node);\n\n while ( treeWalker.length > 0 ) {\n\n if (node && node.childNodes.length === 0) {\n\n stack.push(node);\n\n }\n\n while ( node && node.nextSibling ) {\n\n node = node.nextSibling;\n\n if (!node) continue;\n\n if (node.childNodes.length === 0) {\n\n stack.push(node);\n\n }\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 stack.every( this.checkNodeEmpty );\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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\nimport Block from '../block';\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 /** contentNode click handler */\n block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false);\n\n /** keydown on block */\n block.pluginsContent.addEventListener('keydown', (event) => this.keyDownOnBlock(event), false);\n\n }\n\n /**\n * Highlight clicked block\n * @param {MouseEvent} event\n */\n wrapperClicked(event) {\n\n this.setCurrentBlockByChildNode(event.target);\n\n }\n\n /**\n *\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.blockRightOrDownArrowPressed(event);\n break;\n\n }\n\n }\n\n /**\n *\n * @param event\n */\n blockRightOrDownArrowPressed(event) {\n\n console.log(this.getNextBlock());\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\n this.Editor.Caret.set(block.pluginsContent);\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 *\n * @return {*}\n */\n getLastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n *\n * @param index\n * @return {*}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n getNextBlock() {\n\n if (this.currentBlockIndex + 1 > this._blocks.length - 1) {\n\n return null;\n\n }\n\n return this._blocks[this.currentBlockIndex + 1];\n\n }\n\n /**\n * Get Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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\nclass BlockMethods {\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 * @class Caret\n * @classdesc Contains methods for working Caret\n *\n * @typedef {Caret} Caret\n */\nexport default class Caret extends Module {\n\n /**\n * @constructor\n */\n constructor({config}) {\n\n super({config});\n\n }\n\n /**\n * Creates Document Range and sets caret to the element.\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n */\n set( element, offset = 0) {\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestTextNode(element, true);\n\n /** if found deepest node is native input */\n if ($.isNativeInput(nodeToSet)) {\n\n nodeToSet.focus();\n return;\n\n }\n\n let range = document.createRange(),\n selection = window.getSelection();\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n };\n\n /**\n * Set Caret to the last Block\n *\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let blocks = this.Editor.BlockManager.blocks,\n lastBlock;\n\n if (blocks.length) {\n\n lastBlock = blocks[blocks.length - 1];\n\n }\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.set(lastBlock.html);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\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 }\n\n // /**\n // * Set caret to the passed Node\n // * @param {Element} node - content-editable Element\n // */\n // set(node) {\n //\n // /**\n // * @todo add working with Selection\n // * tmp: work with textContent\n // */\n //\n // node.textContent += '|';\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.getLastBlock(),\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap c273bd23350d37041d7f","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","webpack:///./src/components/Selection.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","TAG","TEXT","COMMENT","DOCUMENT_FRAGMENT","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","getDeepestTextNode","nodeType","Node","ELEMENT_NODE","nativeInputs","indexOf","value","trim","textContent","replace","treeWalker","stack","push","nextSibling","shift","firstChild","every","checkNodeEmpty","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","wrapperClicked","keyDownOnBlock","setCurrentBlockByChildNode","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","blockLeftOrUpArrowPressed","currentBlock","lastTextNode","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","getNextBlock","Caret","firstTextNode","previousBlock","getPreviousBlock","composeBlock","insert","index","isLastBlock","isFirstBlock","childNode","parentFirstLevelBlock","currentNode","Error","array","BlockMethods","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","instance","isNaN","Number","offset","atEnd","focus","nodeToSet","_set","range","createRange","selection","getSelection","setStart","setEnd","removeAllRanges","addRange","delay","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","clickedOnRedactorZone","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","getLastBlock","Selection","anchorNode","anchorOffset"],"mappings":"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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,U;;;;;;;;;;ACtbA;;;;;AAKA,IAAI,CAACwL,QAAQxJ,SAAR,CAAkByJ,OAAvB,EACID,QAAQxJ,SAAR,CAAkByJ,OAAlB,GAA4BD,QAAQxJ,SAAR,CAAkB0J,iBAAlB,IACxBF,QAAQxJ,SAAR,CAAkB2J,qBADtB;;AAGJ,IAAI,CAACH,QAAQxJ,SAAR,CAAkB4J,OAAvB,EACIJ,QAAQxJ,SAAR,CAAkB4J,OAAlB,GAA4B,UAAUC,CAAV,EAAa;;AAErC,QAAIxH,KAAK,IAAT;;AAEA,QAAI,CAACC,SAASwH,eAAT,CAAyBC,QAAzB,CAAkC1H,EAAlC,CAAL,EAA4C,OAAO,IAAP;AAC5C,OAAG;;AAEC,YAAIA,GAAGoH,OAAH,CAAWI,CAAX,CAAJ,EAAmB,OAAOxH,EAAP;AACnBA,aAAKA,GAAG2H,aAAH,IAAoB3H,GAAG4H,UAA5B;AAEH,KALD,QAKS5H,OAAO,IALhB;AAMA,WAAO,IAAP;AAEH,CAbD,C;;;;;;ACVJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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ACA;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,YAATlS,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,cAAKmS,MAAL,GAAc,IAAd;AACA,cAAKC,UAAL,GAAkB,EAAlB;;AALkB;AAOrB;;AAED;;;;;;;;+BAIO;AAAA;;AAEH,gBAAIhG,SAAS,KAAKhM,MAAL,CAAYuK,YAAZ,CAAyByB,MAA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EAvE2B7W,M;;AA2UhC;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;;;;kBAhiBqB2K,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;;;;;;;;;;;;;;;;;;AC3EA;;;IAGqB+M,S;;AAEjB;;;AAGA,yBAAc;AAAA;;AAEV,aAAKnI,QAAL,GAAgB,IAAhB;AACA,aAAKU,SAAL,GAAiB,IAAjB;AAEH;;;;uCAEqB;;AAElB,mBAAOvP,OAAOwP,YAAP,EAAP;AAEH;;;iDAE+B;;AAE5B,gBAAID,YAAYvP,OAAOwP,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU0H,UAAjB;AAEH;AAEJ;;;mDAEiC;;AAE9B,gBAAI1H,YAAYvP,OAAOwP,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU2H,YAAjB;AAEH;AAEJ;;;;;;;kBAxCgBF,S","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 c273bd23350d37041d7f","/**\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 * Returns basic nodetypes as contants\n * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}}\n */\n static get nodeTypes() {\n\n return {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8,\n DOCUMENT_FRAGMENT: 11\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 var 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 content\n *\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\n *\n * @param {Element} node - start Node\n * @param {Boolean} atLast - find last text node\n * @return {*}\n */\n static getDeepestTextNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return 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)) {\n\n /** and it is not native input */\n if (!this.isNativeInput(node)) {\n\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\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.getDeepestTextNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestTextNode(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|*} 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.indexOf(target.tagName) !== -1 : false;\n\n }\n\n /**\n * Checks node if it is empty\n * It must be node without childNodes\n * @param {Node} node\n *\n * @return {Boolean} true if it is empty\n */\n static checkNodeEmpty(node) {\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n node = node.value;\n\n if ( node.trim() ) {\n\n return false;\n\n }\n\n\n } else {\n\n node = node.textContent.replace('\\u200B', '');\n\n if ( node.trim() ) {\n\n return false;\n\n }\n\n }\n\n return true;\n\n }\n\n /**\n * breadth-first search\n *\n * Pushes to stack all DOM leafs and checks for emptiness\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n stack = [];\n\n if (!node) {\n\n return false;\n\n }\n\n treeWalker.push(node);\n\n while ( treeWalker.length > 0 ) {\n\n if (node && node.childNodes.length === 0) {\n\n stack.push(node);\n\n }\n\n while ( node && node.nextSibling ) {\n\n node = node.nextSibling;\n\n if (!node) continue;\n\n if (node.childNodes.length === 0) {\n\n stack.push(node);\n\n }\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 stack.every( node => this.checkNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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\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 /** contentNode click handler */\n block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false);\n\n /** keydown on block */\n block.pluginsContent.addEventListener('keydown', (event) => this.keyDownOnBlock(event), false);\n\n }\n\n /**\n * Highlight clicked block\n * @param {MouseEvent} event\n */\n wrapperClicked(event) {\n\n this.setCurrentBlockByChildNode(event.target);\n\n }\n\n /**\n *\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.blockRightOrDownArrowPressed();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.blockLeftOrUpArrowPressed();\n break;\n\n }\n\n }\n\n /**\n *\n */\n blockRightOrDownArrowPressed() {\n\n let currentBlock = this.currentBlock,\n lastTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n console.log('here right');\n console.log(Selection.getSelectionAnchorNode());\n console.log(lastTextNode);\n\n if (Selection.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n console.log(lastTextNode);\n if (Selection.getSelectionAnchorOffset() === textNodeLength) {\n\n let nextBlock = this.getNextBlock();\n\n if (!nextBlock) return;\n\n // this.currentNode = nextBlock.pluginsContent;\n this.Editor.Caret.set( nextBlock.pluginsContent );\n\n }\n\n }\n\n blockLeftOrUpArrowPressed() {\n\n let currentBlock = this.currentBlock,\n firstTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n console.log('here left');\n console.log(Selection.getSelectionAnchorNode());\n console.log(firstTextNode);\n\n if (Selection.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 0) {\n\n let previousBlock = this.getPreviousBlock();\n\n if (!previousBlock) return;\n\n // this.currentNode = previousBlock.pluginsContent;\n this.Editor.Caret.set( previousBlock.pluginsContent, 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\n this.Editor.Caret.set(block.pluginsContent);\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 *\n * @return {*}\n */\n getLastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n *\n * @param index\n * @return {*}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Returns next Block instance\n * @return {*}\n */\n getNextBlock() {\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 */\n getPreviousBlock() {\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 Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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\nclass BlockMethods {\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 * @class Caret\n * @classdesc Contains methods for working Caret\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 * Creates Document Range and sets caret to the element.\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n * @param {Boolean} atEnd\n */\n set( element, offset = 0, atEnd = false) {\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestTextNode(element, atEnd);\n\n if (atEnd) {\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 function _set() {\n\n let range = document.createRange(),\n selection = Selection.getSelection();\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n }\n\n _.delay( _set, 20)();\n\n };\n\n /**\n * Set Caret to the last Block\n *\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let blocks = this.Editor.BlockManager.blocks,\n lastBlock;\n\n if (blocks.length) {\n\n lastBlock = blocks[blocks.length - 1];\n\n }\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.set(lastBlock.html);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\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 }\n\n // /**\n // * Set caret to the passed Node\n // * @param {Element} node - content-editable Element\n // */\n // set(node) {\n //\n // /**\n // * @todo add working with Selection\n // * tmp: work with textContent\n // */\n //\n // node.textContent += '|';\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.getLastBlock(),\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0","/**\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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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"],"sourceRoot":""} \ No newline at end of file diff --git a/example/example.html b/example/example.html index 113cc5ac..1b294cc9 100644 --- a/example/example.html +++ b/example/example.html @@ -85,6 +85,12 @@ text : '

    ' } }, + { + type : 'text', + data : { + text: 'sdfsdfsd' + } + } ] } }); diff --git a/src/components/dom.js b/src/components/dom.js index d31a14a9..9af7f027 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -118,6 +118,7 @@ export default class Dom { /** and it is not native input */ if (!this.isNativeInput(node)) { + let emptyTextNode = this.text('\u200B'); node.appendChild(emptyTextNode); @@ -170,7 +171,7 @@ export default class Dom { 'TEXTAREA' ]; - return nativeInputs.indexOf(target.tagName) !== -1; + return target ? nativeInputs.indexOf(target.tagName) !== -1 : false; } @@ -222,6 +223,12 @@ export default class Dom { let treeWalker = [], stack = []; + if (!node) { + + return false; + + } + treeWalker.push(node); while ( treeWalker.length > 0 ) { @@ -257,7 +264,7 @@ export default class Dom { } - return stack.every( this.checkNodeEmpty ); + return stack.every( node => this.checkNodeEmpty(node)); } diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index e607ef76..e4896ce5 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -6,6 +6,7 @@ */ import Block from '../block'; +import Selection from '../Selection'; /** * @typedef {BlockManager} BlockManager @@ -138,7 +139,11 @@ export default class BlockManager extends Module { break; case _.keyCodes.DOWN: case _.keyCodes.RIGHT: - this.blockRightOrDownArrowPressed(event); + this.blockRightOrDownArrowPressed(); + break; + case _.keyCodes.UP: + case _.keyCodes.LEFT: + this.blockLeftOrUpArrowPressed(); break; } @@ -147,11 +152,63 @@ export default class BlockManager extends Module { /** * - * @param event */ - blockRightOrDownArrowPressed(event) { + blockRightOrDownArrowPressed() { - console.log(this.getNextBlock()); + let currentBlock = this.currentBlock, + lastTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, true), + textNodeLength = lastTextNode.length; + + console.log('here right'); + console.log(Selection.getSelectionAnchorNode()); + console.log(lastTextNode); + + if (Selection.getSelectionAnchorNode() !== lastTextNode) { + + return; + + } + + console.log(lastTextNode); + if (Selection.getSelectionAnchorOffset() === textNodeLength) { + + let nextBlock = this.getNextBlock(); + + if (!nextBlock) return; + + // this.currentNode = nextBlock.pluginsContent; + this.Editor.Caret.set( nextBlock.pluginsContent ); + + } + + } + + blockLeftOrUpArrowPressed() { + + let currentBlock = this.currentBlock, + firstTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, false), + textNodeLength = firstTextNode.length; + + console.log('here left'); + console.log(Selection.getSelectionAnchorNode()); + console.log(firstTextNode); + + if (Selection.getSelectionAnchorNode() !== firstTextNode) { + + return; + + } + + if (Selection.getSelectionAnchorOffset() === 0) { + + let previousBlock = this.getPreviousBlock(); + + if (!previousBlock) return; + + // this.currentNode = previousBlock.pluginsContent; + this.Editor.Caret.set( previousBlock.pluginsContent, textNodeLength, true ); + + } } @@ -207,9 +264,15 @@ export default class BlockManager extends Module { } + /** + * Returns next Block instance + * @return {*} + */ getNextBlock() { - if (this.currentBlockIndex + 1 > this._blocks.length - 1) { + let isLastBlock = this.currentBlockIndex === (this._blocks.length - 1); + + if (isLastBlock) { return null; @@ -219,6 +282,23 @@ export default class BlockManager extends Module { } + /** + * Returns previous Block instance + */ + getPreviousBlock() { + + let isFirstBlock = this.currentBlockIndex === 0; + + if (isFirstBlock) { + + return null; + + } + + return this._blocks[this.currentBlockIndex - 1]; + + } + /** * Get Block instance by html element * diff --git a/src/components/modules/caret.js b/src/components/modules/caret.js index 255886de..b8e27dca 100644 --- a/src/components/modules/caret.js +++ b/src/components/modules/caret.js @@ -4,6 +4,8 @@ * * @typedef {Caret} Caret */ +import Selection from '../Selection'; + export default class Caret extends Module { /** @@ -19,8 +21,9 @@ export default class Caret extends Module { * Creates Document Range and sets caret to the element. * @param {Element} element - target node. * @param {Number} offset - offset + * @param {Boolean} atEnd */ - set( element, offset = 0) { + set( element, offset = 0, atEnd = false) { /** If Element is INPUT */ if ($.isNativeInput(element)) { @@ -30,7 +33,13 @@ export default class Caret extends Module { } - let nodeToSet = $.getDeepestTextNode(element, true); + let nodeToSet = $.getDeepestTextNode(element, atEnd); + + if (atEnd) { + + offset = nodeToSet.length; + + } /** if found deepest node is native input */ if ($.isNativeInput(nodeToSet)) { @@ -40,14 +49,20 @@ export default class Caret extends Module { } - let range = document.createRange(), - selection = window.getSelection(); + function _set() { - range.setStart(nodeToSet, offset); - range.setEnd(nodeToSet, offset); + let range = document.createRange(), + selection = Selection.getSelection(); - selection.removeAllRanges(); - selection.addRange(range); + range.setStart(nodeToSet, offset); + range.setEnd(nodeToSet, offset); + + selection.removeAllRanges(); + selection.addRange(range); + + } + + _.delay( _set, 20)(); }; diff --git a/src/components/selection.js b/src/components/selection.js new file mode 100644 index 00000000..96b03565 --- /dev/null +++ b/src/components/selection.js @@ -0,0 +1,46 @@ +/** + * Working with selection + */ +export default class Selection { + + /** + * @constructor + */ + constructor() { + + this.instance = null; + this.selection = null; + + } + + static getSelection() { + + return window.getSelection(); + + } + + static getSelectionAnchorNode() { + + let selection = window.getSelection(); + + if (selection) { + + return selection.anchorNode; + + } + + } + + static getSelectionAnchorOffset() { + + let selection = window.getSelection(); + + if (selection) { + + return selection.anchorOffset; + + } + + } + +} \ No newline at end of file diff --git a/src/components/utils.js b/src/components/utils.js index 777f97dd..5b742890 100644 --- a/src/components/utils.js +++ b/src/components/utils.js @@ -208,4 +208,23 @@ export default class Util { } + /** + * Delays method execution + * + * @param method + * @param timeout + */ + static delay(method, timeout) { + + return function () { + + let context = this, + args = arguments; + + window.setTimeout(() => method.apply(context, args), timeout); + + }; + + } + }; \ No newline at end of file From ef6f2d5ac351ab05554d514aa7ae7f2ac0016ec0 Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Fri, 29 Dec 2017 01:40:01 +0300 Subject: [PATCH 04/14] small improvements --- build/codex-editor.js | 45 ++++++++++++++------------ build/codex-editor.js.map | 2 +- example/example.html | 6 ---- src/components/dom.js | 37 ++++++++++++++------- src/components/modules/blockManager.js | 10 ------ 5 files changed, 51 insertions(+), 49 deletions(-) diff --git a/build/codex-editor.js b/build/codex-editor.js index cf9565b0..3849118a 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -631,19 +631,21 @@ var Dom = function () { key: 'checkNodeEmpty', value: function checkNodeEmpty(node) { + var nodeText = void 0; + if (this.isElement(node) && this.isNativeInput(node)) { - node = node.value; + nodeText = node.value; - if (node.trim()) { + if (nodeText.trim()) { return false; } } else { - node = node.textContent.replace('\u200B', ''); + nodeText = node.textContent.replace('\u200B', ''); - if (node.trim()) { + if (nodeText.trim()) { return false; } @@ -652,6 +654,24 @@ var Dom = function () { return true; } + /** + * checks node if it is doesn't have child node + * @param {Node} node + * @return {*|boolean} + */ + + }, { + key: 'isLeaf', + value: function isLeaf(node) { + + if (!node) { + + return false; + } + + return node.childNodes.length === 0; + } + /** * breadth-first search * @@ -677,7 +697,7 @@ var Dom = function () { while (treeWalker.length > 0) { - if (node && node.childNodes.length === 0) { + if (this.isLeaf(node)) { stack.push(node); } @@ -688,11 +708,6 @@ var Dom = function () { if (!node) continue; - if (node.childNodes.length === 0) { - - stack.push(node); - } - treeWalker.push(node); } @@ -1711,23 +1726,17 @@ var BlockManager = function (_Module) { lastTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, true), textNodeLength = lastTextNode.length; - console.log('here right'); - console.log(_Selection2.default.getSelectionAnchorNode()); - console.log(lastTextNode); - if (_Selection2.default.getSelectionAnchorNode() !== lastTextNode) { return; } - console.log(lastTextNode); if (_Selection2.default.getSelectionAnchorOffset() === textNodeLength) { var nextBlock = this.getNextBlock(); if (!nextBlock) return; - // this.currentNode = nextBlock.pluginsContent; this.Editor.Caret.set(nextBlock.pluginsContent); } } @@ -1739,10 +1748,6 @@ var BlockManager = function (_Module) { firstTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, false), textNodeLength = firstTextNode.length; - console.log('here left'); - console.log(_Selection2.default.getSelectionAnchorNode()); - console.log(firstTextNode); - if (_Selection2.default.getSelectionAnchorNode() !== firstTextNode) { return; diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 1c0529cb..4c2000f4 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap c273bd23350d37041d7f","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","webpack:///./src/components/Selection.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","TAG","TEXT","COMMENT","DOCUMENT_FRAGMENT","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","getDeepestTextNode","nodeType","Node","ELEMENT_NODE","nativeInputs","indexOf","value","trim","textContent","replace","treeWalker","stack","push","nextSibling","shift","firstChild","every","checkNodeEmpty","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","wrapperClicked","keyDownOnBlock","setCurrentBlockByChildNode","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","blockLeftOrUpArrowPressed","currentBlock","lastTextNode","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","getNextBlock","Caret","firstTextNode","previousBlock","getPreviousBlock","composeBlock","insert","index","isLastBlock","isFirstBlock","childNode","parentFirstLevelBlock","currentNode","Error","array","BlockMethods","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","instance","isNaN","Number","offset","atEnd","focus","nodeToSet","_set","range","createRange","selection","getSelection","setStart","setEnd","removeAllRanges","addRange","delay","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","clickedOnRedactorZone","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","getLastBlock","Selection","anchorNode","anchorOffset"],"mappings":"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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,U;;;;;;;;;;ACtbA;;;;;AAKA,IAAI,CAACwL,QAAQxJ,SAAR,CAAkByJ,OAAvB,EACID,QAAQxJ,SAAR,CAAkByJ,OAAlB,GAA4BD,QAAQxJ,SAAR,CAAkB0J,iBAAlB,IACxBF,QAAQxJ,SAAR,CAAkB2J,qBADtB;;AAGJ,IAAI,CAACH,QAAQxJ,SAAR,CAAkB4J,OAAvB,EACIJ,QAAQxJ,SAAR,CAAkB4J,OAAlB,GAA4B,UAAUC,CAAV,EAAa;;AAErC,QAAIxH,KAAK,IAAT;;AAEA,QAAI,CAACC,SAASwH,eAAT,CAAyBC,QAAzB,CAAkC1H,EAAlC,CAAL,EAA4C,OAAO,IAAP;AAC5C,OAAG;;AAEC,YAAIA,GAAGoH,OAAH,CAAWI,CAAX,CAAJ,EAAmB,OAAOxH,EAAP;AACnBA,aAAKA,GAAG2H,aAAH,IAAoB3H,GAAG4H,UAA5B;AAEH,KALD,QAKS5H,OAAO,IALhB;AAMA,WAAO,IAAP;AAEH,CAbD,C;;;;;;ACVJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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ACA;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,YAATlS,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,cAAKmS,MAAL,GAAc,IAAd;AACA,cAAKC,UAAL,GAAkB,EAAlB;;AALkB;AAOrB;;AAED;;;;;;;;+BAIO;AAAA;;AAEH,gBAAIhG,SAAS,KAAKhM,MAAL,CAAYuK,YAAZ,CAAyByB,MAA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EAvE2B7W,M;;AA2UhC;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;;;;kBAhiBqB2K,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;;;;;;;;;;;;;;;;;;AC3EA;;;IAGqB+M,S;;AAEjB;;;AAGA,yBAAc;AAAA;;AAEV,aAAKnI,QAAL,GAAgB,IAAhB;AACA,aAAKU,SAAL,GAAiB,IAAjB;AAEH;;;;uCAEqB;;AAElB,mBAAOvP,OAAOwP,YAAP,EAAP;AAEH;;;iDAE+B;;AAE5B,gBAAID,YAAYvP,OAAOwP,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU0H,UAAjB;AAEH;AAEJ;;;mDAEiC;;AAE9B,gBAAI1H,YAAYvP,OAAOwP,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU2H,YAAjB;AAEH;AAEJ;;;;;;;kBAxCgBF,S","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 c273bd23350d37041d7f","/**\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 * Returns basic nodetypes as contants\n * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}}\n */\n static get nodeTypes() {\n\n return {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8,\n DOCUMENT_FRAGMENT: 11\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 var 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 content\n *\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\n *\n * @param {Element} node - start Node\n * @param {Boolean} atLast - find last text node\n * @return {*}\n */\n static getDeepestTextNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return 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)) {\n\n /** and it is not native input */\n if (!this.isNativeInput(node)) {\n\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\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.getDeepestTextNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestTextNode(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|*} 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.indexOf(target.tagName) !== -1 : false;\n\n }\n\n /**\n * Checks node if it is empty\n * It must be node without childNodes\n * @param {Node} node\n *\n * @return {Boolean} true if it is empty\n */\n static checkNodeEmpty(node) {\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n node = node.value;\n\n if ( node.trim() ) {\n\n return false;\n\n }\n\n\n } else {\n\n node = node.textContent.replace('\\u200B', '');\n\n if ( node.trim() ) {\n\n return false;\n\n }\n\n }\n\n return true;\n\n }\n\n /**\n * breadth-first search\n *\n * Pushes to stack all DOM leafs and checks for emptiness\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n stack = [];\n\n if (!node) {\n\n return false;\n\n }\n\n treeWalker.push(node);\n\n while ( treeWalker.length > 0 ) {\n\n if (node && node.childNodes.length === 0) {\n\n stack.push(node);\n\n }\n\n while ( node && node.nextSibling ) {\n\n node = node.nextSibling;\n\n if (!node) continue;\n\n if (node.childNodes.length === 0) {\n\n stack.push(node);\n\n }\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 stack.every( node => this.checkNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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\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 /** contentNode click handler */\n block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false);\n\n /** keydown on block */\n block.pluginsContent.addEventListener('keydown', (event) => this.keyDownOnBlock(event), false);\n\n }\n\n /**\n * Highlight clicked block\n * @param {MouseEvent} event\n */\n wrapperClicked(event) {\n\n this.setCurrentBlockByChildNode(event.target);\n\n }\n\n /**\n *\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.blockRightOrDownArrowPressed();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.blockLeftOrUpArrowPressed();\n break;\n\n }\n\n }\n\n /**\n *\n */\n blockRightOrDownArrowPressed() {\n\n let currentBlock = this.currentBlock,\n lastTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n console.log('here right');\n console.log(Selection.getSelectionAnchorNode());\n console.log(lastTextNode);\n\n if (Selection.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n console.log(lastTextNode);\n if (Selection.getSelectionAnchorOffset() === textNodeLength) {\n\n let nextBlock = this.getNextBlock();\n\n if (!nextBlock) return;\n\n // this.currentNode = nextBlock.pluginsContent;\n this.Editor.Caret.set( nextBlock.pluginsContent );\n\n }\n\n }\n\n blockLeftOrUpArrowPressed() {\n\n let currentBlock = this.currentBlock,\n firstTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n console.log('here left');\n console.log(Selection.getSelectionAnchorNode());\n console.log(firstTextNode);\n\n if (Selection.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 0) {\n\n let previousBlock = this.getPreviousBlock();\n\n if (!previousBlock) return;\n\n // this.currentNode = previousBlock.pluginsContent;\n this.Editor.Caret.set( previousBlock.pluginsContent, 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\n this.Editor.Caret.set(block.pluginsContent);\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 *\n * @return {*}\n */\n getLastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n *\n * @param index\n * @return {*}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Returns next Block instance\n * @return {*}\n */\n getNextBlock() {\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 */\n getPreviousBlock() {\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 Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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\nclass BlockMethods {\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 * @class Caret\n * @classdesc Contains methods for working Caret\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 * Creates Document Range and sets caret to the element.\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n * @param {Boolean} atEnd\n */\n set( element, offset = 0, atEnd = false) {\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestTextNode(element, atEnd);\n\n if (atEnd) {\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 function _set() {\n\n let range = document.createRange(),\n selection = Selection.getSelection();\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n }\n\n _.delay( _set, 20)();\n\n };\n\n /**\n * Set Caret to the last Block\n *\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let blocks = this.Editor.BlockManager.blocks,\n lastBlock;\n\n if (blocks.length) {\n\n lastBlock = blocks[blocks.length - 1];\n\n }\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.set(lastBlock.html);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\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 }\n\n // /**\n // * Set caret to the passed Node\n // * @param {Element} node - content-editable Element\n // */\n // set(node) {\n //\n // /**\n // * @todo add working with Selection\n // * tmp: work with textContent\n // */\n //\n // node.textContent += '|';\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.getLastBlock(),\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0","/**\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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 1eb1c04de957b36a7498","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","webpack:///./src/components/Selection.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","TAG","TEXT","COMMENT","DOCUMENT_FRAGMENT","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","getDeepestTextNode","nodeType","Node","ELEMENT_NODE","nativeInputs","indexOf","nodeText","value","trim","textContent","replace","treeWalker","stack","push","isLeaf","nextSibling","shift","firstChild","every","checkNodeEmpty","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","wrapperClicked","keyDownOnBlock","setCurrentBlockByChildNode","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","blockLeftOrUpArrowPressed","currentBlock","lastTextNode","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","getNextBlock","Caret","firstTextNode","previousBlock","getPreviousBlock","composeBlock","insert","index","isLastBlock","isFirstBlock","childNode","parentFirstLevelBlock","currentNode","Error","array","BlockMethods","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","instance","isNaN","Number","offset","atEnd","focus","nodeToSet","_set","range","createRange","selection","getSelection","setStart","setEnd","removeAllRanges","addRange","delay","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","clickedOnRedactorZone","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","getLastBlock","Selection","anchorNode","anchorOffset"],"mappings":"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AAKhL,MAAZ;AAEH;AA5HL;;AAAA;AAAA;;AAmPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,U;;;;;;;;;;ACtbA;;;;;AAKA,IAAI,CAAC0L,QAAQ1J,SAAR,CAAkB2J,OAAvB,EACID,QAAQ1J,SAAR,CAAkB2J,OAAlB,GAA4BD,QAAQ1J,SAAR,CAAkB4J,iBAAlB,IACxBF,QAAQ1J,SAAR,CAAkB6J,qBADtB;;AAGJ,IAAI,CAACH,QAAQ1J,SAAR,CAAkB8J,OAAvB,EACIJ,QAAQ1J,SAAR,CAAkB8J,OAAlB,GAA4B,UAAUC,CAAV,EAAa;;AAErC,QAAI1H,KAAK,IAAT;;AAEA,QAAI,CAACC,SAAS0H,eAAT,CAAyBC,QAAzB,CAAkC5H,EAAlC,CAAL,EAA4C,OAAO,IAAP;AAC5C,OAAG;;AAEC,YAAIA,GAAGsH,OAAH,CAAWI,CAAX,CAAJ,EAAmB,OAAO1H,EAAP;AACnBA,aAAKA,GAAG6H,aAAH,IAAoB7H,GAAG8H,UAA5B;AAEH,KALD,QAKS9H,OAAO,IALhB;AAMA,WAAO,IAAP;AAEH,CAbD,C;;;;;;ACVJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC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KC,UAAL,CAAgBD,gBAAhB,CAAtB;AAAA,aADH,EAEFnR,IAFE,CAEG,UAACqR,UAAD,EAAgB;;AAElB,uBAAOA,UAAP;AAEH,aANE,CAAP;AAQH;;AAED;;;;;;;;mCAKWF,gB,EAAkB;;AAEzB,gBAAIzH,QAAQ,EAAZ;AAAA,gBACI4H,YAAY,CADhB;;AAGAjS,oBAAQkS,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBxN,OAAjB,CAAyB,UAAC6N,UAAD,EAAatE,KAAb,EAAuB;;AAE5C;AACA7N,wBAAQmI,GAAR,UAAgBgK,WAAWvL,IAA3B,uBAAgDuL,UAAhD;AACAF,6BAAaE,WAAWnK,IAAxB;AACAqC,sBAAMpE,IAAN,CAAWkM,WAAWjR,IAAtB;AAEH,aAPD;;AASAlB,oBAAQmI,GAAR,CAAY,OAAZ,EAAqB8J,SAArB;AACAjS,oBAAQoS,QAAR;;AAEA,mBAAO;AACHpK,sBAAU,CAAC,IAAIqK,IAAJ,EADR;AAEHhI,uBAAUA,KAFP;AAGHiI,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8BlT,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;AA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A;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAhiBqB6K,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;;;;;;;;;;;;;;;;;;AC3EA;;;IAGqB+M,S;;AAEjB;;;AAGA,yBAAc;AAAA;;AAEV,aAAKnI,QAAL,GAAgB,IAAhB;AACA,aAAKU,SAAL,GAAiB,IAAjB;AAEH;;;;uCAEqB;;AAElB,mBAAOzP,OAAO0P,YAAP,EAAP;AAEH;;;iDAE+B;;AAE5B,gBAAID,YAAYzP,OAAO0P,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU0H,UAAjB;AAEH;AAEJ;;;mDAEiC;;AAE9B,gBAAI1H,YAAYzP,OAAO0P,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU2H,YAAjB;AAEH;AAEJ;;;;;;;kBAxCgBF,S","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 1eb1c04de957b36a7498","/**\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 * Returns basic nodetypes as contants\n * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}}\n */\n static get nodeTypes() {\n\n return {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8,\n DOCUMENT_FRAGMENT: 11\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 content\n *\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\n *\n * @param {Element} node - start Node\n * @param {Boolean} atLast - find last text node\n * @return {*}\n */\n static getDeepestTextNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return 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)) {\n\n /** and it is not native input */\n if (!this.isNativeInput(node)) {\n\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\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.getDeepestTextNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestTextNode(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|*} 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.indexOf(target.tagName) !== -1 : false;\n\n }\n\n /**\n * Checks node if it is empty\n * It must be node without childNodes\n * @param {Node} node\n *\n * @return {Boolean} true if it is empty\n */\n static checkNodeEmpty(node) {\n\n let nodeText;\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n nodeText = node.value;\n\n if ( nodeText.trim() ) {\n\n return false;\n\n }\n\n\n } else {\n\n nodeText = node.textContent.replace('\\u200B', '');\n\n if ( nodeText.trim() ) {\n\n return false;\n\n }\n\n }\n\n return true;\n\n }\n\n /**\n * checks node if it is doesn't have child node\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\n *\n * Pushes to stack all DOM leafs and checks for emptiness\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n stack = [];\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 stack.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 stack.every( node => this.checkNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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\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 /** contentNode click handler */\n block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false);\n\n /** keydown on block */\n block.pluginsContent.addEventListener('keydown', (event) => this.keyDownOnBlock(event), false);\n\n }\n\n /**\n * Highlight clicked block\n * @param {MouseEvent} event\n */\n wrapperClicked(event) {\n\n this.setCurrentBlockByChildNode(event.target);\n\n }\n\n /**\n *\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.blockRightOrDownArrowPressed();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.blockLeftOrUpArrowPressed();\n break;\n\n }\n\n }\n\n /**\n *\n */\n blockRightOrDownArrowPressed() {\n\n let currentBlock = this.currentBlock,\n lastTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === textNodeLength) {\n\n let nextBlock = this.getNextBlock();\n\n if (!nextBlock) return;\n\n this.Editor.Caret.set( nextBlock.pluginsContent );\n\n }\n\n }\n\n blockLeftOrUpArrowPressed() {\n\n let currentBlock = this.currentBlock,\n firstTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n \n if (Selection.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 0) {\n\n let previousBlock = this.getPreviousBlock();\n\n if (!previousBlock) return;\n\n // this.currentNode = previousBlock.pluginsContent;\n this.Editor.Caret.set( previousBlock.pluginsContent, 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\n this.Editor.Caret.set(block.pluginsContent);\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 *\n * @return {*}\n */\n getLastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n *\n * @param index\n * @return {*}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Returns next Block instance\n * @return {*}\n */\n getNextBlock() {\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 */\n getPreviousBlock() {\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 Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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\nclass BlockMethods {\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 * @class Caret\n * @classdesc Contains methods for working Caret\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 * Creates Document Range and sets caret to the element.\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n * @param {Boolean} atEnd\n */\n set( element, offset = 0, atEnd = false) {\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestTextNode(element, atEnd);\n\n if (atEnd) {\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 function _set() {\n\n let range = document.createRange(),\n selection = Selection.getSelection();\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n }\n\n _.delay( _set, 20)();\n\n };\n\n /**\n * Set Caret to the last Block\n *\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let blocks = this.Editor.BlockManager.blocks,\n lastBlock;\n\n if (blocks.length) {\n\n lastBlock = blocks[blocks.length - 1];\n\n }\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.set(lastBlock.html);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\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 }\n\n // /**\n // * Set caret to the passed Node\n // * @param {Element} node - content-editable Element\n // */\n // set(node) {\n //\n // /**\n // * @todo add working with Selection\n // * tmp: work with textContent\n // */\n //\n // node.textContent += '|';\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.getLastBlock(),\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0","/**\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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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"],"sourceRoot":""} \ No newline at end of file diff --git a/example/example.html b/example/example.html index 1b294cc9..a142df19 100644 --- a/example/example.html +++ b/example/example.html @@ -84,12 +84,6 @@ data : { text : '

    ' } - }, - { - type : 'text', - data : { - text: 'sdfsdfsd' - } } ] } diff --git a/src/components/dom.js b/src/components/dom.js index 9af7f027..2ef5f949 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -13,7 +13,7 @@ export default class Dom { */ static make(tagName, classNames = null, attributes = {}) { - var el = document.createElement(tagName); + let el = document.createElement(tagName); if ( Array.isArray(classNames) ) { @@ -184,11 +184,13 @@ export default class Dom { */ static checkNodeEmpty(node) { + let nodeText; + if ( this.isElement(node) && this.isNativeInput(node) ) { - node = node.value; + nodeText = node.value; - if ( node.trim() ) { + if ( nodeText.trim() ) { return false; @@ -197,9 +199,9 @@ export default class Dom { } else { - node = node.textContent.replace('\u200B', ''); + nodeText = node.textContent.replace('\u200B', ''); - if ( node.trim() ) { + if ( nodeText.trim() ) { return false; @@ -211,6 +213,23 @@ export default class Dom { } + /** + * checks node if it is doesn't have child node + * @param {Node} node + * @return {*|boolean} + */ + static isLeaf(node) { + + if (!node) { + + return false; + + } + + return node.childNodes.length === 0; + + } + /** * breadth-first search * @@ -233,7 +252,7 @@ export default class Dom { while ( treeWalker.length > 0 ) { - if (node && node.childNodes.length === 0) { + if ( this.isLeaf(node) ) { stack.push(node); @@ -245,12 +264,6 @@ export default class Dom { if (!node) continue; - if (node.childNodes.length === 0) { - - stack.push(node); - - } - treeWalker.push(node); } diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index e4896ce5..a58b660b 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -159,24 +159,18 @@ export default class BlockManager extends Module { lastTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, true), textNodeLength = lastTextNode.length; - console.log('here right'); - console.log(Selection.getSelectionAnchorNode()); - console.log(lastTextNode); - if (Selection.getSelectionAnchorNode() !== lastTextNode) { return; } - console.log(lastTextNode); if (Selection.getSelectionAnchorOffset() === textNodeLength) { let nextBlock = this.getNextBlock(); if (!nextBlock) return; - // this.currentNode = nextBlock.pluginsContent; this.Editor.Caret.set( nextBlock.pluginsContent ); } @@ -189,10 +183,6 @@ export default class BlockManager extends Module { firstTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, false), textNodeLength = firstTextNode.length; - console.log('here left'); - console.log(Selection.getSelectionAnchorNode()); - console.log(firstTextNode); - if (Selection.getSelectionAnchorNode() !== firstTextNode) { return; From 0ed9238e5363cf42b474556543471b451a58b0ce Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Fri, 29 Dec 2017 02:14:10 +0300 Subject: [PATCH 05/14] last changes, added docs --- build/codex-editor.js | 169 ++++++++++--------------- build/codex-editor.js.map | 2 +- docs/caret.md | 1 + src/components/modules/blockManager.js | 30 ++--- src/components/modules/caret.js | 121 ++++++------------ 5 files changed, 125 insertions(+), 198 deletions(-) create mode 100644 docs/caret.md diff --git a/build/codex-editor.js b/build/codex-editor.js index 3849118a..8d74fae4 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -1549,6 +1549,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" * @classdesc Manage editor`s blocks storage and appearance * * @module BlockManager + * + * @version 2.0.0 */ /** @@ -1670,7 +1672,10 @@ var BlockManager = function (_Module) { return _this3.wrapperClicked(event); }, false); - /** keydown on block */ + /** + * keydown on block + * @todo move to the keydown module + */ block.pluginsContent.addEventListener('keydown', function (event) { return _this3.keyDownOnBlock(event); }, false); @@ -1689,7 +1694,7 @@ var BlockManager = function (_Module) { } /** - * + * @todo move to the keydown module * @param {MouseEvent} event */ @@ -1715,7 +1720,7 @@ var BlockManager = function (_Module) { } /** - * + * @todo Refactor method when code above will be moved to the keydown module */ }, { @@ -1737,9 +1742,14 @@ var BlockManager = function (_Module) { if (!nextBlock) return; - this.Editor.Caret.set(nextBlock.pluginsContent); + this.Editor.Caret.setToBlock(nextBlock); } } + + /** + * @todo Refactor method when code above will be moved to the keydown module + */ + }, { key: 'blockLeftOrUpArrowPressed', value: function blockLeftOrUpArrowPressed() { @@ -1759,8 +1769,7 @@ var BlockManager = function (_Module) { if (!previousBlock) return; - // this.currentNode = previousBlock.pluginsContent; - this.Editor.Caret.set(previousBlock.pluginsContent, textNodeLength, true); + this.Editor.Caret.setToBlock(previousBlock, textNodeLength, true); } } @@ -1780,8 +1789,7 @@ var BlockManager = function (_Module) { var block = this.composeBlock(toolName, data); this._blocks[++this.currentBlockIndex] = block; - - this.Editor.Caret.set(block.pluginsContent); + this.Editor.Caret.setToBlock(block); } /** @@ -1946,7 +1954,7 @@ var BlockManager = function (_Module) { /** * Set currentBlockIndex to passed block * - * @todo get first level block before searching + * @todo get first level block before searching. Use closest function * * @param {HTMLElement} element */ @@ -1992,13 +2000,6 @@ var BlockManager = function (_Module) { return BlockManager; }(Module); -BlockManager.displayName = 'BlockManager'; -exports.default = BlockManager; - -var BlockMethods = function BlockMethods() { - _classCallCheck(this, BlockMethods); -}; - /** * @class Blocks * @classdesc Class to work with Block instances array @@ -2010,7 +2011,8 @@ var BlockMethods = function BlockMethods() { */ -BlockMethods.displayName = 'BlockMethods'; +BlockManager.displayName = 'BlockManager'; +exports.default = BlockManager; var Blocks = function () { @@ -2260,9 +2262,17 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" * @class Caret * @classdesc Contains methods for working Caret * - * @typedef {Caret} Caret + * Uses Range methods to manipulate with caret + * + * @module Caret + * + * @version 2.0.0 */ +/** + * @typedef {Caret} Caret + */ + var Caret = function (_Module) { _inherits(Caret, _Module); @@ -2279,20 +2289,28 @@ var Caret = function (_Module) { } /** - * Creates Document Range and sets caret to the element. - * @param {Element} element - target node. - * @param {Number} offset - offset - * @param {Boolean} atEnd + * Method gets Block instance and puts caret to the text node with offset + * There two ways that method applies caret position: + * - first found text node: sets at the beginning, but you can pass an offset + * - last found text node: sets at the end of the node. Also, you can customize the behaviour + * + * @param {Block} block - Block class + * @param {Number} offset - caret offset regarding to the text node + * @param {Boolean} atEnd - put caret at the end of the text node or not */ _createClass(Caret, [{ - key: 'set', - value: function set(element) { + key: 'setToBlock', + value: function setToBlock(block) { + var _this2 = this; + var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var atEnd = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var element = block.pluginsContent; + /** If Element is INPUT */ if ($.isNativeInput(element)) { @@ -2302,7 +2320,7 @@ var Caret = function (_Module) { var nodeToSet = $.getDeepestTextNode(element, atEnd); - if (atEnd) { + if (atEnd || offset > nodeToSet.length) { offset = nodeToSet.length; } @@ -2314,19 +2332,33 @@ var Caret = function (_Module) { return; } - function _set() { + _.delay(function () { + return _this2.set(nodeToSet, offset); + }, 20)(); - var range = document.createRange(), - selection = _Selection2.default.getSelection(); + this.Editor.BlockManager.currentNode = block.wrapper; + } - range.setStart(nodeToSet, offset); - range.setEnd(nodeToSet, offset); + /** + * Creates Document Range and sets caret to the element with offset + * @param {Element} element - target node. + * @param {Number} offset - offset + */ - selection.removeAllRanges(); - selection.addRange(range); - } + }, { + key: 'set', + value: function set(element) { + var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; - _.delay(_set, 20)(); + + var range = document.createRange(), + selection = _Selection2.default.getSelection(); + + range.setStart(element, offset); + range.setEnd(element, offset); + + selection.removeAllRanges(); + selection.addRange(range); } }, { key: 'setToTheLastBlock', @@ -2339,13 +2371,9 @@ var Caret = function (_Module) { */ value: function setToTheLastBlock() { - var blocks = this.Editor.BlockManager.blocks, - lastBlock = void 0; + var lastBlock = this.Editor.BlockManager.getLastBlock(); - if (blocks.length) { - - lastBlock = blocks[blocks.length - 1]; - } + if (!lastBlock) return; /** * If last block is empty and it is an initialBlock, set to that. @@ -2353,71 +2381,12 @@ var Caret = function (_Module) { */ if (lastBlock.isEmpty) { - this.set(lastBlock.html); + this.setToBlock(lastBlock); } else { this.Editor.BlockManager.insert(this.config.initialBlock); } - - /** - // * If inputs in redactor does not exits, then we put input index 0 not -1 - // */ - // var indexOfLastInput = editor.state.inputs.length > 0 ? editor.state.inputs.length - 1 : 0; - // - // /** If we have any inputs */ - // if (editor.state.inputs.length) { - // - // /** getting firstlevel parent of input */ - // firstLevelBlock = editor.content.getFirstLevelBlock(editor.state.inputs[indexOfLastInput]); - // - // } - // - // /** If input is empty, then we set caret to the last input */ - // if (editor.state.inputs.length && editor.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == editor.settings.initialBlockPlugin) { - // - // editor.caret.setToBlock(indexOfLastInput); - // - // } else { - // - // /** Create new input when caret clicked in redactors area */ - // var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin; - // - // editor.content.insertBlock({ - // type : NEW_BLOCK_TYPE, - // block : editor.tools[NEW_BLOCK_TYPE].render() - // }); - // - // /** If there is no inputs except inserted */ - // if (editor.state.inputs.length === 1) { - // - // editor.caret.setToBlock(indexOfLastInput); - // - // } else { - // - // /** Set caret to this appended input */ - // editor.caret.setToNextBlock(indexOfLastInput); - // - // } - // - // } } - - // /** - // * Set caret to the passed Node - // * @param {Element} node - content-editable Element - // */ - // set(node) { - // - // /** - // * @todo add working with Selection - // * tmp: work with textContent - // */ - // - // node.textContent += '|'; - // - // } - - }]); return Caret; diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 4c2000f4..b5865409 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 1eb1c04de957b36a7498","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","webpack:///./src/components/Selection.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","TAG","TEXT","COMMENT","DOCUMENT_FRAGMENT","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","getDeepestTextNode","nodeType","Node","ELEMENT_NODE","nativeInputs","indexOf","nodeText","value","trim","textContent","replace","treeWalker","stack","push","isLeaf","nextSibling","shift","firstChild","every","checkNodeEmpty","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","wrapperClicked","keyDownOnBlock","setCurrentBlockByChildNode","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","blockLeftOrUpArrowPressed","currentBlock","lastTextNode","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","getNextBlock","Caret","firstTextNode","previousBlock","getPreviousBlock","composeBlock","insert","index","isLastBlock","isFirstBlock","childNode","parentFirstLevelBlock","currentNode","Error","array","BlockMethods","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","instance","isNaN","Number","offset","atEnd","focus","nodeToSet","_set","range","createRange","selection","getSelection","setStart","setEnd","removeAllRanges","addRange","delay","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","clickedOnRedactorZone","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","getLastBlock","Selection","anchorNode","anchorOffset"],"mappings":"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AAKhL,MAAZ;AAEH;AA5HL;;AAAA;AAAA;;AAmPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,U;;;;;;;;;;ACtbA;;;;;AAKA,IAAI,CAAC0L,QAAQ1J,SAAR,CAAkB2J,OAAvB,EACID,QAAQ1J,SAAR,CAAkB2J,OAAlB,GAA4BD,QAAQ1J,SAAR,CAAkB4J,iBAAlB,IACxBF,QAAQ1J,SAAR,CAAkB6J,qBADtB;;AAGJ,IAAI,CAACH,QAAQ1J,SAAR,CAAkB8J,OAAvB,EACIJ,QAAQ1J,SAAR,CAAkB8J,OAAlB,GAA4B,UAAUC,CAAV,EAAa;;AAErC,QAAI1H,KAAK,IAAT;;AAEA,QAAI,CAACC,SAAS0H,eAAT,CAAyBC,QAAzB,CAAkC5H,EAAlC,CAAL,EAA4C,OAAO,IAAP;AAC5C,OAAG;;AAEC,YAAIA,GAAGsH,OAAH,CAAWI,CAAX,CAAJ,EAAmB,OAAO1H,EAAP;AACnBA,aAAKA,GAAG6H,aAAH,IAAoB7H,GAAG8H,UAA5B;AAEH,KALD,QAKS9H,OAAO,IALhB;AAMA,WAAO,IAAP;AAEH,CAbD,C;;;;;;ACVJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC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KC,UAAL,CAAgBD,gBAAhB,CAAtB;AAAA,aADH,EAEFnR,IAFE,CAEG,UAACqR,UAAD,EAAgB;;AAElB,uBAAOA,UAAP;AAEH,aANE,CAAP;AAQH;;AAED;;;;;;;;mCAKWF,gB,EAAkB;;AAEzB,gBAAIzH,QAAQ,EAAZ;AAAA,gBACI4H,YAAY,CADhB;;AAGAjS,oBAAQkS,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBxN,OAAjB,CAAyB,UAAC6N,UAAD,EAAatE,KAAb,EAAuB;;AAE5C;AACA7N,wBAAQmI,GAAR,UAAgBgK,WAAWvL,IAA3B,uBAAgDuL,UAAhD;AACAF,6BAAaE,WAAWnK,IAAxB;AACAqC,sBAAMpE,IAAN,CAAWkM,WAAWjR,IAAtB;AAEH,aAPD;;AASAlB,oBAAQmI,GAAR,CAAY,OAAZ,EAAqB8J,SAArB;AACAjS,oBAAQoS,QAAR;;AAEA,mBAAO;AACHpK,sBAAU,CAAC,IAAIqK,IAAJ,EADR;AAEHhI,uBAAUA,KAFP;AAGHiI,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8BlT,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;AA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A;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAhiBqB6K,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;;;;;;;;;;;;;;;;;;AC3EA;;;IAGqB+M,S;;AAEjB;;;AAGA,yBAAc;AAAA;;AAEV,aAAKnI,QAAL,GAAgB,IAAhB;AACA,aAAKU,SAAL,GAAiB,IAAjB;AAEH;;;;uCAEqB;;AAElB,mBAAOzP,OAAO0P,YAAP,EAAP;AAEH;;;iDAE+B;;AAE5B,gBAAID,YAAYzP,OAAO0P,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU0H,UAAjB;AAEH;AAEJ;;;mDAEiC;;AAE9B,gBAAI1H,YAAYzP,OAAO0P,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU2H,YAAjB;AAEH;AAEJ;;;;;;;kBAxCgBF,S","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 1eb1c04de957b36a7498","/**\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 * Returns basic nodetypes as contants\n * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}}\n */\n static get nodeTypes() {\n\n return {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8,\n DOCUMENT_FRAGMENT: 11\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 content\n *\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\n *\n * @param {Element} node - start Node\n * @param {Boolean} atLast - find last text node\n * @return {*}\n */\n static getDeepestTextNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return 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)) {\n\n /** and it is not native input */\n if (!this.isNativeInput(node)) {\n\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\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.getDeepestTextNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestTextNode(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|*} 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.indexOf(target.tagName) !== -1 : false;\n\n }\n\n /**\n * Checks node if it is empty\n * It must be node without childNodes\n * @param {Node} node\n *\n * @return {Boolean} true if it is empty\n */\n static checkNodeEmpty(node) {\n\n let nodeText;\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n nodeText = node.value;\n\n if ( nodeText.trim() ) {\n\n return false;\n\n }\n\n\n } else {\n\n nodeText = node.textContent.replace('\\u200B', '');\n\n if ( nodeText.trim() ) {\n\n return false;\n\n }\n\n }\n\n return true;\n\n }\n\n /**\n * checks node if it is doesn't have child node\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\n *\n * Pushes to stack all DOM leafs and checks for emptiness\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n stack = [];\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 stack.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 stack.every( node => this.checkNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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\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 /** contentNode click handler */\n block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false);\n\n /** keydown on block */\n block.pluginsContent.addEventListener('keydown', (event) => this.keyDownOnBlock(event), false);\n\n }\n\n /**\n * Highlight clicked block\n * @param {MouseEvent} event\n */\n wrapperClicked(event) {\n\n this.setCurrentBlockByChildNode(event.target);\n\n }\n\n /**\n *\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.blockRightOrDownArrowPressed();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.blockLeftOrUpArrowPressed();\n break;\n\n }\n\n }\n\n /**\n *\n */\n blockRightOrDownArrowPressed() {\n\n let currentBlock = this.currentBlock,\n lastTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === textNodeLength) {\n\n let nextBlock = this.getNextBlock();\n\n if (!nextBlock) return;\n\n this.Editor.Caret.set( nextBlock.pluginsContent );\n\n }\n\n }\n\n blockLeftOrUpArrowPressed() {\n\n let currentBlock = this.currentBlock,\n firstTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n \n if (Selection.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 0) {\n\n let previousBlock = this.getPreviousBlock();\n\n if (!previousBlock) return;\n\n // this.currentNode = previousBlock.pluginsContent;\n this.Editor.Caret.set( previousBlock.pluginsContent, 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\n this.Editor.Caret.set(block.pluginsContent);\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 *\n * @return {*}\n */\n getLastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n *\n * @param index\n * @return {*}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Returns next Block instance\n * @return {*}\n */\n getNextBlock() {\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 */\n getPreviousBlock() {\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 Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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\nclass BlockMethods {\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 * @class Caret\n * @classdesc Contains methods for working Caret\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 * Creates Document Range and sets caret to the element.\n * @param {Element} element - target node.\n * @param {Number} offset - offset\n * @param {Boolean} atEnd\n */\n set( element, offset = 0, atEnd = false) {\n\n /** If Element is INPUT */\n if ($.isNativeInput(element)) {\n\n element.focus();\n return;\n\n }\n\n let nodeToSet = $.getDeepestTextNode(element, atEnd);\n\n if (atEnd) {\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 function _set() {\n\n let range = document.createRange(),\n selection = Selection.getSelection();\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n }\n\n _.delay( _set, 20)();\n\n };\n\n /**\n * Set Caret to the last Block\n *\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let blocks = this.Editor.BlockManager.blocks,\n lastBlock;\n\n if (blocks.length) {\n\n lastBlock = blocks[blocks.length - 1];\n\n }\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.set(lastBlock.html);\n\n } else {\n\n this.Editor.BlockManager.insert(this.config.initialBlock);\n\n }\n\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 }\n\n // /**\n // * Set caret to the passed Node\n // * @param {Element} node - content-editable Element\n // */\n // set(node) {\n //\n // /**\n // * @todo add working with Selection\n // * tmp: work with textContent\n // */\n //\n // node.textContent += '|';\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.getLastBlock(),\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0","/**\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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap d37d8f813555e7c91340","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","webpack:///./src/components/Selection.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","TAG","TEXT","COMMENT","DOCUMENT_FRAGMENT","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","getDeepestTextNode","nodeType","Node","ELEMENT_NODE","nativeInputs","indexOf","nodeText","value","trim","textContent","replace","treeWalker","stack","push","isLeaf","nextSibling","shift","firstChild","every","checkNodeEmpty","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","wrapperClicked","keyDownOnBlock","setCurrentBlockByChildNode","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","blockLeftOrUpArrowPressed","currentBlock","lastTextNode","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","getNextBlock","Caret","setToBlock","firstTextNode","previousBlock","getPreviousBlock","composeBlock","insert","index","isLastBlock","isFirstBlock","childNode","parentFirstLevelBlock","currentNode","Error","array","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","instance","isNaN","Number","offset","atEnd","focus","nodeToSet","delay","range","createRange","selection","getSelection","setStart","setEnd","removeAllRanges","addRange","lastBlock","getLastBlock","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","clickedOnRedactorZone","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","Selection","anchorNode","anchorOffset"],"mappings":"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AAKhL,MAAZ;AAEH;AA5HL;;AAAA;AAAA;;AAmPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,U;;;;;;;;;;ACtbA;;;;;AAKA,IAAI,CAAC0L,QAAQ1J,SAAR,CAAkB2J,OAAvB,EACID,QAAQ1J,SAAR,CAAkB2J,OAAlB,GAA4BD,QAAQ1J,SAAR,CAAkB4J,iBAAlB,IACxBF,QAAQ1J,SAAR,CAAkB6J,qBADtB;;AAGJ,IAAI,CAACH,QAAQ1J,SAAR,CAAkB8J,OAAvB,EACIJ,QAAQ1J,SAAR,CAAkB8J,OAAlB,GAA4B,UAAUC,CAAV,EAAa;;AAErC,QAAI1H,KAAK,IAAT;;AAEA,QAAI,CAACC,SAAS0H,eAAT,CAAyBC,QAAzB,CAAkC5H,EAAlC,CAAL,EAA4C,OAAO,IAAP;AAC5C,OAAG;;AAEC,YAAIA,GAAGsH,OAAH,CAAWI,CAAX,CAAJ,EAAmB,OAAO1H,EAAP;AACnBA,aAAKA,GAAG6H,aAAH,IAAoB7H,GAAG8H,UAA5B;AAEH,KALD,QAKS9H,OAAO,IALhB;AAMA,WAAO,IAAP;AAEH,CAbD,C;;;;;;ACVJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC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EAAkB;;AAEzB,gBAAIzH,QAAQ,EAAZ;AAAA,gBACI4H,YAAY,CADhB;;AAGAjS,oBAAQkS,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBxN,OAAjB,CAAyB,UAAC6N,UAAD,EAAarE,KAAb,EAAuB;;AAE5C;AACA9N,wBAAQmI,GAAR,UAAgBgK,WAAWvL,IAA3B,uBAAgDuL,UAAhD;AACAF,6BAAaE,WAAWnK,IAAxB;AACAqC,sBAAMpE,IAAN,CAAWkM,WAAWjR,IAAtB;AAEH,aAPD;;AASAlB,oBAAQmI,GAAR,CAAY,OAAZ,EAAqB8J,SAArB;AACAjS,oBAAQoS,QAAR;;AAEA,mBAAO;AACHpK,sBAAU,CAAC,IAAIqK,IAAJ,EADR;AAEHhI,uBAAUA,KAFP;AAGHiI,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8BlT,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;AA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A;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAhiBqB6K,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;;;;;;;;;;;;;;;;;;AC3EA;;;IAGqB8M,S;;AAEjB;;;AAGA,yBAAc;AAAA;;AAEV,aAAKlI,QAAL,GAAgB,IAAhB;AACA,aAAKU,SAAL,GAAiB,IAAjB;AAEH;;;;uCAEqB;;AAElB,mBAAOzP,OAAO0P,YAAP,EAAP;AAEH;;;iDAE+B;;AAE5B,gBAAID,YAAYzP,OAAO0P,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAUyH,UAAjB;AAEH;AAEJ;;;mDAEiC;;AAE9B,gBAAIzH,YAAYzP,OAAO0P,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU0H,YAAjB;AAEH;AAEJ;;;;;;;kBAxCgBF,S","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 d37d8f813555e7c91340","/**\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 * Returns basic nodetypes as contants\n * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}}\n */\n static get nodeTypes() {\n\n return {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8,\n DOCUMENT_FRAGMENT: 11\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 content\n *\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\n *\n * @param {Element} node - start Node\n * @param {Boolean} atLast - find last text node\n * @return {*}\n */\n static getDeepestTextNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return 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)) {\n\n /** and it is not native input */\n if (!this.isNativeInput(node)) {\n\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\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.getDeepestTextNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestTextNode(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|*} 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.indexOf(target.tagName) !== -1 : false;\n\n }\n\n /**\n * Checks node if it is empty\n * It must be node without childNodes\n * @param {Node} node\n *\n * @return {Boolean} true if it is empty\n */\n static checkNodeEmpty(node) {\n\n let nodeText;\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n nodeText = node.value;\n\n if ( nodeText.trim() ) {\n\n return false;\n\n }\n\n\n } else {\n\n nodeText = node.textContent.replace('\\u200B', '');\n\n if ( nodeText.trim() ) {\n\n return false;\n\n }\n\n }\n\n return true;\n\n }\n\n /**\n * checks node if it is doesn't have child node\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\n *\n * Pushes to stack all DOM leafs and checks for emptiness\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n stack = [];\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 stack.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 stack.every( node => this.checkNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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 /** contentNode click handler */\n block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false);\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 * Highlight clicked block\n * @param {MouseEvent} event\n */\n wrapperClicked(event) {\n\n this.setCurrentBlockByChildNode(event.target);\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.blockRightOrDownArrowPressed();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.blockLeftOrUpArrowPressed();\n break;\n\n }\n\n }\n\n /**\n * @todo Refactor method when code above will be moved to the keydown module\n */\n blockRightOrDownArrowPressed() {\n\n let currentBlock = this.currentBlock,\n lastTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === textNodeLength) {\n\n let nextBlock = this.getNextBlock();\n\n if (!nextBlock) return;\n\n this.Editor.Caret.setToBlock( nextBlock );\n\n }\n\n }\n\n /**\n * @todo Refactor method when code above will be moved to the keydown module\n */\n blockLeftOrUpArrowPressed() {\n\n let currentBlock = this.currentBlock,\n firstTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 0) {\n\n let previousBlock = this.getPreviousBlock();\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 *\n * @return {*}\n */\n getLastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n *\n * @param index\n * @return {*}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Returns next Block instance\n * @return {*}\n */\n getNextBlock() {\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 */\n getPreviousBlock() {\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 Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching. Use closest function\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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 * @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 = $.getDeepestTextNode(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 _.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.getSelection();\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 *\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let lastBlock = this.Editor.BlockManager.getLastBlock();\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.getLastBlock(),\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0","/**\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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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"],"sourceRoot":""} \ No newline at end of file diff --git a/docs/caret.md b/docs/caret.md new file mode 100644 index 00000000..fcfab92c --- /dev/null +++ b/docs/caret.md @@ -0,0 +1 @@ +# CodeX Editor Caret Module \ No newline at end of file diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index a58b660b..4a2f8c59 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -3,6 +3,8 @@ * @classdesc Manage editor`s blocks storage and appearance * * @module BlockManager + * + * @version 2.0.0 */ import Block from '../block'; @@ -111,7 +113,10 @@ export default class BlockManager extends Module { /** contentNode click handler */ block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false); - /** keydown on block */ + /** + * keydown on block + * @todo move to the keydown module + */ block.pluginsContent.addEventListener('keydown', (event) => this.keyDownOnBlock(event), false); } @@ -127,7 +132,7 @@ export default class BlockManager extends Module { } /** - * + * @todo move to the keydown module * @param {MouseEvent} event */ keyDownOnBlock(event) { @@ -151,7 +156,7 @@ export default class BlockManager extends Module { } /** - * + * @todo Refactor method when code above will be moved to the keydown module */ blockRightOrDownArrowPressed() { @@ -171,12 +176,15 @@ export default class BlockManager extends Module { if (!nextBlock) return; - this.Editor.Caret.set( nextBlock.pluginsContent ); + this.Editor.Caret.setToBlock( nextBlock ); } } + /** + * @todo Refactor method when code above will be moved to the keydown module + */ blockLeftOrUpArrowPressed() { let currentBlock = this.currentBlock, @@ -195,8 +203,7 @@ export default class BlockManager extends Module { if (!previousBlock) return; - // this.currentNode = previousBlock.pluginsContent; - this.Editor.Caret.set( previousBlock.pluginsContent, textNodeLength, true ); + this.Editor.Caret.setToBlock( previousBlock, textNodeLength, true ); } @@ -214,8 +221,7 @@ export default class BlockManager extends Module { let block = this.composeBlock(toolName, data); this._blocks[++this.currentBlockIndex] = block; - - this.Editor.Caret.set(block.pluginsContent); + this.Editor.Caret.setToBlock(block); } @@ -335,7 +341,7 @@ export default class BlockManager extends Module { /** * Set currentBlockIndex to passed block * - * @todo get first level block before searching + * @todo get first level block before searching. Use closest function * * @param {HTMLElement} element */ @@ -405,12 +411,6 @@ export default class BlockManager extends Module { } -} - -class BlockMethods { - - - } /** diff --git a/src/components/modules/caret.js b/src/components/modules/caret.js index b8e27dca..9c6410d9 100644 --- a/src/components/modules/caret.js +++ b/src/components/modules/caret.js @@ -2,6 +2,14 @@ * @class Caret * @classdesc Contains methods for working Caret * + * Uses Range methods to manipulate with caret + * + * @module Caret + * + * @version 2.0.0 + */ + +/** * @typedef {Caret} Caret */ import Selection from '../Selection'; @@ -18,12 +26,18 @@ export default class Caret extends Module { } /** - * Creates Document Range and sets caret to the element. - * @param {Element} element - target node. - * @param {Number} offset - offset - * @param {Boolean} atEnd + * Method gets Block instance and puts caret to the text node with offset + * There two ways that method applies caret position: + * - first found text node: sets at the beginning, but you can pass an offset + * - last found text node: sets at the end of the node. Also, you can customize the behaviour + * + * @param {Block} block - Block class + * @param {Number} offset - caret offset regarding to the text node + * @param {Boolean} atEnd - put caret at the end of the text node or not */ - set( element, offset = 0, atEnd = false) { + setToBlock(block, offset = 0, atEnd = false) { + + let element = block.pluginsContent; /** If Element is INPUT */ if ($.isNativeInput(element)) { @@ -35,7 +49,7 @@ export default class Caret extends Module { let nodeToSet = $.getDeepestTextNode(element, atEnd); - if (atEnd) { + if (atEnd || offset > nodeToSet.length) { offset = nodeToSet.length; @@ -49,20 +63,27 @@ export default class Caret extends Module { } - function _set() { + _.delay( () => this.set(nodeToSet, offset), 20)(); - let range = document.createRange(), - selection = Selection.getSelection(); + this.Editor.BlockManager.currentNode = block.wrapper; - range.setStart(nodeToSet, offset); - range.setEnd(nodeToSet, offset); + } - selection.removeAllRanges(); - selection.addRange(range); + /** + * Creates Document Range and sets caret to the element with offset + * @param {Element} element - target node. + * @param {Number} offset - offset + */ + set( element, offset = 0) { - } + let range = document.createRange(), + selection = Selection.getSelection(); - _.delay( _set, 20)(); + range.setStart(element, offset); + range.setEnd(element, offset); + + selection.removeAllRanges(); + selection.addRange(range); }; @@ -73,14 +94,9 @@ export default class Caret extends Module { */ setToTheLastBlock() { - let blocks = this.Editor.BlockManager.blocks, - lastBlock; + let lastBlock = this.Editor.BlockManager.getLastBlock(); - if (blocks.length) { - - lastBlock = blocks[blocks.length - 1]; - - } + if (!lastBlock) return; /** * If last block is empty and it is an initialBlock, set to that. @@ -88,7 +104,7 @@ export default class Caret extends Module { */ if (lastBlock.isEmpty) { - this.set(lastBlock.html); + this.setToBlock(lastBlock); } else { @@ -96,65 +112,6 @@ export default class Caret extends Module { } - - /** - // * If inputs in redactor does not exits, then we put input index 0 not -1 - // */ - // var indexOfLastInput = editor.state.inputs.length > 0 ? editor.state.inputs.length - 1 : 0; - // - // /** If we have any inputs */ - // if (editor.state.inputs.length) { - // - // /** getting firstlevel parent of input */ - // firstLevelBlock = editor.content.getFirstLevelBlock(editor.state.inputs[indexOfLastInput]); - // - // } - // - // /** If input is empty, then we set caret to the last input */ - // if (editor.state.inputs.length && editor.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == editor.settings.initialBlockPlugin) { - // - // editor.caret.setToBlock(indexOfLastInput); - // - // } else { - // - // /** Create new input when caret clicked in redactors area */ - // var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin; - // - // editor.content.insertBlock({ - // type : NEW_BLOCK_TYPE, - // block : editor.tools[NEW_BLOCK_TYPE].render() - // }); - // - // /** If there is no inputs except inserted */ - // if (editor.state.inputs.length === 1) { - // - // editor.caret.setToBlock(indexOfLastInput); - // - // } else { - // - // /** Set caret to this appended input */ - // editor.caret.setToNextBlock(indexOfLastInput); - // - // } - // - // } - } - // /** - // * Set caret to the passed Node - // * @param {Element} node - content-editable Element - // */ - // set(node) { - // - // /** - // * @todo add working with Selection - // * tmp: work with textContent - // */ - // - // node.textContent += '|'; - // - // } - - } \ No newline at end of file From c7a5be88e21be828960a7d3dc72a0a49e2d1e59e Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Fri, 29 Dec 2017 03:08:16 +0300 Subject: [PATCH 06/14] requested changes --- build/codex-editor.js | 151 +++++++++---------------- build/codex-editor.js.map | 2 +- src/components/dom.js | 76 +++++-------- src/components/modules/blockManager.js | 42 +++---- src/components/modules/caret.js | 4 +- src/components/modules/ui.js | 2 +- src/components/utils.js | 15 --- 7 files changed, 103 insertions(+), 189 deletions(-) diff --git a/build/codex-editor.js b/build/codex-editor.js index 8d74fae4..cd6f1fb2 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -377,23 +377,6 @@ var Util = function () { META: 91 }; } - - /** - * Returns basic nodetypes as contants - * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}} - */ - - }, { - key: 'nodeTypes', - get: function get() { - - return { - TAG: 1, - TEXT: 3, - COMMENT: 8, - DOCUMENT_FRAGMENT: 11 - }; - } }]); return Util; @@ -468,8 +451,7 @@ var Dom = function () { } /** - * Creates text Node with content - * + * Creates Text Node with the passed content * @param {String} content - text content * @return {Text} */ @@ -545,34 +527,33 @@ var Dom = function () { } /** - * Search for deepest node + * Search for deepest node which is Leaf. + * Leaf is the vertex that doesn't have any child nodes * - * @param {Element} node - start Node + * @description Method recursively goes throw the all Node until it finds the Leaf + * + * @param {Element} node - root Node. From this vertex we start Deep-first search {@link https://en.wikipedia.org/wiki/Depth-first_search} * @param {Boolean} atLast - find last text node - * @return {*} + * @return {Node} - it can be text Node or Element Node, so that caret will able to work with it */ }, { - key: 'getDeepestTextNode', - value: function getDeepestTextNode(node) { + key: 'getDeepestNode', + value: function getDeepestNode(node) { var atLast = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; if (node.childNodes.length === 0) { /** - * We need to return empty text node + * We need to return an empty text node * But caret will not be placed in empty textNode, so we need textNode with zero-width char */ - if (this.isElement(node)) { + if (this.isElement(node) && !this.isNativeInput(node)) { - /** and it is not native input */ - if (!this.isNativeInput(node)) { + var emptyTextNode = this.text('\u200B'); - var emptyTextNode = this.text('\u200B'); - - node.appendChild(emptyTextNode); - } + node.appendChild(emptyTextNode); } return node; @@ -583,10 +564,10 @@ var Dom = function () { if (atLast) { - return this.getDeepestTextNode(node.childNodes[last], atLast); + return this.getDeepestNode(node.childNodes[last], atLast); } else { - return this.getDeepestTextNode(node.childNodes[0], false); + return this.getDeepestNode(node.childNodes[0], false); } } @@ -606,8 +587,8 @@ var Dom = function () { /** * Checks target if it is native input - * @param {Element|*} target - HTML element or string - * @return {boolean} + * @param {Element|String} target - HTML element or string + * @return {Boolean} */ }, { @@ -616,48 +597,40 @@ var Dom = function () { var nativeInputs = ['INPUT', 'TEXTAREA']; - return target ? nativeInputs.indexOf(target.tagName) !== -1 : false; + return target ? nativeInputs.includes(target.tagName) : false; } /** * Checks node if it is empty - * It must be node without childNodes - * @param {Node} node * + * @description Method checks simple Node without any childs for emptiness + * If you have Node with 2 or more children id depth, you better use {@link Dom#isEmpty} method + * + * @param {Node} node * @return {Boolean} true if it is empty */ }, { - key: 'checkNodeEmpty', - value: function checkNodeEmpty(node) { + key: 'isNodeEmpty', + value: function isNodeEmpty(node) { var nodeText = void 0; if (this.isElement(node) && this.isNativeInput(node)) { nodeText = node.value; - - if (nodeText.trim()) { - - return false; - } } else { nodeText = node.textContent.replace('\u200B', ''); - - if (nodeText.trim()) { - - return false; - } } - return true; + return nodeText.trim().length === 0; } /** - * checks node if it is doesn't have child node + * checks node if it is doesn't have any child nodes * @param {Node} node - * @return {*|boolean} + * @return {boolean} */ }, { @@ -674,8 +647,10 @@ var Dom = function () { /** * breadth-first search + * {@link https://en.wikipedia.org/wiki/Breadth-first_search} + * + * @description Pushes to stack all DOM leafs and checks for emptiness * - * Pushes to stack all DOM leafs and checks for emptiness * @param {Node} node * @return {boolean} */ @@ -686,7 +661,7 @@ var Dom = function () { var _this = this; var treeWalker = [], - stack = []; + leafs = []; if (!node) { @@ -699,7 +674,7 @@ var Dom = function () { if (this.isLeaf(node)) { - stack.push(node); + leafs.push(node); } while (node && node.nextSibling) { @@ -719,8 +694,8 @@ var Dom = function () { treeWalker.push(node); } - return stack.every(function (node) { - return _this.checkNodeEmpty(node); + return leafs.every(function (node) { + return _this.isNodeEmpty(node); }); } }]); @@ -1667,11 +1642,6 @@ var BlockManager = function (_Module) { value: function bindEvents(block) { var _this3 = this; - /** contentNode click handler */ - block.wrapper.addEventListener('click', function (event) { - return _this3.wrapperClicked(event); - }, false); - /** * keydown on block * @todo move to the keydown module @@ -1681,18 +1651,6 @@ var BlockManager = function (_Module) { }, false); } - /** - * Highlight clicked block - * @param {MouseEvent} event - */ - - }, { - key: 'wrapperClicked', - value: function wrapperClicked(event) { - - this.setCurrentBlockByChildNode(event.target); - } - /** * @todo move to the keydown module * @param {MouseEvent} event @@ -1727,8 +1685,7 @@ var BlockManager = function (_Module) { key: 'blockRightOrDownArrowPressed', value: function blockRightOrDownArrowPressed() { - var currentBlock = this.currentBlock, - lastTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, true), + var lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true), textNodeLength = lastTextNode.length; if (_Selection2.default.getSelectionAnchorNode() !== lastTextNode) { @@ -1738,7 +1695,7 @@ var BlockManager = function (_Module) { if (_Selection2.default.getSelectionAnchorOffset() === textNodeLength) { - var nextBlock = this.getNextBlock(); + var nextBlock = this.NextBlock(); if (!nextBlock) return; @@ -1754,8 +1711,7 @@ var BlockManager = function (_Module) { key: 'blockLeftOrUpArrowPressed', value: function blockLeftOrUpArrowPressed() { - var currentBlock = this.currentBlock, - firstTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, false), + var firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false), textNodeLength = firstTextNode.length; if (_Selection2.default.getSelectionAnchorNode() !== firstTextNode) { @@ -1765,7 +1721,7 @@ var BlockManager = function (_Module) { if (_Selection2.default.getSelectionAnchorOffset() === 0) { - var previousBlock = this.getPreviousBlock(); + var previousBlock = this.PreviousBlock(); if (!previousBlock) return; @@ -1811,21 +1767,21 @@ var BlockManager = function (_Module) { } /** - * - * @return {*} + * returns last Block + * @return {Block} */ }, { - key: 'getLastBlock', - value: function getLastBlock() { + key: 'LastBlock', + value: function LastBlock() { return this._blocks[this._blocks.length - 1]; } /** - * - * @param index - * @return {*} + * Returns Block by passed index + * @param {Number} index + * @return {Block} */ }, { @@ -1837,12 +1793,12 @@ var BlockManager = function (_Module) { /** * Returns next Block instance - * @return {*} + * @return {Block|null} */ }, { - key: 'getNextBlock', - value: function getNextBlock() { + key: 'NextBlock', + value: function NextBlock() { var isLastBlock = this.currentBlockIndex === this._blocks.length - 1; @@ -1856,11 +1812,12 @@ var BlockManager = function (_Module) { /** * Returns previous Block instance + * @return {Block|null} */ }, { - key: 'getPreviousBlock', - value: function getPreviousBlock() { + key: 'PreviousBlock', + value: function PreviousBlock() { var isFirstBlock = this.currentBlockIndex === 0; @@ -2318,7 +2275,7 @@ var Caret = function (_Module) { return; } - var nodeToSet = $.getDeepestTextNode(element, atEnd); + var nodeToSet = $.getDeepestNode(element, atEnd); if (atEnd || offset > nodeToSet.length) { @@ -2371,7 +2328,7 @@ var Caret = function (_Module) { */ value: function setToTheLastBlock() { - var lastBlock = this.Editor.BlockManager.getLastBlock(); + var lastBlock = this.Editor.BlockManager.LastBlock(); if (!lastBlock) return; @@ -4586,7 +4543,7 @@ var UI = function (_Module) { key: 'clickedOnRedactorZone', value: function clickedOnRedactorZone(event) { - var lastBlock = this.Editor.BlockManager.getLastBlock(), + var lastBlock = this.Editor.BlockManager.LastBlock(), pluginsContent = lastBlock.pluginsContent; /** diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index b5865409..166f7de1 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap d37d8f813555e7c91340","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","webpack:///./src/components/Selection.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","TAG","TEXT","COMMENT","DOCUMENT_FRAGMENT","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","getDeepestTextNode","nodeType","Node","ELEMENT_NODE","nativeInputs","indexOf","nodeText","value","trim","textContent","replace","treeWalker","stack","push","isLeaf","nextSibling","shift","firstChild","every","checkNodeEmpty","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","wrapperClicked","keyDownOnBlock","setCurrentBlockByChildNode","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","blockLeftOrUpArrowPressed","currentBlock","lastTextNode","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","getNextBlock","Caret","setToBlock","firstTextNode","previousBlock","getPreviousBlock","composeBlock","insert","index","isLastBlock","isFirstBlock","childNode","parentFirstLevelBlock","currentNode","Error","array","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","instance","isNaN","Number","offset","atEnd","focus","nodeToSet","delay","range","createRange","selection","getSelection","setStart","setEnd","removeAllRanges","addRange","lastBlock","getLastBlock","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","clickedOnRedactorZone","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","Selection","anchorNode","anchorOffset"],"mappings":"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AAKhL,MAAZ;AAEH;AA5HL;;AAAA;AAAA;;AAmPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,U;;;;;;;;;;ACtbA;;;;;AAKA,IAAI,CAAC0L,QAAQ1J,SAAR,CAAkB2J,OAAvB,EACID,QAAQ1J,SAAR,CAAkB2J,OAAlB,GAA4BD,QAAQ1J,SAAR,CAAkB4J,iBAAlB,IACxBF,QAAQ1J,SAAR,CAAkB6J,qBADtB;;AAGJ,IAAI,CAACH,QAAQ1J,SAAR,CAAkB8J,OAAvB,EACIJ,QAAQ1J,SAAR,CAAkB8J,OAAlB,GAA4B,UAAUC,CAAV,EAAa;;AAErC,QAAI1H,KAAK,IAAT;;AAEA,QAAI,CAACC,SAAS0H,eAAT,CAAyBC,QAAzB,CAAkC5H,EAAlC,CAAL,EAA4C,OAAO,IAAP;AAC5C,OAAG;;AAEC,YAAIA,GAAGsH,OAAH,CAAWI,CAAX,CAAJ,EAAmB,OAAO1H,EAAP;AACnBA,aAAKA,GAAG6H,aAAH,IAAoB7H,GAAG8H,UAA5B;AAEH,KALD,QAKS9H,OAAO,IALhB;AAMA,WAAO,IAAP;AAEH,CAbD,C;;;;;;ACVJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAC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EAAkB;;AAEzB,gBAAIzH,QAAQ,EAAZ;AAAA,gBACI4H,YAAY,CADhB;;AAGAjS,oBAAQkS,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBxN,OAAjB,CAAyB,UAAC6N,UAAD,EAAarE,KAAb,EAAuB;;AAE5C;AACA9N,wBAAQmI,GAAR,UAAgBgK,WAAWvL,IAA3B,uBAAgDuL,UAAhD;AACAF,6BAAaE,WAAWnK,IAAxB;AACAqC,sBAAMpE,IAAN,CAAWkM,WAAWjR,IAAtB;AAEH,aAPD;;AASAlB,oBAAQmI,GAAR,CAAY,OAAZ,EAAqB8J,SAArB;AACAjS,oBAAQoS,QAAR;;AAEA,mBAAO;AACHpK,sBAAU,CAAC,IAAIqK,IAAJ,EADR;AAEHhI,uBAAUA,KAFP;AAGHiI,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8BlT,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;AA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A;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAhiBqB6K,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;;;;;;;;;;;;;;;;;;AC3EA;;;IAGqB8M,S;;AAEjB;;;AAGA,yBAAc;AAAA;;AAEV,aAAKlI,QAAL,GAAgB,IAAhB;AACA,aAAKU,SAAL,GAAiB,IAAjB;AAEH;;;;uCAEqB;;AAElB,mBAAOzP,OAAO0P,YAAP,EAAP;AAEH;;;iDAE+B;;AAE5B,gBAAID,YAAYzP,OAAO0P,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAUyH,UAAjB;AAEH;AAEJ;;;mDAEiC;;AAE9B,gBAAIzH,YAAYzP,OAAO0P,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU0H,YAAjB;AAEH;AAEJ;;;;;;;kBAxCgBF,S","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 d37d8f813555e7c91340","/**\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 * Returns basic nodetypes as contants\n * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}}\n */\n static get nodeTypes() {\n\n return {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8,\n DOCUMENT_FRAGMENT: 11\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 content\n *\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\n *\n * @param {Element} node - start Node\n * @param {Boolean} atLast - find last text node\n * @return {*}\n */\n static getDeepestTextNode(node, atLast = false) {\n\n if (node.childNodes.length === 0) {\n\n /**\n * We need to return 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)) {\n\n /** and it is not native input */\n if (!this.isNativeInput(node)) {\n\n\n let emptyTextNode = this.text('\\u200B');\n\n node.appendChild(emptyTextNode);\n\n }\n\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.getDeepestTextNode(node.childNodes[last], atLast);\n\n } else {\n\n return this.getDeepestTextNode(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|*} 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.indexOf(target.tagName) !== -1 : false;\n\n }\n\n /**\n * Checks node if it is empty\n * It must be node without childNodes\n * @param {Node} node\n *\n * @return {Boolean} true if it is empty\n */\n static checkNodeEmpty(node) {\n\n let nodeText;\n\n if ( this.isElement(node) && this.isNativeInput(node) ) {\n\n nodeText = node.value;\n\n if ( nodeText.trim() ) {\n\n return false;\n\n }\n\n\n } else {\n\n nodeText = node.textContent.replace('\\u200B', '');\n\n if ( nodeText.trim() ) {\n\n return false;\n\n }\n\n }\n\n return true;\n\n }\n\n /**\n * checks node if it is doesn't have child node\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\n *\n * Pushes to stack all DOM leafs and checks for emptiness\n * @param {Node} node\n * @return {boolean}\n */\n static isEmpty(node) {\n\n let treeWalker = [],\n stack = [];\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 stack.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 stack.every( node => this.checkNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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 /** contentNode click handler */\n block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false);\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 * Highlight clicked block\n * @param {MouseEvent} event\n */\n wrapperClicked(event) {\n\n this.setCurrentBlockByChildNode(event.target);\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.blockRightOrDownArrowPressed();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.blockLeftOrUpArrowPressed();\n break;\n\n }\n\n }\n\n /**\n * @todo Refactor method when code above will be moved to the keydown module\n */\n blockRightOrDownArrowPressed() {\n\n let currentBlock = this.currentBlock,\n lastTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === textNodeLength) {\n\n let nextBlock = this.getNextBlock();\n\n if (!nextBlock) return;\n\n this.Editor.Caret.setToBlock( nextBlock );\n\n }\n\n }\n\n /**\n * @todo Refactor method when code above will be moved to the keydown module\n */\n blockLeftOrUpArrowPressed() {\n\n let currentBlock = this.currentBlock,\n firstTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 0) {\n\n let previousBlock = this.getPreviousBlock();\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 *\n * @return {*}\n */\n getLastBlock() {\n\n return this._blocks[this._blocks.length - 1];\n\n }\n\n /**\n *\n * @param index\n * @return {*}\n */\n getBlockByIndex(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Returns next Block instance\n * @return {*}\n */\n getNextBlock() {\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 */\n getPreviousBlock() {\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 Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching. Use closest function\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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 * @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 = $.getDeepestTextNode(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 _.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.getSelection();\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 *\n * If last block is not empty, append another empty block\n */\n setToTheLastBlock() {\n\n let lastBlock = this.Editor.BlockManager.getLastBlock();\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.getLastBlock(),\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0","/**\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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 619141f39fabf548070b","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","webpack:///./src/components/Selection.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","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","blockLeftOrUpArrowPressed","lastTextNode","currentBlock","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","NextBlock","Caret","setToBlock","firstTextNode","previousBlock","PreviousBlock","composeBlock","insert","index","isLastBlock","isFirstBlock","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","array","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","instance","isNaN","Number","offset","atEnd","focus","nodeToSet","delay","range","createRange","selection","getSelection","setStart","setEnd","removeAllRanges","addRange","lastBlock","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","clickedOnRedactorZone","setCurrentBlockByChildNode","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","Selection","anchorNode","anchorOffset"],"mappings":"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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAvOqBgS,K;;;;;;;;;;;;;;;;;;;;;;;ACvBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmDqBc,O;;;AAEjB;;;AAGA,yBAAsB;AAAA,QAAT7S,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAKoM,KAAL,GAAa;AACT/E,eAAU,IADD;AAET7C,eAAU,IAFD;AAGTsO,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;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AAIsD,YAAY,KAAK/P,MAAL,CAAYqK,YAAZ,CAAyB2F,SAAzB,EAAhB;AAAA,UACI1I,iBAAiByI,UAAUzI,cAD/B;;AAGA;;;AAGA,UAAI,CAACJ,EAAE6B,OAAF,CAAUzB,cAAV,CAAL,EAAgC;;AAE5B,aAAKtH,MAAL,CAAYqK,YAAZ,CAAyBwD,MAAzB,CAAgC,KAAKjO,MAAL,CAAY4K,YAA5C,EAA0D,EAA1D;AAEH,OAJD,MAIO;;AAEH,aAAKxK,MAAL,CAAYuN,KAAZ,CAAkBpB,GAAlB,CAAsB7E,cAAtB;AAEH;AAEJ;;;wBAvQS;;AAEN,aAAO;AACH8O,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2B1W,M;;AA2UhC;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;;;;kBAhiBqByK,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;;;;;;;;;;;;;;;;;;AC3EA;;;IAGqB8M,S;;AAEjB;;;AAGA,yBAAc;AAAA;;AAEV,aAAKnI,QAAL,GAAgB,IAAhB;AACA,aAAKU,SAAL,GAAiB,IAAjB;AAEH;;;;uCAEqB;;AAElB,mBAAOpP,OAAOqP,YAAP,EAAP;AAEH;;;iDAE+B;;AAE5B,gBAAID,YAAYpP,OAAOqP,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU0H,UAAjB;AAEH;AAEJ;;;mDAEiC;;AAE9B,gBAAI1H,YAAYpP,OAAOqP,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU2H,YAAjB;AAEH;AAEJ;;;;;;;kBAxCgBF,S","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 619141f39fabf548070b","/**\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\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( node => this.isNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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.blockRightOrDownArrowPressed();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.blockLeftOrUpArrowPressed();\n break;\n\n }\n\n }\n\n /**\n * @todo Refactor method when code above will be moved to the keydown module\n */\n blockRightOrDownArrowPressed() {\n\n let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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 * @todo Refactor method when code above will be moved to the keydown module\n */\n blockLeftOrUpArrowPressed() {\n\n let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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 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 * Returns next Block instance\n * @return {Block|null}\n */\n 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 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 Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching. Use closest function\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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 * @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 _.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.getSelection();\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 *\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.LastBlock(),\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0","/**\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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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"],"sourceRoot":""} \ No newline at end of file diff --git a/src/components/dom.js b/src/components/dom.js index 2ef5f949..0e8a22e4 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -36,8 +36,7 @@ export default class Dom { } /** - * Creates text Node with content - * + * Creates Text Node with the passed content * @param {String} content - text content * @return {Text} */ @@ -99,32 +98,28 @@ export default class Dom { } /** - * Search for deepest node + * Search for deepest node which is Leaf. + * Leaf is the vertex that doesn't have any child nodes * - * @param {Element} node - start Node + * @description Method recursively goes throw the all Node until it finds the Leaf + * + * @param {Element} node - root Node. From this vertex we start Deep-first search {@link https://en.wikipedia.org/wiki/Depth-first_search} * @param {Boolean} atLast - find last text node - * @return {*} + * @return {Node} - it can be text Node or Element Node, so that caret will able to work with it */ - static getDeepestTextNode(node, atLast = false) { + static getDeepestNode(node, atLast = false) { if (node.childNodes.length === 0) { /** - * We need to return empty text node + * We need to return an empty text node * But caret will not be placed in empty textNode, so we need textNode with zero-width char */ - if (this.isElement(node)) { + if (this.isElement(node) && !this.isNativeInput(node)) { - /** and it is not native input */ - if (!this.isNativeInput(node)) { - - - let emptyTextNode = this.text('\u200B'); - - node.appendChild(emptyTextNode); - - } + let emptyTextNode = this.text('\u200B'); + node.appendChild(emptyTextNode); } @@ -137,11 +132,11 @@ export default class Dom { if (atLast) { - return this.getDeepestTextNode(node.childNodes[last], atLast); + return this.getDeepestNode(node.childNodes[last], atLast); } else { - return this.getDeepestTextNode(node.childNodes[0], false); + return this.getDeepestNode(node.childNodes[0], false); } @@ -161,8 +156,8 @@ export default class Dom { /** * Checks target if it is native input - * @param {Element|*} target - HTML element or string - * @return {boolean} + * @param {Element|String} target - HTML element or string + * @return {Boolean} */ static isNativeInput(target) { @@ -171,18 +166,20 @@ export default class Dom { 'TEXTAREA' ]; - return target ? nativeInputs.indexOf(target.tagName) !== -1 : false; + return target ? nativeInputs.includes(target.tagName) : false; } /** * Checks node if it is empty - * It must be node without childNodes - * @param {Node} node * + * @description Method checks simple Node without any childs for emptiness + * If you have Node with 2 or more children id depth, you better use {@link Dom#isEmpty} method + * + * @param {Node} node * @return {Boolean} true if it is empty */ - static checkNodeEmpty(node) { + static isNodeEmpty(node) { let nodeText; @@ -190,33 +187,20 @@ export default class Dom { nodeText = node.value; - if ( nodeText.trim() ) { - - return false; - - } - - } else { nodeText = node.textContent.replace('\u200B', ''); - if ( nodeText.trim() ) { - - return false; - - } - } - return true; + return nodeText.trim().length === 0; } /** - * checks node if it is doesn't have child node + * checks node if it is doesn't have any child nodes * @param {Node} node - * @return {*|boolean} + * @return {boolean} */ static isLeaf(node) { @@ -232,15 +216,17 @@ export default class Dom { /** * breadth-first search + * {@link https://en.wikipedia.org/wiki/Breadth-first_search} + * + * @description Pushes to stack all DOM leafs and checks for emptiness * - * Pushes to stack all DOM leafs and checks for emptiness * @param {Node} node * @return {boolean} */ static isEmpty(node) { let treeWalker = [], - stack = []; + leafs = []; if (!node) { @@ -254,7 +240,7 @@ export default class Dom { if ( this.isLeaf(node) ) { - stack.push(node); + leafs.push(node); } @@ -277,7 +263,7 @@ export default class Dom { } - return stack.every( node => this.checkNodeEmpty(node)); + return leafs.every( node => this.isNodeEmpty(node)); } diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index 4a2f8c59..0b402ad2 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -110,9 +110,6 @@ export default class BlockManager extends Module { */ bindEvents(block) { - /** contentNode click handler */ - block.wrapper.addEventListener('click', (event) => this.wrapperClicked(event), false); - /** * keydown on block * @todo move to the keydown module @@ -121,16 +118,6 @@ export default class BlockManager extends Module { } - /** - * Highlight clicked block - * @param {MouseEvent} event - */ - wrapperClicked(event) { - - this.setCurrentBlockByChildNode(event.target); - - } - /** * @todo move to the keydown module * @param {MouseEvent} event @@ -160,8 +147,7 @@ export default class BlockManager extends Module { */ blockRightOrDownArrowPressed() { - let currentBlock = this.currentBlock, - lastTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, true), + let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true), textNodeLength = lastTextNode.length; if (Selection.getSelectionAnchorNode() !== lastTextNode) { @@ -172,7 +158,7 @@ export default class BlockManager extends Module { if (Selection.getSelectionAnchorOffset() === textNodeLength) { - let nextBlock = this.getNextBlock(); + let nextBlock = this.NextBlock(); if (!nextBlock) return; @@ -187,8 +173,7 @@ export default class BlockManager extends Module { */ blockLeftOrUpArrowPressed() { - let currentBlock = this.currentBlock, - firstTextNode = $.getDeepestTextNode(currentBlock.pluginsContent, false), + let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false), textNodeLength = firstTextNode.length; if (Selection.getSelectionAnchorNode() !== firstTextNode) { @@ -199,7 +184,7 @@ export default class BlockManager extends Module { if (Selection.getSelectionAnchorOffset() === 0) { - let previousBlock = this.getPreviousBlock(); + let previousBlock = this.PreviousBlock(); if (!previousBlock) return; @@ -240,19 +225,19 @@ export default class BlockManager extends Module { } /** - * - * @return {*} + * returns last Block + * @return {Block} */ - getLastBlock() { + LastBlock() { return this._blocks[this._blocks.length - 1]; } /** - * - * @param index - * @return {*} + * Returns Block by passed index + * @param {Number} index + * @return {Block} */ getBlockByIndex(index) { @@ -262,9 +247,9 @@ export default class BlockManager extends Module { /** * Returns next Block instance - * @return {*} + * @return {Block|null} */ - getNextBlock() { + NextBlock() { let isLastBlock = this.currentBlockIndex === (this._blocks.length - 1); @@ -280,8 +265,9 @@ export default class BlockManager extends Module { /** * Returns previous Block instance + * @return {Block|null} */ - getPreviousBlock() { + PreviousBlock() { let isFirstBlock = this.currentBlockIndex === 0; diff --git a/src/components/modules/caret.js b/src/components/modules/caret.js index 9c6410d9..b8d8c1ba 100644 --- a/src/components/modules/caret.js +++ b/src/components/modules/caret.js @@ -47,7 +47,7 @@ export default class Caret extends Module { } - let nodeToSet = $.getDeepestTextNode(element, atEnd); + let nodeToSet = $.getDeepestNode(element, atEnd); if (atEnd || offset > nodeToSet.length) { @@ -94,7 +94,7 @@ export default class Caret extends Module { */ setToTheLastBlock() { - let lastBlock = this.Editor.BlockManager.getLastBlock(); + let lastBlock = this.Editor.BlockManager.LastBlock(); if (!lastBlock) return; diff --git a/src/components/modules/ui.js b/src/components/modules/ui.js index 3d91b64c..ba8a5e26 100644 --- a/src/components/modules/ui.js +++ b/src/components/modules/ui.js @@ -362,7 +362,7 @@ export default class UI extends Module { clickedOnRedactorZone(event) { - let lastBlock = this.Editor.BlockManager.getLastBlock(), + let lastBlock = this.Editor.BlockManager.LastBlock(), pluginsContent = lastBlock.pluginsContent; /** diff --git a/src/components/utils.js b/src/components/utils.js index 5b742890..3f22348d 100644 --- a/src/components/utils.js +++ b/src/components/utils.js @@ -65,21 +65,6 @@ export default class Util { } - /** - * Returns basic nodetypes as contants - * @return {{TAG: number, TEXT: number, COMMENT: number, DOCUMENT_FRAGMENT: number}} - */ - static get nodeTypes() { - - return { - TAG : 1, - TEXT : 3, - COMMENT : 8, - DOCUMENT_FRAGMENT: 11 - }; - - } - /** * @typedef {Object} ChainData * @property {Object} data - data that will be passed to the success or fallback From 8adc54cc460292e5d22de6771ab3830bd3f4bceb Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Fri, 29 Dec 2017 09:44:08 +0300 Subject: [PATCH 07/14] implement getters instead of functions in block cursors --- build/codex-editor.js | 98 +++++++++++++------------- build/codex-editor.js.map | 2 +- src/components/modules/blockManager.js | 78 ++++++++++---------- src/components/modules/caret.js | 2 +- src/components/modules/ui.js | 2 +- 5 files changed, 91 insertions(+), 91 deletions(-) diff --git a/build/codex-editor.js b/build/codex-editor.js index cd6f1fb2..247e032a 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -1695,7 +1695,7 @@ var BlockManager = function (_Module) { if (_Selection2.default.getSelectionAnchorOffset() === textNodeLength) { - var nextBlock = this.NextBlock(); + var nextBlock = this.nextBlock; if (!nextBlock) return; @@ -1721,7 +1721,7 @@ var BlockManager = function (_Module) { if (_Selection2.default.getSelectionAnchorOffset() === 0) { - var previousBlock = this.PreviousBlock(); + var previousBlock = this.previousBlock; if (!previousBlock) return; @@ -1772,63 +1772,19 @@ var BlockManager = function (_Module) { */ }, { - key: 'LastBlock', - value: function LastBlock() { + key: 'getBlockByIndex', - return this._blocks[this._blocks.length - 1]; - } /** * Returns Block by passed index * @param {Number} index * @return {Block} */ - - }, { - key: 'getBlockByIndex', value: function getBlockByIndex(index) { return this._blocks[index]; } - /** - * Returns next Block instance - * @return {Block|null} - */ - - }, { - key: 'NextBlock', - value: function NextBlock() { - - var isLastBlock = this.currentBlockIndex === this._blocks.length - 1; - - if (isLastBlock) { - - return null; - } - - return this._blocks[this.currentBlockIndex + 1]; - } - - /** - * Returns previous Block instance - * @return {Block|null} - */ - - }, { - key: 'PreviousBlock', - value: function PreviousBlock() { - - var isFirstBlock = this.currentBlockIndex === 0; - - if (isFirstBlock) { - - return null; - } - - return this._blocks[this.currentBlockIndex - 1]; - } - /** * Get Block instance by html element * @@ -1888,6 +1844,12 @@ var BlockManager = function (_Module) { throw new Error('Can not find a Block from this child Node'); } } + }, { + key: 'lastBlock', + get: function get() { + + return this._blocks[this._blocks.length - 1]; + } }, { key: 'currentBlock', get: function get() { @@ -1895,6 +1857,44 @@ var BlockManager = function (_Module) { return this._blocks[this.currentBlockIndex]; } + /** + * Returns next Block instance + * @return {Block|null} + */ + + }, { + key: 'nextBlock', + get: function get() { + + var isLastBlock = this.currentBlockIndex === this._blocks.length - 1; + + if (isLastBlock) { + + return null; + } + + return this._blocks[this.currentBlockIndex + 1]; + } + + /** + * Returns previous Block instance + * @return {Block|null} + */ + + }, { + key: 'previousBlock', + get: function get() { + + var isFirstBlock = this.currentBlockIndex === 0; + + if (isFirstBlock) { + + return null; + } + + return this._blocks[this.currentBlockIndex - 1]; + } + /** * Get working html element * @@ -2328,7 +2328,7 @@ var Caret = function (_Module) { */ value: function setToTheLastBlock() { - var lastBlock = this.Editor.BlockManager.LastBlock(); + var lastBlock = this.Editor.BlockManager.lastBlock; if (!lastBlock) return; @@ -4543,7 +4543,7 @@ var UI = function (_Module) { key: 'clickedOnRedactorZone', value: function clickedOnRedactorZone(event) { - var lastBlock = this.Editor.BlockManager.LastBlock(), + var lastBlock = this.Editor.BlockManager.lastBlock, pluginsContent = lastBlock.pluginsContent; /** diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 166f7de1..03b4a3a2 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 619141f39fabf548070b","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","webpack:///./src/components/Selection.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","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","blockLeftOrUpArrowPressed","lastTextNode","currentBlock","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","NextBlock","Caret","setToBlock","firstTextNode","previousBlock","PreviousBlock","composeBlock","insert","index","isLastBlock","isFirstBlock","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","array","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","instance","isNaN","Number","offset","atEnd","focus","nodeToSet","delay","range","createRange","selection","getSelection","setStart","setEnd","removeAllRanges","addRange","lastBlock","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","clickedOnRedactorZone","setCurrentBlockByChildNode","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","Selection","anchorNode","anchorOffset"],"mappings":"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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAvOqBgS,K;;;;;;;;;;;;;;;;;;;;;;;ACvBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmDqBc,O;;;AAEjB;;;AAGA,yBAAsB;AAAA,QAAT7S,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAKoM,KAAL,GAAa;AACT/E,eAAU,IADD;AAET7C,eAAU,IAFD;AAGTsO,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;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AAIsD,YAAY,KAAK/P,MAAL,CAAYqK,YAAZ,CAAyB2F,SAAzB,EAAhB;AAAA,UACI1I,iBAAiByI,UAAUzI,cAD/B;;AAGA;;;AAGA,UAAI,CAACJ,EAAE6B,OAAF,CAAUzB,cAAV,CAAL,EAAgC;;AAE5B,aAAKtH,MAAL,CAAYqK,YAAZ,CAAyBwD,MAAzB,CAAgC,KAAKjO,MAAL,CAAY4K,YAA5C,EAA0D,EAA1D;AAEH,OAJD,MAIO;;AAEH,aAAKxK,MAAL,CAAYuN,KAAZ,CAAkBpB,GAAlB,CAAsB7E,cAAtB;AAEH;AAEJ;;;wBAvQS;;AAEN,aAAO;AACH8O,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2B1W,M;;AA2UhC;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;;;;kBAhiBqByK,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;;;;;;;;;;;;;;;;;;AC3EA;;;IAGqB8M,S;;AAEjB;;;AAGA,yBAAc;AAAA;;AAEV,aAAKnI,QAAL,GAAgB,IAAhB;AACA,aAAKU,SAAL,GAAiB,IAAjB;AAEH;;;;uCAEqB;;AAElB,mBAAOpP,OAAOqP,YAAP,EAAP;AAEH;;;iDAE+B;;AAE5B,gBAAID,YAAYpP,OAAOqP,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU0H,UAAjB;AAEH;AAEJ;;;mDAEiC;;AAE9B,gBAAI1H,YAAYpP,OAAOqP,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU2H,YAAjB;AAEH;AAEJ;;;;;;;kBAxCgBF,S","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 619141f39fabf548070b","/**\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\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( node => this.isNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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.blockRightOrDownArrowPressed();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.blockLeftOrUpArrowPressed();\n break;\n\n }\n\n }\n\n /**\n * @todo Refactor method when code above will be moved to the keydown module\n */\n blockRightOrDownArrowPressed() {\n\n let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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 * @todo Refactor method when code above will be moved to the keydown module\n */\n blockLeftOrUpArrowPressed() {\n\n let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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 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 * Returns next Block instance\n * @return {Block|null}\n */\n 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 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 Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * 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 *\n * @todo get first level block before searching. Use closest function\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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 * @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 _.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.getSelection();\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 *\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.LastBlock(),\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0","/**\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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 69fe2a721aa567ff4fb3","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","webpack:///./src/components/Selection.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","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","blockLeftOrUpArrowPressed","lastTextNode","currentBlock","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","array","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","instance","isNaN","Number","offset","atEnd","focus","nodeToSet","delay","range","createRange","selection","getSelection","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","clickedOnRedactorZone","setCurrentBlockByChildNode","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","Selection","anchorNode","anchorOffset"],"mappings":"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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAvOqB6R,K;;;;;;;;;;;;;;;;;;;;;;;ACvBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmDqBc,O;;;AAEjB;;;AAGA,yBAAsB;AAAA,QAAT1S,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAKoM,KAAL,GAAa;AACT/E,eAAU,IADD;AAET7C,eAAU,IAFD;AAGTmO,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;;;;;;;;;;;A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KAAK7P,MAAL,CAAYqK,YAAZ,CAAyBwF,SAAzC;AAAA,UACIvI,iBAAiBuI,UAAUvI,cAD/B;;AAGA;;;AAGA,UAAI,CAACJ,EAAE6B,OAAF,CAAUzB,cAAV,CAAL,EAAgC;;AAE5B,aAAKtH,MAAL,CAAYqK,YAAZ,CAAyBsD,MAAzB,CAAgC,KAAK/N,MAAL,CAAY4K,YAA5C,EAA0D,EAA1D;AAEH,OAJD,MAIO;;AAEH,aAAKxK,MAAL,CAAYsN,KAAZ,CAAkBnB,GAAlB,CAAsB7E,cAAtB;AAEH;AAEJ;;;wBAvQS;;AAEN,aAAO;AACH2O,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2BvW,M;;AA2UhC;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;;;;kBAhiBqByK,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;;;;;;;;;;;;;;;;;;AC3EA;;;IAGqB2M,S;;AAEjB;;;AAGA,yBAAc;AAAA;;AAEV,aAAKlI,QAAL,GAAgB,IAAhB;AACA,aAAKU,SAAL,GAAiB,IAAjB;AAEH;;;;uCAEqB;;AAElB,mBAAOlP,OAAOmP,YAAP,EAAP;AAEH;;;iDAE+B;;AAE5B,gBAAID,YAAYlP,OAAOmP,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAUyH,UAAjB;AAEH;AAEJ;;;mDAEiC;;AAE9B,gBAAIzH,YAAYlP,OAAOmP,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU0H,YAAjB;AAEH;AAEJ;;;;;;;kBAxCgBF,S","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 69fe2a721aa567ff4fb3","/**\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\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( node => this.isNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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.blockRightOrDownArrowPressed();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.blockLeftOrUpArrowPressed();\n break;\n\n }\n\n }\n\n /**\n * @todo Refactor method when code above will be moved to the keydown module\n */\n blockRightOrDownArrowPressed() {\n\n let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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 * @todo Refactor method when code above will be moved to the keydown module\n */\n blockLeftOrUpArrowPressed() {\n\n let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 *\n * @todo get first level block before searching. Use closest function\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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 * @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 _.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.getSelection();\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 *\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.lastBlock,\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0","/**\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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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"],"sourceRoot":""} \ No newline at end of file diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index 0b402ad2..6b45512f 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -158,7 +158,7 @@ export default class BlockManager extends Module { if (Selection.getSelectionAnchorOffset() === textNodeLength) { - let nextBlock = this.NextBlock(); + let nextBlock = this.nextBlock; if (!nextBlock) return; @@ -184,7 +184,7 @@ export default class BlockManager extends Module { if (Selection.getSelectionAnchorOffset() === 0) { - let previousBlock = this.PreviousBlock(); + let previousBlock = this.previousBlock; if (!previousBlock) return; @@ -228,7 +228,7 @@ export default class BlockManager extends Module { * returns last Block * @return {Block} */ - LastBlock() { + get lastBlock() { return this._blocks[this._blocks.length - 1]; @@ -245,42 +245,6 @@ export default class BlockManager extends Module { } - /** - * Returns next Block instance - * @return {Block|null} - */ - NextBlock() { - - let isLastBlock = this.currentBlockIndex === (this._blocks.length - 1); - - if (isLastBlock) { - - return null; - - } - - return this._blocks[this.currentBlockIndex + 1]; - - } - - /** - * Returns previous Block instance - * @return {Block|null} - */ - PreviousBlock() { - - let isFirstBlock = this.currentBlockIndex === 0; - - if (isFirstBlock) { - - return null; - - } - - return this._blocks[this.currentBlockIndex - 1]; - - } - /** * Get Block instance by html element * @@ -313,6 +277,42 @@ export default class BlockManager extends Module { } + /** + * Returns next Block instance + * @return {Block|null} + */ + get nextBlock() { + + let isLastBlock = this.currentBlockIndex === (this._blocks.length - 1); + + if (isLastBlock) { + + return null; + + } + + return this._blocks[this.currentBlockIndex + 1]; + + } + + /** + * Returns previous Block instance + * @return {Block|null} + */ + get previousBlock() { + + let isFirstBlock = this.currentBlockIndex === 0; + + if (isFirstBlock) { + + return null; + + } + + return this._blocks[this.currentBlockIndex - 1]; + + } + /** * Get working html element * diff --git a/src/components/modules/caret.js b/src/components/modules/caret.js index b8d8c1ba..100f5632 100644 --- a/src/components/modules/caret.js +++ b/src/components/modules/caret.js @@ -94,7 +94,7 @@ export default class Caret extends Module { */ setToTheLastBlock() { - let lastBlock = this.Editor.BlockManager.LastBlock(); + let lastBlock = this.Editor.BlockManager.lastBlock; if (!lastBlock) return; diff --git a/src/components/modules/ui.js b/src/components/modules/ui.js index ba8a5e26..5bd22d63 100644 --- a/src/components/modules/ui.js +++ b/src/components/modules/ui.js @@ -362,7 +362,7 @@ export default class UI extends Module { clickedOnRedactorZone(event) { - let lastBlock = this.Editor.BlockManager.LastBlock(), + let lastBlock = this.Editor.BlockManager.lastBlock, pluginsContent = lastBlock.pluginsContent; /** From 4575a24fe23e63881a2adadf024eed7b87c9a4cb Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Fri, 29 Dec 2017 20:06:27 +0300 Subject: [PATCH 08/14] last requested changes --- src/components/dom.js | 2 +- src/components/modules/blockManager.js | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/dom.js b/src/components/dom.js index 0e8a22e4..652bedcc 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -215,7 +215,7 @@ export default class Dom { } /** - * breadth-first search + * breadth-first search (BFS) * {@link https://en.wikipedia.org/wiki/Breadth-first_search} * * @description Pushes to stack all DOM leafs and checks for emptiness diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index 6b45512f..3baf4d9e 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -131,11 +131,11 @@ export default class BlockManager extends Module { break; case _.keyCodes.DOWN: case _.keyCodes.RIGHT: - this.blockRightOrDownArrowPressed(); + this.navigateNext(); break; case _.keyCodes.UP: case _.keyCodes.LEFT: - this.blockLeftOrUpArrowPressed(); + this.navigatePrevious(); break; } @@ -145,7 +145,7 @@ export default class BlockManager extends Module { /** * @todo Refactor method when code above will be moved to the keydown module */ - blockRightOrDownArrowPressed() { + navigateNext() { let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true), textNodeLength = lastTextNode.length; @@ -171,7 +171,7 @@ export default class BlockManager extends Module { /** * @todo Refactor method when code above will be moved to the keydown module */ - blockLeftOrUpArrowPressed() { + navigatePrevious() { let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false), textNodeLength = firstTextNode.length; From cf4a1266eea863e76685351ded6fe02124f73ca7 Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Sat, 30 Dec 2017 18:15:41 +0300 Subject: [PATCH 09/14] caret module docs and last improvements --- build/codex-editor.js | 255 ++++++++++++------------- build/codex-editor.js.map | 2 +- docs/caret.md | 38 +++- src/components/modules/blockManager.js | 8 +- src/components/modules/caret.js | 6 +- src/components/modules/ui.js | 28 --- 6 files changed, 164 insertions(+), 173 deletions(-) diff --git a/build/codex-editor.js b/build/codex-editor.js index 247e032a..90cfc917 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -61,7 +61,7 @@ var CodexEditor = /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 4); +/******/ return __webpack_require__(__webpack_require__.s = 5); /******/ }) /************************************************************************/ /******/ ([ @@ -646,7 +646,7 @@ var Dom = function () { } /** - * breadth-first search + * breadth-first search (BFS) * {@link https://en.wikipedia.org/wiki/Breadth-first_search} * * @description Pushes to stack all DOM leafs and checks for emptiness @@ -977,6 +977,73 @@ module.exports = exports['default']; /* 4 */ /***/ (function(module, exports, __webpack_require__) { +"use strict"; + + +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"); } } + +/** + * Working with selection + */ +var Selection = function () { + + /** + * @constructor + */ + function Selection() { + _classCallCheck(this, Selection); + + this.instance = null; + this.selection = null; + } + + _createClass(Selection, null, [{ + key: "getSelection", + value: function getSelection() { + + return window.getSelection(); + } + }, { + key: "getSelectionAnchorNode", + value: function getSelectionAnchorNode() { + + var selection = window.getSelection(); + + if (selection) { + + return selection.anchorNode; + } + } + }, { + key: "getSelectionAnchorOffset", + value: function getSelectionAnchorOffset() { + + var selection = window.getSelection(); + + if (selection) { + + return selection.anchorOffset; + } + } + }]); + + return Selection; +}(); + +Selection.displayName = "Selection"; +exports.default = Selection; +module.exports = exports["default"]; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + "use strict"; /* WEBPACK VAR INJECTION */(function(_) {/** * Codex Editor @@ -1050,7 +1117,7 @@ module.exports = exports['default']; 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; }; }(); -__webpack_require__(5); +__webpack_require__(6); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -1059,7 +1126,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons */ // 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) { - return __webpack_require__(6)("./" + module); + return __webpack_require__(7)("./" + module); }); /** @@ -1434,7 +1501,7 @@ module.exports = function () { /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1))) /***/ }), -/* 5 */ +/* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1461,20 +1528,20 @@ if (!Element.prototype.closest) Element.prototype.closest = function (s) { }; /***/ }), -/* 6 */ +/* 7 */ /***/ (function(module, exports, __webpack_require__) { var map = { - "./blockManager.js": 7, - "./caret.js": 8, - "./events.js": 9, - "./renderer.js": 10, - "./sanitizer.js": 11, - "./saver.js": 13, - "./toolbar.js": 14, - "./toolbox.js": 15, - "./tools.js": 16, - "./ui.js": 17 + "./blockManager.js": 8, + "./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 }; function webpackContext(req) { return __webpack_require__(webpackContextResolve(req)); @@ -1490,10 +1557,10 @@ webpackContext.keys = function webpackContextKeys() { }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; -webpackContext.id = 6; +webpackContext.id = 7; /***/ }), -/* 7 */ +/* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1509,7 +1576,7 @@ var _block = __webpack_require__(3); var _block2 = _interopRequireDefault(_block); -var _Selection = __webpack_require__(20); +var _Selection = __webpack_require__(4); var _Selection2 = _interopRequireDefault(_Selection); @@ -1667,23 +1734,25 @@ var BlockManager = function (_Module) { break; case _.keyCodes.DOWN: case _.keyCodes.RIGHT: - this.blockRightOrDownArrowPressed(); + this.navigateNext(); break; case _.keyCodes.UP: case _.keyCodes.LEFT: - this.blockLeftOrUpArrowPressed(); + this.navigatePrevious(); break; } } /** - * @todo Refactor method when code above will be moved to the keydown module + * Set's caret to the next Block + * Before moving caret, we should check if caret position is at the end of Plugins node + * Using {@link Dom#getDeepestNode} to get a last node and match with current selection */ }, { - key: 'blockRightOrDownArrowPressed', - value: function blockRightOrDownArrowPressed() { + key: 'navigateNext', + value: function navigateNext() { var lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true), textNodeLength = lastTextNode.length; @@ -1704,12 +1773,14 @@ var BlockManager = function (_Module) { } /** - * @todo Refactor method when code above will be moved to the keydown module + * Set's caret to the previous Block + * Before moving caret, we should check if caret position is at the end of Plugins node + * Using {@link Dom#getDeepestNode} to get a last node and match with current selection */ }, { - key: 'blockLeftOrUpArrowPressed', - value: function blockLeftOrUpArrowPressed() { + key: 'navigatePrevious', + value: function navigatePrevious() { var firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false), textNodeLength = firstTextNode.length; @@ -2193,7 +2264,7 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(1), __webpack_require__(2))) /***/ }), -/* 8 */ +/* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2205,7 +2276,7 @@ Object.defineProperty(exports, "__esModule", { 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; }; }(); -var _Selection = __webpack_require__(20); +var _Selection = __webpack_require__(4); var _Selection2 = _interopRequireDefault(_Selection); @@ -2323,12 +2394,12 @@ var Caret = function (_Module) { /** * Set Caret to the last Block - * * If last block is not empty, append another empty block */ value: function setToTheLastBlock() { - var lastBlock = this.Editor.BlockManager.lastBlock; + var lastBlock = this.Editor.BlockManager.lastBlock, + pluginsContent = lastBlock.pluginsContent; if (!lastBlock) return; @@ -2336,7 +2407,7 @@ var Caret = function (_Module) { * If last block is empty and it is an initialBlock, set to that. * Otherwise, append new empty block and set to that */ - if (lastBlock.isEmpty) { + if ($.isEmpty(pluginsContent)) { this.setToBlock(lastBlock); } else { @@ -2355,7 +2426,7 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(2), __webpack_require__(1))) /***/ }), -/* 9 */ +/* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2461,7 +2532,7 @@ module.exports = exports["default"]; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0))) /***/ }), -/* 10 */ +/* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2589,7 +2660,7 @@ module.exports = exports["default"]; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(1))) /***/ }), -/* 11 */ +/* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -2667,7 +2738,7 @@ var Sanitizer = function (_Module) { _this.sanitizerConfig = config.settings ? config.settings.sanitizer : {}; /** HTML Janitor library */ - _this.sanitizerInstance = __webpack_require__(12); + _this.sanitizerInstance = __webpack_require__(13); return _this; } @@ -2770,7 +2841,7 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(1))) /***/ }), -/* 12 */ +/* 13 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) { @@ -2965,7 +3036,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (roo /***/ }), -/* 13 */ +/* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3256,7 +3327,7 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0))) /***/ }), -/* 14 */ +/* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3585,7 +3656,7 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(2))) /***/ }), -/* 15 */ +/* 16 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -3850,7 +3921,7 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(2), __webpack_require__(1))) /***/ }), -/* 16 */ +/* 17 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4149,7 +4220,7 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(1))) /***/ }), -/* 17 */ +/* 18 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -4350,7 +4421,7 @@ var UI = function (_Module) { /** * Load CSS */ - var styles = __webpack_require__(18); + var styles = __webpack_require__(19); /** * Make tag @@ -4413,13 +4484,6 @@ var UI = function (_Module) { var clickedNode = event.target; - console.log('click', clickedNode); - if (clickedNode.classList.contains(this.CSS.editorZone)) { - - this.clickedOnRedactorZone(event); - return; - } - /** * Select clicked Block as Current */ @@ -4539,24 +4603,6 @@ var UI = function (_Module) { this.Editor.Toolbar.plusButton.show(); } } - }, { - key: 'clickedOnRedactorZone', - value: function clickedOnRedactorZone(event) { - - var lastBlock = this.Editor.BlockManager.lastBlock, - pluginsContent = lastBlock.pluginsContent; - - /** - * If last block has text content, then insert new Block after - */ - if (!$.isEmpty(pluginsContent)) { - - this.Editor.BlockManager.insert(this.config.initialBlock, {}); - } else { - - this.Editor.Caret.set(pluginsContent); - } - } }, { key: 'CSS', get: function get() { @@ -4793,10 +4839,10 @@ module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(2))) /***/ }), -/* 18 */ +/* 19 */ /***/ (function(module, exports, __webpack_require__) { -exports = module.exports = __webpack_require__(19)(undefined); +exports = module.exports = __webpack_require__(20)(undefined); // imports @@ -4807,7 +4853,7 @@ exports.push([module.i, ":root {\n\n /**\n * Toolbar buttons\n */\n\n /***/ }), -/* 19 */ +/* 20 */ /***/ (function(module, exports) { /* @@ -4888,73 +4934,6 @@ function toComment(sourceMap) { } -/***/ }), -/* 20 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -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"); } } - -/** - * Working with selection - */ -var Selection = function () { - - /** - * @constructor - */ - function Selection() { - _classCallCheck(this, Selection); - - this.instance = null; - this.selection = null; - } - - _createClass(Selection, null, [{ - key: "getSelection", - value: function getSelection() { - - return window.getSelection(); - } - }, { - key: "getSelectionAnchorNode", - value: function getSelectionAnchorNode() { - - var selection = window.getSelection(); - - if (selection) { - - return selection.anchorNode; - } - } - }, { - key: "getSelectionAnchorOffset", - value: function getSelectionAnchorOffset() { - - var selection = window.getSelection(); - - if (selection) { - - return selection.anchorOffset; - } - } - }]); - - return Selection; -}(); - -Selection.displayName = "Selection"; -exports.default = Selection; -module.exports = exports["default"]; - /***/ }) /******/ ]); //# sourceMappingURL=codex-editor.js.map \ No newline at end of file diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 03b4a3a2..1213563a 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 69fe2a721aa567ff4fb3","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","webpack:///./src/components/Selection.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","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","blockRightOrDownArrowPressed","blockLeftOrUpArrowPressed","lastTextNode","currentBlock","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","array","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","instance","isNaN","Number","offset","atEnd","focus","nodeToSet","delay","range","createRange","selection","getSelection","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","clickedOnRedactorZone","setCurrentBlockByChildNode","setToTheLastBlock","isInitialBlock","isInitial","isEmptyBlock","Selection","anchorNode","anchorOffset"],"mappings":"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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;kBAvOqB6R,K;;;;;;;;;;;;;;;;;;;;;;;ACvBrB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmDqBc,O;;;AAEjB;;;AAGA,yBAAsB;AAAA,QAAT1S,MAAS,QAATA,MAAS;;AAAA;;AAAA,kHAEZ,EAACA,cAAD,EAFY;;AAIlB,UAAKoM,KAAL,GAAa;AACT/E,eAAU,IADD;AAET7C,eAAU,IAFD;AAGTmO,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;;;;;;;;;;;A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KAAK7P,MAAL,CAAYqK,YAAZ,CAAyBwF,SAAzC;AAAA,UACIvI,iBAAiBuI,UAAUvI,cAD/B;;AAGA;;;AAGA,UAAI,CAACJ,EAAE6B,OAAF,CAAUzB,cAAV,CAAL,EAAgC;;AAE5B,aAAKtH,MAAL,CAAYqK,YAAZ,CAAyBsD,MAAzB,CAAgC,KAAK/N,MAAL,CAAY4K,YAA5C,EAA0D,EAA1D;AAEH,OAJD,MAIO;;AAEH,aAAKxK,MAAL,CAAYsN,KAAZ,CAAkBnB,GAAlB,CAAsB7E,cAAtB;AAEH;AAEJ;;;wBAvQS;;AAEN,aAAO;AACH2O,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2BvW,M;;AA2UhC;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;;;;kBAhiBqByK,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;;;;;;;;;;;;;;;;;;AC3EA;;;IAGqB2M,S;;AAEjB;;;AAGA,yBAAc;AAAA;;AAEV,aAAKlI,QAAL,GAAgB,IAAhB;AACA,aAAKU,SAAL,GAAiB,IAAjB;AAEH;;;;uCAEqB;;AAElB,mBAAOlP,OAAOmP,YAAP,EAAP;AAEH;;;iDAE+B;;AAE5B,gBAAID,YAAYlP,OAAOmP,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAUyH,UAAjB;AAEH;AAEJ;;;mDAEiC;;AAE9B,gBAAIzH,YAAYlP,OAAOmP,YAAP,EAAhB;;AAEA,gBAAID,SAAJ,EAAe;;AAEX,uBAAOA,UAAU0H,YAAjB;AAEH;AAEJ;;;;;;;kBAxCgBF,S","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 69fe2a721aa567ff4fb3","/**\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\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( node => this.isNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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\": 8,\n\t\"./events.js\": 9,\n\t\"./renderer.js\": 10,\n\t\"./sanitizer.js\": 11,\n\t\"./saver.js\": 13,\n\t\"./toolbar.js\": 14,\n\t\"./toolbox.js\": 15,\n\t\"./tools.js\": 16,\n\t\"./ui.js\": 17\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.blockRightOrDownArrowPressed();\n break;\n case _.keyCodes.UP:\n case _.keyCodes.LEFT:\n this.blockLeftOrUpArrowPressed();\n break;\n\n }\n\n }\n\n /**\n * @todo Refactor method when code above will be moved to the keydown module\n */\n blockRightOrDownArrowPressed() {\n\n let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true),\n textNodeLength = lastTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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 * @todo Refactor method when code above will be moved to the keydown module\n */\n blockLeftOrUpArrowPressed() {\n\n let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false),\n textNodeLength = firstTextNode.length;\n\n if (Selection.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 *\n * @todo get first level block before searching. Use closest function\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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 * @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 _.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.getSelection();\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 *\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 = 12\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\nimport 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 console.log('click', clickedNode);\n if ( clickedNode.classList.contains(this.CSS.editorZone) ) {\n\n this.clickedOnRedactorZone(event);\n return;\n\n }\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 clickedOnRedactorZone(event) {\n\n let lastBlock = this.Editor.BlockManager.lastBlock,\n pluginsContent = lastBlock.pluginsContent;\n\n /**\n * If last block has text content, then insert new Block after\n */\n if (!$.isEmpty(pluginsContent)) {\n\n this.Editor.BlockManager.insert(this.config.initialBlock, {});\n\n } else {\n\n this.Editor.Caret.set(pluginsContent);\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 = 18\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 = 19\n// module chunks = 0","/**\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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 717f0da0df82bf29cc9e","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","Selection","instance","selection","getSelection","anchorNode","anchorOffset","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","navigateNext","navigatePrevious","lastTextNode","currentBlock","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","array","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","isNaN","Number","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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EAAZ;AAAA,gBACIqH,YAAY,CADhB;;AAGA5R,oBAAQ6R,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBvN,OAAjB,CAAyB,UAAC4N,UAAD,EAAalE,KAAb,EAAuB;;AAE5C;AACA5N,wBAAQ+H,GAAR,UAAgB+J,WAAWtL,IAA3B,uBAAgDsL,UAAhD;AACAF,6BAAaE,WAAWlK,IAAxB;AACA2C,sBAAM1E,IAAN,CAAWiM,WAAW5Q,IAAtB;AAEH,aAPD;;AASAlB,oBAAQ+H,GAAR,CAAY,OAAZ,EAAqB6J,SAArB;AACA5R,oBAAQ+R,QAAR;;AAEA,mBAAO;AACHnK,sBAAU,CAAC,IAAIoK,IAAJ,EADR;AAEHzH,uBAAUA,KAFP;AAGH0H,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8B7S,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;AAC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,KAAZ,CAAkBsM,SAAlB,CAA4B,KAAK/W,MAAL,CAAY2K,YAAZ,CAAyB4C,YAAzB,CAAsCzG,IAAlE,CAArB;AAAA,UACIkQ,eAAe,KAAKhX,MAAL,CAAY2K,YAAZ,CAAyB4C,YAAzB,CAAsCxE,OADzD;;AAGA,UAAI+N,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAKhX,MAAL,CAAYyS,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;AAEH;AAEJ;;;wBA3OS;;AAEN,aAAO;AACHiC,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2B1W,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;;;;kBApgBqB+K,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 = 5);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 717f0da0df82bf29cc9e","/**\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( node => this.isNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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\": 8,\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 = 7;\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 = 7\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.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 *\n * @todo get first level block before searching. Use closest function\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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 * @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 _.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.getSelection();\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 pluginsContent = lastBlock.pluginsContent;\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 ($.isEmpty(pluginsContent)) {\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\nimport 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 diff --git a/docs/caret.md b/docs/caret.md index fcfab92c..e13125db 100644 --- a/docs/caret.md +++ b/docs/caret.md @@ -1 +1,37 @@ -# CodeX Editor Caret Module \ No newline at end of file +# CodeX Editor Caret Module + +The `Caret` module contains methods working with caret. + +Uses[Range](https://developer.mozilla.org/en-US/docs/Web/API/Range) methods to navigate caret +between blocks. + +Caret class implements basic Module class that holds User configuration +and default CodeXEditor instances + +You can read more about Module class[here]() + +## Properties + +## Methods + +```javascript +Caret.setToBlock +``` + +Method gets Block instance and puts caret to the text node with offset + +### params + +| Param | Type | Description| +| -------------|------ |:-------------:| +| block | Object | Block instance that BlockManager created| +| offset | Number | caret offset regarding to the text node (Default: 0)| +| atEnd | Boolean | puts caret at the end of last text node| + + +```javascript +Caret.setToTheLastBlock +``` + +sets Caret at the end of last Block +If last block is not empty, inserts another empty Block which is passed as initial \ No newline at end of file diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index 3baf4d9e..f2872fca 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -143,7 +143,9 @@ export default class BlockManager extends Module { } /** - * @todo Refactor method when code above will be moved to the keydown module + * Set's caret to the next Block + * Before moving caret, we should check if caret position is at the end of Plugins node + * Using {@link Dom#getDeepestNode} to get a last node and match with current selection */ navigateNext() { @@ -169,7 +171,9 @@ export default class BlockManager extends Module { } /** - * @todo Refactor method when code above will be moved to the keydown module + * Set's caret to the previous Block + * Before moving caret, we should check if caret position is at the end of Plugins node + * Using {@link Dom#getDeepestNode} to get a last node and match with current selection */ navigatePrevious() { diff --git a/src/components/modules/caret.js b/src/components/modules/caret.js index 100f5632..7380097a 100644 --- a/src/components/modules/caret.js +++ b/src/components/modules/caret.js @@ -89,12 +89,12 @@ export default class Caret extends Module { /** * Set Caret to the last Block - * * If last block is not empty, append another empty block */ setToTheLastBlock() { - let lastBlock = this.Editor.BlockManager.lastBlock; + let lastBlock = this.Editor.BlockManager.lastBlock, + pluginsContent = lastBlock.pluginsContent; if (!lastBlock) return; @@ -102,7 +102,7 @@ export default class Caret extends Module { * If last block is empty and it is an initialBlock, set to that. * Otherwise, append new empty block and set to that */ - if (lastBlock.isEmpty) { + if ($.isEmpty(pluginsContent)) { this.setToBlock(lastBlock); diff --git a/src/components/modules/ui.js b/src/components/modules/ui.js index 5bd22d63..f76508de 100644 --- a/src/components/modules/ui.js +++ b/src/components/modules/ui.js @@ -224,14 +224,6 @@ export default class UI extends Module { let clickedNode = event.target; - console.log('click', clickedNode); - if ( clickedNode.classList.contains(this.CSS.editorZone) ) { - - this.clickedOnRedactorZone(event); - return; - - } - /** * Select clicked Block as Current */ @@ -360,26 +352,6 @@ export default class UI extends Module { } - clickedOnRedactorZone(event) { - - let lastBlock = this.Editor.BlockManager.lastBlock, - pluginsContent = lastBlock.pluginsContent; - - /** - * If last block has text content, then insert new Block after - */ - if (!$.isEmpty(pluginsContent)) { - - this.Editor.BlockManager.insert(this.config.initialBlock, {}); - - } else { - - this.Editor.Caret.set(pluginsContent); - - } - - } - } // /** From 8f4b7e5139a0c3e1f54ffe2a662943c07da55688 Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Sat, 30 Dec 2017 18:24:24 +0300 Subject: [PATCH 10/14] update docs --- build/codex-editor.js | 8 +++----- build/codex-editor.js.map | 2 +- docs/caret.md | 20 +++++++++++++------- src/components/modules/blockManager.js | 8 +++----- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/build/codex-editor.js b/build/codex-editor.js index 90cfc917..64477ea2 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -1981,21 +1981,19 @@ var BlockManager = function (_Module) { /** * Set currentBlockIndex to passed block - * - * @todo get first level block before searching. Use closest function - * * @param {HTMLElement} element */ , set: function set(element) { - var nodes = this._blocks.nodes; + var nodes = this._blocks.nodes, + firstLevelBlock = element.closest('.' + _block2.default.CSS.wrapper); /** * Update current Block's index * @type {number} */ - this.currentBlockIndex = nodes.indexOf(element); + this.currentBlockIndex = nodes.indexOf(firstLevelBlock); /** * Remove previous selected Block's state diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 1213563a..4fe5db24 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 717f0da0df82bf29cc9e","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","Selection","instance","selection","getSelection","anchorNode","anchorOffset","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","navigateNext","navigatePrevious","lastTextNode","currentBlock","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","array","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","isNaN","Number","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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EAAZ;AAAA,gBACIqH,YAAY,CADhB;;AAGA5R,oBAAQ6R,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBvN,OAAjB,CAAyB,UAAC4N,UAAD,EAAalE,KAAb,EAAuB;;AAE5C;AACA5N,wBAAQ+H,GAAR,UAAgB+J,WAAWtL,IAA3B,uBAAgDsL,UAAhD;AACAF,6BAAaE,WAAWlK,IAAxB;AACA2C,sBAAM1E,IAAN,CAAWiM,WAAW5Q,IAAtB;AAEH,aAPD;;AASAlB,oBAAQ+H,GAAR,CAAY,OAAZ,EAAqB6J,SAArB;AACA5R,oBAAQ+R,QAAR;;AAEA,mBAAO;AACHnK,sBAAU,CAAC,IAAIoK,IAAJ,EADR;AAEHzH,uBAAUA,KAFP;AAGH0H,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8B7S,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;AAC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,KAAZ,CAAkBsM,SAAlB,CAA4B,KAAK/W,MAAL,CAAY2K,YAAZ,CAAyB4C,YAAzB,CAAsCzG,IAAlE,CAArB;AAAA,UACIkQ,eAAe,KAAKhX,MAAL,CAAY2K,YAAZ,CAAyB4C,YAAzB,CAAsCxE,OADzD;;AAGA,UAAI+N,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAKhX,MAAL,CAAYyS,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;AAEH;AAEJ;;;wBA3OS;;AAEN,aAAO;AACHiC,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2B1W,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;;;;kBApgBqB+K,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 = 5);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 717f0da0df82bf29cc9e","/**\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( node => this.isNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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\": 8,\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 = 7;\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 = 7\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.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 *\n * @todo get first level block before searching. Use closest function\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n /**\n * Update current Block's index\n * @type {number}\n */\n this.currentBlockIndex = nodes.indexOf(element);\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 * @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 _.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.getSelection();\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 pluginsContent = lastBlock.pluginsContent;\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 ($.isEmpty(pluginsContent)) {\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\nimport 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 d68c3572cfdf468771ae","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","Selection","instance","selection","getSelection","anchorNode","anchorOffset","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","navigateNext","navigatePrevious","lastTextNode","currentBlock","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","firstLevelBlock","array","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","isNaN","Number","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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AP;AAEH,aANE,CAAP;AAQH;;AAED;;;;;;;;mCAKWF,gB,EAAkB;;AAEzB,gBAAInH,QAAQ,EAAZ;AAAA,gBACIsH,YAAY,CADhB;;AAGA7R,oBAAQ8R,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBxN,OAAjB,CAAyB,UAAC6N,UAAD,EAAanE,KAAb,EAAuB;;AAE5C;AACA5N,wBAAQ+H,GAAR,UAAgBgK,WAAWvL,IAA3B,uBAAgDuL,UAAhD;AACAF,6BAAaE,WAAWnK,IAAxB;AACA2C,sBAAM1E,IAAN,CAAWkM,WAAW7Q,IAAtB;AAEH,aAPD;;AASAlB,oBAAQ+H,GAAR,CAAY,OAAZ,EAAqB8J,SAArB;AACA7R,oBAAQgS,QAAR;;AAEA,mBAAO;AACHpK,sBAAU,CAAC,IAAIqK,IAAJ,EADR;AAEH1H,uBAAUA,KAFP;AAGH2H,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8B9S,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;A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AoBE,UAApB,CAA+BsB,IAA/B;;AAEA;;;;;AAKA,UAAI6C,iBAAiB,KAAK/W,MAAL,CAAYyK,KAAZ,CAAkBuM,SAAlB,CAA4B,KAAKhX,MAAL,CAAY2K,YAAZ,CAAyB4C,YAAzB,CAAsCzG,IAAlE,CAArB;AAAA,UACImQ,eAAe,KAAKjX,MAAL,CAAY2K,YAAZ,CAAyB4C,YAAzB,CAAsCxE,OADzD;;AAGA,UAAIgO,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAKjX,MAAL,CAAY0S,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;AAEH;AAEJ;;;wBA3OS;;AAEN,aAAO;AACHiC,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2B3W,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;;;;kBApgBqB+K,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 = 5);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d68c3572cfdf468771ae","/**\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( node => this.isNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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\": 8,\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 = 7;\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 = 7\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.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * @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 _.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.getSelection();\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 pluginsContent = lastBlock.pluginsContent;\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 ($.isEmpty(pluginsContent)) {\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\nimport 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 diff --git a/docs/caret.md b/docs/caret.md index e13125db..e10a4a71 100644 --- a/docs/caret.md +++ b/docs/caret.md @@ -2,25 +2,29 @@ The `Caret` module contains methods working with caret. -Uses[Range](https://developer.mozilla.org/en-US/docs/Web/API/Range) methods to navigate caret +Uses [Range](https://developer.mozilla.org/en-US/docs/Web/API/Range) methods to navigate caret between blocks. Caret class implements basic Module class that holds User configuration and default CodeXEditor instances -You can read more about Module class[here]() +You can read more about Module class [here]() ## Properties ## Methods + +### setToBlock + ```javascript -Caret.setToBlock +Caret.setToBlock() ``` -Method gets Block instance and puts caret to the text node with offset -### params +> Method gets Block instance and puts caret to the text node with offset + +#### params | Param | Type | Description| | -------------|------ |:-------------:| @@ -29,9 +33,11 @@ Method gets Block instance and puts caret to the text node with offset | atEnd | Boolean | puts caret at the end of last text node| +### setToTheLastBlock + ```javascript -Caret.setToTheLastBlock +Caret.setToTheLastBlock() ``` -sets Caret at the end of last Block +> sets Caret at the end of last Block If last block is not empty, inserts another empty Block which is passed as initial \ No newline at end of file diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index f2872fca..96a252d7 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -330,20 +330,18 @@ export default class BlockManager extends Module { /** * Set currentBlockIndex to passed block - * - * @todo get first level block before searching. Use closest function - * * @param {HTMLElement} element */ set currentNode(element) { - let nodes = this._blocks.nodes; + let nodes = this._blocks.nodes, + firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`); /** * Update current Block's index * @type {number} */ - this.currentBlockIndex = nodes.indexOf(element); + this.currentBlockIndex = nodes.indexOf(firstLevelBlock); /** * Remove previous selected Block's state From 6c75a4535858a416cdd99f59f81a4ce7c63e8fd3 Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Thu, 4 Jan 2018 01:13:27 +0300 Subject: [PATCH 11/14] upgrade request --- build/codex-editor.js | 80 +++++++++++++++----------- build/codex-editor.js.map | 2 +- src/components/block.js | 2 +- src/components/dom.js | 2 +- src/components/modules/blockManager.js | 14 ++--- src/components/modules/caret.js | 7 +-- src/components/modules/ui.js | 2 +- src/components/selection.js | 21 ++++++- 8 files changed, 79 insertions(+), 51 deletions(-) diff --git a/build/codex-editor.js b/build/codex-editor.js index 64477ea2..5d93c261 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -694,8 +694,8 @@ var Dom = function () { treeWalker.push(node); } - return leafs.every(function (node) { - return _this.isNodeEmpty(node); + return leafs.every(function (leaf) { + return _this.isNodeEmpty(leaf); }); } }]); @@ -909,7 +909,7 @@ var Block = function () { return false; } - var emptyText = this._html.textContent.trim().length === 0, + var emptyText = $.isEmpty(this.pluginsContent), emptyMedia = !this.hasMedia; return emptyText && emptyMedia; @@ -1003,15 +1003,29 @@ var Selection = function () { this.selection = null; } + /** + * Returns window Selection + * {@link https://developer.mozilla.org/ru/docs/Web/API/Window/getSelection} + * @return {Selection} + */ + + _createClass(Selection, null, [{ - key: "getSelection", - value: function getSelection() { + key: "get", + value: function get() { return window.getSelection(); } + + /** + * Returns selected anchor + * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorNode} + * @return {Node} + */ + }, { - key: "getSelectionAnchorNode", - value: function getSelectionAnchorNode() { + key: "getAnchorNode", + value: function getAnchorNode() { var selection = window.getSelection(); @@ -1020,9 +1034,16 @@ var Selection = function () { return selection.anchorNode; } } + + /** + * Returns selection offset according to the anchor node + * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorOffset} + * @return {Number} + */ + }, { - key: "getSelectionAnchorOffset", - value: function getSelectionAnchorOffset() { + key: "getAnchorOffset", + value: function getAnchorOffset() { var selection = window.getSelection(); @@ -1757,12 +1778,12 @@ var BlockManager = function (_Module) { var lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true), textNodeLength = lastTextNode.length; - if (_Selection2.default.getSelectionAnchorNode() !== lastTextNode) { + if (_Selection2.default.getAnchorNode() !== lastTextNode) { return; } - if (_Selection2.default.getSelectionAnchorOffset() === textNodeLength) { + if (_Selection2.default.getAnchorOffset() === textNodeLength) { var nextBlock = this.nextBlock; @@ -1785,12 +1806,12 @@ var BlockManager = function (_Module) { var firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false), textNodeLength = firstTextNode.length; - if (_Selection2.default.getSelectionAnchorNode() !== firstTextNode) { + if (_Selection2.default.getAnchorNode() !== firstTextNode) { return; } - if (_Selection2.default.getSelectionAnchorOffset() === 0) { + if (_Selection2.default.getAnchorOffset() === 0) { var previousBlock = this.previousBlock; @@ -1858,9 +1879,6 @@ var BlockManager = function (_Module) { /** * Get Block instance by html element - * - * @todo get first level block before searching - * * @param {HTMLElement} element * @returns {Block} */ @@ -1870,7 +1888,8 @@ var BlockManager = function (_Module) { value: function getBlock(element) { var nodes = this._blocks.nodes, - index = nodes.indexOf(element); + firstLevelBlock = element.closest('.' + _block2.default.CSS.wrapper), + index = nodes.indexOf(firstLevelBlock); if (index >= 0) { @@ -2378,7 +2397,7 @@ var Caret = function (_Module) { var range = document.createRange(), - selection = _Selection2.default.getSelection(); + selection = _Selection2.default.get(); range.setStart(element, offset); range.setEnd(element, offset); @@ -2396,8 +2415,7 @@ var Caret = function (_Module) { */ value: function setToTheLastBlock() { - var lastBlock = this.Editor.BlockManager.lastBlock, - pluginsContent = lastBlock.pluginsContent; + var lastBlock = this.Editor.BlockManager.lastBlock; if (!lastBlock) return; @@ -2405,7 +2423,7 @@ var Caret = function (_Module) { * If last block is empty and it is an initialBlock, set to that. * Otherwise, append new empty block and set to that */ - if ($.isEmpty(pluginsContent)) { + if (lastBlock.isEmpty) { this.setToBlock(lastBlock); } else { @@ -4230,21 +4248,17 @@ Object.defineProperty(exports, "__esModule", { 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; }; }(); -var _block = __webpack_require__(3); - -var _block2 = _interopRequireDefault(_block); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - 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; } /** - * Module UI - * - * @type {UI} - */ +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; } + +/** + * Module UI + * + * @type {UI} + */ // let className = { /** @@ -4273,6 +4287,8 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function" // SETTINGS_ITEM : 'ce-settings__item' // }; +// import Block from '../block'; + /** * @class * diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 4fe5db24..3880abcf 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap d68c3572cfdf468771ae","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","emptyMedia","hasMedia","mediaTags","join","state","isEmpty","selected","remove","Selection","instance","selection","getSelection","anchorNode","anchorOffset","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","navigateNext","navigatePrevious","lastTextNode","currentBlock","textNodeLength","getSelectionAnchorNode","getSelectionAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","firstLevelBlock","array","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","isNaN","Number","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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AP;AAEH,aANE,CAAP;AAQH;;AAED;;;;;;;;mCAKWF,gB,EAAkB;;AAEzB,gBAAInH,QAAQ,EAAZ;AAAA,gBACIsH,YAAY,CADhB;;AAGA7R,oBAAQ8R,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBxN,OAAjB,CAAyB,UAAC6N,UAAD,EAAanE,KAAb,EAAuB;;AAE5C;AACA5N,wBAAQ+H,GAAR,UAAgBgK,WAAWvL,IAA3B,uBAAgDuL,UAAhD;AACAF,6BAAaE,WAAWnK,IAAxB;AACA2C,sBAAM1E,IAAN,CAAWkM,WAAW7Q,IAAtB;AAEH,aAPD;;AASAlB,oBAAQ+H,GAAR,CAAY,OAAZ,EAAqB8J,SAArB;AACA7R,oBAAQgS,QAAR;;AAEA,mBAAO;AACHpK,sBAAU,CAAC,IAAIqK,IAAJ,EADR;AAEH1H,uBAAUA,KAFP;AAGH2H,yBAAU,OAAAC;AAHP,aAAP;AAMH;;;;EAtE8B9S,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;A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AoBE,UAApB,CAA+BsB,IAA/B;;AAEA;;;;;AAKA,UAAI6C,iBAAiB,KAAK/W,MAAL,CAAYyK,KAAZ,CAAkBuM,SAAlB,CAA4B,KAAKhX,MAAL,CAAY2K,YAAZ,CAAyB4C,YAAzB,CAAsCzG,IAAlE,CAArB;AAAA,UACImQ,eAAe,KAAKjX,MAAL,CAAY2K,YAAZ,CAAyB4C,YAAzB,CAAsCxE,OADzD;;AAGA,UAAIgO,kBAAkBE,YAAtB,EAAoC;;AAEhC,aAAKjX,MAAL,CAAY0S,OAAZ,CAAoBE,UAApB,CAA+BwB,IAA/B;AAEH;AAEJ;;;wBA3OS;;AAEN,aAAO;AACHiC,uBAAgB,cADb;AAEHC,oBAAgB;AAFb,OAAP;AAKH;;;;EAvE2B3W,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;;;;kBApgBqB+K,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 = 5);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d68c3572cfdf468771ae","/**\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( node => this.isNodeEmpty(node));\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.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 = this._html.textContent.trim().length === 0,\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 * 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 static getSelection() {\n\n return window.getSelection();\n\n }\n\n static getSelectionAnchorNode() {\n\n let selection = window.getSelection();\n\n if (selection) {\n\n return selection.anchorNode;\n\n }\n\n }\n\n static getSelectionAnchorOffset() {\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\": 8,\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 = 7;\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 = 7\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.getSelectionAnchorNode() !== lastTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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.getSelectionAnchorNode() !== firstTextNode) {\n\n return;\n\n }\n\n if (Selection.getSelectionAnchorOffset() === 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 *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\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 * @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 _.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.getSelection();\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 pluginsContent = lastBlock.pluginsContent;\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 ($.isEmpty(pluginsContent)) {\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\nimport 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 6d54753a57f5c532e21a","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","isEmpty","emptyMedia","hasMedia","mediaTags","join","state","selected","remove","Selection","instance","selection","getSelection","anchorNode","anchorOffset","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","navigateNext","navigatePrevious","lastTextNode","currentBlock","textNodeLength","getAnchorNode","getAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","firstLevelBlock","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","array","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","isNaN","Number","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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ElB,uBAAOA,UAAP;AAEH,aANE,CAAP;AAQH;;AAED;;;;;;;;mCAKWF,gB,EAAkB;;AAEzB,gBAAInH,QAAQ,EAAZ;AAAA,gBACIsH,YAAY,CADhB;;AAGA9R,oBAAQ+R,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBzN,OAAjB,CAAyB,UAAC8N,UAAD,EAAanE,KAAb,EAAuB;;AAE5C;AACA7N,wBAAQgI,GAAR,UAAgBgK,WAAWvL,IAA3B,uBAAgDuL,UAAhD;AACAF,6BAAaE,WAAWnK,IAAxB;AACA2C,sBAAM3E,IAAN,CAAWmM,WAAW9Q,IAAtB;AAEH,aAPD;;AASAlB,oBAAQgI,GAAR,CAAY,OAAZ,EAAqB8J,SAArB;AACA9R,oBAAQiS,QAAR;;AAEA,mBAAO;AACHpK,sBAAU,CAAC,IAAIqK,IAAJ,EADR;AAEH1H,uBAAUA,KAFP;AAGH2H,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;AACA;AAC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2S,OAAZ,CAAoBE,UAApB,CAA+BsB,IAA/B;;AAEA;;;;;AAKA,UAAI6C,iBAAiB,KAAKhX,MAAL,CAAY0K,KAAZ,CAAkBuM,SAAlB,CAA4B,KAAKjX,MAAL,CAAY4K,YAAZ,CAAyB4C,YAAzB,CAAsCzG,IAAlE,CAArB;AAAA,UACImQ,eAAe,KAAKlX,MAAL,CAAY4K,YAAZ,CAAyB4C,YAAzB,CAAsC7E,OADzD;;AAGA,UAAIqO,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;;;;kBApgBqBgL,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 = 5);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6d54753a57f5c532e21a","/**\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 *\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 * 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\": 8,\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 = 7;\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 = 7\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 * @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 _.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 diff --git a/src/components/block.js b/src/components/block.js index 9a5d9c33..ec9e56ec 100644 --- a/src/components/block.js +++ b/src/components/block.js @@ -183,7 +183,7 @@ export default class Block { } - let emptyText = this._html.textContent.trim().length === 0, + let emptyText = $.isEmpty(this.pluginsContent), emptyMedia = !this.hasMedia; return emptyText && emptyMedia; diff --git a/src/components/dom.js b/src/components/dom.js index 652bedcc..621db406 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -263,7 +263,7 @@ export default class Dom { } - return leafs.every( node => this.isNodeEmpty(node)); + return leafs.every( leaf => this.isNodeEmpty(leaf)) ; } diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index 96a252d7..fc5c4e5f 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -152,13 +152,13 @@ export default class BlockManager extends Module { let lastTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, true), textNodeLength = lastTextNode.length; - if (Selection.getSelectionAnchorNode() !== lastTextNode) { + if (Selection.getAnchorNode() !== lastTextNode) { return; } - if (Selection.getSelectionAnchorOffset() === textNodeLength) { + if (Selection.getAnchorOffset() === textNodeLength) { let nextBlock = this.nextBlock; @@ -180,13 +180,13 @@ export default class BlockManager extends Module { let firstTextNode = $.getDeepestNode(this.currentBlock.pluginsContent, false), textNodeLength = firstTextNode.length; - if (Selection.getSelectionAnchorNode() !== firstTextNode) { + if (Selection.getAnchorNode() !== firstTextNode) { return; } - if (Selection.getSelectionAnchorOffset() === 0) { + if (Selection.getAnchorOffset() === 0) { let previousBlock = this.previousBlock; @@ -251,16 +251,14 @@ export default class BlockManager extends Module { /** * Get Block instance by html element - * - * @todo get first level block before searching - * * @param {HTMLElement} element * @returns {Block} */ getBlock(element) { let nodes = this._blocks.nodes, - index = nodes.indexOf(element); + firstLevelBlock = element.closest(`.${Block.CSS.wrapper}`), + index = nodes.indexOf(firstLevelBlock); if (index >= 0) { diff --git a/src/components/modules/caret.js b/src/components/modules/caret.js index 7380097a..6f0c609e 100644 --- a/src/components/modules/caret.js +++ b/src/components/modules/caret.js @@ -77,7 +77,7 @@ export default class Caret extends Module { set( element, offset = 0) { let range = document.createRange(), - selection = Selection.getSelection(); + selection = Selection.get(); range.setStart(element, offset); range.setEnd(element, offset); @@ -93,8 +93,7 @@ export default class Caret extends Module { */ setToTheLastBlock() { - let lastBlock = this.Editor.BlockManager.lastBlock, - pluginsContent = lastBlock.pluginsContent; + let lastBlock = this.Editor.BlockManager.lastBlock; if (!lastBlock) return; @@ -102,7 +101,7 @@ export default class Caret extends Module { * If last block is empty and it is an initialBlock, set to that. * Otherwise, append new empty block and set to that */ - if ($.isEmpty(pluginsContent)) { + if (lastBlock.isEmpty) { this.setToBlock(lastBlock); diff --git a/src/components/modules/ui.js b/src/components/modules/ui.js index f76508de..e6964b2a 100644 --- a/src/components/modules/ui.js +++ b/src/components/modules/ui.js @@ -31,7 +31,7 @@ // SETTINGS_ITEM : 'ce-settings__item' // }; -import Block from '../block'; +// import Block from '../block'; /** * @class diff --git a/src/components/selection.js b/src/components/selection.js index 96b03565..838f23f1 100644 --- a/src/components/selection.js +++ b/src/components/selection.js @@ -13,13 +13,23 @@ export default class Selection { } - static getSelection() { + /** + * Returns window Selection + * {@link https://developer.mozilla.org/ru/docs/Web/API/Window/getSelection} + * @return {Selection} + */ + static get() { return window.getSelection(); } - static getSelectionAnchorNode() { + /** + * Returns selected anchor + * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorNode} + * @return {Node} + */ + static getAnchorNode() { let selection = window.getSelection(); @@ -31,7 +41,12 @@ export default class Selection { } - static getSelectionAnchorOffset() { + /** + * Returns selection offset according to the anchor node + * {@link https://developer.mozilla.org/ru/docs/Web/API/Selection/anchorOffset} + * @return {Number} + */ + static getAnchorOffset() { let selection = window.getSelection(); From 6d83636779b4e7bb4c51027b6f33e012345ea75c Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Thu, 4 Jan 2018 01:16:17 +0300 Subject: [PATCH 12/14] update docs --- docs/caret.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/caret.md b/docs/caret.md index e10a4a71..b03dd5a9 100644 --- a/docs/caret.md +++ b/docs/caret.md @@ -1,8 +1,6 @@ # CodeX Editor Caret Module -The `Caret` module contains methods working with caret. - -Uses [Range](https://developer.mozilla.org/en-US/docs/Web/API/Range) methods to navigate caret +The `Caret` module contains methods working with caret. Uses [Range](https://developer.mozilla.org/en-US/docs/Web/API/Range) methods to navigate caret between blocks. Caret class implements basic Module class that holds User configuration @@ -18,7 +16,7 @@ You can read more about Module class [here]() ### setToBlock ```javascript -Caret.setToBlock() +Caret.setToBlock(block, offset, atEnd) ``` From cdf2ca7173acc27ec4e401dc827edffa4e3fc563 Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Thu, 4 Jan 2018 20:24:36 +0300 Subject: [PATCH 13/14] upd --- build/codex-editor.js | 554 +++++++++++++++++++------------------- build/codex-editor.js.map | 2 +- example/example.html | 2 +- 3 files changed, 279 insertions(+), 279 deletions(-) diff --git a/build/codex-editor.js b/build/codex-editor.js index 5d93c261..d292f7fe 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -61,7 +61,7 @@ var CodexEditor = /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 5); +/******/ return __webpack_require__(__webpack_require__.s = 4); /******/ }) /************************************************************************/ /******/ ([ @@ -712,271 +712,6 @@ module.exports = exports['default']; /* 3 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; -/* WEBPACK VAR INJECTION */(function($, _) { - -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"); } } - -/** - * - * @class Block - * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool - * - * @property {Tool} tool — current block tool (Paragraph, for example) - * @property {Object} CSS — block`s css classes - * - */ - -/** - * @classdesc Abstract Block class that contains Block information, Tool name and Tool class instance - * - * @property tool - Tool instance - * @property html - Returns HTML content of plugin - * @property wrapper - Div element that wraps block content with Tool's content. Has `ce-block` CSS class - * @property contentNode - Div element that wraps Tool's content. Has `ce-block__content` CSS class - * @property pluginsContent - HTML content that returns by Tool's render function - */ -var Block = function () { - - /** - * @constructor - * @param {String} toolName - Tool name that passed on initialization - * @param {Object} toolInstance — passed Tool`s instance that rendered the Block - */ - function Block(toolName, toolInstance) { - _classCallCheck(this, Block); - - this.name = toolName; - this.tool = toolInstance; - this._html = this.compose(); - } - - /** - * CSS classes for the Block - * @return {{wrapper: string, content: string}} - */ - - - _createClass(Block, [{ - key: 'compose', - - - /** - * Make default Block wrappers and put Tool`s content there - * @returns {HTMLDivElement} - */ - value: function compose() { - - this.wrapper = $.make('div', Block.CSS.wrapper); - this.contentNode = $.make('div', Block.CSS.content); - this.pluginsContent = this.tool.render(); - - this.contentNode.appendChild(this.pluginsContent); - this.wrapper.appendChild(this.contentNode); - - return this.wrapper; - } - - /** - * Calls Tool's method - * - * Method checks tool property {MethodName}. Fires method with passes params If it is instance of Function - * - * @param {String} methodName - * @param {Object} params - */ - - }, { - key: 'call', - value: function call(methodName, params) { - - /** - * call Tool's method with the instance context - */ - if (this.tool[methodName] && this.tool[methodName] instanceof Function) { - - this.tool[methodName].call(this.tool, params); - } - } - - /** - * Get Block`s HTML - * @returns {HTMLElement} - */ - - }, { - key: 'save', - - - /** - * Extracts data from Block - * Groups Tool's save processing time - * @return {Object} - */ - value: function save() { - var _this = this; - - var extractedBlock = this.tool.save(this.pluginsContent); - - /** Measuring execution time*/ - var measuringStart = window.performance.now(), - measuringEnd = void 0; - - return Promise.resolve(extractedBlock).then(function (finishedExtraction) { - - /** measure promise execution */ - measuringEnd = window.performance.now(); - - return { - tool: _this.name, - data: finishedExtraction, - time: measuringEnd - measuringStart - }; - }).catch(function (error) { - - _.log('Saving proccess for ' + this.tool.name + ' tool failed due to the ' + error, 'log', 'red'); - }); - } - - /** - * Uses Tool's validation method to check the correctness of output data - * Tool's validation method is optional - * - * @description Method also can return data if it passed the validation - * - * @param {Object} data - * @returns {Boolean|Object} valid - */ - - }, { - key: 'validateData', - value: function validateData(data) { - - var isValid = true; - - if (this.tool.validate instanceof Function) { - - isValid = this.tool.validate(data); - } - - if (!isValid) { - - return false; - } - - return data; - } - - /** - * Check block for emptiness - * @return {Boolean} - */ - - }, { - key: 'html', - get: function get() { - - return this._html; - } - - /** - * Get Block's JSON data - * @return {Object} - */ - - }, { - key: 'data', - get: function get() { - - return this.save(); - } - }, { - key: 'isEmpty', - get: function get() { - - /** - * Allow Tool to represent decorative contentless blocks: for example "* * *"-tool - * That Tools are not empty - */ - if (this.tool.contentless) { - - return false; - } - - var emptyText = $.isEmpty(this.pluginsContent), - emptyMedia = !this.hasMedia; - - return emptyText && emptyMedia; - } - - /** - * Check if block has a media content such as images, iframes and other - * @return {Boolean} - */ - - }, { - key: 'hasMedia', - get: function get() { - - /** - * This tags represents media-content - * @type {string[]} - */ - var mediaTags = ['img', 'iframe', 'video', 'audio', 'source', 'input', 'textarea', 'twitterwidget']; - - return !!this._html.querySelector(mediaTags.join(',')); - } - - /** - * Set selected state - * @param {Boolean} state - 'true' to select, 'false' to remove selection - */ - - }, { - key: 'selected', - set: function set(state) { - - /** - * We don't need to mark Block as Selected when it is not empty - */ - if (state === true && !this.isEmpty) { - - this._html.classList.add(Block.CSS.selected); - } else { - - this._html.classList.remove(Block.CSS.selected); - } - } - }], [{ - key: 'CSS', - get: function get() { - - return { - wrapper: 'ce-block', - content: 'ce-block__content', - selected: 'ce-block--selected' - }; - } - }]); - - return Block; -}(); - -Block.displayName = 'Block'; -exports.default = Block; -module.exports = exports['default']; -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1))) - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - "use strict"; @@ -1062,7 +797,7 @@ exports.default = Selection; module.exports = exports["default"]; /***/ }), -/* 5 */ +/* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1138,7 +873,7 @@ module.exports = exports["default"]; 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; }; }(); -__webpack_require__(6); +__webpack_require__(5); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } @@ -1147,7 +882,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons */ // 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) { - return __webpack_require__(7)("./" + module); + return __webpack_require__(6)("./" + module); }); /** @@ -1522,7 +1257,7 @@ module.exports = function () { /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1))) /***/ }), -/* 6 */ +/* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1549,11 +1284,11 @@ if (!Element.prototype.closest) Element.prototype.closest = function (s) { }; /***/ }), -/* 7 */ +/* 6 */ /***/ (function(module, exports, __webpack_require__) { var map = { - "./blockManager.js": 8, + "./blockManager.js": 7, "./caret.js": 9, "./events.js": 10, "./renderer.js": 11, @@ -1578,10 +1313,10 @@ webpackContext.keys = function webpackContextKeys() { }; webpackContext.resolve = webpackContextResolve; module.exports = webpackContext; -webpackContext.id = 7; +webpackContext.id = 6; /***/ }), -/* 8 */ +/* 7 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -1593,11 +1328,11 @@ Object.defineProperty(exports, "__esModule", { 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; }; }(); -var _block = __webpack_require__(3); +var _block = __webpack_require__(8); var _block2 = _interopRequireDefault(_block); -var _Selection = __webpack_require__(4); +var _Selection = __webpack_require__(3); var _Selection2 = _interopRequireDefault(_Selection); @@ -2280,6 +2015,271 @@ Blocks.displayName = 'Blocks'; module.exports = exports['default']; /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0), __webpack_require__(1), __webpack_require__(2))) +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function($, _) { + +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"); } } + +/** + * + * @class Block + * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool + * + * @property {Tool} tool — current block tool (Paragraph, for example) + * @property {Object} CSS — block`s css classes + * + */ + +/** + * @classdesc Abstract Block class that contains Block information, Tool name and Tool class instance + * + * @property tool - Tool instance + * @property html - Returns HTML content of plugin + * @property wrapper - Div element that wraps block content with Tool's content. Has `ce-block` CSS class + * @property contentNode - Div element that wraps Tool's content. Has `ce-block__content` CSS class + * @property pluginsContent - HTML content that returns by Tool's render function + */ +var Block = function () { + + /** + * @constructor + * @param {String} toolName - Tool name that passed on initialization + * @param {Object} toolInstance — passed Tool`s instance that rendered the Block + */ + function Block(toolName, toolInstance) { + _classCallCheck(this, Block); + + this.name = toolName; + this.tool = toolInstance; + this._html = this.compose(); + } + + /** + * CSS classes for the Block + * @return {{wrapper: string, content: string}} + */ + + + _createClass(Block, [{ + key: 'compose', + + + /** + * Make default Block wrappers and put Tool`s content there + * @returns {HTMLDivElement} + */ + value: function compose() { + + this.wrapper = $.make('div', Block.CSS.wrapper); + this.contentNode = $.make('div', Block.CSS.content); + this.pluginsContent = this.tool.render(); + + this.contentNode.appendChild(this.pluginsContent); + this.wrapper.appendChild(this.contentNode); + + return this.wrapper; + } + + /** + * Calls Tool's method + * + * Method checks tool property {MethodName}. Fires method with passes params If it is instance of Function + * + * @param {String} methodName + * @param {Object} params + */ + + }, { + key: 'call', + value: function call(methodName, params) { + + /** + * call Tool's method with the instance context + */ + if (this.tool[methodName] && this.tool[methodName] instanceof Function) { + + this.tool[methodName].call(this.tool, params); + } + } + + /** + * Get Block`s HTML + * @returns {HTMLElement} + */ + + }, { + key: 'save', + + + /** + * Extracts data from Block + * Groups Tool's save processing time + * @return {Object} + */ + value: function save() { + var _this = this; + + var extractedBlock = this.tool.save(this.pluginsContent); + + /** Measuring execution time*/ + var measuringStart = window.performance.now(), + measuringEnd = void 0; + + return Promise.resolve(extractedBlock).then(function (finishedExtraction) { + + /** measure promise execution */ + measuringEnd = window.performance.now(); + + return { + tool: _this.name, + data: finishedExtraction, + time: measuringEnd - measuringStart + }; + }).catch(function (error) { + + _.log('Saving proccess for ' + this.tool.name + ' tool failed due to the ' + error, 'log', 'red'); + }); + } + + /** + * Uses Tool's validation method to check the correctness of output data + * Tool's validation method is optional + * + * @description Method also can return data if it passed the validation + * + * @param {Object} data + * @returns {Boolean|Object} valid + */ + + }, { + key: 'validateData', + value: function validateData(data) { + + var isValid = true; + + if (this.tool.validate instanceof Function) { + + isValid = this.tool.validate(data); + } + + if (!isValid) { + + return false; + } + + return data; + } + + /** + * Check block for emptiness + * @return {Boolean} + */ + + }, { + key: 'html', + get: function get() { + + return this._html; + } + + /** + * Get Block's JSON data + * @return {Object} + */ + + }, { + key: 'data', + get: function get() { + + return this.save(); + } + }, { + key: 'isEmpty', + get: function get() { + + /** + * Allow Tool to represent decorative contentless blocks: for example "* * *"-tool + * That Tools are not empty + */ + if (this.tool.contentless) { + + return false; + } + + var emptyText = $.isEmpty(this.pluginsContent), + emptyMedia = !this.hasMedia; + + return emptyText && emptyMedia; + } + + /** + * Check if block has a media content such as images, iframes and other + * @return {Boolean} + */ + + }, { + key: 'hasMedia', + get: function get() { + + /** + * This tags represents media-content + * @type {string[]} + */ + var mediaTags = ['img', 'iframe', 'video', 'audio', 'source', 'input', 'textarea', 'twitterwidget']; + + return !!this._html.querySelector(mediaTags.join(',')); + } + + /** + * Set selected state + * @param {Boolean} state - 'true' to select, 'false' to remove selection + */ + + }, { + key: 'selected', + set: function set(state) { + + /** + * We don't need to mark Block as Selected when it is not empty + */ + if (state === true && !this.isEmpty) { + + this._html.classList.add(Block.CSS.selected); + } else { + + this._html.classList.remove(Block.CSS.selected); + } + } + }], [{ + key: 'CSS', + get: function get() { + + return { + wrapper: 'ce-block', + content: 'ce-block__content', + selected: 'ce-block--selected' + }; + } + }]); + + return Block; +}(); + +Block.displayName = 'Block'; +exports.default = Block; +module.exports = exports['default']; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(2), __webpack_require__(1))) + /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { @@ -2293,7 +2293,7 @@ Object.defineProperty(exports, "__esModule", { 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; }; }(); -var _Selection = __webpack_require__(4); +var _Selection = __webpack_require__(3); var _Selection2 = _interopRequireDefault(_Selection); diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 3880abcf..6181c2b3 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 6d54753a57f5c532e21a","webpack:///./src/components/__module.js","webpack:///./src/components/utils.js","webpack:///./src/components/dom.js","webpack:///./src/components/block.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/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","Block","toolName","toolInstance","name","tool","_html","compose","wrapper","$","make","CSS","contentNode","pluginsContent","render","methodName","params","Function","extractedBlock","save","measuringStart","performance","now","measuringEnd","finishedExtraction","time","error","_","log","isValid","validate","contentless","emptyText","isEmpty","emptyMedia","hasMedia","mediaTags","join","state","selected","remove","Selection","instance","selection","getSelection","anchorNode","anchorOffset","modules","editorModules","map","module","exports","moduleInstances","configuration","init","start","constructModules","configureModules","displayName","getModulesDiff","diff","moduleName","prepareDecorator","prepare","Tools","UI","BlockManager","Renderer","items","initialBlock","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Element","matches","msMatchesSelector","webkitMatchesSelector","closest","s","documentElement","contains","parentElement","parentNode","_blocks","currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","construct","block","bindEvents","addEventListener","event","keyDownOnBlock","keyCode","keyCodes","enterPressedOnPluginsContent","navigateNext","navigatePrevious","lastTextNode","currentBlock","textNodeLength","getAnchorNode","getAnchorOffset","nextBlock","Caret","setToBlock","firstTextNode","previousBlock","composeBlock","insert","index","firstLevelBlock","indexOf","childNode","parentFirstLevelBlock","currentNode","Error","isLastBlock","isFirstBlock","array","workingArea","html","deleteCount","splice","insertAdjacentElement","targetBlock","newBlock","children","isNaN","Number","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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ElB,uBAAOA,UAAP;AAEH,aANE,CAAP;AAQH;;AAED;;;;;;;;mCAKWF,gB,EAAkB;;AAEzB,gBAAInH,QAAQ,EAAZ;AAAA,gBACIsH,YAAY,CADhB;;AAGA9R,oBAAQ+R,cAAR,CAAuB,uBAAvB;;AAEAJ,6BAAiBzN,OAAjB,CAAyB,UAAC8N,UAAD,EAAanE,KAAb,EAAuB;;AAE5C;AACA7N,wBAAQgI,GAAR,UAAgBgK,WAAWvL,IAA3B,uBAAgDuL,UAAhD;AACAF,6BAAaE,WAAWnK,IAAxB;AACA2C,sBAAM3E,IAAN,CAAWmM,WAAW9Q,IAAtB;AAEH,aAPD;;AASAlB,oBAAQgI,GAAR,CAAY,OAAZ,EAAqB8J,SAArB;AACA9R,oBAAQiS,QAAR;;AAEA,mBAAO;AACHpK,sBAAU,CAAC,IAAIqK,IAAJ,EADR;AAEH1H,uBAAUA,KAFP;AAGH2H,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;AACA;AAC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2S,OAAZ,CAAoBE,UAApB,CAA+BsB,IAA/B;;AAEA;;;;;AAKA,UAAI6C,iBAAiB,KAAKhX,MAAL,CAAY0K,KAAZ,CAAkBuM,SAAlB,CAA4B,KAAKjX,MAAL,CAAY4K,YAAZ,CAAyB4C,YAAzB,CAAsCzG,IAAlE,CAArB;AAAA,UACImQ,eAAe,KAAKlX,MAAL,CAAY4K,YAAZ,CAAyB4C,YAAzB,CAAsC7E,OADzD;;AAGA,UAAIqO,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;;;;kBApgBqBgL,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 = 5);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6d54753a57f5c532e21a","/**\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 *\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 * 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\": 8,\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 = 7;\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 = 7\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 * @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 _.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 1bdf25449cbb95595285","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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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;AACA;A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;;;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 1bdf25449cbb95595285","/**\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 _.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 diff --git a/example/example.html b/example/example.html index a142df19..3fcedd0a 100644 --- a/example/example.html +++ b/example/example.html @@ -82,7 +82,7 @@ { type : 'text', data : { - text : '

    ' + text : '

    CodeX Привет!!!

    ' } } ] From 6db88c3e26803594364012ea63d3de546dcd9f3c Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Thu, 4 Jan 2018 23:21:39 +0300 Subject: [PATCH 14/14] todo on delays --- build/codex-editor.js | 3 +++ build/codex-editor.js.map | 2 +- src/components/modules/caret.js | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/build/codex-editor.js b/build/codex-editor.js index d292f7fe..8226c33e 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -2377,6 +2377,9 @@ var Caret = function (_Module) { return; } + /** + * @todo try to fix via Promises or use querySelectorAll to not to use timeout + */ _.delay(function () { return _this2.set(nodeToSet, offset); }, 20)(); diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 6181c2b3..de9e9f9e 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 1bdf25449cbb95595285","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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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;AACA;A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;;;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 1bdf25449cbb95595285","/**\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 _.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 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 diff --git a/src/components/modules/caret.js b/src/components/modules/caret.js index 6f0c609e..1a916b77 100644 --- a/src/components/modules/caret.js +++ b/src/components/modules/caret.js @@ -63,6 +63,9 @@ export default class Caret extends Module { } + /** + * @todo try to fix via Promises or use querySelectorAll to not to use timeout + */ _.delay( () => this.set(nodeToSet, offset), 20)(); this.Editor.BlockManager.currentNode = block.wrapper;