From b96572f6fc6cdab5460c039d52c1da18feea088e Mon Sep 17 00:00:00 2001 From: khaydarov Date: Sun, 25 Dec 2016 00:28:53 +0300 Subject: [PATCH 01/11] new sanitize method Need to fix caret position --- codex-editor.js | 518 ++++++++++++++++++++----- codex-editor.js.map | 2 +- editor.js | 1 + example.html | 4 +- modules/content.js | 83 +--- modules/sanitizer/config/basic.js | 31 ++ modules/sanitizer/config/relaxed.js | 39 ++ modules/sanitizer/config/restricted.js | 11 + modules/sanitizer/sanitize.js | 265 +++++++++++++ 9 files changed, 770 insertions(+), 184 deletions(-) create mode 100644 modules/sanitizer/config/basic.js create mode 100644 modules/sanitizer/config/relaxed.js create mode 100644 modules/sanitizer/config/restricted.js create mode 100644 modules/sanitizer/sanitize.js diff --git a/codex-editor.js b/codex-editor.js index c3f6b9854..4f4506e04 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -41,8 +41,9 @@ var codex = /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ -/******/ ([ -/* 0 */ +/******/ ({ + +/***/ 0: /***/ function(module, exports, __webpack_require__) { /** @@ -55,7 +56,8 @@ var codex = module.exports = editor; /***/ }, -/* 1 */ + +/***/ 1: /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -78,13 +80,14 @@ var codex = codex.renderer = __webpack_require__(5); codex.saver = __webpack_require__(6); codex.content = __webpack_require__(7); - codex.toolbar = __webpack_require__(8); - codex.tools = __webpack_require__(12); - codex.callback = __webpack_require__(13); - codex.draw = __webpack_require__(14); - codex.caret = __webpack_require__(15); - codex.notifications = __webpack_require__(16); - codex.parser = __webpack_require__(17); + codex.toolbar = __webpack_require__(68); + codex.tools = __webpack_require__(72); + codex.callback = __webpack_require__(73); + codex.draw = __webpack_require__(74); + codex.caret = __webpack_require__(75); + codex.notifications = __webpack_require__(76); + codex.parser = __webpack_require__(77); + codex.sanitizer = __webpack_require__(79); }; codex.version = { @@ -193,7 +196,8 @@ var codex = module.exports = codex; /***/ }, -/* 2 */ + +/***/ 2: /***/ function(module, exports) { 'use strict'; @@ -375,7 +379,8 @@ var codex = module.exports = core; /***/ }, -/* 3 */ + +/***/ 3: /***/ function(module, exports) { 'use strict'; @@ -745,7 +750,8 @@ var codex = module.exports = ui; /***/ }, -/* 4 */ + +/***/ 4: /***/ function(module, exports) { 'use strict'; @@ -854,7 +860,8 @@ var codex = module.exports = transport; /***/ }, -/* 5 */ + +/***/ 5: /***/ function(module, exports) { 'use strict'; @@ -1025,7 +1032,8 @@ var codex = module.exports = renderer; /***/ }, -/* 6 */ + +/***/ 6: /***/ function(module, exports) { 'use strict'; @@ -1131,7 +1139,8 @@ var codex = module.exports = saver; /***/ }, -/* 7 */ + +/***/ 7: /***/ function(module, exports) { 'use strict'; @@ -1141,7 +1150,7 @@ var codex = * Works with DOM * * @author Codex Team - * @version 1.0 + * @version 1.1.1 */ var content = function (content) { @@ -1663,80 +1672,13 @@ var codex = return; } - for (var i = 0; i < target.childNodes.length; i++) { - this.dfs(target.childNodes[i]); - } - }; - - /** - * Clears styles - * @param {Element|Text} - */ - content.clearStyles = function (target) { - - var href, - newNode = null, - blockTags = ['P', 'BLOCKQUOTE', 'UL', 'CODE', 'OL', 'LI', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'DIV', 'PRE', 'HEADER', 'SECTION'], - allowedTags = ['P', 'B', 'I', 'A', 'U', 'BR'], - needReplace = !allowedTags.includes(target.tagName), - isDisplayedAsBlock = blockTags.includes(target.tagName); - - if (!codex.core.isDomNode(target)) { - return target; - } - - if (!target.parentNode) { - return target; - } - - if (needReplace) { - - if (isDisplayedAsBlock) { - - newNode = document.createElement('P'); - newNode.innerHTML = target.innerHTML; - target.parentNode.replaceChild(newNode, target); - target = newNode; - } else { - - newNode = document.createTextNode(' ' + target.textContent + ' '); - newNode.textContent = newNode.textContent.replace(/\s{2,}/g, ' '); - target.parentNode.replaceChild(newNode, target); - } - } - - /** keep href attributes of tag A */ - if (target.tagName == 'A') { - href = target.getAttribute('href'); - } - - /** Remove all tags */ - while (target.attributes.length > 0) { - target.removeAttribute(target.attributes[0].name); - } - - /** return href */ - if (href) { - target.setAttribute('href', href); - } - - return target; - }; - - /** - * Depth-first search Algorithm - * returns all childs - * @param {Element} - */ - content.dfs = function (el) { - - if (!codex.core.isDomNode(el)) return; + console.log(target); - var sanitized = this.clearStyles(el); + var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC); + var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]); - for (var i = 0; i < sanitized.childNodes.length; i++) { - this.dfs(sanitized.childNodes[i]); - } + target.innerHTML = ""; + target.appendChild(clearHTML); }; return content; @@ -1745,7 +1687,8 @@ var codex = module.exports = content; /***/ }, -/* 8 */ + +/***/ 68: /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1764,9 +1707,9 @@ var codex = var toolbar = function (toolbar) { toolbar.init = function () { - toolbar.settings = __webpack_require__(9); - toolbar.inline = __webpack_require__(10); - toolbar.toolbox = __webpack_require__(11); + toolbar.settings = __webpack_require__(69); + toolbar.inline = __webpack_require__(70); + toolbar.toolbox = __webpack_require__(71); }; /** @@ -1856,7 +1799,8 @@ var codex = module.exports = toolbar; /***/ }, -/* 9 */ + +/***/ 69: /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -2097,7 +2041,8 @@ var codex = module.exports = settings; /***/ }, -/* 10 */ + +/***/ 70: /***/ function(module, exports) { 'use strict'; @@ -2590,7 +2535,8 @@ var codex = module.exports = inline; /***/ }, -/* 11 */ + +/***/ 71: /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -2606,7 +2552,7 @@ var codex = var toolbox = function (toolbox) { toolbox.init = function () { - __webpack_require__(8); + __webpack_require__(68); }; toolbox.opened = false; @@ -2763,7 +2709,8 @@ var codex = module.exports = toolbox; /***/ }, -/* 12 */ + +/***/ 72: /***/ function(module, exports) { "use strict"; @@ -2783,7 +2730,8 @@ var codex = module.exports = tools; /***/ }, -/* 13 */ + +/***/ 73: /***/ function(module, exports) { 'use strict'; @@ -3499,7 +3447,8 @@ var codex = module.exports = callbacks; /***/ }, -/* 14 */ + +/***/ 74: /***/ function(module, exports) { 'use strict'; @@ -3804,7 +3753,8 @@ var codex = module.exports = draw; /***/ }, -/* 15 */ + +/***/ 75: /***/ function(module, exports) { 'use strict'; @@ -4048,7 +3998,8 @@ var codex = module.exports = caret; /***/ }, -/* 16 */ + +/***/ 76: /***/ function(module, exports) { 'use strict'; @@ -4101,7 +4052,8 @@ var codex = module.exports = notifications; /***/ }, -/* 17 */ + +/***/ 77: /***/ function(module, exports) { 'use strict'; @@ -4351,6 +4303,364 @@ var codex = module.exports = parser; +/***/ }, + +/***/ 79: +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict'; + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + + /** + * Copyright (c) 2010 by Gabriel Birke + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the 'Software'), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + function Sanitize() { + var i, e, options; + options = arguments[0] || {}; + this.config = {}; + this.config.elements = options.elements ? options.elements : []; + this.config.attributes = options.attributes ? options.attributes : {}; + this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : []; + this.config.allow_comments = options.allow_comments ? options.allow_comments : false; + this.allowed_elements = {}; + this.config.protocols = options.protocols ? options.protocols : {}; + this.config.add_attributes = options.add_attributes ? options.add_attributes : {}; + this.dom = options.dom ? options.dom : document; + for (i = 0; i < this.config.elements.length; i++) { + this.allowed_elements[this.config.elements[i]] = true; + } + this.config.remove_element_contents = {}; + this.config.remove_all_contents = false; + if (options.remove_contents) { + + if (options.remove_contents instanceof Array) { + for (i = 0; i < options.remove_contents.length; i++) { + this.config.remove_element_contents[options.remove_contents[i]] = true; + } + } else { + this.config.remove_all_contents = true; + } + } + this.transformers = options.transformers ? options.transformers : []; + } + + Sanitize.REGEX_PROTOCOL = /^([A-Za-z0-9\+\-\.\&\;\*\s]*?)(?:\:|&*0*58|&*x0*3a)/i; + + // emulate Ruby symbol with string constant + Sanitize.RELATIVE = '__RELATIVE__'; + Sanitize.ALL = '__ALL__'; + + Sanitize.prototype.clean_node = function (container) { + var fragment = this.dom.createDocumentFragment(); + this.current_element = fragment; + this.whitelist_nodes = []; + + /** + * Utility function to check if an element exists in an array + */ + function _array_index(needle, haystack) { + var i; + for (i = 0; i < haystack.length; i++) { + if (haystack[i] == needle) return i; + } + return -1; + } + + function _merge_arrays_uniq() { + var result = []; + var uniq_hash = {}; + var i, j; + for (i = 0; i < arguments.length; i++) { + if (!arguments[i] || !arguments[i].length) continue; + for (j = 0; j < arguments[i].length; j++) { + if (uniq_hash[arguments[i][j]]) continue; + uniq_hash[arguments[i][j]] = true; + result.push(arguments[i][j]); + } + } + return result; + } + + /** + * Clean function that checks the different node types and cleans them up accordingly + * @param elem DOM Node to clean + */ + function _clean(elem) { + var clone; + switch (elem.nodeType) { + // Element + case 1: + _clean_element.call(this, elem); + break; + // Text + case 3: + clone = elem.cloneNode(false); + this.current_element.appendChild(clone); + break; + // Entity-Reference (normally not used) + case 5: + clone = elem.cloneNode(false); + this.current_element.appendChild(clone); + break; + // Comment + case 8: + if (this.config.allow_comments) { + clone = elem.cloneNode(false); + this.current_element.appendChild(clone); + } + break; + default: + if (console && console.log) console.log("unknown node type", elem.nodeType); + break; + } + } + + function _clean_element(elem) { + var i, j, clone, parent_element, name, allowed_attributes, attr, attr_name, attr_node, protocols, del, attr_ok; + var transform = _transform_element.call(this, elem); + + elem = transform.node; + name = elem.nodeName.toLowerCase(); + + // check if element itself is allowed + parent_element = this.current_element; + if (this.allowed_elements[name] || transform.whitelist) { + this.current_element = this.dom.createElement(elem.nodeName); + parent_element.appendChild(this.current_element); + + // clean attributes + var attrs = this.config.attributes; + allowed_attributes = _merge_arrays_uniq(attrs[name], attrs[Sanitize.ALL], transform.attr_whitelist); + for (i = 0; i < allowed_attributes.length; i++) { + attr_name = allowed_attributes[i]; + attr = elem.attributes[attr_name]; + if (attr) { + attr_ok = true; + // Check protocol attributes for valid protocol + if (this.config.protocols[name] && this.config.protocols[name][attr_name]) { + protocols = this.config.protocols[name][attr_name]; + del = attr.value.toLowerCase().match(Sanitize.REGEX_PROTOCOL); + if (del) { + attr_ok = _array_index(del[1], protocols) != -1; + } else { + attr_ok = _array_index(Sanitize.RELATIVE, protocols) != -1; + } + } + if (attr_ok) { + attr_node = document.createAttribute(attr_name); + attr_node.value = attr.value; + this.current_element.setAttributeNode(attr_node); + } + } + } + + // Add attributes + if (this.config.add_attributes[name]) { + for (attr_name in this.config.add_attributes[name]) { + attr_node = document.createAttribute(attr_name); + attr_node.value = this.config.add_attributes[name][attr_name]; + this.current_element.setAttributeNode(attr_node); + } + } + } // End checking if element is allowed + // If this node is in the dynamic whitelist array (built at runtime by + // transformers), let it live with all of its attributes intact. + else if (_array_index(elem, this.whitelist_nodes) != -1) { + this.current_element = elem.cloneNode(true); + // Remove child nodes, they will be sanitiazied and added by other code + while (this.current_element.childNodes.length > 0) { + this.current_element.removeChild(this.current_element.firstChild); + } + parent_element.appendChild(this.current_element); + } + + // iterate over child nodes + if (!this.config.remove_all_contents && !this.config.remove_element_contents[name]) { + for (i = 0; i < elem.childNodes.length; i++) { + _clean.call(this, elem.childNodes[i]); + } + } + + // some versions of IE don't support normalize. + if (this.current_element.normalize) { + this.current_element.normalize(); + } + this.current_element = parent_element; + } // END clean_element function + + function _transform_element(node) { + var output = { + attr_whitelist: [], + node: node, + whitelist: false + }; + var i, j, transform; + for (i = 0; i < this.transformers.length; i++) { + transform = this.transformers[i]({ + allowed_elements: this.allowed_elements, + config: this.config, + node: node, + node_name: node.nodeName.toLowerCase(), + whitelist_nodes: this.whitelist_nodes, + dom: this.dom + }); + if (transform == null) continue;else if ((typeof transform === 'undefined' ? 'undefined' : _typeof(transform)) == 'object') { + if (transform.whitelist_nodes && transform.whitelist_nodes instanceof Array) { + for (j = 0; j < transform.whitelist_nodes.length; j++) { + if (_array_index(transform.whitelist_nodes[j], this.whitelist_nodes) == -1) { + this.whitelist_nodes.push(transform.whitelist_nodes[j]); + } + } + } + output.whitelist = transform.whitelist ? true : false; + if (transform.attr_whitelist) { + output.attr_whitelist = _merge_arrays_uniq(output.attr_whitelist, transform.attr_whitelist); + } + output.node = transform.node ? transform.node : output.node; + } else { + throw new Error("transformer output must be an object or null"); + } + } + return output; + } + + for (i = 0; i < container.childNodes.length; i++) { + _clean.call(this, container.childNodes[i]); + } + + if (fragment.normalize) { + fragment.normalize(); + } + + return fragment; + }; + + if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () { + return Sanitize; + }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } + + __webpack_require__(80); + __webpack_require__(81); + __webpack_require__(82); + + module.exports = Sanitize; + +/***/ }, + +/***/ 80: +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var Sanitize = __webpack_require__(79); + + if (!Sanitize.Config) { + Sanitize.Config = {}; + } + + Sanitize.Config.BASIC = { + elements: ['a', 'b', 'blockquote', 'br', 'cite', 'code', 'dd', 'dl', 'dt', 'em', 'i', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'u', 'ul'], + + attributes: { + 'a': ['href'], + 'blockquote': ['cite'], + 'q': ['cite'] + }, + + add_attributes: { + 'a': { 'rel': 'nofollow' } + }, + + protocols: { + 'a': { 'href': ['ftp', 'http', 'https', 'mailto', Sanitize.RELATIVE] }, + 'blockquote': { 'cite': ['http', 'https', Sanitize.RELATIVE] }, + 'q': { 'cite': ['http', 'https', Sanitize.RELATIVE] } + } + }; + + codex.sanitizer = Sanitize; + +/***/ }, + +/***/ 81: +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var Sanitize = __webpack_require__(79); + + if (!Sanitize.Config) { + Sanitize.Config = {}; + } + + Sanitize.Config.RELAXED = { + elements: ['a', 'b', 'blockquote', 'br', 'caption', 'cite', 'code', 'col', 'colgroup', 'dd', 'dl', 'dt', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'i', 'img', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'u', 'ul'], + + attributes: { + 'a': ['href', 'title'], + 'blockquote': ['cite'], + 'col': ['span', 'width'], + 'colgroup': ['span', 'width'], + 'img': ['align', 'alt', 'height', 'src', 'title', 'width'], + 'ol': ['start', 'type'], + 'q': ['cite'], + 'table': ['summary', 'width'], + 'td': ['abbr', 'axis', 'colspan', 'rowspan', 'width'], + 'th': ['abbr', 'axis', 'colspan', 'rowspan', 'scope', 'width'], + 'ul': ['type'] + }, + + protocols: { + 'a': { 'href': ['ftp', 'http', 'https', 'mailto', Sanitize.RELATIVE] }, + 'blockquote': { 'cite': ['http', 'https', Sanitize.RELATIVE] }, + 'img': { 'src': ['http', 'https', Sanitize.RELATIVE] }, + 'q': { 'cite': ['http', 'https', Sanitize.RELATIVE] } + } + }; + + codex.sanitizer = Sanitize; + +/***/ }, + +/***/ 82: +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var Sanitize = __webpack_require__(79); + + if (!Sanitize.Config) { + Sanitize.Config = {}; + } + + Sanitize.Config.RESTRICTED = { + elements: ['a', 'b', 'em', 'i', 'strong', 'u'] + }; + + codex.sanitizer = Sanitize; + /***/ } -/******/ ]); + +/******/ }); //# sourceMappingURL=codex-editor.js.map \ No newline at end of file diff --git a/codex-editor.js.map b/codex-editor.js.map index cc8b8d4d6..1d53f7120 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap a410e52e605280496ef3","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","version","major","minor","build","BUILD","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","currentNode","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","dfs","clearStyles","href","blockTags","allowedTags","needReplace","includes","tagName","isDisplayedAsBlock","replace","getAttribute","attributes","removeAttribute","sanitized","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","tabKeyPressed","enterKeyPressed","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","firstLevelBlocksArea","clickedOnFirstLevelBlockArea","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","_blockPaste","observer","MutationObserver","handlePasteEvents","config","childList","characterData","observe","mutations","currentToolType","bar","placeholder","div","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","getSeparatedTextFromContent","split","insertPastedContent","parsedTextContent","parseTextareaContent","initialContent","getNodesFromString","appendNodesToRedactor","inputString","contentHolder","createBlockByDomNode","nodeList","item","storeBlockType","parentBlock","nodeContent","isPlainTextNode"],"mappings":"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","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap a410e52e605280496ef3","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.0.6\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n };\n\n codex.version = {\n major : MAJOR,\n minor : MINOR,\n build : BUILD\n };\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, false);\n\n /**\n * Pasting content from another source\n */\n block.addEventListener('paste', function (event) {\n codex.callback.blockPaste(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar content = (function(content) {\n\n content.currentNode = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize(mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses DFS function for deep searching\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n for (var i = 0; i < target.childNodes.length; i++) {\n this.dfs(target.childNodes[i]);\n }\n };\n\n /**\n * Clears styles\n * @param {Element|Text}\n */\n content.clearStyles = function(target) {\n\n var href,\n newNode = null,\n blockTags = ['P', 'BLOCKQUOTE', 'UL', 'CODE', 'OL', 'LI', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'DIV', 'PRE', 'HEADER', 'SECTION'],\n allowedTags = ['P', 'B', 'I', 'A', 'U', 'BR'],\n needReplace = !allowedTags.includes(target.tagName),\n isDisplayedAsBlock = blockTags.includes(target.tagName);\n\n if (!codex.core.isDomNode(target)){\n return target;\n }\n\n if (!target.parentNode){\n return target;\n }\n\n if (needReplace) {\n\n if (isDisplayedAsBlock) {\n\n newNode = document.createElement('P');\n newNode.innerHTML = target.innerHTML;\n target.parentNode.replaceChild(newNode, target);\n target = newNode;\n\n } else {\n\n newNode = document.createTextNode(` ${target.textContent} `);\n newNode.textContent = newNode.textContent.replace(/\\s{2,}/g, ' ');\n target.parentNode.replaceChild(newNode, target);\n\n }\n }\n\n /** keep href attributes of tag A */\n if (target.tagName == 'A') {\n href = target.getAttribute('href');\n }\n\n /** Remove all tags */\n while(target.attributes.length > 0) {\n target.removeAttribute(target.attributes[0].name);\n }\n\n /** return href */\n if (href) {\n target.setAttribute('href', href);\n }\n\n return target;\n\n };\n\n /**\n * Depth-first search Algorithm\n * returns all childs\n * @param {Element}\n */\n content.dfs = function(el) {\n\n if (!codex.core.isDomNode(el))\n return;\n\n var sanitized = this.clearStyles(el);\n\n for(var i = 0; i < sanitized.childNodes.length; i++) {\n this.dfs(sanitized.childNodes[i]);\n }\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function() {\n require('./toolbar');\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n codex.toolbar.settings.close();\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n if (!codex.tools[tool].displayInToolbox)\n hiddenToolsAmount ++;\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n break;\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n appendCallback.call(event);\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressed = function(event){\n\n /** Set current node */\n var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea();\n\n if (firstLevelBlocksArea) {\n event.preventDefault();\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n return;\n }\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n return;\n\n }\n\n /**\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != 'paragraph' || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.clickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n\n if (selection.rangeCount == 0) {\n\n return true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n return flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n }, 10);\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n mutations.forEach(codex.content.paste);\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar parser = (function(parser) {\n\n /**\n * Splits content by `\\n` and returns blocks\n */\n parser.getSeparatedTextFromContent = function(content) {\n return content.split('\\n');\n };\n\n /** inserting text */\n parser.insertPastedContent = function(content) {\n\n var blocks = this.getSeparatedTextFromContent(content),\n i,\n inputIndex = cEditor.caret.getCurrentInputIndex(),\n textNode,\n parsedTextContent;\n\n for(i = 0; i < blocks.length; i++) {\n\n blocks[i].trim();\n\n if (blocks[i]) {\n var data = cEditor.draw.pluginsRender('paragraph', blocks[i]);\n cEditor.content.insertBlock(data);\n }\n }\n\n };\n\n /**\n * Asynchronously parses textarea input string to HTML editor blocks\n */\n parser.parseTextareaContent = function () {\n\n var initialContent = cEditor.nodes.textarea.value;\n\n if ( initialContent.trim().length === 0 ) return true;\n\n\n cEditor.parser\n\n /** Get child nodes async-aware */\n .getNodesFromString(initialContent)\n\n /** Then append nodes to the redactor */\n .then(cEditor.parser.appendNodesToRedactor)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n cEditor.core.log('Error while parsing content: %o', 'warn', error);\n });\n\n };\n\n /**\n * Parses string to nodeList\n * @param string inputString\n * @return Primise -> nodeList\n */\n parser.getNodesFromString = function (inputString) {\n\n return Promise.resolve().then(function() {\n\n var contentHolder = document.createElement('div');\n\n contentHolder.innerHTML = inputString;\n\n /**\n * Returning childNodes will include:\n * - Elements (html-tags),\n * - Texts (empty-spaces or non-wrapped strings )\n * - Comments and other\n */\n return contentHolder.childNodes;\n\n });\n };\n\n /**\n * Appends nodes to the redactor\n * @param nodeList nodes - list for nodes to append\n */\n parser.appendNodesToRedactor = function(nodes) {\n\n /**\n * Sequence of one-by-one nodes appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n\n for (var index = 0; index < nodes.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n parser.appendNodeAtIndex = function (nodeSequence, nodes, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return cEditor.parser.getNodeAsync(nodes , index);\n\n })\n\n /**\n * second, compose editor-block from node\n * and append it to redactor\n */\n .then(function(node){\n\n var block = cEditor.parser.createBlockByDomNode(node);\n\n if ( cEditor.core.isDomNode(block) ) {\n\n block.contentEditable = \"true\";\n\n /** Mark node as redactor block*/\n block.classList.add('ce-block');\n\n /** Append block to the redactor */\n cEditor.nodes.redactor.appendChild(block);\n\n /** Save block to the cEditor.state array */\n cEditor.state.blocks.push(block);\n\n return block;\n\n }\n return null;\n })\n\n .then(cEditor.ui.addBlockHandlers)\n\n /** Log if something wrong with node */\n .catch(function(error) {\n cEditor.core.log('Node skipped while parsing because %o', 'warn', error);\n });\n\n };\n\n /**\n * Asynchronously returns node from nodeList by index\n * @return Promise to node\n */\n parser.getNodeAsync = function (nodeList, index) {\n\n return Promise.resolve().then(function() {\n\n return nodeList.item(index);\n\n });\n };\n\n /**\n * Creates editor block by DOM node\n *\n * First-level blocks (see cEditor.settings.blockTags) saves as-is,\n * other wrapps with

-tag\n *\n * @param DOMnode node\n * @return First-level node (paragraph)\n */\n parser.createBlockByDomNode = function (node) {\n\n /** First level nodes already appears as blocks */\n if ( cEditor.parser.isFirstLevelBlock(node) ){\n\n /** Save plugin type in data-type */\n node = this.storeBlockType(node);\n\n return node;\n }\n\n /** Other nodes wraps into parent block (paragraph-tag) */\n var parentBlock,\n nodeContent = node.textContent.trim(),\n isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG;\n\n\n /** Skip empty textNodes with space-symbols */\n if (isPlainTextNode && !nodeContent.length) return null;\n\n /** Make

tag */\n parentBlock = cEditor.draw.block('P');\n\n if (isPlainTextNode){\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\n } else {\n parentBlock.appendChild(node);\n }\n\n /** Save plugin type in data-type */\n parentBlock = this.storeBlockType(parentBlock);\n\n return parentBlock;\n\n };\n\n /**\n * It's a crutch\n * - - - - - - -\n * We need block type stored as data-attr\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\n * Remove it after updating parser module for the block-oriented structure:\n * - each block must have stored type\n * @param {Element} node\n */\n parser.storeBlockType = function (node) {\n\n switch (node.tagName) {\n case 'P' : node.dataset.tool = 'paragraph'; break;\n case 'H1':\n case 'H2':\n case 'H3':\n case 'H4':\n case 'H5':\n case 'H6': node.dataset.tool = 'header'; break;\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\n case 'CODE': node.dataset.tool = 'code'; break;\n }\n\n return node;\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 1aab2c7b78c407b98b7a","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js","webpack:///./modules/sanitizer/sanitize.js","webpack:///./modules/sanitizer/config/basic.js","webpack:///./modules/sanitizer/config/relaxed.js","webpack:///./modules/sanitizer/config/restricted.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","sanitizer","version","major","minor","build","BUILD","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","currentNode","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","Config","BASIC","clearHTML","clean_node","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","tabKeyPressed","enterKeyPressed","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","firstLevelBlocksArea","clickedOnFirstLevelBlockArea","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","_blockPaste","observer","MutationObserver","handlePasteEvents","config","attributes","childList","characterData","observe","mutations","currentToolType","bar","placeholder","div","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","getSeparatedTextFromContent","split","insertPastedContent","parsedTextContent","parseTextareaContent","initialContent","getNodesFromString","appendNodesToRedactor","inputString","contentHolder","createBlockByDomNode","nodeList","item","storeBlockType","parentBlock","nodeContent","isPlainTextNode","replace","Sanitize","options","ALL","allow_comments","allowed_elements","protocols","add_attributes","dom","remove_element_contents","remove_all_contents","remove_contents","Array","transformers","REGEX_PROTOCOL","RELATIVE","prototype","fragment","createDocumentFragment","current_element","whitelist_nodes","_array_index","needle","haystack","_merge_arrays_uniq","result","uniq_hash","j","_clean","elem","clone","_clean_element","cloneNode","parent_element","allowed_attributes","attr","attr_name","attr_node","del","attr_ok","_transform_element","nodeName","toLowerCase","whitelist","attrs","attr_whitelist","match","createAttribute","setAttributeNode","normalize","node_name","define","RELAXED","RESTRICTED"],"mappings":"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","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 1aab2c7b78c407b98b7a","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.0.6\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n codex.sanitizer = require('./modules/sanitizer/sanitize');\n };\n\n codex.version = {\n major : MAJOR,\n minor : MINOR,\n build : BUILD\n };\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, false);\n\n /**\n * Pasting content from another source\n */\n block.addEventListener('paste', function (event) {\n codex.callback.blockPaste(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.1.1\n */\n\nvar content = (function(content) {\n\n content.currentNode = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize(mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses DFS function for deep searching\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n console.log(target);\n\n var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC);\n var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]);\n\n target.innerHTML = \"\";\n target.appendChild(clearHTML);\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function() {\n require('./toolbar');\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n codex.toolbar.settings.close();\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n if (!codex.tools[tool].displayInToolbox)\n hiddenToolsAmount ++;\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n break;\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n appendCallback.call(event);\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressed = function(event){\n\n /** Set current node */\n var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea();\n\n if (firstLevelBlocksArea) {\n event.preventDefault();\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n return;\n }\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n return;\n\n }\n\n /**\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != 'paragraph' || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.clickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n\n if (selection.rangeCount == 0) {\n\n return true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n return flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n }, 10);\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n mutations.forEach(codex.content.paste);\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar parser = (function(parser) {\n\n /**\n * Splits content by `\\n` and returns blocks\n */\n parser.getSeparatedTextFromContent = function(content) {\n return content.split('\\n');\n };\n\n /** inserting text */\n parser.insertPastedContent = function(content) {\n\n var blocks = this.getSeparatedTextFromContent(content),\n i,\n inputIndex = cEditor.caret.getCurrentInputIndex(),\n textNode,\n parsedTextContent;\n\n for(i = 0; i < blocks.length; i++) {\n\n blocks[i].trim();\n\n if (blocks[i]) {\n var data = cEditor.draw.pluginsRender('paragraph', blocks[i]);\n cEditor.content.insertBlock(data);\n }\n }\n\n };\n\n /**\n * Asynchronously parses textarea input string to HTML editor blocks\n */\n parser.parseTextareaContent = function () {\n\n var initialContent = cEditor.nodes.textarea.value;\n\n if ( initialContent.trim().length === 0 ) return true;\n\n\n cEditor.parser\n\n /** Get child nodes async-aware */\n .getNodesFromString(initialContent)\n\n /** Then append nodes to the redactor */\n .then(cEditor.parser.appendNodesToRedactor)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n cEditor.core.log('Error while parsing content: %o', 'warn', error);\n });\n\n };\n\n /**\n * Parses string to nodeList\n * @param string inputString\n * @return Primise -> nodeList\n */\n parser.getNodesFromString = function (inputString) {\n\n return Promise.resolve().then(function() {\n\n var contentHolder = document.createElement('div');\n\n contentHolder.innerHTML = inputString;\n\n /**\n * Returning childNodes will include:\n * - Elements (html-tags),\n * - Texts (empty-spaces or non-wrapped strings )\n * - Comments and other\n */\n return contentHolder.childNodes;\n\n });\n };\n\n /**\n * Appends nodes to the redactor\n * @param nodeList nodes - list for nodes to append\n */\n parser.appendNodesToRedactor = function(nodes) {\n\n /**\n * Sequence of one-by-one nodes appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n\n for (var index = 0; index < nodes.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n parser.appendNodeAtIndex = function (nodeSequence, nodes, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return cEditor.parser.getNodeAsync(nodes , index);\n\n })\n\n /**\n * second, compose editor-block from node\n * and append it to redactor\n */\n .then(function(node){\n\n var block = cEditor.parser.createBlockByDomNode(node);\n\n if ( cEditor.core.isDomNode(block) ) {\n\n block.contentEditable = \"true\";\n\n /** Mark node as redactor block*/\n block.classList.add('ce-block');\n\n /** Append block to the redactor */\n cEditor.nodes.redactor.appendChild(block);\n\n /** Save block to the cEditor.state array */\n cEditor.state.blocks.push(block);\n\n return block;\n\n }\n return null;\n })\n\n .then(cEditor.ui.addBlockHandlers)\n\n /** Log if something wrong with node */\n .catch(function(error) {\n cEditor.core.log('Node skipped while parsing because %o', 'warn', error);\n });\n\n };\n\n /**\n * Asynchronously returns node from nodeList by index\n * @return Promise to node\n */\n parser.getNodeAsync = function (nodeList, index) {\n\n return Promise.resolve().then(function() {\n\n return nodeList.item(index);\n\n });\n };\n\n /**\n * Creates editor block by DOM node\n *\n * First-level blocks (see cEditor.settings.blockTags) saves as-is,\n * other wrapps with

-tag\n *\n * @param DOMnode node\n * @return First-level node (paragraph)\n */\n parser.createBlockByDomNode = function (node) {\n\n /** First level nodes already appears as blocks */\n if ( cEditor.parser.isFirstLevelBlock(node) ){\n\n /** Save plugin type in data-type */\n node = this.storeBlockType(node);\n\n return node;\n }\n\n /** Other nodes wraps into parent block (paragraph-tag) */\n var parentBlock,\n nodeContent = node.textContent.trim(),\n isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG;\n\n\n /** Skip empty textNodes with space-symbols */\n if (isPlainTextNode && !nodeContent.length) return null;\n\n /** Make

tag */\n parentBlock = cEditor.draw.block('P');\n\n if (isPlainTextNode){\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\n } else {\n parentBlock.appendChild(node);\n }\n\n /** Save plugin type in data-type */\n parentBlock = this.storeBlockType(parentBlock);\n\n return parentBlock;\n\n };\n\n /**\n * It's a crutch\n * - - - - - - -\n * We need block type stored as data-attr\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\n * Remove it after updating parser module for the block-oriented structure:\n * - each block must have stored type\n * @param {Element} node\n */\n parser.storeBlockType = function (node) {\n\n switch (node.tagName) {\n case 'P' : node.dataset.tool = 'paragraph'; break;\n case 'H1':\n case 'H2':\n case 'H3':\n case 'H4':\n case 'H5':\n case 'H6': node.dataset.tool = 'header'; break;\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\n case 'CODE': node.dataset.tool = 'code'; break;\n }\n\n return node;\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Copyright (c) 2010 by Gabriel Birke\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nfunction Sanitize(){\n var i, e, options;\n options = arguments[0] || {};\n this.config = {};\n this.config.elements = options.elements ? options.elements : [];\n this.config.attributes = options.attributes ? options.attributes : {};\n this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];\n this.config.allow_comments = options.allow_comments ? options.allow_comments : false;\n this.allowed_elements = {};\n this.config.protocols = options.protocols ? options.protocols : {};\n this.config.add_attributes = options.add_attributes ? options.add_attributes : {};\n this.dom = options.dom ? options.dom : document;\n for(i=0;i 0) {\n this.current_element.removeChild(this.current_element.firstChild);\n }\n parent_element.appendChild(this.current_element);\n }\n\n // iterate over child nodes\n if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {\n for(i=0;i - - + + diff --git a/modules/content.js b/modules/content.js index aea157589..c87fc3a6b 100644 --- a/modules/content.js +++ b/modules/content.js @@ -3,7 +3,7 @@ * Works with DOM * * @author Codex Team - * @version 1.0 + * @version 1.1.1 */ var content = (function(content) { @@ -553,84 +553,13 @@ var content = (function(content) { return; } - for (var i = 0; i < target.childNodes.length; i++) { - this.dfs(target.childNodes[i]); - } - }; - - /** - * Clears styles - * @param {Element|Text} - */ - content.clearStyles = function(target) { - - var href, - newNode = null, - blockTags = ['P', 'BLOCKQUOTE', 'UL', 'CODE', 'OL', 'LI', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'DIV', 'PRE', 'HEADER', 'SECTION'], - allowedTags = ['P', 'B', 'I', 'A', 'U', 'BR'], - needReplace = !allowedTags.includes(target.tagName), - isDisplayedAsBlock = blockTags.includes(target.tagName); - - if (!codex.core.isDomNode(target)){ - return target; - } - - if (!target.parentNode){ - return target; - } - - if (needReplace) { - - if (isDisplayedAsBlock) { - - newNode = document.createElement('P'); - newNode.innerHTML = target.innerHTML; - target.parentNode.replaceChild(newNode, target); - target = newNode; - - } else { - - newNode = document.createTextNode(` ${target.textContent} `); - newNode.textContent = newNode.textContent.replace(/\s{2,}/g, ' '); - target.parentNode.replaceChild(newNode, target); - - } - } + console.log(target); - /** keep href attributes of tag A */ - if (target.tagName == 'A') { - href = target.getAttribute('href'); - } - - /** Remove all tags */ - while(target.attributes.length > 0) { - target.removeAttribute(target.attributes[0].name); - } + var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC); + var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]); - /** return href */ - if (href) { - target.setAttribute('href', href); - } - - return target; - - }; - - /** - * Depth-first search Algorithm - * returns all childs - * @param {Element} - */ - content.dfs = function(el) { - - if (!codex.core.isDomNode(el)) - return; - - var sanitized = this.clearStyles(el); - - for(var i = 0; i < sanitized.childNodes.length; i++) { - this.dfs(sanitized.childNodes[i]); - } + target.innerHTML = ""; + target.appendChild(clearHTML); }; diff --git a/modules/sanitizer/config/basic.js b/modules/sanitizer/config/basic.js new file mode 100644 index 000000000..6dc4926b4 --- /dev/null +++ b/modules/sanitizer/config/basic.js @@ -0,0 +1,31 @@ +var Sanitize = require('../sanitize'); + +if(!Sanitize.Config) { + Sanitize.Config = {} +} + +Sanitize.Config.BASIC = { + elements: [ + 'a', 'b', 'blockquote', 'br', 'cite', 'code', 'dd', 'dl', 'dt', 'em', + 'i', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', + 'sup', 'u', 'ul'], + + attributes: { + 'a' : ['href'], + 'blockquote': ['cite'], + 'q' : ['cite'] + }, + + add_attributes: { + 'a': {'rel': 'nofollow'} + }, + + protocols: { + 'a' : {'href': ['ftp', 'http', 'https', 'mailto', + Sanitize.RELATIVE]}, + 'blockquote': {'cite': ['http', 'https', Sanitize.RELATIVE]}, + 'q' : {'cite': ['http', 'https', Sanitize.RELATIVE]} + } +}; + +codex.sanitizer = Sanitize; diff --git a/modules/sanitizer/config/relaxed.js b/modules/sanitizer/config/relaxed.js new file mode 100644 index 000000000..e4eea1435 --- /dev/null +++ b/modules/sanitizer/config/relaxed.js @@ -0,0 +1,39 @@ +var Sanitize = require('../sanitize'); + +if(!Sanitize.Config) { + Sanitize.Config = {} +} + +Sanitize.Config.RELAXED = { + elements: [ + 'a', 'b', 'blockquote', 'br', 'caption', 'cite', 'code', 'col', + 'colgroup', 'dd', 'dl', 'dt', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'i', 'img', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', + 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'u', + 'ul'], + + attributes: { + 'a' : ['href', 'title'], + 'blockquote': ['cite'], + 'col' : ['span', 'width'], + 'colgroup' : ['span', 'width'], + 'img' : ['align', 'alt', 'height', 'src', 'title', 'width'], + 'ol' : ['start', 'type'], + 'q' : ['cite'], + 'table' : ['summary', 'width'], + 'td' : ['abbr', 'axis', 'colspan', 'rowspan', 'width'], + 'th' : ['abbr', 'axis', 'colspan', 'rowspan', 'scope', + 'width'], + 'ul' : ['type'] + }, + + protocols: { + 'a' : {'href': ['ftp', 'http', 'https', 'mailto', + Sanitize.RELATIVE]}, + 'blockquote': {'cite': ['http', 'https', Sanitize.RELATIVE]}, + 'img' : {'src' : ['http', 'https', Sanitize.RELATIVE]}, + 'q' : {'cite': ['http', 'https', Sanitize.RELATIVE]} + } +}; + +codex.sanitizer = Sanitize; \ No newline at end of file diff --git a/modules/sanitizer/config/restricted.js b/modules/sanitizer/config/restricted.js new file mode 100644 index 000000000..0667a37f3 --- /dev/null +++ b/modules/sanitizer/config/restricted.js @@ -0,0 +1,11 @@ +var Sanitize = require('../sanitize'); + +if(!Sanitize.Config) { + Sanitize.Config = {} +} + +Sanitize.Config.RESTRICTED = { + elements: ['a', 'b', 'em', 'i', 'strong', 'u'] +}; + +codex.sanitizer = Sanitize; diff --git a/modules/sanitizer/sanitize.js b/modules/sanitizer/sanitize.js new file mode 100644 index 000000000..5f53356e8 --- /dev/null +++ b/modules/sanitizer/sanitize.js @@ -0,0 +1,265 @@ +/** + * Copyright (c) 2010 by Gabriel Birke + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the 'Software'), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +function Sanitize(){ + var i, e, options; + options = arguments[0] || {}; + this.config = {}; + this.config.elements = options.elements ? options.elements : []; + this.config.attributes = options.attributes ? options.attributes : {}; + this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : []; + this.config.allow_comments = options.allow_comments ? options.allow_comments : false; + this.allowed_elements = {}; + this.config.protocols = options.protocols ? options.protocols : {}; + this.config.add_attributes = options.add_attributes ? options.add_attributes : {}; + this.dom = options.dom ? options.dom : document; + for(i=0;i 0) { + this.current_element.removeChild(this.current_element.firstChild); + } + parent_element.appendChild(this.current_element); + } + + // iterate over child nodes + if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) { + for(i=0;i Date: Sun, 25 Dec 2016 00:32:41 +0300 Subject: [PATCH 02/11] removed console logs --- codex-editor.js | 5 ++--- codex-editor.js.map | 2 +- modules/content.js | 5 ++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/codex-editor.js b/codex-editor.js index 4f4506e04..2ce9f7274 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -1664,7 +1664,8 @@ var codex = * * Sanitizes HTML content * @param {Element} target - inserted element - * @uses DFS function for deep searching + * @uses Sanitize library and BASIC configuration + * @todo Fix caret positioning */ content.sanitize = function (target) { @@ -1672,8 +1673,6 @@ var codex = return; } - console.log(target); - var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC); var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]); diff --git a/codex-editor.js.map b/codex-editor.js.map index 1d53f7120..efae2f015 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 1aab2c7b78c407b98b7a","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js","webpack:///./modules/sanitizer/sanitize.js","webpack:///./modules/sanitizer/config/basic.js","webpack:///./modules/sanitizer/config/relaxed.js","webpack:///./modules/sanitizer/config/restricted.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","sanitizer","version","major","minor","build","BUILD","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","currentNode","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","Config","BASIC","clearHTML","clean_node","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","tabKeyPressed","enterKeyPressed","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","firstLevelBlocksArea","clickedOnFirstLevelBlockArea","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","_blockPaste","observer","MutationObserver","handlePasteEvents","config","attributes","childList","characterData","observe","mutations","currentToolType","bar","placeholder","div","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","getSeparatedTextFromContent","split","insertPastedContent","parsedTextContent","parseTextareaContent","initialContent","getNodesFromString","appendNodesToRedactor","inputString","contentHolder","createBlockByDomNode","nodeList","item","storeBlockType","parentBlock","nodeContent","isPlainTextNode","replace","Sanitize","options","ALL","allow_comments","allowed_elements","protocols","add_attributes","dom","remove_element_contents","remove_all_contents","remove_contents","Array","transformers","REGEX_PROTOCOL","RELATIVE","prototype","fragment","createDocumentFragment","current_element","whitelist_nodes","_array_index","needle","haystack","_merge_arrays_uniq","result","uniq_hash","j","_clean","elem","clone","_clean_element","cloneNode","parent_element","allowed_attributes","attr","attr_name","attr_node","del","attr_ok","_transform_element","nodeName","toLowerCase","whitelist","attrs","attr_whitelist","match","createAttribute","setAttributeNode","normalize","node_name","define","RELAXED","RESTRICTED"],"mappings":"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","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 1aab2c7b78c407b98b7a","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.0.6\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n codex.sanitizer = require('./modules/sanitizer/sanitize');\n };\n\n codex.version = {\n major : MAJOR,\n minor : MINOR,\n build : BUILD\n };\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, false);\n\n /**\n * Pasting content from another source\n */\n block.addEventListener('paste', function (event) {\n codex.callback.blockPaste(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.1.1\n */\n\nvar content = (function(content) {\n\n content.currentNode = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize(mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses DFS function for deep searching\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n console.log(target);\n\n var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC);\n var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]);\n\n target.innerHTML = \"\";\n target.appendChild(clearHTML);\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function() {\n require('./toolbar');\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n codex.toolbar.settings.close();\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n if (!codex.tools[tool].displayInToolbox)\n hiddenToolsAmount ++;\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n break;\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n appendCallback.call(event);\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressed = function(event){\n\n /** Set current node */\n var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea();\n\n if (firstLevelBlocksArea) {\n event.preventDefault();\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n return;\n }\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n return;\n\n }\n\n /**\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != 'paragraph' || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.clickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n\n if (selection.rangeCount == 0) {\n\n return true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n return flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n }, 10);\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n mutations.forEach(codex.content.paste);\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar parser = (function(parser) {\n\n /**\n * Splits content by `\\n` and returns blocks\n */\n parser.getSeparatedTextFromContent = function(content) {\n return content.split('\\n');\n };\n\n /** inserting text */\n parser.insertPastedContent = function(content) {\n\n var blocks = this.getSeparatedTextFromContent(content),\n i,\n inputIndex = cEditor.caret.getCurrentInputIndex(),\n textNode,\n parsedTextContent;\n\n for(i = 0; i < blocks.length; i++) {\n\n blocks[i].trim();\n\n if (blocks[i]) {\n var data = cEditor.draw.pluginsRender('paragraph', blocks[i]);\n cEditor.content.insertBlock(data);\n }\n }\n\n };\n\n /**\n * Asynchronously parses textarea input string to HTML editor blocks\n */\n parser.parseTextareaContent = function () {\n\n var initialContent = cEditor.nodes.textarea.value;\n\n if ( initialContent.trim().length === 0 ) return true;\n\n\n cEditor.parser\n\n /** Get child nodes async-aware */\n .getNodesFromString(initialContent)\n\n /** Then append nodes to the redactor */\n .then(cEditor.parser.appendNodesToRedactor)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n cEditor.core.log('Error while parsing content: %o', 'warn', error);\n });\n\n };\n\n /**\n * Parses string to nodeList\n * @param string inputString\n * @return Primise -> nodeList\n */\n parser.getNodesFromString = function (inputString) {\n\n return Promise.resolve().then(function() {\n\n var contentHolder = document.createElement('div');\n\n contentHolder.innerHTML = inputString;\n\n /**\n * Returning childNodes will include:\n * - Elements (html-tags),\n * - Texts (empty-spaces or non-wrapped strings )\n * - Comments and other\n */\n return contentHolder.childNodes;\n\n });\n };\n\n /**\n * Appends nodes to the redactor\n * @param nodeList nodes - list for nodes to append\n */\n parser.appendNodesToRedactor = function(nodes) {\n\n /**\n * Sequence of one-by-one nodes appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n\n for (var index = 0; index < nodes.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n parser.appendNodeAtIndex = function (nodeSequence, nodes, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return cEditor.parser.getNodeAsync(nodes , index);\n\n })\n\n /**\n * second, compose editor-block from node\n * and append it to redactor\n */\n .then(function(node){\n\n var block = cEditor.parser.createBlockByDomNode(node);\n\n if ( cEditor.core.isDomNode(block) ) {\n\n block.contentEditable = \"true\";\n\n /** Mark node as redactor block*/\n block.classList.add('ce-block');\n\n /** Append block to the redactor */\n cEditor.nodes.redactor.appendChild(block);\n\n /** Save block to the cEditor.state array */\n cEditor.state.blocks.push(block);\n\n return block;\n\n }\n return null;\n })\n\n .then(cEditor.ui.addBlockHandlers)\n\n /** Log if something wrong with node */\n .catch(function(error) {\n cEditor.core.log('Node skipped while parsing because %o', 'warn', error);\n });\n\n };\n\n /**\n * Asynchronously returns node from nodeList by index\n * @return Promise to node\n */\n parser.getNodeAsync = function (nodeList, index) {\n\n return Promise.resolve().then(function() {\n\n return nodeList.item(index);\n\n });\n };\n\n /**\n * Creates editor block by DOM node\n *\n * First-level blocks (see cEditor.settings.blockTags) saves as-is,\n * other wrapps with

-tag\n *\n * @param DOMnode node\n * @return First-level node (paragraph)\n */\n parser.createBlockByDomNode = function (node) {\n\n /** First level nodes already appears as blocks */\n if ( cEditor.parser.isFirstLevelBlock(node) ){\n\n /** Save plugin type in data-type */\n node = this.storeBlockType(node);\n\n return node;\n }\n\n /** Other nodes wraps into parent block (paragraph-tag) */\n var parentBlock,\n nodeContent = node.textContent.trim(),\n isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG;\n\n\n /** Skip empty textNodes with space-symbols */\n if (isPlainTextNode && !nodeContent.length) return null;\n\n /** Make

tag */\n parentBlock = cEditor.draw.block('P');\n\n if (isPlainTextNode){\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\n } else {\n parentBlock.appendChild(node);\n }\n\n /** Save plugin type in data-type */\n parentBlock = this.storeBlockType(parentBlock);\n\n return parentBlock;\n\n };\n\n /**\n * It's a crutch\n * - - - - - - -\n * We need block type stored as data-attr\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\n * Remove it after updating parser module for the block-oriented structure:\n * - each block must have stored type\n * @param {Element} node\n */\n parser.storeBlockType = function (node) {\n\n switch (node.tagName) {\n case 'P' : node.dataset.tool = 'paragraph'; break;\n case 'H1':\n case 'H2':\n case 'H3':\n case 'H4':\n case 'H5':\n case 'H6': node.dataset.tool = 'header'; break;\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\n case 'CODE': node.dataset.tool = 'code'; break;\n }\n\n return node;\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Copyright (c) 2010 by Gabriel Birke\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nfunction Sanitize(){\n var i, e, options;\n options = arguments[0] || {};\n this.config = {};\n this.config.elements = options.elements ? options.elements : [];\n this.config.attributes = options.attributes ? options.attributes : {};\n this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];\n this.config.allow_comments = options.allow_comments ? options.allow_comments : false;\n this.allowed_elements = {};\n this.config.protocols = options.protocols ? options.protocols : {};\n this.config.add_attributes = options.add_attributes ? options.add_attributes : {};\n this.dom = options.dom ? options.dom : document;\n for(i=0;i 0) {\n this.current_element.removeChild(this.current_element.firstChild);\n }\n parent_element.appendChild(this.current_element);\n }\n\n // iterate over child nodes\n if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {\n for(i=0;i nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.1.1\n */\n\nvar content = (function(content) {\n\n content.currentNode = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize(mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n * @todo Fix caret positioning\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC);\n var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]);\n\n target.innerHTML = \"\";\n target.appendChild(clearHTML);\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function() {\n require('./toolbar');\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n codex.toolbar.settings.close();\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n if (!codex.tools[tool].displayInToolbox)\n hiddenToolsAmount ++;\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n break;\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n appendCallback.call(event);\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressed = function(event){\n\n /** Set current node */\n var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea();\n\n if (firstLevelBlocksArea) {\n event.preventDefault();\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n return;\n }\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n return;\n\n }\n\n /**\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != 'paragraph' || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.clickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n\n if (selection.rangeCount == 0) {\n\n return true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n return flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n }, 10);\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n mutations.forEach(codex.content.paste);\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar parser = (function(parser) {\n\n /**\n * Splits content by `\\n` and returns blocks\n */\n parser.getSeparatedTextFromContent = function(content) {\n return content.split('\\n');\n };\n\n /** inserting text */\n parser.insertPastedContent = function(content) {\n\n var blocks = this.getSeparatedTextFromContent(content),\n i,\n inputIndex = cEditor.caret.getCurrentInputIndex(),\n textNode,\n parsedTextContent;\n\n for(i = 0; i < blocks.length; i++) {\n\n blocks[i].trim();\n\n if (blocks[i]) {\n var data = cEditor.draw.pluginsRender('paragraph', blocks[i]);\n cEditor.content.insertBlock(data);\n }\n }\n\n };\n\n /**\n * Asynchronously parses textarea input string to HTML editor blocks\n */\n parser.parseTextareaContent = function () {\n\n var initialContent = cEditor.nodes.textarea.value;\n\n if ( initialContent.trim().length === 0 ) return true;\n\n\n cEditor.parser\n\n /** Get child nodes async-aware */\n .getNodesFromString(initialContent)\n\n /** Then append nodes to the redactor */\n .then(cEditor.parser.appendNodesToRedactor)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n cEditor.core.log('Error while parsing content: %o', 'warn', error);\n });\n\n };\n\n /**\n * Parses string to nodeList\n * @param string inputString\n * @return Primise -> nodeList\n */\n parser.getNodesFromString = function (inputString) {\n\n return Promise.resolve().then(function() {\n\n var contentHolder = document.createElement('div');\n\n contentHolder.innerHTML = inputString;\n\n /**\n * Returning childNodes will include:\n * - Elements (html-tags),\n * - Texts (empty-spaces or non-wrapped strings )\n * - Comments and other\n */\n return contentHolder.childNodes;\n\n });\n };\n\n /**\n * Appends nodes to the redactor\n * @param nodeList nodes - list for nodes to append\n */\n parser.appendNodesToRedactor = function(nodes) {\n\n /**\n * Sequence of one-by-one nodes appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n\n for (var index = 0; index < nodes.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n parser.appendNodeAtIndex = function (nodeSequence, nodes, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return cEditor.parser.getNodeAsync(nodes , index);\n\n })\n\n /**\n * second, compose editor-block from node\n * and append it to redactor\n */\n .then(function(node){\n\n var block = cEditor.parser.createBlockByDomNode(node);\n\n if ( cEditor.core.isDomNode(block) ) {\n\n block.contentEditable = \"true\";\n\n /** Mark node as redactor block*/\n block.classList.add('ce-block');\n\n /** Append block to the redactor */\n cEditor.nodes.redactor.appendChild(block);\n\n /** Save block to the cEditor.state array */\n cEditor.state.blocks.push(block);\n\n return block;\n\n }\n return null;\n })\n\n .then(cEditor.ui.addBlockHandlers)\n\n /** Log if something wrong with node */\n .catch(function(error) {\n cEditor.core.log('Node skipped while parsing because %o', 'warn', error);\n });\n\n };\n\n /**\n * Asynchronously returns node from nodeList by index\n * @return Promise to node\n */\n parser.getNodeAsync = function (nodeList, index) {\n\n return Promise.resolve().then(function() {\n\n return nodeList.item(index);\n\n });\n };\n\n /**\n * Creates editor block by DOM node\n *\n * First-level blocks (see cEditor.settings.blockTags) saves as-is,\n * other wrapps with

-tag\n *\n * @param DOMnode node\n * @return First-level node (paragraph)\n */\n parser.createBlockByDomNode = function (node) {\n\n /** First level nodes already appears as blocks */\n if ( cEditor.parser.isFirstLevelBlock(node) ){\n\n /** Save plugin type in data-type */\n node = this.storeBlockType(node);\n\n return node;\n }\n\n /** Other nodes wraps into parent block (paragraph-tag) */\n var parentBlock,\n nodeContent = node.textContent.trim(),\n isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG;\n\n\n /** Skip empty textNodes with space-symbols */\n if (isPlainTextNode && !nodeContent.length) return null;\n\n /** Make

tag */\n parentBlock = cEditor.draw.block('P');\n\n if (isPlainTextNode){\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\n } else {\n parentBlock.appendChild(node);\n }\n\n /** Save plugin type in data-type */\n parentBlock = this.storeBlockType(parentBlock);\n\n return parentBlock;\n\n };\n\n /**\n * It's a crutch\n * - - - - - - -\n * We need block type stored as data-attr\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\n * Remove it after updating parser module for the block-oriented structure:\n * - each block must have stored type\n * @param {Element} node\n */\n parser.storeBlockType = function (node) {\n\n switch (node.tagName) {\n case 'P' : node.dataset.tool = 'paragraph'; break;\n case 'H1':\n case 'H2':\n case 'H3':\n case 'H4':\n case 'H5':\n case 'H6': node.dataset.tool = 'header'; break;\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\n case 'CODE': node.dataset.tool = 'code'; break;\n }\n\n return node;\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Copyright (c) 2010 by Gabriel Birke\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nfunction Sanitize(){\n var i, e, options;\n options = arguments[0] || {};\n this.config = {};\n this.config.elements = options.elements ? options.elements : [];\n this.config.attributes = options.attributes ? options.attributes : {};\n this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];\n this.config.allow_comments = options.allow_comments ? options.allow_comments : false;\n this.allowed_elements = {};\n this.config.protocols = options.protocols ? options.protocols : {};\n this.config.add_attributes = options.add_attributes ? options.add_attributes : {};\n this.dom = options.dom ? options.dom : document;\n for(i=0;i 0) {\n this.current_element.removeChild(this.current_element.firstChild);\n }\n parent_element.appendChild(this.current_element);\n }\n\n // iterate over child nodes\n if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {\n for(i=0;i Date: Sun, 25 Dec 2016 00:40:57 +0300 Subject: [PATCH 03/11] version updated --- codex-editor.js | 113 ++++++++++++++++++------------------------------ package.json | 2 +- 2 files changed, 44 insertions(+), 71 deletions(-) diff --git a/codex-editor.js b/codex-editor.js index 2ce9f7274..5c8abcc7d 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -41,9 +41,8 @@ var codex = /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ -/******/ ({ - -/***/ 0: +/******/ ([ +/* 0 */ /***/ function(module, exports, __webpack_require__) { /** @@ -56,8 +55,7 @@ var codex = module.exports = editor; /***/ }, - -/***/ 1: +/* 1 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -80,21 +78,17 @@ var codex = codex.renderer = __webpack_require__(5); codex.saver = __webpack_require__(6); codex.content = __webpack_require__(7); - codex.toolbar = __webpack_require__(68); - codex.tools = __webpack_require__(72); - codex.callback = __webpack_require__(73); - codex.draw = __webpack_require__(74); - codex.caret = __webpack_require__(75); - codex.notifications = __webpack_require__(76); - codex.parser = __webpack_require__(77); - codex.sanitizer = __webpack_require__(79); + codex.toolbar = __webpack_require__(8); + codex.tools = __webpack_require__(12); + codex.callback = __webpack_require__(13); + codex.draw = __webpack_require__(14); + codex.caret = __webpack_require__(15); + codex.notifications = __webpack_require__(16); + codex.parser = __webpack_require__(17); + codex.sanitizer = __webpack_require__(18); }; - codex.version = { - major: (1), - minor: (0), - build: (6) - }; + codex.version = ("1.0.6"); /** * @public @@ -196,8 +190,7 @@ var codex = module.exports = codex; /***/ }, - -/***/ 2: +/* 2 */ /***/ function(module, exports) { 'use strict'; @@ -379,8 +372,7 @@ var codex = module.exports = core; /***/ }, - -/***/ 3: +/* 3 */ /***/ function(module, exports) { 'use strict'; @@ -750,8 +742,7 @@ var codex = module.exports = ui; /***/ }, - -/***/ 4: +/* 4 */ /***/ function(module, exports) { 'use strict'; @@ -860,8 +851,7 @@ var codex = module.exports = transport; /***/ }, - -/***/ 5: +/* 5 */ /***/ function(module, exports) { 'use strict'; @@ -1032,8 +1022,7 @@ var codex = module.exports = renderer; /***/ }, - -/***/ 6: +/* 6 */ /***/ function(module, exports) { 'use strict'; @@ -1139,8 +1128,7 @@ var codex = module.exports = saver; /***/ }, - -/***/ 7: +/* 7 */ /***/ function(module, exports) { 'use strict'; @@ -1686,8 +1674,7 @@ var codex = module.exports = content; /***/ }, - -/***/ 68: +/* 8 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1706,9 +1693,9 @@ var codex = var toolbar = function (toolbar) { toolbar.init = function () { - toolbar.settings = __webpack_require__(69); - toolbar.inline = __webpack_require__(70); - toolbar.toolbox = __webpack_require__(71); + toolbar.settings = __webpack_require__(9); + toolbar.inline = __webpack_require__(10); + toolbar.toolbox = __webpack_require__(11); }; /** @@ -1798,8 +1785,7 @@ var codex = module.exports = toolbar; /***/ }, - -/***/ 69: +/* 9 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -2040,8 +2026,7 @@ var codex = module.exports = settings; /***/ }, - -/***/ 70: +/* 10 */ /***/ function(module, exports) { 'use strict'; @@ -2534,8 +2519,7 @@ var codex = module.exports = inline; /***/ }, - -/***/ 71: +/* 11 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -2551,7 +2535,7 @@ var codex = var toolbox = function (toolbox) { toolbox.init = function () { - __webpack_require__(68); + __webpack_require__(8); }; toolbox.opened = false; @@ -2708,8 +2692,7 @@ var codex = module.exports = toolbox; /***/ }, - -/***/ 72: +/* 12 */ /***/ function(module, exports) { "use strict"; @@ -2729,8 +2712,7 @@ var codex = module.exports = tools; /***/ }, - -/***/ 73: +/* 13 */ /***/ function(module, exports) { 'use strict'; @@ -3446,8 +3428,7 @@ var codex = module.exports = callbacks; /***/ }, - -/***/ 74: +/* 14 */ /***/ function(module, exports) { 'use strict'; @@ -3752,8 +3733,7 @@ var codex = module.exports = draw; /***/ }, - -/***/ 75: +/* 15 */ /***/ function(module, exports) { 'use strict'; @@ -3997,8 +3977,7 @@ var codex = module.exports = caret; /***/ }, - -/***/ 76: +/* 16 */ /***/ function(module, exports) { 'use strict'; @@ -4051,8 +4030,7 @@ var codex = module.exports = notifications; /***/ }, - -/***/ 77: +/* 17 */ /***/ function(module, exports) { 'use strict'; @@ -4303,8 +4281,7 @@ var codex = module.exports = parser; /***/ }, - -/***/ 79: +/* 18 */ /***/ function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict'; @@ -4559,20 +4536,19 @@ var codex = }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); } - __webpack_require__(80); - __webpack_require__(81); - __webpack_require__(82); + __webpack_require__(19); + __webpack_require__(20); + __webpack_require__(21); module.exports = Sanitize; /***/ }, - -/***/ 80: +/* 19 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Sanitize = __webpack_require__(79); + var Sanitize = __webpack_require__(18); if (!Sanitize.Config) { Sanitize.Config = {}; @@ -4601,13 +4577,12 @@ var codex = codex.sanitizer = Sanitize; /***/ }, - -/***/ 81: +/* 20 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Sanitize = __webpack_require__(79); + var Sanitize = __webpack_require__(18); if (!Sanitize.Config) { Sanitize.Config = {}; @@ -4641,13 +4616,12 @@ var codex = codex.sanitizer = Sanitize; /***/ }, - -/***/ 82: +/* 21 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; - var Sanitize = __webpack_require__(79); + var Sanitize = __webpack_require__(18); if (!Sanitize.Config) { Sanitize.Config = {}; @@ -4660,6 +4634,5 @@ var codex = codex.sanitizer = Sanitize; /***/ } - -/******/ }); +/******/ ]); //# sourceMappingURL=codex-editor.js.map \ No newline at end of file diff --git a/package.json b/package.json index 9ab1e2fed..5748a765d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codex.editor", - "version": "1.0.6", + "version": "1.0.10", "description": "Codex Editor. Native JS, based on API and Open Source", "main": "index.js", "scripts": { From 0e4aac987a70290e6aeecf8bfdeea4bb8ff2686a Mon Sep 17 00:00:00 2001 From: khaydarov Date: Sun, 25 Dec 2016 01:26:36 +0300 Subject: [PATCH 04/11] eslint style --- .eslintrc | 6 +- codex-editor.js | 97 ++++++++++++++------------ codex-editor.js.map | 2 +- editor.js | 1 - modules/sanitizer/config/basic.js | 42 ++++++----- modules/sanitizer/config/relaxed.js | 58 +++++++-------- modules/sanitizer/config/restricted.js | 6 +- modules/toolbar/toolbox.js | 19 ++++- whatwg-fetch.js.map | 2 +- 9 files changed, 123 insertions(+), 110 deletions(-) diff --git a/.eslintrc b/.eslintrc index 96693bb30..816d1887b 100644 --- a/.eslintrc +++ b/.eslintrc @@ -38,12 +38,12 @@ "semi": [2, "always"], "indent": [2, 4, { "SwitchCase": 1 }], "camelcase": [2, { "properties": "always" }], - "newline-after-var": [1, "always"], - + "newline-after-var": [1, "always"] }, "globals":{ "document": true, "require": true, - "module": true + "module": true, + "codex": true } } \ No newline at end of file diff --git a/codex-editor.js b/codex-editor.js index 5c8abcc7d..acafb0796 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -71,7 +71,6 @@ var codex = var codex = function (codex) { var init = function init() { - codex.core = __webpack_require__(2); codex.ui = __webpack_require__(3); codex.transport = __webpack_require__(4); @@ -88,7 +87,7 @@ var codex = codex.sanitizer = __webpack_require__(18); }; - codex.version = ("1.0.6"); + codex.version = ("1.0.10"); /** * @public @@ -2535,6 +2534,7 @@ var codex = var toolbox = function (toolbox) { toolbox.init = function () { + __webpack_require__(8); }; @@ -2545,6 +2545,7 @@ var codex = /** Close setting if toolbox is opened */ if (codex.toolbar.settings.opened) { + codex.toolbar.settings.close(); } @@ -2582,7 +2583,11 @@ var codex = /** Count toolbox hidden tools */ for (var tool in codex.tools) { - if (!codex.tools[tool].displayInToolbox) hiddenToolsAmount++; + + if (!codex.tools[tool].displayInToolbox) { + + hiddenToolsAmount++; + } } if (!currentTool) { @@ -2605,6 +2610,7 @@ var codex = for (var tool in codex.tools) { if (codex.tools[tool].displayInToolbox) { + break; } @@ -2649,6 +2655,7 @@ var codex = }; if (workingNode && UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 && workingNode.textContent.trim() === '') { + /** Replace current block */ codex.content.switchBlock(workingNode, newBlockContent, tool.type); } else { @@ -2664,6 +2671,7 @@ var codex = appendCallback = tool.appendCallback; if (appendCallback && typeof appendCallback == 'function') { + appendCallback.call(event); } @@ -4551,27 +4559,26 @@ var codex = var Sanitize = __webpack_require__(18); if (!Sanitize.Config) { - Sanitize.Config = {}; + Sanitize.Config = {}; } Sanitize.Config.BASIC = { - elements: ['a', 'b', 'blockquote', 'br', 'cite', 'code', 'dd', 'dl', 'dt', 'em', 'i', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'u', 'ul'], - - attributes: { - 'a': ['href'], - 'blockquote': ['cite'], - 'q': ['cite'] - }, - - add_attributes: { - 'a': { 'rel': 'nofollow' } - }, - - protocols: { - 'a': { 'href': ['ftp', 'http', 'https', 'mailto', Sanitize.RELATIVE] }, - 'blockquote': { 'cite': ['http', 'https', Sanitize.RELATIVE] }, - 'q': { 'cite': ['http', 'https', Sanitize.RELATIVE] } - } + elements: ['a', 'b', 'blockquote', 'br', 'cite', 'code', 'dd', 'dl', 'dt', 'em', 'i', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'u', 'ul'], + attributes: { + 'a': ['href'], + 'blockquote': ['cite'], + 'q': ['cite'] + }, + + add_attributes: { + 'a': { 'rel': 'nofollow' } + }, + + protocols: { + 'a': { 'href': ['ftp', 'http', 'https', 'mailto', Sanitize.RELATIVE] }, + 'blockquote': { 'cite': ['http', 'https', Sanitize.RELATIVE] }, + 'q': { 'cite': ['http', 'https', Sanitize.RELATIVE] } + } }; codex.sanitizer = Sanitize; @@ -4585,32 +4592,30 @@ var codex = var Sanitize = __webpack_require__(18); if (!Sanitize.Config) { - Sanitize.Config = {}; + Sanitize.Config = {}; } Sanitize.Config.RELAXED = { - elements: ['a', 'b', 'blockquote', 'br', 'caption', 'cite', 'code', 'col', 'colgroup', 'dd', 'dl', 'dt', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'i', 'img', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'u', 'ul'], - - attributes: { - 'a': ['href', 'title'], - 'blockquote': ['cite'], - 'col': ['span', 'width'], - 'colgroup': ['span', 'width'], - 'img': ['align', 'alt', 'height', 'src', 'title', 'width'], - 'ol': ['start', 'type'], - 'q': ['cite'], - 'table': ['summary', 'width'], - 'td': ['abbr', 'axis', 'colspan', 'rowspan', 'width'], - 'th': ['abbr', 'axis', 'colspan', 'rowspan', 'scope', 'width'], - 'ul': ['type'] - }, - - protocols: { - 'a': { 'href': ['ftp', 'http', 'https', 'mailto', Sanitize.RELATIVE] }, - 'blockquote': { 'cite': ['http', 'https', Sanitize.RELATIVE] }, - 'img': { 'src': ['http', 'https', Sanitize.RELATIVE] }, - 'q': { 'cite': ['http', 'https', Sanitize.RELATIVE] } - } + elements: ['a', 'b', 'blockquote', 'br', 'caption', 'cite', 'code', 'col', 'colgroup', 'dd', 'dl', 'dt', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'i', 'img', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'u', 'ul'], + attributes: { + 'a': ['href', 'title'], + 'blockquote': ['cite'], + 'col': ['span', 'width'], + 'colgroup': ['span', 'width'], + 'img': ['align', 'alt', 'height', 'src', 'title', 'width'], + 'ol': ['start', 'type'], + 'q': ['cite'], + 'table': ['summary', 'width'], + 'td': ['abbr', 'axis', 'colspan', 'rowspan', 'width'], + 'th': ['abbr', 'axis', 'colspan', 'rowspan', 'scope', 'width'], + 'ul': ['type'] + }, + protocols: { + 'a': { 'href': ['ftp', 'http', 'https', 'mailto', Sanitize.RELATIVE] }, + 'blockquote': { 'cite': ['http', 'https', Sanitize.RELATIVE] }, + 'img': { 'src': ['http', 'https', Sanitize.RELATIVE] }, + 'q': { 'cite': ['http', 'https', Sanitize.RELATIVE] } + } }; codex.sanitizer = Sanitize; @@ -4624,11 +4629,11 @@ var codex = var Sanitize = __webpack_require__(18); if (!Sanitize.Config) { - Sanitize.Config = {}; + Sanitize.Config = {}; } Sanitize.Config.RESTRICTED = { - elements: ['a', 'b', 'em', 'i', 'strong', 'u'] + elements: ['a', 'b', 'em', 'i', 'strong', 'u'] }; codex.sanitizer = Sanitize; diff --git a/codex-editor.js.map b/codex-editor.js.map index efae2f015..d1e21948b 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 2cc9452015882dcf9516","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js","webpack:///./modules/sanitizer/sanitize.js","webpack:///./modules/sanitizer/config/basic.js","webpack:///./modules/sanitizer/config/relaxed.js","webpack:///./modules/sanitizer/config/restricted.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","sanitizer","version","major","minor","build","BUILD","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","currentNode","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","Config","BASIC","clearHTML","clean_node","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","tabKeyPressed","enterKeyPressed","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","firstLevelBlocksArea","clickedOnFirstLevelBlockArea","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","_blockPaste","observer","MutationObserver","handlePasteEvents","config","attributes","childList","characterData","observe","mutations","currentToolType","bar","placeholder","div","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","getSeparatedTextFromContent","split","insertPastedContent","parsedTextContent","parseTextareaContent","initialContent","getNodesFromString","appendNodesToRedactor","inputString","contentHolder","createBlockByDomNode","nodeList","item","storeBlockType","parentBlock","nodeContent","isPlainTextNode","replace","Sanitize","options","ALL","allow_comments","allowed_elements","protocols","add_attributes","dom","remove_element_contents","remove_all_contents","remove_contents","Array","transformers","REGEX_PROTOCOL","RELATIVE","prototype","fragment","createDocumentFragment","current_element","whitelist_nodes","_array_index","needle","haystack","_merge_arrays_uniq","result","uniq_hash","j","_clean","elem","clone","_clean_element","cloneNode","parent_element","allowed_attributes","attr","attr_name","attr_node","del","attr_ok","_transform_element","nodeName","toLowerCase","whitelist","attrs","attr_whitelist","match","createAttribute","setAttributeNode","normalize","node_name","define","RELAXED","RESTRICTED"],"mappings":"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","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2cc9452015882dcf9516","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.0.6\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n codex.sanitizer = require('./modules/sanitizer/sanitize');\n };\n\n codex.version = {\n major : MAJOR,\n minor : MINOR,\n build : BUILD\n };\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, false);\n\n /**\n * Pasting content from another source\n */\n block.addEventListener('paste', function (event) {\n codex.callback.blockPaste(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.1.1\n */\n\nvar content = (function(content) {\n\n content.currentNode = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize(mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n * @todo Fix caret positioning\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC);\n var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]);\n\n target.innerHTML = \"\";\n target.appendChild(clearHTML);\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function() {\n require('./toolbar');\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n codex.toolbar.settings.close();\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n if (!codex.tools[tool].displayInToolbox)\n hiddenToolsAmount ++;\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n break;\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n appendCallback.call(event);\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressed = function(event){\n\n /** Set current node */\n var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea();\n\n if (firstLevelBlocksArea) {\n event.preventDefault();\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n return;\n }\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n return;\n\n }\n\n /**\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != 'paragraph' || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.clickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n\n if (selection.rangeCount == 0) {\n\n return true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n return flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n }, 10);\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n mutations.forEach(codex.content.paste);\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar parser = (function(parser) {\n\n /**\n * Splits content by `\\n` and returns blocks\n */\n parser.getSeparatedTextFromContent = function(content) {\n return content.split('\\n');\n };\n\n /** inserting text */\n parser.insertPastedContent = function(content) {\n\n var blocks = this.getSeparatedTextFromContent(content),\n i,\n inputIndex = cEditor.caret.getCurrentInputIndex(),\n textNode,\n parsedTextContent;\n\n for(i = 0; i < blocks.length; i++) {\n\n blocks[i].trim();\n\n if (blocks[i]) {\n var data = cEditor.draw.pluginsRender('paragraph', blocks[i]);\n cEditor.content.insertBlock(data);\n }\n }\n\n };\n\n /**\n * Asynchronously parses textarea input string to HTML editor blocks\n */\n parser.parseTextareaContent = function () {\n\n var initialContent = cEditor.nodes.textarea.value;\n\n if ( initialContent.trim().length === 0 ) return true;\n\n\n cEditor.parser\n\n /** Get child nodes async-aware */\n .getNodesFromString(initialContent)\n\n /** Then append nodes to the redactor */\n .then(cEditor.parser.appendNodesToRedactor)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n cEditor.core.log('Error while parsing content: %o', 'warn', error);\n });\n\n };\n\n /**\n * Parses string to nodeList\n * @param string inputString\n * @return Primise -> nodeList\n */\n parser.getNodesFromString = function (inputString) {\n\n return Promise.resolve().then(function() {\n\n var contentHolder = document.createElement('div');\n\n contentHolder.innerHTML = inputString;\n\n /**\n * Returning childNodes will include:\n * - Elements (html-tags),\n * - Texts (empty-spaces or non-wrapped strings )\n * - Comments and other\n */\n return contentHolder.childNodes;\n\n });\n };\n\n /**\n * Appends nodes to the redactor\n * @param nodeList nodes - list for nodes to append\n */\n parser.appendNodesToRedactor = function(nodes) {\n\n /**\n * Sequence of one-by-one nodes appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n\n for (var index = 0; index < nodes.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n parser.appendNodeAtIndex = function (nodeSequence, nodes, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return cEditor.parser.getNodeAsync(nodes , index);\n\n })\n\n /**\n * second, compose editor-block from node\n * and append it to redactor\n */\n .then(function(node){\n\n var block = cEditor.parser.createBlockByDomNode(node);\n\n if ( cEditor.core.isDomNode(block) ) {\n\n block.contentEditable = \"true\";\n\n /** Mark node as redactor block*/\n block.classList.add('ce-block');\n\n /** Append block to the redactor */\n cEditor.nodes.redactor.appendChild(block);\n\n /** Save block to the cEditor.state array */\n cEditor.state.blocks.push(block);\n\n return block;\n\n }\n return null;\n })\n\n .then(cEditor.ui.addBlockHandlers)\n\n /** Log if something wrong with node */\n .catch(function(error) {\n cEditor.core.log('Node skipped while parsing because %o', 'warn', error);\n });\n\n };\n\n /**\n * Asynchronously returns node from nodeList by index\n * @return Promise to node\n */\n parser.getNodeAsync = function (nodeList, index) {\n\n return Promise.resolve().then(function() {\n\n return nodeList.item(index);\n\n });\n };\n\n /**\n * Creates editor block by DOM node\n *\n * First-level blocks (see cEditor.settings.blockTags) saves as-is,\n * other wrapps with

-tag\n *\n * @param DOMnode node\n * @return First-level node (paragraph)\n */\n parser.createBlockByDomNode = function (node) {\n\n /** First level nodes already appears as blocks */\n if ( cEditor.parser.isFirstLevelBlock(node) ){\n\n /** Save plugin type in data-type */\n node = this.storeBlockType(node);\n\n return node;\n }\n\n /** Other nodes wraps into parent block (paragraph-tag) */\n var parentBlock,\n nodeContent = node.textContent.trim(),\n isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG;\n\n\n /** Skip empty textNodes with space-symbols */\n if (isPlainTextNode && !nodeContent.length) return null;\n\n /** Make

tag */\n parentBlock = cEditor.draw.block('P');\n\n if (isPlainTextNode){\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\n } else {\n parentBlock.appendChild(node);\n }\n\n /** Save plugin type in data-type */\n parentBlock = this.storeBlockType(parentBlock);\n\n return parentBlock;\n\n };\n\n /**\n * It's a crutch\n * - - - - - - -\n * We need block type stored as data-attr\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\n * Remove it after updating parser module for the block-oriented structure:\n * - each block must have stored type\n * @param {Element} node\n */\n parser.storeBlockType = function (node) {\n\n switch (node.tagName) {\n case 'P' : node.dataset.tool = 'paragraph'; break;\n case 'H1':\n case 'H2':\n case 'H3':\n case 'H4':\n case 'H5':\n case 'H6': node.dataset.tool = 'header'; break;\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\n case 'CODE': node.dataset.tool = 'code'; break;\n }\n\n return node;\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Copyright (c) 2010 by Gabriel Birke\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nfunction Sanitize(){\n var i, e, options;\n options = arguments[0] || {};\n this.config = {};\n this.config.elements = options.elements ? options.elements : [];\n this.config.attributes = options.attributes ? options.attributes : {};\n this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];\n this.config.allow_comments = options.allow_comments ? options.allow_comments : false;\n this.allowed_elements = {};\n this.config.protocols = options.protocols ? options.protocols : {};\n this.config.add_attributes = options.add_attributes ? options.add_attributes : {};\n this.dom = options.dom ? options.dom : document;\n for(i=0;i 0) {\n this.current_element.removeChild(this.current_element.firstChild);\n }\n parent_element.appendChild(this.current_element);\n }\n\n // iterate over child nodes\n if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {\n for(i=0;i nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.1.1\n */\n\nvar content = (function(content) {\n\n content.currentNode = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize(mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n * @todo Fix caret positioning\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC);\n var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]);\n\n target.innerHTML = \"\";\n target.appendChild(clearHTML);\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressed = function(event){\n\n /** Set current node */\n var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea();\n\n if (firstLevelBlocksArea) {\n event.preventDefault();\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n return;\n }\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n return;\n\n }\n\n /**\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != 'paragraph' || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.clickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n\n if (selection.rangeCount == 0) {\n\n return true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n return flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n }, 10);\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n mutations.forEach(codex.content.paste);\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar parser = (function(parser) {\n\n /**\n * Splits content by `\\n` and returns blocks\n */\n parser.getSeparatedTextFromContent = function(content) {\n return content.split('\\n');\n };\n\n /** inserting text */\n parser.insertPastedContent = function(content) {\n\n var blocks = this.getSeparatedTextFromContent(content),\n i,\n inputIndex = cEditor.caret.getCurrentInputIndex(),\n textNode,\n parsedTextContent;\n\n for(i = 0; i < blocks.length; i++) {\n\n blocks[i].trim();\n\n if (blocks[i]) {\n var data = cEditor.draw.pluginsRender('paragraph', blocks[i]);\n cEditor.content.insertBlock(data);\n }\n }\n\n };\n\n /**\n * Asynchronously parses textarea input string to HTML editor blocks\n */\n parser.parseTextareaContent = function () {\n\n var initialContent = cEditor.nodes.textarea.value;\n\n if ( initialContent.trim().length === 0 ) return true;\n\n\n cEditor.parser\n\n /** Get child nodes async-aware */\n .getNodesFromString(initialContent)\n\n /** Then append nodes to the redactor */\n .then(cEditor.parser.appendNodesToRedactor)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n cEditor.core.log('Error while parsing content: %o', 'warn', error);\n });\n\n };\n\n /**\n * Parses string to nodeList\n * @param string inputString\n * @return Primise -> nodeList\n */\n parser.getNodesFromString = function (inputString) {\n\n return Promise.resolve().then(function() {\n\n var contentHolder = document.createElement('div');\n\n contentHolder.innerHTML = inputString;\n\n /**\n * Returning childNodes will include:\n * - Elements (html-tags),\n * - Texts (empty-spaces or non-wrapped strings )\n * - Comments and other\n */\n return contentHolder.childNodes;\n\n });\n };\n\n /**\n * Appends nodes to the redactor\n * @param nodeList nodes - list for nodes to append\n */\n parser.appendNodesToRedactor = function(nodes) {\n\n /**\n * Sequence of one-by-one nodes appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n\n for (var index = 0; index < nodes.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n parser.appendNodeAtIndex = function (nodeSequence, nodes, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return cEditor.parser.getNodeAsync(nodes , index);\n\n })\n\n /**\n * second, compose editor-block from node\n * and append it to redactor\n */\n .then(function(node){\n\n var block = cEditor.parser.createBlockByDomNode(node);\n\n if ( cEditor.core.isDomNode(block) ) {\n\n block.contentEditable = \"true\";\n\n /** Mark node as redactor block*/\n block.classList.add('ce-block');\n\n /** Append block to the redactor */\n cEditor.nodes.redactor.appendChild(block);\n\n /** Save block to the cEditor.state array */\n cEditor.state.blocks.push(block);\n\n return block;\n\n }\n return null;\n })\n\n .then(cEditor.ui.addBlockHandlers)\n\n /** Log if something wrong with node */\n .catch(function(error) {\n cEditor.core.log('Node skipped while parsing because %o', 'warn', error);\n });\n\n };\n\n /**\n * Asynchronously returns node from nodeList by index\n * @return Promise to node\n */\n parser.getNodeAsync = function (nodeList, index) {\n\n return Promise.resolve().then(function() {\n\n return nodeList.item(index);\n\n });\n };\n\n /**\n * Creates editor block by DOM node\n *\n * First-level blocks (see cEditor.settings.blockTags) saves as-is,\n * other wrapps with

-tag\n *\n * @param DOMnode node\n * @return First-level node (paragraph)\n */\n parser.createBlockByDomNode = function (node) {\n\n /** First level nodes already appears as blocks */\n if ( cEditor.parser.isFirstLevelBlock(node) ){\n\n /** Save plugin type in data-type */\n node = this.storeBlockType(node);\n\n return node;\n }\n\n /** Other nodes wraps into parent block (paragraph-tag) */\n var parentBlock,\n nodeContent = node.textContent.trim(),\n isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG;\n\n\n /** Skip empty textNodes with space-symbols */\n if (isPlainTextNode && !nodeContent.length) return null;\n\n /** Make

tag */\n parentBlock = cEditor.draw.block('P');\n\n if (isPlainTextNode){\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\n } else {\n parentBlock.appendChild(node);\n }\n\n /** Save plugin type in data-type */\n parentBlock = this.storeBlockType(parentBlock);\n\n return parentBlock;\n\n };\n\n /**\n * It's a crutch\n * - - - - - - -\n * We need block type stored as data-attr\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\n * Remove it after updating parser module for the block-oriented structure:\n * - each block must have stored type\n * @param {Element} node\n */\n parser.storeBlockType = function (node) {\n\n switch (node.tagName) {\n case 'P' : node.dataset.tool = 'paragraph'; break;\n case 'H1':\n case 'H2':\n case 'H3':\n case 'H4':\n case 'H5':\n case 'H6': node.dataset.tool = 'header'; break;\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\n case 'CODE': node.dataset.tool = 'code'; break;\n }\n\n return node;\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Copyright (c) 2010 by Gabriel Birke\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nfunction Sanitize(){\n var i, e, options;\n options = arguments[0] || {};\n this.config = {};\n this.config.elements = options.elements ? options.elements : [];\n this.config.attributes = options.attributes ? options.attributes : {};\n this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];\n this.config.allow_comments = options.allow_comments ? options.allow_comments : false;\n this.allowed_elements = {};\n this.config.protocols = options.protocols ? options.protocols : {};\n this.config.add_attributes = options.add_attributes ? options.add_attributes : {};\n this.dom = options.dom ? options.dom : document;\n for(i=0;i 0) {\n this.current_element.removeChild(this.current_element.firstChild);\n }\n parent_element.appendChild(this.current_element);\n }\n\n // iterate over child nodes\n if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {\n for(i=0;i

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != 'paragraph' || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.clickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n\n if (selection.rangeCount == 0) {\n\n return true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n return flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n }, 10);\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n mutations.forEach(codex.content.paste);\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar parser = (function(parser) {\n\n /**\n * Splits content by `\\n` and returns blocks\n */\n parser.getSeparatedTextFromContent = function(content) {\n return content.split('\\n');\n };\n\n /** inserting text */\n parser.insertPastedContent = function(content) {\n\n var blocks = this.getSeparatedTextFromContent(content),\n i,\n inputIndex = cEditor.caret.getCurrentInputIndex(),\n textNode,\n parsedTextContent;\n\n for(i = 0; i < blocks.length; i++) {\n\n blocks[i].trim();\n\n if (blocks[i]) {\n var data = cEditor.draw.pluginsRender('paragraph', blocks[i]);\n cEditor.content.insertBlock(data);\n }\n }\n\n };\n\n /**\n * Asynchronously parses textarea input string to HTML editor blocks\n */\n parser.parseTextareaContent = function () {\n\n var initialContent = cEditor.nodes.textarea.value;\n\n if ( initialContent.trim().length === 0 ) return true;\n\n\n cEditor.parser\n\n /** Get child nodes async-aware */\n .getNodesFromString(initialContent)\n\n /** Then append nodes to the redactor */\n .then(cEditor.parser.appendNodesToRedactor)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n cEditor.core.log('Error while parsing content: %o', 'warn', error);\n });\n\n };\n\n /**\n * Parses string to nodeList\n * @param string inputString\n * @return Primise -> nodeList\n */\n parser.getNodesFromString = function (inputString) {\n\n return Promise.resolve().then(function() {\n\n var contentHolder = document.createElement('div');\n\n contentHolder.innerHTML = inputString;\n\n /**\n * Returning childNodes will include:\n * - Elements (html-tags),\n * - Texts (empty-spaces or non-wrapped strings )\n * - Comments and other\n */\n return contentHolder.childNodes;\n\n });\n };\n\n /**\n * Appends nodes to the redactor\n * @param nodeList nodes - list for nodes to append\n */\n parser.appendNodesToRedactor = function(nodes) {\n\n /**\n * Sequence of one-by-one nodes appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n\n for (var index = 0; index < nodes.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n parser.appendNodeAtIndex = function (nodeSequence, nodes, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return cEditor.parser.getNodeAsync(nodes , index);\n\n })\n\n /**\n * second, compose editor-block from node\n * and append it to redactor\n */\n .then(function(node){\n\n var block = cEditor.parser.createBlockByDomNode(node);\n\n if ( cEditor.core.isDomNode(block) ) {\n\n block.contentEditable = \"true\";\n\n /** Mark node as redactor block*/\n block.classList.add('ce-block');\n\n /** Append block to the redactor */\n cEditor.nodes.redactor.appendChild(block);\n\n /** Save block to the cEditor.state array */\n cEditor.state.blocks.push(block);\n\n return block;\n\n }\n return null;\n })\n\n .then(cEditor.ui.addBlockHandlers)\n\n /** Log if something wrong with node */\n .catch(function(error) {\n cEditor.core.log('Node skipped while parsing because %o', 'warn', error);\n });\n\n };\n\n /**\n * Asynchronously returns node from nodeList by index\n * @return Promise to node\n */\n parser.getNodeAsync = function (nodeList, index) {\n\n return Promise.resolve().then(function() {\n\n return nodeList.item(index);\n\n });\n };\n\n /**\n * Creates editor block by DOM node\n *\n * First-level blocks (see cEditor.settings.blockTags) saves as-is,\n * other wrapps with

-tag\n *\n * @param DOMnode node\n * @return First-level node (paragraph)\n */\n parser.createBlockByDomNode = function (node) {\n\n /** First level nodes already appears as blocks */\n if ( cEditor.parser.isFirstLevelBlock(node) ){\n\n /** Save plugin type in data-type */\n node = this.storeBlockType(node);\n\n return node;\n }\n\n /** Other nodes wraps into parent block (paragraph-tag) */\n var parentBlock,\n nodeContent = node.textContent.trim(),\n isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG;\n\n\n /** Skip empty textNodes with space-symbols */\n if (isPlainTextNode && !nodeContent.length) return null;\n\n /** Make

tag */\n parentBlock = cEditor.draw.block('P');\n\n if (isPlainTextNode){\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\n } else {\n parentBlock.appendChild(node);\n }\n\n /** Save plugin type in data-type */\n parentBlock = this.storeBlockType(parentBlock);\n\n return parentBlock;\n\n };\n\n /**\n * It's a crutch\n * - - - - - - -\n * We need block type stored as data-attr\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\n * Remove it after updating parser module for the block-oriented structure:\n * - each block must have stored type\n * @param {Element} node\n */\n parser.storeBlockType = function (node) {\n\n switch (node.tagName) {\n case 'P' : node.dataset.tool = 'paragraph'; break;\n case 'H1':\n case 'H2':\n case 'H3':\n case 'H4':\n case 'H5':\n case 'H6': node.dataset.tool = 'header'; break;\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\n case 'CODE': node.dataset.tool = 'code'; break;\n }\n\n return node;\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Copyright (c) 2010 by Gabriel Birke\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nfunction Sanitize(){\n var i, e, options;\n options = arguments[0] || {};\n this.config = {};\n this.config.elements = options.elements ? options.elements : [];\n this.config.attributes = options.attributes ? options.attributes : {};\n this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];\n this.config.allow_comments = options.allow_comments ? options.allow_comments : false;\n this.allowed_elements = {};\n this.config.protocols = options.protocols ? options.protocols : {};\n this.config.add_attributes = options.add_attributes ? options.add_attributes : {};\n this.dom = options.dom ? options.dom : document;\n for(i=0;i 0) {\n this.current_element.removeChild(this.current_element.firstChild);\n }\n parent_element.appendChild(this.current_element);\n }\n\n // iterate over child nodes\n if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {\n for(i=0;i nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.1.2\n */\n\nvar content = (function(content) {\n\n content.currentNode = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize(mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n * @todo Fix caret positioning\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC);\n var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]);\n\n target.innerHTML = \"\";\n target.appendChild(clearHTML);\n\n /**\n * Preliminary solution:\n * Always set caret at the end of input\n */\n var inputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * setting to current block:\n * (index + 1) minus 1 is current\n */\n codex.caret.setToPreviousBlock(inputIndex + 1);\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressed = function(event){\n\n /** Set current node */\n var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea();\n\n if (firstLevelBlocksArea) {\n event.preventDefault();\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n return;\n }\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n return;\n\n }\n\n /**\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != 'paragraph' || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.clickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n\n if (selection.rangeCount == 0) {\n\n return true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n return flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n }, 10);\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n mutations.forEach(codex.content.paste);\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar parser = (function(parser) {\n\n /**\n * Splits content by `\\n` and returns blocks\n */\n parser.getSeparatedTextFromContent = function(content) {\n return content.split('\\n');\n };\n\n /** inserting text */\n parser.insertPastedContent = function(content) {\n\n var blocks = this.getSeparatedTextFromContent(content),\n i,\n inputIndex = cEditor.caret.getCurrentInputIndex(),\n textNode,\n parsedTextContent;\n\n for(i = 0; i < blocks.length; i++) {\n\n blocks[i].trim();\n\n if (blocks[i]) {\n var data = cEditor.draw.pluginsRender('paragraph', blocks[i]);\n cEditor.content.insertBlock(data);\n }\n }\n\n };\n\n /**\n * Asynchronously parses textarea input string to HTML editor blocks\n */\n parser.parseTextareaContent = function () {\n\n var initialContent = cEditor.nodes.textarea.value;\n\n if ( initialContent.trim().length === 0 ) return true;\n\n\n cEditor.parser\n\n /** Get child nodes async-aware */\n .getNodesFromString(initialContent)\n\n /** Then append nodes to the redactor */\n .then(cEditor.parser.appendNodesToRedactor)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n cEditor.core.log('Error while parsing content: %o', 'warn', error);\n });\n\n };\n\n /**\n * Parses string to nodeList\n * @param string inputString\n * @return Primise -> nodeList\n */\n parser.getNodesFromString = function (inputString) {\n\n return Promise.resolve().then(function() {\n\n var contentHolder = document.createElement('div');\n\n contentHolder.innerHTML = inputString;\n\n /**\n * Returning childNodes will include:\n * - Elements (html-tags),\n * - Texts (empty-spaces or non-wrapped strings )\n * - Comments and other\n */\n return contentHolder.childNodes;\n\n });\n };\n\n /**\n * Appends nodes to the redactor\n * @param nodeList nodes - list for nodes to append\n */\n parser.appendNodesToRedactor = function(nodes) {\n\n /**\n * Sequence of one-by-one nodes appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n\n for (var index = 0; index < nodes.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n parser.appendNodeAtIndex = function (nodeSequence, nodes, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return cEditor.parser.getNodeAsync(nodes , index);\n\n })\n\n /**\n * second, compose editor-block from node\n * and append it to redactor\n */\n .then(function(node){\n\n var block = cEditor.parser.createBlockByDomNode(node);\n\n if ( cEditor.core.isDomNode(block) ) {\n\n block.contentEditable = \"true\";\n\n /** Mark node as redactor block*/\n block.classList.add('ce-block');\n\n /** Append block to the redactor */\n cEditor.nodes.redactor.appendChild(block);\n\n /** Save block to the cEditor.state array */\n cEditor.state.blocks.push(block);\n\n return block;\n\n }\n return null;\n })\n\n .then(cEditor.ui.addBlockHandlers)\n\n /** Log if something wrong with node */\n .catch(function(error) {\n cEditor.core.log('Node skipped while parsing because %o', 'warn', error);\n });\n\n };\n\n /**\n * Asynchronously returns node from nodeList by index\n * @return Promise to node\n */\n parser.getNodeAsync = function (nodeList, index) {\n\n return Promise.resolve().then(function() {\n\n return nodeList.item(index);\n\n });\n };\n\n /**\n * Creates editor block by DOM node\n *\n * First-level blocks (see cEditor.settings.blockTags) saves as-is,\n * other wrapps with

-tag\n *\n * @param DOMnode node\n * @return First-level node (paragraph)\n */\n parser.createBlockByDomNode = function (node) {\n\n /** First level nodes already appears as blocks */\n if ( cEditor.parser.isFirstLevelBlock(node) ){\n\n /** Save plugin type in data-type */\n node = this.storeBlockType(node);\n\n return node;\n }\n\n /** Other nodes wraps into parent block (paragraph-tag) */\n var parentBlock,\n nodeContent = node.textContent.trim(),\n isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG;\n\n\n /** Skip empty textNodes with space-symbols */\n if (isPlainTextNode && !nodeContent.length) return null;\n\n /** Make

tag */\n parentBlock = cEditor.draw.block('P');\n\n if (isPlainTextNode){\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\n } else {\n parentBlock.appendChild(node);\n }\n\n /** Save plugin type in data-type */\n parentBlock = this.storeBlockType(parentBlock);\n\n return parentBlock;\n\n };\n\n /**\n * It's a crutch\n * - - - - - - -\n * We need block type stored as data-attr\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\n * Remove it after updating parser module for the block-oriented structure:\n * - each block must have stored type\n * @param {Element} node\n */\n parser.storeBlockType = function (node) {\n\n switch (node.tagName) {\n case 'P' : node.dataset.tool = 'paragraph'; break;\n case 'H1':\n case 'H2':\n case 'H3':\n case 'H4':\n case 'H5':\n case 'H6': node.dataset.tool = 'header'; break;\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\n case 'CODE': node.dataset.tool = 'code'; break;\n }\n\n return node;\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Copyright (c) 2010 by Gabriel Birke\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nfunction Sanitize(){\n var i, e, options;\n options = arguments[0] || {};\n this.config = {};\n this.config.elements = options.elements ? options.elements : [];\n this.config.attributes = options.attributes ? options.attributes : {};\n this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];\n this.config.allow_comments = options.allow_comments ? options.allow_comments : false;\n this.allowed_elements = {};\n this.config.protocols = options.protocols ? options.protocols : {};\n this.config.add_attributes = options.add_attributes ? options.add_attributes : {};\n this.dom = options.dom ? options.dom : document;\n for(i=0;i 0) {\n this.current_element.removeChild(this.current_element.firstChild);\n }\n parent_element.appendChild(this.current_element);\n }\n\n // iterate over child nodes\n if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {\n for(i=0;i Date: Fri, 30 Dec 2016 16:48:58 +0300 Subject: [PATCH 06/11] big fixed on sanitize method --- codex-editor.css | 4 + codex-editor.js | 374 +++++++++--------------------- codex-editor.js.map | 2 +- editor.js | 2 +- example.html | 10 +- modules/callbacks.js | 63 +++-- modules/content.js | 70 ++++-- modules/core.js | 10 +- modules/parser.js | 235 +------------------ modules/sanitizer/config/basic.js | 2 +- modules/ui.js | 45 ++-- package.json | 2 +- plugins/header/header.js | 4 + whatwg-fetch.js.map | 2 +- 14 files changed, 268 insertions(+), 557 deletions(-) diff --git a/codex-editor.css b/codex-editor.css index a15933fee..ff211096d 100644 --- a/codex-editor.css +++ b/codex-editor.css @@ -16,6 +16,10 @@ position: relative; } + .codex-editor .hide { + display: none; + } + /** * Working zone - redactor */ diff --git a/codex-editor.js b/codex-editor.js index 1aaafcbd9..86c6b7bd8 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -65,7 +65,7 @@ var codex = * Codex Editor * * @author Codex Team - * @version 1.0.6 + * @version 1.1.4 */ var codex = function (codex) { @@ -87,7 +87,7 @@ var codex = codex.sanitizer = __webpack_require__(18); }; - codex.version = ("1.0.12"); + codex.version = ("1.1.0"); /** * @public @@ -200,7 +200,7 @@ var codex = * Codex Editor Core * * @author Codex Team - * @version 1.0 + * @version 1.1.2 */ var core = function (core) { @@ -224,6 +224,14 @@ var codex = codex.state.blocks = userSettings.data; } + if (userSettings.initialBlockPlugin) { + codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin; + } + + if (userSettings.uploadImagesUrl) { + codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl; + } + codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId); if (_typeof(codex.nodes.textarea) === undefined || codex.nodes.textarea === null) { @@ -624,7 +632,10 @@ var codex = }, false); /** All keydowns on Document */ - codex.nodes.redactor.addEventListener('keydown', codex.callback.globalKeydown, false); + document.addEventListener('keydown', codex.callback.globalKeydown, false); + + /** All keydowns on Redactor zone */ + codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false); /** All keydowns on Document */ document.addEventListener('keyup', codex.callback.globalKeyup, false); @@ -1137,13 +1148,23 @@ var codex = * Works with DOM * * @author Codex Team - * @version 1.1.2 + * @version 1.1.6 */ var content = function (content) { + /** + * Links to current active block + * @type {null | Element} + */ content.currentNode = null; + /** + * clicked in redactor area + * @type {null | Boolean} + */ + content.editorArea = null; + /** * Synchronizes redactor with original textarea */ @@ -1375,6 +1396,12 @@ var codex = }, 10); } } + + /** + * Block is inserted, wait for new click that defined focusing on editors area + * @type {boolean} + */ + content.editorArea = false; }; /** @@ -1574,7 +1601,7 @@ var codex = newNode = newNode.innerHTML; /** This type of block creates when enter is pressed */ - var NEW_BLOCK_TYPE = 'paragraph'; + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; /** * Make new paragraph with text after caret @@ -1652,7 +1679,6 @@ var codex = * Sanitizes HTML content * @param {Element} target - inserted element * @uses Sanitize library and BASIC configuration - * @todo Fix caret positioning */ content.sanitize = function (target) { @@ -1660,23 +1686,48 @@ var codex = return; } + /** + * Sanitize configuration. + * Using basic sanitize + */ var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC); - var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]); - target.innerHTML = ""; - target.appendChild(clearHTML); + var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]), + i, + tool; - /** - * Preliminary solution: - * Always set caret at the end of input - */ - var inputIndex = codex.caret.getCurrentInputIndex(); + for (i = 0; i < clearHTML.childNodes.length; i++) { + + var tag = clearHTML.childNodes[i], + blockType = null; + + for (tool in codex.tools) { + + var handleTags = codex.tools[tool].handleTagOnPaste; + + if (!handleTags) { + continue; + } + + if (handleTags.indexOf(tag.tagName) !== -1) { + blockType = codex.tools[tool]; + break; + } + } + + if (blockType) { + codex.parser.insertPastedContent(blockType, tag); + } + } /** - * setting to current block: - * (index + 1) minus 1 is current + * Remove node where data pasted */ - codex.caret.setToPreviousBlock(inputIndex + 1); + target = content.getFirstLevelBlock(target); + + if (target) { + target.remove(); + } }; return content; @@ -2741,7 +2792,7 @@ var codex = * Codex Editor callbacks module * * @author Codex Team - * @version 1.0 + * @version 1.1.3 */ var callbacks = function (callbacks) { @@ -2749,11 +2800,18 @@ var codex = callbacks.redactorSyncTimeout = null; callbacks.globalKeydown = function (event) { + switch (event.keyCode) { + case codex.core.keys.ENTER: + codex.callback.enterKeyPressed(event);break; + } + }; + + callbacks.redactorKeyDown = function (event) { switch (event.keyCode) { case codex.core.keys.TAB: codex.callback.tabKeyPressed(event);break; case codex.core.keys.ENTER: - codex.callback.enterKeyPressed(event);break; + codex.callback.enterKeyPressedOnRedactorZone(event);break; case codex.core.keys.ESC: codex.callback.escapeKeyPressed(event);break; default: @@ -2786,17 +2844,9 @@ var codex = event.preventDefault(); }; - /** - * ENTER key handler - * Makes new paragraph block - */ callbacks.enterKeyPressed = function (event) { - /** Set current node */ - var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea(); - - if (firstLevelBlocksArea) { - event.preventDefault(); + if (codex.content.editorArea) { /** * it means that we lose input index, saved index before is not correct @@ -2805,8 +2855,14 @@ var codex = codex.caret.inputIndex = -1; codex.callback.enterPressedOnBlock(); - return; } + }; + + /** + * ENTER key handler + * Makes new paragraph block + */ + callbacks.enterKeyPressedOnRedactorZone = function (event) { if (event.target.contentEditable == 'true') { @@ -2831,7 +2887,7 @@ var codex = var enableLineBreaks = codex.tools[tool].enableLineBreaks; /** This type of block creates when enter is pressed */ - var NEW_BLOCK_TYPE = 'paragraph'; + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; /** * When toolbar is opened, select tool instead of making new paragraph @@ -2844,6 +2900,12 @@ var codex = codex.toolbar.close(); + /** + * Stop other listeners callback executions + */ + event.stopPropagation(); + event.stopImmediatePropagation(); + return; } @@ -2951,6 +3013,8 @@ var codex = callbacks.redactorClicked = function (event) { + callbacks.isClickedOnFirstLevelBlockArea(); + codex.content.workingNodeChanged(event.target); codex.ui.saveInputs(); @@ -2985,13 +3049,13 @@ var codex = } /** If input is empty, then we set caret to the last input */ - if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') { + if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) { codex.caret.setToBlock(indexOfLastInput); } else { /** Create new input when caret clicked in redactors area */ - var NEW_BLOCK_TYPE = 'paragraph'; + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; codex.content.insertBlock({ type: NEW_BLOCK_TYPE, @@ -3044,7 +3108,7 @@ var codex = var currentNodeType = codex.content.currentNode.dataset.tool; /** Mark current block*/ - if (currentNodeType != 'paragraph' || !inputIsEmpty) { + if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) { codex.content.markBlock(); } @@ -3057,7 +3121,7 @@ var codex = * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always * specifies to the first-level block. Other cases we just ignore. */ - callbacks.clickedOnFirstLevelBlockArea = function () { + callbacks.isClickedOnFirstLevelBlockArea = function () { var selection = window.getSelection(), anchorNode = selection.anchorNode, @@ -3065,7 +3129,7 @@ var codex = if (selection.rangeCount == 0) { - return true; + codex.content.editorArea = true; } else { if (!codex.core.isDomNode(anchorNode)) { @@ -3090,7 +3154,7 @@ var codex = } /** If editable element founded, flag is "TRUE", Therefore we return "FALSE" */ - return flag ? false : true; + codex.content.editorArea = flag ? false : true; } }; @@ -3303,7 +3367,7 @@ var codex = */ callbacks.enterPressedOnBlock = function (event) { - var NEW_BLOCK_TYPE = 'paragraph'; + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; codex.content.insertBlock({ type: NEW_BLOCK_TYPE, @@ -3394,7 +3458,11 @@ var codex = setTimeout(function () { codex.content.sanitize(node); + + event.preventDefault(); }, 10); + + event.stopImmediatePropagation(); }; callbacks._blockPaste = function (event) { @@ -4053,240 +4121,28 @@ var codex = /* 17 */ /***/ function(module, exports) { - 'use strict'; + "use strict"; /** * Codex Editor Parser Module * * @author Codex Team - * @version 1.0 + * @version 1.1 */ var parser = function (parser) { - /** - * Splits content by `\n` and returns blocks - */ - parser.getSeparatedTextFromContent = function (content) { - return content.split('\n'); - }; - /** inserting text */ - parser.insertPastedContent = function (content) { - - var blocks = this.getSeparatedTextFromContent(content), - i, - inputIndex = cEditor.caret.getCurrentInputIndex(), - textNode, - parsedTextContent; - - for (i = 0; i < blocks.length; i++) { - - blocks[i].trim(); - - if (blocks[i]) { - var data = cEditor.draw.pluginsRender('paragraph', blocks[i]); - cEditor.content.insertBlock(data); - } - } - }; - - /** - * Asynchronously parses textarea input string to HTML editor blocks - */ - parser.parseTextareaContent = function () { - - var initialContent = cEditor.nodes.textarea.value; - - if (initialContent.trim().length === 0) return true; - - cEditor.parser - - /** Get child nodes async-aware */ - .getNodesFromString(initialContent) - - /** Then append nodes to the redactor */ - .then(cEditor.parser.appendNodesToRedactor) - - /** Write log if something goes wrong */ - .catch(function (error) { - cEditor.core.log('Error while parsing content: %o', 'warn', error); - }); - }; - - /** - * Parses string to nodeList - * @param string inputString - * @return Primise -> nodeList - */ - parser.getNodesFromString = function (inputString) { - - return Promise.resolve().then(function () { - - var contentHolder = document.createElement('div'); - - contentHolder.innerHTML = inputString; - - /** - * Returning childNodes will include: - * - Elements (html-tags), - * - Texts (empty-spaces or non-wrapped strings ) - * - Comments and other - */ - return contentHolder.childNodes; - }); - }; - - /** - * Appends nodes to the redactor - * @param nodeList nodes - list for nodes to append - */ - parser.appendNodesToRedactor = function (nodes) { - - /** - * Sequence of one-by-one nodes appending - * Uses to save blocks order after async-handler - */ - var nodeSequence = Promise.resolve(); - - for (var index = 0; index < nodes.length; index++) { - - /** Add node to sequence at specified index */ - cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index); - } - }; - - /** - * Append node at specified index - */ - parser.appendNodeAtIndex = function (nodeSequence, nodes, index) { - - /** We need to append node to sequence */ - nodeSequence - - /** first, get node async-aware */ - .then(function () { - - return cEditor.parser.getNodeAsync(nodes, index); - }) - - /** - * second, compose editor-block from node - * and append it to redactor - */ - .then(function (node) { - - var block = cEditor.parser.createBlockByDomNode(node); - - if (cEditor.core.isDomNode(block)) { - - block.contentEditable = "true"; + parser.insertPastedContent = function (blockType, tag) { - /** Mark node as redactor block*/ - block.classList.add('ce-block'); - - /** Append block to the redactor */ - cEditor.nodes.redactor.appendChild(block); - - /** Save block to the cEditor.state array */ - cEditor.state.blocks.push(block); - - return block; - } - return null; - }).then(cEditor.ui.addBlockHandlers) - - /** Log if something wrong with node */ - .catch(function (error) { - cEditor.core.log('Node skipped while parsing because %o', 'warn', error); - }); - }; - - /** - * Asynchronously returns node from nodeList by index - * @return Promise to node - */ - parser.getNodeAsync = function (nodeList, index) { - - return Promise.resolve().then(function () { - - return nodeList.item(index); + codex.content.insertBlock({ + type: blockType.type, + block: blockType.render({ + text: tag.innerHTML + }) }); }; - /** - * Creates editor block by DOM node - * - * First-level blocks (see cEditor.settings.blockTags) saves as-is, - * other wrapps with

-tag - * - * @param DOMnode node - * @return First-level node (paragraph) - */ - parser.createBlockByDomNode = function (node) { - - /** First level nodes already appears as blocks */ - if (cEditor.parser.isFirstLevelBlock(node)) { - - /** Save plugin type in data-type */ - node = this.storeBlockType(node); - - return node; - } - - /** Other nodes wraps into parent block (paragraph-tag) */ - var parentBlock, - nodeContent = node.textContent.trim(), - isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG; - - /** Skip empty textNodes with space-symbols */ - if (isPlainTextNode && !nodeContent.length) return null; - - /** Make

tag */ - parentBlock = cEditor.draw.block('P'); - - if (isPlainTextNode) { - parentBlock.textContent = nodeContent.replace(/(\s){2,}/, '$1'); // remove double spaces - } else { - parentBlock.appendChild(node); - } - - /** Save plugin type in data-type */ - parentBlock = this.storeBlockType(parentBlock); - - return parentBlock; - }; - - /** - * It's a crutch - * - - - - - - - - * We need block type stored as data-attr - * Now supports only simple blocks : P, HEADER, QUOTE, CODE - * Remove it after updating parser module for the block-oriented structure: - * - each block must have stored type - * @param {Element} node - */ - parser.storeBlockType = function (node) { - - switch (node.tagName) { - case 'P': - node.dataset.tool = 'paragraph';break; - case 'H1': - case 'H2': - case 'H3': - case 'H4': - case 'H5': - case 'H6': - node.dataset.tool = 'header';break; - case 'BLOCKQUOTE': - node.dataset.tool = 'quote';break; - case 'CODE': - node.dataset.tool = 'code';break; - } - - return node; - }; - /** * Check DOM node for display style: separated block or child-view */ @@ -4575,7 +4431,7 @@ var codex = } Sanitize.Config.BASIC = { - elements: ['a', 'b', 'blockquote', 'br', 'cite', 'code', 'dd', 'dl', 'dt', 'em', 'i', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'u', 'ul'], + elements: ['a', 'b', 'blockquote', 'br', 'cite', 'code', 'dd', 'dl', 'dt', 'em', 'i', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'u', 'ul', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'], attributes: { 'a': ['href'], 'blockquote': ['cite'], diff --git a/codex-editor.js.map b/codex-editor.js.map index 55285bf9b..87c38a725 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap a41e1ed0708db88bb48a","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js","webpack:///./modules/sanitizer/sanitize.js","webpack:///./modules/sanitizer/config/basic.js","webpack:///./modules/sanitizer/config/relaxed.js","webpack:///./modules/sanitizer/config/restricted.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","sanitizer","version","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","currentNode","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","Config","BASIC","clearHTML","clean_node","setToPreviousBlock","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","tabKeyPressed","enterKeyPressed","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","firstLevelBlocksArea","clickedOnFirstLevelBlockArea","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","selectionLength","endOffset","atStart","_blockPaste","observer","MutationObserver","handlePasteEvents","config","attributes","childList","characterData","observe","mutations","currentToolType","bar","placeholder","div","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","getSeparatedTextFromContent","split","insertPastedContent","parsedTextContent","parseTextareaContent","initialContent","getNodesFromString","appendNodesToRedactor","inputString","contentHolder","createBlockByDomNode","nodeList","item","storeBlockType","parentBlock","nodeContent","isPlainTextNode","replace","Sanitize","options","ALL","allow_comments","allowed_elements","protocols","add_attributes","dom","remove_element_contents","remove_all_contents","remove_contents","Array","transformers","REGEX_PROTOCOL","RELATIVE","prototype","fragment","createDocumentFragment","current_element","whitelist_nodes","_array_index","needle","haystack","_merge_arrays_uniq","result","uniq_hash","j","_clean","elem","clone","_clean_element","cloneNode","parent_element","allowed_attributes","attr","attr_name","attr_node","del","attr_ok","_transform_element","nodeName","toLowerCase","whitelist","attrs","attr_whitelist","match","createAttribute","setAttributeNode","normalize","node_name","define","RELAXED","RESTRICTED"],"mappings":"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","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap a41e1ed0708db88bb48a","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.0.6\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n codex.sanitizer = require('./modules/sanitizer/sanitize');\n };\n\n codex.version = VERSION;\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, false);\n\n /**\n * Pasting content from another source\n */\n block.addEventListener('paste', function (event) {\n codex.callback.blockPaste(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.1.2\n */\n\nvar content = (function(content) {\n\n content.currentNode = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize(mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n * @todo Fix caret positioning\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC);\n var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]);\n\n target.innerHTML = \"\";\n target.appendChild(clearHTML);\n\n /**\n * Preliminary solution:\n * Always set caret at the end of input\n */\n var inputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * setting to current block:\n * (index + 1) minus 1 is current\n */\n codex.caret.setToPreviousBlock(inputIndex + 1);\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressed = function(event){\n\n /** Set current node */\n var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea();\n\n if (firstLevelBlocksArea) {\n event.preventDefault();\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n return;\n }\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n return;\n\n }\n\n /**\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != 'paragraph' || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.clickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n\n if (selection.rangeCount == 0) {\n\n return true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n return flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = 'paragraph';\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n }, 10);\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n mutations.forEach(codex.content.paste);\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar parser = (function(parser) {\n\n /**\n * Splits content by `\\n` and returns blocks\n */\n parser.getSeparatedTextFromContent = function(content) {\n return content.split('\\n');\n };\n\n /** inserting text */\n parser.insertPastedContent = function(content) {\n\n var blocks = this.getSeparatedTextFromContent(content),\n i,\n inputIndex = cEditor.caret.getCurrentInputIndex(),\n textNode,\n parsedTextContent;\n\n for(i = 0; i < blocks.length; i++) {\n\n blocks[i].trim();\n\n if (blocks[i]) {\n var data = cEditor.draw.pluginsRender('paragraph', blocks[i]);\n cEditor.content.insertBlock(data);\n }\n }\n\n };\n\n /**\n * Asynchronously parses textarea input string to HTML editor blocks\n */\n parser.parseTextareaContent = function () {\n\n var initialContent = cEditor.nodes.textarea.value;\n\n if ( initialContent.trim().length === 0 ) return true;\n\n\n cEditor.parser\n\n /** Get child nodes async-aware */\n .getNodesFromString(initialContent)\n\n /** Then append nodes to the redactor */\n .then(cEditor.parser.appendNodesToRedactor)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n cEditor.core.log('Error while parsing content: %o', 'warn', error);\n });\n\n };\n\n /**\n * Parses string to nodeList\n * @param string inputString\n * @return Primise -> nodeList\n */\n parser.getNodesFromString = function (inputString) {\n\n return Promise.resolve().then(function() {\n\n var contentHolder = document.createElement('div');\n\n contentHolder.innerHTML = inputString;\n\n /**\n * Returning childNodes will include:\n * - Elements (html-tags),\n * - Texts (empty-spaces or non-wrapped strings )\n * - Comments and other\n */\n return contentHolder.childNodes;\n\n });\n };\n\n /**\n * Appends nodes to the redactor\n * @param nodeList nodes - list for nodes to append\n */\n parser.appendNodesToRedactor = function(nodes) {\n\n /**\n * Sequence of one-by-one nodes appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n\n for (var index = 0; index < nodes.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n parser.appendNodeAtIndex = function (nodeSequence, nodes, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return cEditor.parser.getNodeAsync(nodes , index);\n\n })\n\n /**\n * second, compose editor-block from node\n * and append it to redactor\n */\n .then(function(node){\n\n var block = cEditor.parser.createBlockByDomNode(node);\n\n if ( cEditor.core.isDomNode(block) ) {\n\n block.contentEditable = \"true\";\n\n /** Mark node as redactor block*/\n block.classList.add('ce-block');\n\n /** Append block to the redactor */\n cEditor.nodes.redactor.appendChild(block);\n\n /** Save block to the cEditor.state array */\n cEditor.state.blocks.push(block);\n\n return block;\n\n }\n return null;\n })\n\n .then(cEditor.ui.addBlockHandlers)\n\n /** Log if something wrong with node */\n .catch(function(error) {\n cEditor.core.log('Node skipped while parsing because %o', 'warn', error);\n });\n\n };\n\n /**\n * Asynchronously returns node from nodeList by index\n * @return Promise to node\n */\n parser.getNodeAsync = function (nodeList, index) {\n\n return Promise.resolve().then(function() {\n\n return nodeList.item(index);\n\n });\n };\n\n /**\n * Creates editor block by DOM node\n *\n * First-level blocks (see cEditor.settings.blockTags) saves as-is,\n * other wrapps with

-tag\n *\n * @param DOMnode node\n * @return First-level node (paragraph)\n */\n parser.createBlockByDomNode = function (node) {\n\n /** First level nodes already appears as blocks */\n if ( cEditor.parser.isFirstLevelBlock(node) ){\n\n /** Save plugin type in data-type */\n node = this.storeBlockType(node);\n\n return node;\n }\n\n /** Other nodes wraps into parent block (paragraph-tag) */\n var parentBlock,\n nodeContent = node.textContent.trim(),\n isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG;\n\n\n /** Skip empty textNodes with space-symbols */\n if (isPlainTextNode && !nodeContent.length) return null;\n\n /** Make

tag */\n parentBlock = cEditor.draw.block('P');\n\n if (isPlainTextNode){\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\n } else {\n parentBlock.appendChild(node);\n }\n\n /** Save plugin type in data-type */\n parentBlock = this.storeBlockType(parentBlock);\n\n return parentBlock;\n\n };\n\n /**\n * It's a crutch\n * - - - - - - -\n * We need block type stored as data-attr\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\n * Remove it after updating parser module for the block-oriented structure:\n * - each block must have stored type\n * @param {Element} node\n */\n parser.storeBlockType = function (node) {\n\n switch (node.tagName) {\n case 'P' : node.dataset.tool = 'paragraph'; break;\n case 'H1':\n case 'H2':\n case 'H3':\n case 'H4':\n case 'H5':\n case 'H6': node.dataset.tool = 'header'; break;\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\n case 'CODE': node.dataset.tool = 'code'; break;\n }\n\n return node;\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Copyright (c) 2010 by Gabriel Birke\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nfunction Sanitize(){\n var i, e, options;\n options = arguments[0] || {};\n this.config = {};\n this.config.elements = options.elements ? options.elements : [];\n this.config.attributes = options.attributes ? options.attributes : {};\n this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];\n this.config.allow_comments = options.allow_comments ? options.allow_comments : false;\n this.allowed_elements = {};\n this.config.protocols = options.protocols ? options.protocols : {};\n this.config.add_attributes = options.add_attributes ? options.add_attributes : {};\n this.dom = options.dom ? options.dom : document;\n for(i=0;i 0) {\n this.current_element.removeChild(this.current_element.firstChild);\n }\n parent_element.appendChild(this.current_element);\n }\n\n // iterate over child nodes\n if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {\n for(i=0;i nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.1.6\n */\n\nvar content = (function(content) {\n\n /**\n * Links to current active block\n * @type {null | Element}\n */\n content.currentNode = null;\n\n /**\n * clicked in redactor area\n * @type {null | Boolean}\n */\n content.editorArea = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n /**\n * Block is inserted, wait for new click that defined focusing on editors area\n * @type {boolean}\n */\n content.editorArea = false;\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize(mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n /**\n * Sanitize configuration.\n * Using basic sanitize\n */\n var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC);\n\n var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]),\n i,\n tool;\n\n for (i = 0; i < clearHTML.childNodes.length; i++) {\n\n var tag = clearHTML.childNodes[i],\n blockType = null;\n\n for (tool in codex.tools) {\n\n var handleTags = codex.tools[tool].handleTagOnPaste;\n\n if (!handleTags) {\n continue;\n }\n\n if (handleTags.indexOf(tag.tagName) !== -1) {\n blockType = codex.tools[tool];\n break;\n }\n\n }\n\n if (blockType) {\n codex.parser.insertPastedContent(blockType, tag);\n }\n\n }\n\n /**\n * Remove node where data pasted\n */\n target = content.getFirstLevelBlock(target);\n\n if (target) {\n target.remove();\n }\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.1.3\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n }\n };\n\n callbacks.redactorKeyDown = function(event) {\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n callbacks.enterKeyPressed = function(event) {\n\n if (codex.content.editorArea) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n }\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressedOnRedactorZone = function(event){\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.isClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.isClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorArea = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorArea = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n mutations.forEach(codex.content.paste);\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Copyright (c) 2010 by Gabriel Birke\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nfunction Sanitize(){\n var i, e, options;\n options = arguments[0] || {};\n this.config = {};\n this.config.elements = options.elements ? options.elements : [];\n this.config.attributes = options.attributes ? options.attributes : {};\n this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];\n this.config.allow_comments = options.allow_comments ? options.allow_comments : false;\n this.allowed_elements = {};\n this.config.protocols = options.protocols ? options.protocols : {};\n this.config.add_attributes = options.add_attributes ? options.add_attributes : {};\n this.dom = options.dom ? options.dom : document;\n for(i=0;i 0) {\n this.current_element.removeChild(this.current_element.firstChild);\n }\n parent_element.appendChild(this.current_element);\n }\n\n // iterate over child nodes\n if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {\n for(i=0;i codex.start({ textareaId : "codex_area", + initialBlockPlugin : 'paragraph', + uploadImagesUrl : '/hull', tools : { paragraph: { type: 'paragraph', @@ -58,7 +60,8 @@ render: paragraphTool.render, save: paragraphTool.save, enableLineBreaks: false, - allowedToPaste: true + allowedToPaste: true, + handleTagOnPaste : ['P'] }, paste: { type: 'paste', @@ -81,7 +84,8 @@ settings: headerTool.makeSettings(), render: headerTool.render, save: headerTool.save, - displayInToolbox: true + displayInToolbox: true, + handleTagOnPaste : ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'] }, code: { type: 'code', @@ -148,7 +152,6 @@ settings: null, render: instagramTool.reneder, save: instagramTool.save, - displayInToolbox: false, enableLineBreaks: false, allowedToPaste: false }, @@ -161,7 +164,6 @@ settings: null, render: twitterTool.render, save: twitterTool.save, - displayInToolbox: false, enableLineBreaks: false, allowedToPaste: false } diff --git a/modules/callbacks.js b/modules/callbacks.js index 7bbcbcae6..7c05796e9 100644 --- a/modules/callbacks.js +++ b/modules/callbacks.js @@ -2,7 +2,7 @@ * Codex Editor callbacks module * * @author Codex Team - * @version 1.0 + * @version 1.1.3 */ var callbacks = (function(callbacks) { @@ -11,10 +11,16 @@ var callbacks = (function(callbacks) { callbacks.globalKeydown = function(event){ switch (event.keyCode){ - case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break; case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break; - case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break; - default : codex.callback.defaultKeyPressed(event); break; + } + }; + + callbacks.redactorKeyDown = function(event) { + switch (event.keyCode){ + case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break; + case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break; + case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break; + default : codex.callback.defaultKeyPressed(event); break; } }; @@ -42,17 +48,9 @@ var callbacks = (function(callbacks) { event.preventDefault(); }; - /** - * ENTER key handler - * Makes new paragraph block - */ - callbacks.enterKeyPressed = function(event){ - - /** Set current node */ - var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea(); + callbacks.enterKeyPressed = function(event) { - if (firstLevelBlocksArea) { - event.preventDefault(); + if (codex.content.editorArea) { /** * it means that we lose input index, saved index before is not correct @@ -61,8 +59,14 @@ var callbacks = (function(callbacks) { codex.caret.inputIndex = -1; codex.callback.enterPressedOnBlock(); - return; } + }; + + /** + * ENTER key handler + * Makes new paragraph block + */ + callbacks.enterKeyPressedOnRedactorZone = function(event){ if (event.target.contentEditable == 'true') { @@ -90,7 +94,7 @@ var callbacks = (function(callbacks) { var enableLineBreaks = codex.tools[tool].enableLineBreaks; /** This type of block creates when enter is pressed */ - var NEW_BLOCK_TYPE = 'paragraph'; + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; /** * When toolbar is opened, select tool instead of making new paragraph @@ -103,6 +107,12 @@ var callbacks = (function(callbacks) { codex.toolbar.close(); + /** + * Stop other listeners callback executions + */ + event.stopPropagation(); + event.stopImmediatePropagation(); + return; } @@ -224,6 +234,8 @@ var callbacks = (function(callbacks) { callbacks.redactorClicked = function (event) { + callbacks.isClickedOnFirstLevelBlockArea(); + codex.content.workingNodeChanged(event.target); codex.ui.saveInputs(); @@ -259,14 +271,14 @@ var callbacks = (function(callbacks) { } /** If input is empty, then we set caret to the last input */ - if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') { + if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) { codex.caret.setToBlock(indexOfLastInput); } else { /** Create new input when caret clicked in redactors area */ - var NEW_BLOCK_TYPE = 'paragraph'; + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; codex.content.insertBlock({ type : NEW_BLOCK_TYPE, @@ -325,7 +337,7 @@ var callbacks = (function(callbacks) { var currentNodeType = codex.content.currentNode.dataset.tool; /** Mark current block*/ - if (currentNodeType != 'paragraph' || !inputIsEmpty) { + if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) { codex.content.markBlock(); @@ -340,16 +352,15 @@ var callbacks = (function(callbacks) { * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always * specifies to the first-level block. Other cases we just ignore. */ - callbacks.clickedOnFirstLevelBlockArea = function() { + callbacks.isClickedOnFirstLevelBlockArea = function() { var selection = window.getSelection(), anchorNode = selection.anchorNode, flag = false; - if (selection.rangeCount == 0) { - return true; + codex.content.editorArea = true; } else { @@ -375,7 +386,7 @@ var callbacks = (function(callbacks) { } /** If editable element founded, flag is "TRUE", Therefore we return "FALSE" */ - return flag ? false : true; + codex.content.editorArea = flag ? false : true; } }; @@ -604,7 +615,7 @@ var callbacks = (function(callbacks) { */ callbacks.enterPressedOnBlock = function (event) { - var NEW_BLOCK_TYPE = 'paragraph'; + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; codex.content.insertBlock({ type : NEW_BLOCK_TYPE, @@ -706,8 +717,12 @@ var callbacks = (function(callbacks) { codex.content.sanitize(node); + event.preventDefault(); + }, 10); + event.stopImmediatePropagation(); + }; callbacks._blockPaste = function(event) { diff --git a/modules/content.js b/modules/content.js index 35bbc1e23..db6e155b7 100644 --- a/modules/content.js +++ b/modules/content.js @@ -3,13 +3,23 @@ * Works with DOM * * @author Codex Team - * @version 1.1.2 + * @version 1.1.6 */ var content = (function(content) { + /** + * Links to current active block + * @type {null | Element} + */ content.currentNode = null; + /** + * clicked in redactor area + * @type {null | Boolean} + */ + content.editorArea = null; + /** * Synchronizes redactor with original textarea */ @@ -259,6 +269,12 @@ var content = (function(content) { } + /** + * Block is inserted, wait for new click that defined focusing on editors area + * @type {boolean} + */ + content.editorArea = false; + }; /** @@ -464,7 +480,7 @@ var content = (function(content) { newNode = newNode.innerHTML; /** This type of block creates when enter is pressed */ - var NEW_BLOCK_TYPE = 'paragraph'; + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; /** * Make new paragraph with text after caret @@ -546,7 +562,6 @@ var content = (function(content) { * Sanitizes HTML content * @param {Element} target - inserted element * @uses Sanitize library and BASIC configuration - * @todo Fix caret positioning */ content.sanitize = function(target) { @@ -554,23 +569,50 @@ var content = (function(content) { return; } + /** + * Sanitize configuration. + * Using basic sanitize + */ var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC); - var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]); - target.innerHTML = ""; - target.appendChild(clearHTML); + var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]), + i, + tool; - /** - * Preliminary solution: - * Always set caret at the end of input - */ - var inputIndex = codex.caret.getCurrentInputIndex(); + for (i = 0; i < clearHTML.childNodes.length; i++) { + + var tag = clearHTML.childNodes[i], + blockType = null; + + for (tool in codex.tools) { + + var handleTags = codex.tools[tool].handleTagOnPaste; + + if (!handleTags) { + continue; + } + + if (handleTags.indexOf(tag.tagName) !== -1) { + blockType = codex.tools[tool]; + break; + } + + } + + if (blockType) { + codex.parser.insertPastedContent(blockType, tag); + } + + } /** - * setting to current block: - * (index + 1) minus 1 is current + * Remove node where data pasted */ - codex.caret.setToPreviousBlock(inputIndex + 1); + target = content.getFirstLevelBlock(target); + + if (target) { + target.remove(); + } }; diff --git a/modules/core.js b/modules/core.js index 38f5d3adc..2b40d1720 100644 --- a/modules/core.js +++ b/modules/core.js @@ -2,7 +2,7 @@ * Codex Editor Core * * @author Codex Team - * @version 1.0 + * @version 1.1.2 */ var core = (function(core) { @@ -27,6 +27,14 @@ var core = (function(core) { codex.state.blocks = userSettings.data; } + if (userSettings.initialBlockPlugin) { + codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin; + } + + if (userSettings.uploadImagesUrl) { + codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl; + } + codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId); if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) { diff --git a/modules/parser.js b/modules/parser.js index c12c4cb7d..fa1ac6b94 100644 --- a/modules/parser.js +++ b/modules/parser.js @@ -2,243 +2,20 @@ * Codex Editor Parser Module * * @author Codex Team - * @version 1.0 + * @version 1.1 */ var parser = (function(parser) { - /** - * Splits content by `\n` and returns blocks - */ - parser.getSeparatedTextFromContent = function(content) { - return content.split('\n'); - }; - /** inserting text */ - parser.insertPastedContent = function(content) { - - var blocks = this.getSeparatedTextFromContent(content), - i, - inputIndex = cEditor.caret.getCurrentInputIndex(), - textNode, - parsedTextContent; - - for(i = 0; i < blocks.length; i++) { - - blocks[i].trim(); - - if (blocks[i]) { - var data = cEditor.draw.pluginsRender('paragraph', blocks[i]); - cEditor.content.insertBlock(data); - } - } - - }; - - /** - * Asynchronously parses textarea input string to HTML editor blocks - */ - parser.parseTextareaContent = function () { - - var initialContent = cEditor.nodes.textarea.value; - - if ( initialContent.trim().length === 0 ) return true; - - - cEditor.parser - - /** Get child nodes async-aware */ - .getNodesFromString(initialContent) - - /** Then append nodes to the redactor */ - .then(cEditor.parser.appendNodesToRedactor) - - /** Write log if something goes wrong */ - .catch(function(error) { - cEditor.core.log('Error while parsing content: %o', 'warn', error); - }); - - }; - - /** - * Parses string to nodeList - * @param string inputString - * @return Primise -> nodeList - */ - parser.getNodesFromString = function (inputString) { - - return Promise.resolve().then(function() { - - var contentHolder = document.createElement('div'); - - contentHolder.innerHTML = inputString; - - /** - * Returning childNodes will include: - * - Elements (html-tags), - * - Texts (empty-spaces or non-wrapped strings ) - * - Comments and other - */ - return contentHolder.childNodes; - - }); - }; - - /** - * Appends nodes to the redactor - * @param nodeList nodes - list for nodes to append - */ - parser.appendNodesToRedactor = function(nodes) { - - /** - * Sequence of one-by-one nodes appending - * Uses to save blocks order after async-handler - */ - var nodeSequence = Promise.resolve(); - - - for (var index = 0; index < nodes.length ; index++ ) { - - /** Add node to sequence at specified index */ - cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index); - - } - - }; - - /** - * Append node at specified index - */ - parser.appendNodeAtIndex = function (nodeSequence, nodes, index) { + parser.insertPastedContent = function(blockType, tag) { - /** We need to append node to sequence */ - nodeSequence - - /** first, get node async-aware */ - .then(function() { - - return cEditor.parser.getNodeAsync(nodes , index); - - }) - - /** - * second, compose editor-block from node - * and append it to redactor - */ - .then(function(node){ - - var block = cEditor.parser.createBlockByDomNode(node); - - if ( cEditor.core.isDomNode(block) ) { - - block.contentEditable = "true"; - - /** Mark node as redactor block*/ - block.classList.add('ce-block'); - - /** Append block to the redactor */ - cEditor.nodes.redactor.appendChild(block); - - /** Save block to the cEditor.state array */ - cEditor.state.blocks.push(block); - - return block; - - } - return null; + codex.content.insertBlock({ + type : blockType.type, + block : blockType.render({ + text : tag.innerHTML }) - - .then(cEditor.ui.addBlockHandlers) - - /** Log if something wrong with node */ - .catch(function(error) { - cEditor.core.log('Node skipped while parsing because %o', 'warn', error); - }); - - }; - - /** - * Asynchronously returns node from nodeList by index - * @return Promise to node - */ - parser.getNodeAsync = function (nodeList, index) { - - return Promise.resolve().then(function() { - - return nodeList.item(index); - }); - }; - - /** - * Creates editor block by DOM node - * - * First-level blocks (see cEditor.settings.blockTags) saves as-is, - * other wrapps with

-tag - * - * @param DOMnode node - * @return First-level node (paragraph) - */ - parser.createBlockByDomNode = function (node) { - - /** First level nodes already appears as blocks */ - if ( cEditor.parser.isFirstLevelBlock(node) ){ - - /** Save plugin type in data-type */ - node = this.storeBlockType(node); - - return node; - } - - /** Other nodes wraps into parent block (paragraph-tag) */ - var parentBlock, - nodeContent = node.textContent.trim(), - isPlainTextNode = node.nodeType != cEditor.core.nodeTypes.TAG; - - - /** Skip empty textNodes with space-symbols */ - if (isPlainTextNode && !nodeContent.length) return null; - - /** Make

tag */ - parentBlock = cEditor.draw.block('P'); - - if (isPlainTextNode){ - parentBlock.textContent = nodeContent.replace(/(\s){2,}/, '$1'); // remove double spaces - } else { - parentBlock.appendChild(node); - } - - /** Save plugin type in data-type */ - parentBlock = this.storeBlockType(parentBlock); - - return parentBlock; - - }; - - /** - * It's a crutch - * - - - - - - - - * We need block type stored as data-attr - * Now supports only simple blocks : P, HEADER, QUOTE, CODE - * Remove it after updating parser module for the block-oriented structure: - * - each block must have stored type - * @param {Element} node - */ - parser.storeBlockType = function (node) { - - switch (node.tagName) { - case 'P' : node.dataset.tool = 'paragraph'; break; - case 'H1': - case 'H2': - case 'H3': - case 'H4': - case 'H5': - case 'H6': node.dataset.tool = 'header'; break; - case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break; - case 'CODE': node.dataset.tool = 'code'; break; - } - - return node; }; diff --git a/modules/sanitizer/config/basic.js b/modules/sanitizer/config/basic.js index b035c55a2..85042b8ff 100644 --- a/modules/sanitizer/config/basic.js +++ b/modules/sanitizer/config/basic.js @@ -8,7 +8,7 @@ Sanitize.Config.BASIC = { elements: [ 'a', 'b', 'blockquote', 'br', 'cite', 'code', 'dd', 'dl', 'dt', 'em', 'i', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', - 'sup', 'u', 'ul'], + 'sup', 'u', 'ul', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'], attributes: { 'a' : ['href'], 'blockquote': ['cite'], diff --git a/modules/ui.js b/modules/ui.js index 36a232247..d0d2fdabb 100644 --- a/modules/ui.js +++ b/modules/ui.js @@ -17,30 +17,30 @@ var ui = (function(ui){ */ BLOCK_CLASSNAME : 'ce-block', - /** - * @const {String} wrapper for plugins content - */ - BLOCK_CONTENT : 'ce-block__content', + /** + * @const {String} wrapper for plugins content + */ + BLOCK_CONTENT : 'ce-block__content', - /** - * @const {String} BLOCK_STRETCHED - makes block stretched - */ - BLOCK_STRETCHED : 'ce-block--stretched', + /** + * @const {String} BLOCK_STRETCHED - makes block stretched + */ + BLOCK_STRETCHED : 'ce-block--stretched', - /** - * @const {String} BLOCK_HIGHLIGHTED - adds background - */ - BLOCK_HIGHLIGHTED : 'ce-block--focused', + /** + * @const {String} BLOCK_HIGHLIGHTED - adds background + */ + BLOCK_HIGHLIGHTED : 'ce-block--focused', - /** - * @const {String} - highlights covered blocks - */ - BLOCK_IN_FEED_MODE : 'ce-block--feed-mode', + /** + * @const {String} - highlights covered blocks + */ + BLOCK_IN_FEED_MODE : 'ce-block--feed-mode', - /** - * @const {String} - for all default settings - */ - SETTINGS_ITEM : 'ce-settings__item' + /** + * @const {String} - for all default settings + */ + SETTINGS_ITEM : 'ce-settings__item' }; @@ -264,7 +264,10 @@ var ui = (function(ui){ }, false ); /** All keydowns on Document */ - codex.nodes.redactor.addEventListener('keydown', codex.callback.globalKeydown, false ); + document.addEventListener('keydown', codex.callback.globalKeydown, false ); + + /** All keydowns on Redactor zone */ + codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false); /** All keydowns on Document */ document.addEventListener('keyup', codex.callback.globalKeyup, false ); diff --git a/package.json b/package.json index 80b69d646..434f17dd5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codex.editor", - "version": "1.0.12", + "version": "1.1.0", "description": "Codex Editor. Native JS, based on API and Open Source", "main": "index.js", "scripts": { diff --git a/plugins/header/header.js b/plugins/header/header.js index 1a3fef791..9b780545a 100644 --- a/plugins/header/header.js +++ b/plugins/header/header.js @@ -35,6 +35,10 @@ var headerTool = { tag.textContent = data.text; } + if (!tag.dataset.headerData) { + tag.dataset.headerData = 'H2'; + } + tag.classList.add('ce-header'); tag.setAttribute('data-placeholder', 'Heading'); tag.contentEditable = true; diff --git a/whatwg-fetch.js.map b/whatwg-fetch.js.map index 22f5fdcfb..7d4be7c23 100644 --- a/whatwg-fetch.js.map +++ b/whatwg-fetch.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 2d10cb689e9f3d7ede20?22d7","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2d10cb689e9f3d7ede20","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 0d418aab6939be89286b?7a79","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0d418aab6939be89286b","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file From 54770f02970bc3a15ca6dcdc8bc60c6d5978e028 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Sun, 8 Jan 2017 14:54:33 +0300 Subject: [PATCH 07/11] sanitize improved, using observers --- codex-editor.js | 141 +++++++++++++++++++++--------- codex-editor.js.map | 2 +- editor.js | 2 +- modules/callbacks.js | 19 +++- modules/content.js | 98 ++++++++++++++------- modules/sanitizer/config/basic.js | 2 +- modules/ui.js | 18 +++- package.json | 2 +- whatwg-fetch.js.map | 2 +- 9 files changed, 206 insertions(+), 80 deletions(-) diff --git a/codex-editor.js b/codex-editor.js index 86c6b7bd8..faf238d82 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -65,7 +65,7 @@ var codex = * Codex Editor * * @author Codex Team - * @version 1.1.4 + * @version 1.2.1 */ var codex = function (codex) { @@ -87,7 +87,7 @@ var codex = codex.sanitizer = __webpack_require__(18); }; - codex.version = ("1.1.0"); + codex.version = ("1.2.2"); /** * @public @@ -388,7 +388,7 @@ var codex = * Codex Editor UI module * * @author Codex Team - * @version 1.0 + * @version 1.1 */ var ui = function (ui) { @@ -693,9 +693,23 @@ var codex = /** * Pasting content from another source + * We have two type of sanitization + * First - uses deep-first search algorithm to get sub nodes, + * sanitizes whole Block_content and replaces cleared nodes + * + * Method is used in codex.callback.blockPaste(event) + * + * Secont - uses Mutation observer. + * Observer "observe" DOM changes and send changings to callback. + * Callback gets changed node, not whole Block_content. + * Inserted or changed node, which we've gotten have been cleared and replaced with diry node + * + * Method is used in codex.callback._blockPaste(event) + * + * @uses codex.callback._blockPaste(event), the second method. */ block.addEventListener('paste', function (event) { - codex.callback.blockPaste(event); + codex.callback._blockPaste(event); }, false); block.addEventListener('mouseup', function () { @@ -1148,7 +1162,7 @@ var codex = * Works with DOM * * @author Codex Team - * @version 1.1.6 + * @version 1.2.0 */ var content = function (content) { @@ -1651,7 +1665,7 @@ var codex = tool = workingNode.dataset.tool; if (codex.tools[tool].allowedToPaste) { - codex.content.sanitize(mutation.addedNodes); + codex.content.sanitize.bind(this, mutation.addedNodes)(); } else { codex.content.pasteTextContent(mutation.addedNodes); } @@ -1686,48 +1700,84 @@ var codex = return; } + var node = target[0]; + + if (!node) { + return; + } + + /** + * Disconnect Observer + * hierarchy of function calls inherits context of observer + */ + this.disconnect(); + /** * Sanitize configuration. * Using basic sanitize */ var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC); - var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]), - i, - tool; - - for (i = 0; i < clearHTML.childNodes.length; i++) { - - var tag = clearHTML.childNodes[i], - blockType = null; - - for (tool in codex.tools) { - - var handleTags = codex.tools[tool].handleTagOnPaste; - - if (!handleTags) { - continue; - } - - if (handleTags.indexOf(tag.tagName) !== -1) { - blockType = codex.tools[tool]; - break; - } - } + var clearHTML, i, tool; - if (blockType) { - codex.parser.insertPastedContent(blockType, tag); - } + /** + * Don't sanitize text node + */ + if (node.nodeType == codex.core.nodeTypes.TEXT) { + return; } + /** + * Clear dirty content + */ + clearHTML = sanitizer.clean_node(node); + node.replaceWith(clearHTML); + + // for(i = 0; i < target.childNodes.length; i++) { + + // var node = target.childNodes[i]; + + // console.log("Узел %o", node); + + // node.replaceWith(clearHTML); + // } + + // return; + + // for (i = 0; i < clearHTML.childNodes.length; i++) { + // + // var tag = clearHTML.childNodes[i], + // blockType = null; + // + // for (tool in codex.tools) { + // + // var handleTags = codex.tools[tool].handleTagOnPaste; + // + // if (!handleTags) { + // continue; + // } + // + // if (handleTags.indexOf(tag.tagName) !== -1) { + // blockType = codex.tools[tool]; + // break; + // } + // + // } + // + // if (blockType) { + // codex.parser.insertPastedContent(blockType, tag); + // } + // + // } + /** * Remove node where data pasted */ - target = content.getFirstLevelBlock(target); + // target = content.getFirstLevelBlock(target); - if (target) { - target.remove(); - } + // if (target) { + // target.remove(); + // } }; return content; @@ -2792,7 +2842,7 @@ var codex = * Codex Editor callbacks module * * @author Codex Team - * @version 1.1.3 + * @version 1.2.1 */ var callbacks = function (callbacks) { @@ -3477,7 +3527,7 @@ var codex = /** * configuration of the observer: */ - var config = { attributes: true, childList: true, characterData: false }; + var config = { attributes: true, childList: true, characterData: false, subtree: true }; // pass in the target node, as well as the observer options observer.observe(codex.state.inputs[currentInputIndex], config); @@ -3487,7 +3537,20 @@ var codex = * Sends all mutations to paste handler */ callbacks.handlePasteEvents = function (mutations) { - mutations.forEach(codex.content.paste); + + var self = this, + callback; + + /** + * using closure to call the function immediatelly. + * Also, we should sanitize pasted or changed data one time and ignore + * changings which makes sanitize method. + * For that, we need to send Context, MutationObserver.__proto__ that contains + * observer disconnect method. + */ + mutations.forEach(function (mutation) { + codex.content.paste.bind(self, mutation)(); + }); }; /** @@ -4431,7 +4494,7 @@ var codex = } Sanitize.Config.BASIC = { - elements: ['a', 'b', 'blockquote', 'br', 'cite', 'code', 'dd', 'dl', 'dt', 'em', 'i', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'u', 'ul', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'], + elements: ['a', 'b', 'blockquote', 'br', 'cite', 'code', 'dd', 'dl', 'dt', 'em', 'i', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'u', 'ul', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'span'], attributes: { 'a': ['href'], 'blockquote': ['cite'], diff --git a/codex-editor.js.map b/codex-editor.js.map index 87c38a725..e78982dde 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap c2c2f19fd0ce8dea5677","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js","webpack:///./modules/sanitizer/sanitize.js","webpack:///./modules/sanitizer/config/basic.js","webpack:///./modules/sanitizer/config/relaxed.js","webpack:///./modules/sanitizer/config/restricted.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","sanitizer","version","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","redactorKeyDown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","currentNode","editorArea","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","Config","BASIC","clearHTML","clean_node","tag","handleTags","handleTagOnPaste","indexOf","tagName","insertPastedContent","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","enterKeyPressed","tabKeyPressed","enterKeyPressedOnRedactorZone","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","stopPropagation","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","isClickedOnFirstLevelBlockArea","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","_blockPaste","observer","MutationObserver","handlePasteEvents","config","attributes","childList","characterData","observe","mutations","currentToolType","bar","placeholder","div","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","Sanitize","options","ALL","allow_comments","allowed_elements","protocols","add_attributes","dom","remove_element_contents","remove_all_contents","remove_contents","Array","transformers","REGEX_PROTOCOL","RELATIVE","prototype","fragment","createDocumentFragment","current_element","whitelist_nodes","_array_index","needle","haystack","_merge_arrays_uniq","result","uniq_hash","j","_clean","elem","clone","_clean_element","cloneNode","parent_element","allowed_attributes","attr","attr_name","attr_node","del","attr_ok","_transform_element","nodeName","toLowerCase","whitelist","attrs","attr_whitelist","match","createAttribute","setAttributeNode","normalize","node_name","define","RELAXED","RESTRICTED"],"mappings":"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","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap c2c2f19fd0ce8dea5677","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.1.4\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n codex.sanitizer = require('./modules/sanitizer/sanitize');\n };\n\n codex.version = VERSION;\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.1.2\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n if (userSettings.initialBlockPlugin) {\n codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin;\n }\n\n if (userSettings.uploadImagesUrl) {\n codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n document.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Redactor zone */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false);\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, false);\n\n /**\n * Pasting content from another source\n */\n block.addEventListener('paste', function (event) {\n codex.callback.blockPaste(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.1.6\n */\n\nvar content = (function(content) {\n\n /**\n * Links to current active block\n * @type {null | Element}\n */\n content.currentNode = null;\n\n /**\n * clicked in redactor area\n * @type {null | Boolean}\n */\n content.editorArea = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n /**\n * Block is inserted, wait for new click that defined focusing on editors area\n * @type {boolean}\n */\n content.editorArea = false;\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize(mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n /**\n * Sanitize configuration.\n * Using basic sanitize\n */\n var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC);\n\n var clearHTML = sanitizer.clean_node(codex.content.currentNode.childNodes[0]),\n i,\n tool;\n\n for (i = 0; i < clearHTML.childNodes.length; i++) {\n\n var tag = clearHTML.childNodes[i],\n blockType = null;\n\n for (tool in codex.tools) {\n\n var handleTags = codex.tools[tool].handleTagOnPaste;\n\n if (!handleTags) {\n continue;\n }\n\n if (handleTags.indexOf(tag.tagName) !== -1) {\n blockType = codex.tools[tool];\n break;\n }\n\n }\n\n if (blockType) {\n codex.parser.insertPastedContent(blockType, tag);\n }\n\n }\n\n /**\n * Remove node where data pasted\n */\n target = content.getFirstLevelBlock(target);\n\n if (target) {\n target.remove();\n }\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.1.3\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n }\n };\n\n callbacks.redactorKeyDown = function(event) {\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n callbacks.enterKeyPressed = function(event) {\n\n if (codex.content.editorArea) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n }\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressedOnRedactorZone = function(event){\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.isClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.isClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorArea = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorArea = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n mutations.forEach(codex.content.paste);\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Copyright (c) 2010 by Gabriel Birke\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nfunction Sanitize(){\n var i, e, options;\n options = arguments[0] || {};\n this.config = {};\n this.config.elements = options.elements ? options.elements : [];\n this.config.attributes = options.attributes ? options.attributes : {};\n this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];\n this.config.allow_comments = options.allow_comments ? options.allow_comments : false;\n this.allowed_elements = {};\n this.config.protocols = options.protocols ? options.protocols : {};\n this.config.add_attributes = options.add_attributes ? options.add_attributes : {};\n this.dom = options.dom ? options.dom : document;\n for(i=0;i 0) {\n this.current_element.removeChild(this.current_element.firstChild);\n }\n parent_element.appendChild(this.current_element);\n }\n\n // iterate over child nodes\n if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {\n for(i=0;i nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.2.0\n */\n\nvar content = (function(content) {\n\n /**\n * Links to current active block\n * @type {null | Element}\n */\n content.currentNode = null;\n\n /**\n * clicked in redactor area\n * @type {null | Boolean}\n */\n content.editorArea = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n /**\n * Block is inserted, wait for new click that defined focusing on editors area\n * @type {boolean}\n */\n content.editorArea = false;\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n (codex.content.sanitize.bind(this, mutation.addedNodes))();\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var node = target[0];\n\n if (!node) {\n return;\n }\n\n /**\n * Disconnect Observer\n * hierarchy of function calls inherits context of observer\n */\n this.disconnect();\n\n /**\n * Sanitize configuration.\n * Using basic sanitize\n */\n var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC);\n\n var clearHTML,\n i,\n tool;\n\n /**\n * Don't sanitize text node\n */\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n return;\n }\n\n /**\n * Clear dirty content\n */\n clearHTML = sanitizer.clean_node(node);\n node.replaceWith(clearHTML);\n\n // for(i = 0; i < target.childNodes.length; i++) {\n\n // var node = target.childNodes[i];\n\n // console.log(\"Узел %o\", node);\n\n // node.replaceWith(clearHTML);\n // }\n\n // return;\n\n // for (i = 0; i < clearHTML.childNodes.length; i++) {\n //\n // var tag = clearHTML.childNodes[i],\n // blockType = null;\n //\n // for (tool in codex.tools) {\n //\n // var handleTags = codex.tools[tool].handleTagOnPaste;\n //\n // if (!handleTags) {\n // continue;\n // }\n //\n // if (handleTags.indexOf(tag.tagName) !== -1) {\n // blockType = codex.tools[tool];\n // break;\n // }\n //\n // }\n //\n // if (blockType) {\n // codex.parser.insertPastedContent(blockType, tag);\n // }\n //\n // }\n\n /**\n * Remove node where data pasted\n */\n // target = content.getFirstLevelBlock(target);\n\n // if (target) {\n // target.remove();\n // }\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.2.1\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n }\n };\n\n callbacks.redactorKeyDown = function(event) {\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n callbacks.enterKeyPressed = function(event) {\n\n if (codex.content.editorArea) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n }\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressedOnRedactorZone = function(event){\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.isClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.isClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorArea = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorArea = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false, subtree : true };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n\n var self = this,\n callback;\n\n /**\n * using closure to call the function immediatelly.\n * Also, we should sanitize pasted or changed data one time and ignore\n * changings which makes sanitize method.\n * For that, we need to send Context, MutationObserver.__proto__ that contains\n * observer disconnect method.\n */\n mutations.forEach(function(mutation) {\n (codex.content.paste.bind(self, mutation))();\n });\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Copyright (c) 2010 by Gabriel Birke\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nfunction Sanitize(){\n var i, e, options;\n options = arguments[0] || {};\n this.config = {};\n this.config.elements = options.elements ? options.elements : [];\n this.config.attributes = options.attributes ? options.attributes : {};\n this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];\n this.config.allow_comments = options.allow_comments ? options.allow_comments : false;\n this.allowed_elements = {};\n this.config.protocols = options.protocols ? options.protocols : {};\n this.config.add_attributes = options.add_attributes ? options.add_attributes : {};\n this.dom = options.dom ? options.dom : document;\n for(i=0;i 0) {\n this.current_element.removeChild(this.current_element.firstChild);\n }\n parent_element.appendChild(this.current_element);\n }\n\n // iterate over child nodes\n if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {\n for(i=0;i -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 59b40846d3fc3e9171a2?db49","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 59b40846d3fc3e9171a2","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file From 2f059b31984d7efa49047f59eddc706979f8feb3 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Tue, 10 Jan 2017 18:49:42 +0300 Subject: [PATCH 08/11] sanitize: using html-janitor --- codex-editor.js | 659 ++++++++++--------------- codex-editor.js.map | 2 +- editor.js | 3 +- example.html | 2 +- modules/callbacks.js | 14 +- modules/content.js | 60 +-- modules/sanitizer/config/basic.js | 29 -- modules/sanitizer/config/relaxed.js | 35 -- modules/sanitizer/config/restricted.js | 11 - modules/sanitizer/sanitize.js | 265 ---------- package.json | 4 +- whatwg-fetch.js.map | 2 +- 12 files changed, 298 insertions(+), 788 deletions(-) delete mode 100644 modules/sanitizer/config/basic.js delete mode 100644 modules/sanitizer/config/relaxed.js delete mode 100644 modules/sanitizer/config/restricted.js delete mode 100644 modules/sanitizer/sanitize.js diff --git a/codex-editor.js b/codex-editor.js index faf238d82..3149ffe46 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -65,7 +65,7 @@ var codex = * Codex Editor * * @author Codex Team - * @version 1.2.1 + * @version 1.2.5 */ var codex = function (codex) { @@ -77,17 +77,16 @@ var codex = codex.renderer = __webpack_require__(5); codex.saver = __webpack_require__(6); codex.content = __webpack_require__(7); - codex.toolbar = __webpack_require__(8); - codex.tools = __webpack_require__(12); - codex.callback = __webpack_require__(13); - codex.draw = __webpack_require__(14); - codex.caret = __webpack_require__(15); - codex.notifications = __webpack_require__(16); - codex.parser = __webpack_require__(17); - codex.sanitizer = __webpack_require__(18); + codex.toolbar = __webpack_require__(9); + codex.tools = __webpack_require__(13); + codex.callback = __webpack_require__(14); + codex.draw = __webpack_require__(15); + codex.caret = __webpack_require__(16); + codex.notifications = __webpack_require__(17); + codex.parser = __webpack_require__(18); }; - codex.version = ("1.2.2"); + codex.version = ("1.2.8"); /** * @public @@ -1153,7 +1152,7 @@ var codex = /***/ }, /* 7 */ -/***/ function(module, exports) { +/***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1162,9 +1161,32 @@ var codex = * Works with DOM * * @author Codex Team - * @version 1.2.0 + * @version 1.3.1 */ + var janitor = __webpack_require__(8); + + /** + * Default settings for sane. + * @uses html-janitor + */ + var Config = { + + tags: { + p: {}, + a: { + href: true, + target: '_blank', + rel: true + }, + i: true, + b: true, + strong: true, + em: true, + span: true + } + }; + var content = function (content) { /** @@ -1712,14 +1734,6 @@ var codex = */ this.disconnect(); - /** - * Sanitize configuration. - * Using basic sanitize - */ - var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC); - - var clearHTML, i, tool; - /** * Don't sanitize text node */ @@ -1730,19 +1744,14 @@ var codex = /** * Clear dirty content */ - clearHTML = sanitizer.clean_node(node); - node.replaceWith(clearHTML); - - // for(i = 0; i < target.childNodes.length; i++) { - // var node = target.childNodes[i]; + var sanitizer = new janitor(Config), + clear = sanitizer.clean(node.outerHTML); - // console.log("Узел %o", node); - - // node.replaceWith(clearHTML); - // } + var newFragment = document.createElement('DIV'); + newFragment.innerHTML = clear; - // return; + node.replaceWith(newFragment.childNodes[0]); // for (i = 0; i < clearHTML.childNodes.length; i++) { // @@ -1769,15 +1778,6 @@ var codex = // } // // } - - /** - * Remove node where data pasted - */ - // target = content.getFirstLevelBlock(target); - - // if (target) { - // target.remove(); - // } }; return content; @@ -1787,6 +1787,197 @@ var codex = /***/ }, /* 8 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) { + if (true) { + !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else if (typeof exports === 'object') { + module.exports = factory(); + } else { + root.HTMLJanitor = factory(); + } + }(this, function () { + + /** + * @param {Object} config.tags Dictionary of allowed tags. + * @param {boolean} config.keepNestedBlockElements Default false. + */ + function HTMLJanitor(config) { + + var tagDefinitions = config['tags']; + var tags = Object.keys(tagDefinitions); + + var validConfigValues = tags + .map(function(k) { return typeof tagDefinitions[k]; }) + .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; }); + + if(!validConfigValues) { + throw new Error("The configuration was invalid"); + } + + this.config = config; + } + + // TODO: not exhaustive? + var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE']; + function isBlockElement(node) { + return blockElementNames.indexOf(node.nodeName) !== -1; + } + + var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE']; + function isInlineElement(node) { + return inlineElementNames.indexOf(node.nodeName) !== -1; + } + + HTMLJanitor.prototype.clean = function (html) { + var sandbox = document.createElement('div'); + sandbox.innerHTML = html; + + this._sanitize(sandbox); + + return sandbox.innerHTML; + }; + + HTMLJanitor.prototype._sanitize = function (parentNode) { + var treeWalker = createTreeWalker(parentNode); + var node = treeWalker.firstChild(); + if (!node) { return; } + + do { + // Ignore nodes that have already been sanitized + if (node._sanitized) { + continue; + } + + if (node.nodeType === Node.TEXT_NODE) { + // If this text node is just whitespace and the previous or next element + // sibling is a block element, remove it + // N.B.: This heuristic could change. Very specific to a bug with + // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output + // FIXME: make this an option? + if (node.data.trim() === '' + && ((node.previousElementSibling && isBlockElement(node.previousElementSibling)) + || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) { + parentNode.removeChild(node); + this._sanitize(parentNode); + break; + } else { + continue; + } + } + + // Remove all comments + if (node.nodeType === Node.COMMENT_NODE) { + parentNode.removeChild(node); + this._sanitize(parentNode); + break; + } + + var isInline = isInlineElement(node); + var containsBlockElement; + if (isInline) { + containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement); + } + + // Block elements should not be nested (e.g.

  • ...); if + // they are, we want to unwrap the inner block element. + var isNotTopContainer = !! parentNode.parentNode; + var isNestedBlockElement = + isBlockElement(parentNode) && + isBlockElement(node) && + isNotTopContainer; + + var nodeName = node.nodeName.toLowerCase(); + + var allowedAttrs = getAllowedAttrs(this.config, nodeName, node); + + var isInvalid = isInline && containsBlockElement; + + // Drop tag entirely according to the whitelist *and* if the markup + // is invalid. + if (isInvalid || shouldRejectNode(node, allowedAttrs) + || (!this.config.keepNestedBlockElements && isNestedBlockElement)) { + // Do not keep the inner text of SCRIPT/STYLE elements. + if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) { + while (node.childNodes.length > 0) { + parentNode.insertBefore(node.childNodes[0], node); + } + } + parentNode.removeChild(node); + + this._sanitize(parentNode); + break; + } + + // Sanitize attributes + for (var a = 0; a < node.attributes.length; a += 1) { + var attr = node.attributes[a]; + + if (shouldRejectAttr(attr, allowedAttrs, node)) { + node.removeAttribute(attr.name); + // Shift the array to continue looping. + a = a - 1; + } + } + + // Sanitize children + this._sanitize(node); + + // Mark node as sanitized so it's ignored in future runs + node._sanitized = true; + } while ((node = treeWalker.nextSibling())); + }; + + function createTreeWalker(node) { + return document.createTreeWalker(node, + NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT, + null, false); + } + + function getAllowedAttrs(config, nodeName, node){ + if (typeof config.tags[nodeName] === 'function') { + return config.tags[nodeName](node); + } else { + return config.tags[nodeName]; + } + } + + function shouldRejectNode(node, allowedAttrs){ + if (typeof allowedAttrs === 'undefined') { + return true; + } else if (typeof allowedAttrs === 'boolean') { + return !allowedAttrs; + } + + return false; + } + + function shouldRejectAttr(attr, allowedAttrs, node){ + var attrName = attr.name.toLowerCase(); + + if (allowedAttrs === true){ + return false; + } else if (typeof allowedAttrs[attrName] === 'function'){ + return !allowedAttrs[attrName](attr.value, node); + } else if (typeof allowedAttrs[attrName] === 'undefined'){ + return true; + } else if (allowedAttrs[attrName] === false) { + return true; + } else if (typeof allowedAttrs[attrName] === 'string') { + return (allowedAttrs[attrName] !== attr.value); + } + + return false; + } + + return HTMLJanitor; + + })); + + +/***/ }, +/* 9 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -1805,9 +1996,9 @@ var codex = var toolbar = function (toolbar) { toolbar.init = function () { - toolbar.settings = __webpack_require__(9); - toolbar.inline = __webpack_require__(10); - toolbar.toolbox = __webpack_require__(11); + toolbar.settings = __webpack_require__(10); + toolbar.inline = __webpack_require__(11); + toolbar.toolbox = __webpack_require__(12); }; /** @@ -1897,7 +2088,7 @@ var codex = module.exports = toolbar; /***/ }, -/* 9 */ +/* 10 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -2138,7 +2329,7 @@ var codex = module.exports = settings; /***/ }, -/* 10 */ +/* 11 */ /***/ function(module, exports) { 'use strict'; @@ -2631,7 +2822,7 @@ var codex = module.exports = inline; /***/ }, -/* 11 */ +/* 12 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -2648,7 +2839,7 @@ var codex = toolbox.init = function () { - __webpack_require__(8); + __webpack_require__(9); }; toolbox.opened = false; @@ -2813,7 +3004,7 @@ var codex = module.exports = toolbox; /***/ }, -/* 12 */ +/* 13 */ /***/ function(module, exports) { "use strict"; @@ -2833,7 +3024,7 @@ var codex = module.exports = tools; /***/ }, -/* 13 */ +/* 14 */ /***/ function(module, exports) { 'use strict'; @@ -2842,7 +3033,7 @@ var codex = * Codex Editor callbacks module * * @author Codex Team - * @version 1.2.1 + * @version 1.2.5 */ var callbacks = function (callbacks) { @@ -3527,7 +3718,12 @@ var codex = /** * configuration of the observer: */ - var config = { attributes: true, childList: true, characterData: false, subtree: true }; + var config = { + attributes: true, + childList: true, + characterData: false, + subtree: true + }; // pass in the target node, as well as the observer options observer.observe(codex.state.inputs[currentInputIndex], config); @@ -3542,14 +3738,15 @@ var codex = callback; /** - * using closure to call the function immediatelly. + * Calling function with context of this function. * Also, we should sanitize pasted or changed data one time and ignore * changings which makes sanitize method. * For that, we need to send Context, MutationObserver.__proto__ that contains * observer disconnect method. */ + console.warn('mutations count: %o', mutations.length); mutations.forEach(function (mutation) { - codex.content.paste.bind(self, mutation)(); + codex.content.paste.call(self, mutation); }); }; @@ -3579,7 +3776,7 @@ var codex = module.exports = callbacks; /***/ }, -/* 14 */ +/* 15 */ /***/ function(module, exports) { 'use strict'; @@ -3884,7 +4081,7 @@ var codex = module.exports = draw; /***/ }, -/* 15 */ +/* 16 */ /***/ function(module, exports) { 'use strict'; @@ -4128,7 +4325,7 @@ var codex = module.exports = caret; /***/ }, -/* 16 */ +/* 17 */ /***/ function(module, exports) { 'use strict'; @@ -4181,7 +4378,7 @@ var codex = module.exports = notifications; /***/ }, -/* 17 */ +/* 18 */ /***/ function(module, exports) { "use strict"; @@ -4219,356 +4416,6 @@ var codex = module.exports = parser; -/***/ }, -/* 18 */ -/***/ function(module, exports, __webpack_require__) { - - var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict'; - - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - - /** - * Copyright (c) 2010 by Gabriel Birke - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the 'Software'), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - function Sanitize() { - var i, e, options; - options = arguments[0] || {}; - this.config = {}; - this.config.elements = options.elements ? options.elements : []; - this.config.attributes = options.attributes ? options.attributes : {}; - this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : []; - this.config.allow_comments = options.allow_comments ? options.allow_comments : false; - this.allowed_elements = {}; - this.config.protocols = options.protocols ? options.protocols : {}; - this.config.add_attributes = options.add_attributes ? options.add_attributes : {}; - this.dom = options.dom ? options.dom : document; - for (i = 0; i < this.config.elements.length; i++) { - this.allowed_elements[this.config.elements[i]] = true; - } - this.config.remove_element_contents = {}; - this.config.remove_all_contents = false; - if (options.remove_contents) { - - if (options.remove_contents instanceof Array) { - for (i = 0; i < options.remove_contents.length; i++) { - this.config.remove_element_contents[options.remove_contents[i]] = true; - } - } else { - this.config.remove_all_contents = true; - } - } - this.transformers = options.transformers ? options.transformers : []; - } - - Sanitize.REGEX_PROTOCOL = /^([A-Za-z0-9\+\-\.\&\;\*\s]*?)(?:\:|&*0*58|&*x0*3a)/i; - - // emulate Ruby symbol with string constant - Sanitize.RELATIVE = '__RELATIVE__'; - Sanitize.ALL = '__ALL__'; - - Sanitize.prototype.clean_node = function (container) { - var fragment = this.dom.createDocumentFragment(); - this.current_element = fragment; - this.whitelist_nodes = []; - - /** - * Utility function to check if an element exists in an array - */ - function _array_index(needle, haystack) { - var i; - for (i = 0; i < haystack.length; i++) { - if (haystack[i] == needle) return i; - } - return -1; - } - - function _merge_arrays_uniq() { - var result = []; - var uniq_hash = {}; - var i, j; - for (i = 0; i < arguments.length; i++) { - if (!arguments[i] || !arguments[i].length) continue; - for (j = 0; j < arguments[i].length; j++) { - if (uniq_hash[arguments[i][j]]) continue; - uniq_hash[arguments[i][j]] = true; - result.push(arguments[i][j]); - } - } - return result; - } - - /** - * Clean function that checks the different node types and cleans them up accordingly - * @param elem DOM Node to clean - */ - function _clean(elem) { - var clone; - switch (elem.nodeType) { - // Element - case 1: - _clean_element.call(this, elem); - break; - // Text - case 3: - clone = elem.cloneNode(false); - this.current_element.appendChild(clone); - break; - // Entity-Reference (normally not used) - case 5: - clone = elem.cloneNode(false); - this.current_element.appendChild(clone); - break; - // Comment - case 8: - if (this.config.allow_comments) { - clone = elem.cloneNode(false); - this.current_element.appendChild(clone); - } - break; - default: - if (console && console.log) console.log("unknown node type", elem.nodeType); - break; - } - } - - function _clean_element(elem) { - var i, j, clone, parent_element, name, allowed_attributes, attr, attr_name, attr_node, protocols, del, attr_ok; - var transform = _transform_element.call(this, elem); - - elem = transform.node; - name = elem.nodeName.toLowerCase(); - - // check if element itself is allowed - parent_element = this.current_element; - if (this.allowed_elements[name] || transform.whitelist) { - this.current_element = this.dom.createElement(elem.nodeName); - parent_element.appendChild(this.current_element); - - // clean attributes - var attrs = this.config.attributes; - allowed_attributes = _merge_arrays_uniq(attrs[name], attrs[Sanitize.ALL], transform.attr_whitelist); - for (i = 0; i < allowed_attributes.length; i++) { - attr_name = allowed_attributes[i]; - attr = elem.attributes[attr_name]; - if (attr) { - attr_ok = true; - // Check protocol attributes for valid protocol - if (this.config.protocols[name] && this.config.protocols[name][attr_name]) { - protocols = this.config.protocols[name][attr_name]; - del = attr.value.toLowerCase().match(Sanitize.REGEX_PROTOCOL); - if (del) { - attr_ok = _array_index(del[1], protocols) != -1; - } else { - attr_ok = _array_index(Sanitize.RELATIVE, protocols) != -1; - } - } - if (attr_ok) { - attr_node = document.createAttribute(attr_name); - attr_node.value = attr.value; - this.current_element.setAttributeNode(attr_node); - } - } - } - - // Add attributes - if (this.config.add_attributes[name]) { - for (attr_name in this.config.add_attributes[name]) { - attr_node = document.createAttribute(attr_name); - attr_node.value = this.config.add_attributes[name][attr_name]; - this.current_element.setAttributeNode(attr_node); - } - } - } // End checking if element is allowed - // If this node is in the dynamic whitelist array (built at runtime by - // transformers), let it live with all of its attributes intact. - else if (_array_index(elem, this.whitelist_nodes) != -1) { - this.current_element = elem.cloneNode(true); - // Remove child nodes, they will be sanitiazied and added by other code - while (this.current_element.childNodes.length > 0) { - this.current_element.removeChild(this.current_element.firstChild); - } - parent_element.appendChild(this.current_element); - } - - // iterate over child nodes - if (!this.config.remove_all_contents && !this.config.remove_element_contents[name]) { - for (i = 0; i < elem.childNodes.length; i++) { - _clean.call(this, elem.childNodes[i]); - } - } - - // some versions of IE don't support normalize. - if (this.current_element.normalize) { - this.current_element.normalize(); - } - this.current_element = parent_element; - } // END clean_element function - - function _transform_element(node) { - var output = { - attr_whitelist: [], - node: node, - whitelist: false - }; - var i, j, transform; - for (i = 0; i < this.transformers.length; i++) { - transform = this.transformers[i]({ - allowed_elements: this.allowed_elements, - config: this.config, - node: node, - node_name: node.nodeName.toLowerCase(), - whitelist_nodes: this.whitelist_nodes, - dom: this.dom - }); - if (transform == null) continue;else if ((typeof transform === 'undefined' ? 'undefined' : _typeof(transform)) == 'object') { - if (transform.whitelist_nodes && transform.whitelist_nodes instanceof Array) { - for (j = 0; j < transform.whitelist_nodes.length; j++) { - if (_array_index(transform.whitelist_nodes[j], this.whitelist_nodes) == -1) { - this.whitelist_nodes.push(transform.whitelist_nodes[j]); - } - } - } - output.whitelist = transform.whitelist ? true : false; - if (transform.attr_whitelist) { - output.attr_whitelist = _merge_arrays_uniq(output.attr_whitelist, transform.attr_whitelist); - } - output.node = transform.node ? transform.node : output.node; - } else { - throw new Error("transformer output must be an object or null"); - } - } - return output; - } - - for (i = 0; i < container.childNodes.length; i++) { - _clean.call(this, container.childNodes[i]); - } - - if (fragment.normalize) { - fragment.normalize(); - } - - return fragment; - }; - - if (true) { - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () { - return Sanitize; - }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } - - __webpack_require__(19); - __webpack_require__(20); - __webpack_require__(21); - - module.exports = Sanitize; - -/***/ }, -/* 19 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var Sanitize = __webpack_require__(18); - - if (!Sanitize.Config) { - Sanitize.Config = {}; - } - - Sanitize.Config.BASIC = { - elements: ['a', 'b', 'blockquote', 'br', 'cite', 'code', 'dd', 'dl', 'dt', 'em', 'i', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'u', 'ul', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'span'], - attributes: { - 'a': ['href'], - 'blockquote': ['cite'], - 'q': ['cite'] - }, - - add_attributes: { - 'a': { 'rel': 'nofollow' } - }, - - protocols: { - 'a': { 'href': ['ftp', 'http', 'https', 'mailto', Sanitize.RELATIVE] }, - 'blockquote': { 'cite': ['http', 'https', Sanitize.RELATIVE] }, - 'q': { 'cite': ['http', 'https', Sanitize.RELATIVE] } - } - }; - - codex.sanitizer = Sanitize; - -/***/ }, -/* 20 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var Sanitize = __webpack_require__(18); - - if (!Sanitize.Config) { - Sanitize.Config = {}; - } - - Sanitize.Config.RELAXED = { - elements: ['a', 'b', 'blockquote', 'br', 'caption', 'cite', 'code', 'col', 'colgroup', 'dd', 'dl', 'dt', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'i', 'img', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'u', 'ul'], - attributes: { - 'a': ['href', 'title'], - 'blockquote': ['cite'], - 'col': ['span', 'width'], - 'colgroup': ['span', 'width'], - 'img': ['align', 'alt', 'height', 'src', 'title', 'width'], - 'ol': ['start', 'type'], - 'q': ['cite'], - 'table': ['summary', 'width'], - 'td': ['abbr', 'axis', 'colspan', 'rowspan', 'width'], - 'th': ['abbr', 'axis', 'colspan', 'rowspan', 'scope', 'width'], - 'ul': ['type'] - }, - protocols: { - 'a': { 'href': ['ftp', 'http', 'https', 'mailto', Sanitize.RELATIVE] }, - 'blockquote': { 'cite': ['http', 'https', Sanitize.RELATIVE] }, - 'img': { 'src': ['http', 'https', Sanitize.RELATIVE] }, - 'q': { 'cite': ['http', 'https', Sanitize.RELATIVE] } - } - }; - - codex.sanitizer = Sanitize; - -/***/ }, -/* 21 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var Sanitize = __webpack_require__(18); - - if (!Sanitize.Config) { - Sanitize.Config = {}; - } - - Sanitize.Config.RESTRICTED = { - elements: ['a', 'b', 'em', 'i', 'strong', 'u'] - }; - - codex.sanitizer = Sanitize; - /***/ } /******/ ]); //# sourceMappingURL=codex-editor.js.map \ No newline at end of file diff --git a/codex-editor.js.map b/codex-editor.js.map index e78982dde..d5effd351 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 59b40846d3fc3e9171a2","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js","webpack:///./modules/sanitizer/sanitize.js","webpack:///./modules/sanitizer/config/basic.js","webpack:///./modules/sanitizer/config/relaxed.js","webpack:///./modules/sanitizer/config/restricted.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","sanitizer","version","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","redactorKeyDown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","_blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","currentNode","editorArea","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","bind","addedNodes","pasteTextContent","textNode","disconnect","Config","BASIC","clearHTML","clean_node","replaceWith","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","enterKeyPressed","tabKeyPressed","enterKeyPressedOnRedactorZone","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","stopPropagation","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","isClickedOnFirstLevelBlockArea","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","blockPaste","observer","MutationObserver","handlePasteEvents","config","attributes","childList","characterData","subtree","observe","mutations","self","currentToolType","bar","placeholder","div","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","insertPastedContent","Sanitize","options","ALL","allow_comments","allowed_elements","protocols","add_attributes","dom","remove_element_contents","remove_all_contents","remove_contents","Array","transformers","REGEX_PROTOCOL","RELATIVE","prototype","fragment","createDocumentFragment","current_element","whitelist_nodes","_array_index","needle","haystack","_merge_arrays_uniq","result","uniq_hash","j","_clean","elem","clone","_clean_element","cloneNode","parent_element","allowed_attributes","attr","attr_name","attr_node","del","attr_ok","_transform_element","nodeName","toLowerCase","whitelist","attrs","attr_whitelist","match","createAttribute","setAttributeNode","normalize","node_name","define","RELAXED","RESTRICTED"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;;;;AAIA;;AAEA,KAAIA,SAAS,mBAAAC,CAAQ,CAAR,CAAb;AACAC,QAAOC,OAAP,GAAiBH,MAAjB,C;;;;;;;;ACPA;;;;;;;;AAQA,KAAII,QAAS,UAASA,KAAT,EAAe;;AAExB,SAAIC,OAAO,SAAPA,IAAO,GAAW;AAClBD,eAAME,IAAN,GAAsB,mBAAAL,CAAQ,CAAR,CAAtB;AACAG,eAAMG,EAAN,GAAsB,mBAAAN,CAAQ,CAAR,CAAtB;AACAG,eAAMI,SAAN,GAAsB,mBAAAP,CAAQ,CAAR,CAAtB;AACAG,eAAMK,QAAN,GAAsB,mBAAAR,CAAQ,CAAR,CAAtB;AACAG,eAAMM,KAAN,GAAsB,mBAAAT,CAAQ,CAAR,CAAtB;AACAG,eAAMO,OAAN,GAAsB,mBAAAV,CAAQ,CAAR,CAAtB;AACAG,eAAMQ,OAAN,GAAsB,mBAAAX,CAAQ,CAAR,CAAtB;AACAG,eAAMS,KAAN,GAAsB,mBAAAZ,CAAQ,EAAR,CAAtB;AACAG,eAAMU,QAAN,GAAsB,mBAAAb,CAAQ,EAAR,CAAtB;AACAG,eAAMW,IAAN,GAAsB,mBAAAd,CAAQ,EAAR,CAAtB;AACAG,eAAMY,KAAN,GAAsB,mBAAAf,CAAQ,EAAR,CAAtB;AACAG,eAAMa,aAAN,GAAsB,mBAAAhB,CAAQ,EAAR,CAAtB;AACAG,eAAMc,MAAN,GAAsB,mBAAAjB,CAAQ,EAAR,CAAtB;AACAG,eAAMe,SAAN,GAAsB,mBAAAlB,CAAQ,EAAR,CAAtB;AACH,MAfD;;AAiBAG,WAAMgB,OAAN,GAAgB,SAAhB;;AAEA;;;;;AAKAhB,WAAMiB,QAAN,GAAiB;AACbR,gBAAY,CAAC,WAAD,EAAc,QAAd,EAAwB,SAAxB,EAAmC,MAAnC,EAA2C,OAA3C,EAAoD,MAApD,EAA4D,SAA5D,EAAuE,WAAvE,EAAoF,OAApF,CADC;AAEbS,qBAAY,cAFC;AAGbC,0BAAiB,oBAHJ;;AAKb;AACAC,6BAAoB;AANP,MAAjB;;AASA;;;;;AAKApB,WAAMqB,KAAN,GAAc;AACVC,mBAAoB,IADV;AAEVC,kBAAoB,IAFV;AAGVf,kBAAoB,IAHV;AAIVgB,wBAAoB;AAChBD,sBAAU,IADM;AAEhBE,sBAAU,IAFM;AAGhBC,sBAAU;AAHM,UAJV;AASVC,kBAAoB,IATV;AAUVd,wBAAoB,IAVV;AAWVe,qBAAoB,IAXV;AAYVC,6BAAoB,IAZV;AAaVC,0BAAoB,IAbV;AAcVC,wBAAoB,IAdV;AAeVC,yBAAoB,IAfV;AAgBVC,0BAAoB,IAhBV;AAiBVC,yBAAoB,EAjBV,EAiBc;AACxBC,mBAAoB;AAlBV,MAAd;;AAqBA;;;;;AAKAnC,WAAMoC,KAAN,GAAc;AACVC,qBAAY,EADF;AAEVC,iBAAY,EAFF;AAGVC,iBAAY;AAHF,MAAd;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BAvC,WAAMwC,KAAN,GAAc,UAAUC,YAAV,EAAwB;;AAElCxC;;AAEA,cAAKC,IAAL,CAAUwC,OAAV,CAAkBD,YAAlB;;AAEA;AAFA,UAGKE,IAHL,CAGU,KAAKxC,EAAL,CAAQyC,IAHlB,EAIKD,IAJL,CAIU,KAAKxC,EAAL,CAAQ0C,QAJlB,EAKKF,IALL,CAKU,KAAKxC,EAAL,CAAQ2C,UALlB,EAMKH,IANL,CAMU,KAAKxC,EAAL,CAAQ4C,cANlB,EAOKJ,IAPL,CAOU,KAAKvC,SAAL,CAAesC,OAPzB,EAQKC,IARL,CAQU,KAAKtC,QAAL,CAAc2C,kBARxB,EASKL,IATL,CASU,KAAKxC,EAAL,CAAQ8C,UATlB,EAUKC,KAVL,CAUW,UAAUC,KAAV,EAAiB;AACpBnD,mBAAME,IAAN,CAAWkD,GAAX,CAAe,sCAAf,EAAuD,MAAvD,EAA+DD,KAA/D;AACH,UAZL;AAcH,MAlBD;;AAoBA,YAAOnD,KAAP;AAEH,EA7HW,CA6HT,EA7HS,CAAZ;;AA+HAF,QAAOC,OAAP,GAAiBC,KAAjB,C;;;;;;;;;;ACvIA;;;;;;;AAOA,KAAIE,OAAQ,UAASA,IAAT,EAAe;;AAEvB;;;;;;AAMAA,UAAKwC,OAAL,GAAe,UAAUD,YAAV,EAAwB;;AAEnC,gBAAO,IAAIY,OAAJ,CAAY,UAASC,OAAT,EAAkBC,MAAlB,EAA0B;;AAEzC,iBAAKd,YAAL,EAAmB;;AAEfzC,uBAAMiB,QAAN,CAAeR,KAAf,GAAuBgC,aAAahC,KAAb,IAAsBT,MAAMiB,QAAN,CAAeR,KAA5D;AAEH;;AAED,iBAAIgC,aAAae,IAAjB,EAAuB;AACnBxD,uBAAMoC,KAAN,CAAYE,MAAZ,GAAqBG,aAAae,IAAlC;AACH;;AAED,iBAAIf,aAAarB,kBAAjB,EAAqC;AACjCpB,uBAAMiB,QAAN,CAAeG,kBAAf,GAAoCqB,aAAarB,kBAAjD;AACH;;AAED,iBAAIqB,aAAatB,eAAjB,EAAkC;AAC9BnB,uBAAMiB,QAAN,CAAeE,eAAf,GAAiCsB,aAAatB,eAA9C;AACH;;AAEDnB,mBAAMqB,KAAN,CAAYC,QAAZ,GAAuBmC,SAASC,cAAT,CAAwBjB,aAAavB,UAAb,IAA2BlB,MAAMiB,QAAN,CAAeC,UAAlE,CAAvB;;AAEA,iBAAI,QAAOlB,MAAMqB,KAAN,CAAYC,QAAnB,MAAgCqC,SAAhC,IAA6C3D,MAAMqB,KAAN,CAAYC,QAAZ,KAAyB,IAA1E,EAAgF;AAC5EiC,wBAAOK,MAAM,mCAAmCnB,aAAavB,UAAtD,CAAP;AACH,cAFD,MAEO;AACHoC;AACH;AAEJ,UA5BM,CAAP;AA8BH,MAhCD;;AAkCA;;;;AAIApD,UAAKkD,GAAL,GAAW,UAAUS,GAAV,EAAeC,IAAf,EAAqBC,GAArB,EAA0B;;AAEjCD,gBAAOA,QAAQ,KAAf;;AAEA,aAAI,CAACC,GAAL,EAAU;AACNA,mBAAOF,OAAO,WAAd;AACAA,mBAAO,yBAAP;AACH,UAHD,MAGO;AACHA,mBAAO,0BAA0BA,GAAjC;AACH;;AAED,aAAG;AACC,iBAAK,aAAaG,MAAb,IAAuBC,QAASH,IAAT,CAA5B,EAA6C;AACzC,qBAAKC,GAAL,EAAWE,QAASH,IAAT,EAAiBD,GAAjB,EAAuBE,GAAvB,EAAX,KACKE,QAASH,IAAT,EAAiBD,GAAjB;AACR;AAEJ,UAND,CAMC,OAAMK,CAAN,EAAQ,CAAE;AAEd,MAnBD;;AAqBA;;;;;AAKAhE,UAAKiE,WAAL,GAAmB,UAAUC,MAAV,EAAkBC,OAAlB,EAA2B;AAC1CD,gBAAOE,UAAP,CAAkBC,YAAlB,CAA+BF,OAA/B,EAAwCD,OAAOI,WAA/C;AACH,MAFD;;AAIA;;;;;AAKAtE,UAAKuE,SAAL,GAAiB;AACbC,cAAU,CADG;AAEbC,eAAU,CAFG;AAGbC,kBAAU;AAHG,MAAjB;;AAMA;;;;AAIA1E,UAAK2E,IAAL,GAAY,EAAEC,WAAW,CAAb,EAAgBC,KAAK,CAArB,EAAwBC,OAAO,EAA/B,EAAmCC,OAAO,EAA1C,EAA8CC,MAAM,EAApD,EAAwDC,KAAK,EAA7D,EAAiEC,KAAK,EAAtE,EAA0EC,OAAO,EAAjF,EAAqFC,MAAM,EAA3F,EAA+FC,IAAI,EAAnG,EAAuGC,MAAM,EAA7G,EAAiHC,OAAO,EAAxH,EAA4HC,QAAQ,EAApI,EAAwIC,MAAM,EAA9I,EAAZ;;AAEA;;;;;AAKAzF,UAAK0F,SAAL,GAAiB,UAAUC,EAAV,EAAc;AAC3B,gBAAOA,MAAM,QAAOA,EAAP,yCAAOA,EAAP,OAAc,QAApB,IAAgCA,GAAGC,QAAnC,IAA+CD,GAAGC,QAAH,IAAe,KAAKrB,SAAL,CAAeC,GAApF;AACH,MAFD;;AAIA;;;AAGAxE,UAAK6F,IAAL,GAAY,UAAUvC,IAAV,EAAgB;;AAExB,aAAI,CAACA,IAAD,IAAS,CAACA,KAAKwC,GAAnB,EAAuB;AACnB;AACH;;AAED,aAAIC,UAAmBjC,OAAOkC,cAAP,GAAwB,IAAIA,cAAJ,EAAxB,GAA+C,IAAIC,aAAJ,CAAkB,mBAAlB,CAAtE;AAAA,aACIC,mBAAmB,4BAAU,CAAE,CADnC;AAAA,aAEIC,SAAS,EAFb;AAAA,aAGIC,GAHJ;;AAKA9C,cAAK+C,KAAL,GAAuB,IAAvB;AACA/C,cAAKM,IAAL,GAAuBN,KAAKM,IAAL,IAAa,KAApC;AACAN,cAAKA,IAAL,GAAuBA,KAAKA,IAAL,IAAa,EAApC;AACAA,cAAK,cAAL,IAAuBA,KAAK,cAAL,KAAwB,iCAA/C;AACA4C,4BAAuB5C,KAAKgD,OAAL,IAAgBJ,gBAAvC;;AAEA,aAAI5C,KAAKM,IAAL,IAAa,KAAb,IAAsBN,KAAKA,IAA/B,EAAqC;;AAEjCA,kBAAKwC,GAAL,GAAW,KAAKS,IAAL,CAAUjD,KAAKwC,GAAf,IAAsBxC,KAAKwC,GAAL,GAAW,GAAX,GAAiBxC,KAAKA,IAA5C,GAAmDA,KAAKwC,GAAL,GAAW,GAAX,GAAiBxC,KAAKA,IAApF;AAEH,UAJD,MAIO;;AAEH,kBAAI8C,GAAJ,IAAW9C,KAAKA,IAAhB,EAAsB;AAClB6C,2BAAWC,MAAM,GAAN,GAAYI,mBAAmBlD,KAAKA,IAAL,CAAU8C,GAAV,CAAnB,CAAZ,GAAiD,GAA5D;AACH;AACJ;;AAED,aAAI9C,KAAKmD,eAAT,EAA0B;AACtBV,qBAAQU,eAAR,GAA0B,IAA1B;AACH;;AAED,aAAInD,KAAKoD,UAAL,IAAmB,OAAOpD,KAAKoD,UAAZ,IAA0B,UAAjD,EAA6D;AACzDpD,kBAAKoD,UAAL,CAAgBC,IAAhB;AACH;;AAEDZ,iBAAQa,IAAR,CAActD,KAAKM,IAAnB,EAAyBN,KAAKwC,GAA9B,EAAmCxC,KAAK+C,KAAxC;AACAN,iBAAQc,gBAAR,CAAyB,kBAAzB,EAA6C,gBAA7C;AACAd,iBAAQc,gBAAR,CAAyB,cAAzB,EAAyC,mCAAzC;;AAEAd,iBAAQe,kBAAR,GAA6B,YAAW;AACpC,iBAAIf,QAAQgB,UAAR,IAAsB,CAAtB,IAA2BhB,QAAQiB,MAAR,IAAkB,GAAjD,EAAsD;AAClDd,kCAAiBH,QAAQkB,YAAzB;AACH;AACJ,UAJD;;AAMAlB,iBAAQmB,IAAR,CAAaf,MAAb;AACH,MA/CD;;AAiDA;AACAnG,UAAKmH,YAAL,GAAoB,UAASC,UAAT,EAAqBC,YAArB,EAAmC;;AAEnD;AACA,aAAK,CAACA,YAAD,IAAkBA,gBAAgB9D,SAASC,cAAT,CAAwB,eAAe6D,YAAvC,CAAvC,EAA+F;AAC3FvH,mBAAME,IAAN,CAAWkD,GAAX,CAAe,+DAAf,EAAgF,MAAhF;AACA;AACH;;AAGD,aAAIoE,SAAW/D,SAASgE,aAAT,CAAuB,QAAvB,CAAf;AACAD,gBAAO1D,IAAP,GAAc,iBAAd;AACA0D,gBAAOE,GAAP,GAAaJ,UAAb;AACAE,gBAAOjB,KAAP,GAAe,IAAf;AACAiB,gBAAOG,KAAP,GAAe,IAAf;;AAEA,aAAIJ,YAAJ,EAAkB;AACdC,oBAAOI,EAAP,GAAY,eAAeL,YAA3B;AACH;;AAED9D,kBAASoE,IAAT,CAAcC,WAAd,CAA0BN,MAA1B;AACA,gBAAOA,MAAP;AACH,MArBD;;AAuBA,YAAOtH,IAAP;AAEH,EApLU,CAoLR,EApLQ,CAAX;;AAsLAJ,QAAOC,OAAP,GAAiBG,IAAjB,C;;;;;;;;AC7LA;;;;;;;AAOA,KAAIC,KAAM,UAASA,EAAT,EAAY;;AAElB;;;AAGAA,QAAG4H,SAAH,GAAe;;AAEX;;;AAGAC,0BAAkB,UALP;;AAOX;;;AAGAC,wBAAgB,mBAVL;;AAYX;;;AAGAC,0BAAkB,qBAfP;;AAiBX;;;AAGAC,4BAAoB,mBApBT;;AAsBX;;;AAGAC,6BAAqB,qBAzBV;;AA2BX;;;AAGAC,wBAAgB;;AA9BL,MAAf;;AAkCA;;;;;AAKAlI,QAAGyC,IAAH,GAAU,YAAY;;AAElB,aAAIrB,OAAJ,EACIf,OADJ,EAEI8H,cAFJ,EAGI9G,aAHJ,EAIIW,QAJJ,EAKIoG,OALJ,EAMI1H,aANJ,EAOI2H,YAPJ,EAQIzG,aARJ,EASIF,kBATJ,EAUIC,eAVJ,EAWIH,OAXJ,EAYIC,UAZJ;;AAcA;AACAL,mBAAUvB,MAAMW,IAAN,CAAWY,OAAX,EAAV;;AAEA;AACAvB,eAAME,IAAN,CAAWiE,WAAX,CAAuBnE,MAAMqB,KAAN,CAAYC,QAAnC,EAA6CC,OAA7C;;AAEA;AACAV,yBAAgBb,MAAMW,IAAN,CAAW8H,YAAX,EAAhB;AACAzI,eAAMqB,KAAN,CAAYR,aAAZ,GAA4B4C,SAASiF,IAAT,CAAcZ,WAAd,CAA0BjH,aAA1B,CAA5B;;AAEA;AACAL,mBAAwBR,MAAMW,IAAN,CAAWH,OAAX,EAAxB;AACA8H,0BAAwBtI,MAAMW,IAAN,CAAW2H,cAAX,EAAxB;AACA9G,yBAAwBxB,MAAMW,IAAN,CAAWa,aAAX,EAAxB;AACAI,sBAAwB5B,MAAMW,IAAN,CAAWiB,UAAX,EAAxB;AACAC,8BAAwB7B,MAAMW,IAAN,CAAWgI,cAAX,EAAxB;AACA7G,2BAAwB9B,MAAMQ,OAAN,CAAcS,QAAd,CAAuB2H,qBAAvB,EAAxB;AACA7G,yBAAwB/B,MAAMW,IAAN,CAAWoB,aAAX,EAAxB;AACAyG,wBAAwBxI,MAAMW,IAAN,CAAW6H,YAAX,EAAxB;AACA7G,mBAAwB3B,MAAMW,IAAN,CAAWgB,OAAX,EAAxB;AACAQ,oBAAwBnC,MAAMW,IAAN,CAAWwB,QAAX,EAAxB;;AAEA;AACA,aAAIF,kBAAkBjC,MAAMW,IAAN,CAAWsB,eAAX,EAAtB;AAAA,aACID,iBAAkBhC,MAAMW,IAAN,CAAWkI,eAAX,EADtB;;AAGA;AACA9G,uBAAc+F,WAAd,CAA0B9F,cAA1B;AACAD,uBAAc+F,WAAd,CAA0B7F,eAA1B;;AAEA;;;AAGAuG,sBAAaV,WAAb,CAAyBjG,kBAAzB;AACA2G,sBAAaV,WAAb,CAAyBhG,eAAzB;AACA0G,sBAAaV,WAAb,CAAyB/F,aAAzB;;AAEA;AACAuG,wBAAeR,WAAf,CAA2BlG,UAA3B;;AAEA;AACA0G,wBAAeR,WAAf,CAA2BnG,OAA3B;;AAEA;AACAnB,iBAAQsH,WAAR,CAAoBU,YAApB;;AAEA;AACAhI,iBAAQsH,WAAR,CAAoBQ,cAApB;;AAEA/G,iBAAQuG,WAAR,CAAoBtH,OAApB;;AAEAe,iBAAQuG,WAAR,CAAoB3F,QAApB;;AAEA;AACAnC,eAAMqB,KAAN,CAAYE,OAAZ,GAAiCA,OAAjC;AACAvB,eAAMqB,KAAN,CAAYb,OAAZ,GAAiCA,OAAjC;AACAR,eAAMqB,KAAN,CAAYO,UAAZ,GAAiCA,UAAjC;AACA5B,eAAMqB,KAAN,CAAYM,OAAZ,GAAiCA,OAAjC;AACA3B,eAAMqB,KAAN,CAAYU,aAAZ,GAAiCA,aAAjC;AACA/B,eAAMqB,KAAN,CAAYW,cAAZ,GAAiCA,cAAjC;AACAhC,eAAMqB,KAAN,CAAYY,eAAZ,GAAiCA,eAAjC;AACAjC,eAAMqB,KAAN,CAAYQ,kBAAZ,GAAiCA,kBAAjC;AACA7B,eAAMqB,KAAN,CAAYS,eAAZ,GAAiCA,eAAjC;;AAEA9B,eAAMqB,KAAN,CAAYc,QAAZ,GAAuBA,QAAvB;;AAEAnC,eAAMG,EAAN,CAAS2I,iBAAT,CAA2BtH,aAA3B;;AAEA;AACAxB,eAAMQ,OAAN,CAAcS,QAAd,CAAuB8H,kBAAvB;AACH,MAtFD;;AAwFA5I,QAAG2I,iBAAH,GAAuB,UAASE,SAAT,EAAoB;;AAEvC;AACAhJ,eAAMqB,KAAN,CAAYG,aAAZ,CAA0BD,OAA1B,GAAoCyH,SAApC;;AAEA;AACAhJ,eAAMqB,KAAN,CAAYG,aAAZ,CAA0BC,OAA1B,GAAoCzB,MAAMW,IAAN,CAAWsI,oBAAX,EAApC;;AAEA;AACAjJ,eAAMqB,KAAN,CAAYG,aAAZ,CAA0BE,OAA1B,GAAoC1B,MAAMW,IAAN,CAAWuI,oBAAX,EAApC;;AAEA;AACAlJ,eAAMqB,KAAN,CAAYG,aAAZ,CAA0BD,OAA1B,CAAkCuG,WAAlC,CAA8C9H,MAAMqB,KAAN,CAAYG,aAAZ,CAA0BC,OAAxE;AACAzB,eAAMqB,KAAN,CAAYG,aAAZ,CAA0BD,OAA1B,CAAkCuG,WAAlC,CAA8C9H,MAAMqB,KAAN,CAAYG,aAAZ,CAA0BE,OAAxE;;AAEA1B,eAAMqB,KAAN,CAAYE,OAAZ,CAAoBuG,WAApB,CAAgC9H,MAAMqB,KAAN,CAAYG,aAAZ,CAA0BD,OAA1D;AACH,MAhBD;;AAkBA;;;;AAIApB,QAAG0C,QAAH,GAAc,YAAY;;AAEtB,aAAIsG,IAAJ,EACIC,WADJ;;AAGA,cAAI,IAAIC,IAAR,IAAgBrJ,MAAMiB,QAAN,CAAeR,KAA/B,EAAsC;AAClC0I,oBAAOnJ,MAAMiB,QAAN,CAAeR,KAAf,CAAqB4I,IAArB,CAAP;AACArJ,mBAAMS,KAAN,CAAY4I,IAAZ,IAAoBF,IAApB,CAAyB;AAC5B;;AAED;AACA,cAAK,IAAIE,IAAT,IAAiBrJ,MAAMS,KAAvB,EAA6B;;AAEzB0I,oBAAOnJ,MAAMS,KAAN,CAAY4I,IAAZ,CAAP;;AAEA,iBAAI,CAACF,KAAKG,gBAAV,EAA4B;AACxB;AACH;;AAED,iBAAI,CAACH,KAAKI,aAAV,EAAyB;AACrBvJ,uBAAME,IAAN,CAAWkD,GAAX,CAAe,gDAAf,EAAiE,MAAjE,EAAyEiG,IAAzE;AACA;AACH;;AAED,iBAAI,OAAOF,KAAKvG,IAAZ,IAAoB,UAAxB,EAAoC;AAChC5C,uBAAME,IAAN,CAAWkD,GAAX,CAAe,qCAAf,EAAsD,MAAtD,EAA8DiG,IAA9D;AACA;AACH;;AAED;;;AAGAD,2BAAcpJ,MAAMW,IAAN,CAAW6I,aAAX,CAAyBH,IAAzB,EAA+BF,KAAKI,aAApC,CAAd;;AAEAvJ,mBAAMqB,KAAN,CAAYM,OAAZ,CAAoBmG,WAApB,CAAgCsB,WAAhC;;AAEA;AACApJ,mBAAMqB,KAAN,CAAYa,cAAZ,CAA2BmH,IAA3B,IAAmCD,WAAnC;AACH;;AAGD;;;AAGApJ,eAAMG,EAAN,CAASsJ,qBAAT;AAGH,MA/CD;;AAiDAtJ,QAAGsJ,qBAAH,GAA2B,YAAW;;AAElC,aAAIhJ,QAAQ;;AAERiJ,mBAAM;AACFC,uBAAU,cADR;AAEFC,0BAAU;AAFR,cAFE;;AAORC,qBAAQ;AACJF,uBAAU,gBADN;AAEJC,0BAAU;AAFN,cAPA;;AAYRE,wBAAW;AACPH,uBAAU,mBADH;AAEPC,0BAAU;AAFH,cAZH;;AAiBRG,mBAAM;AACFJ,uBAAU,cADR;AAEFC,0BAAU;AAFR;AAjBE,UAAZ;;AAuBA,aAAII,UAAJ,EACIb,IADJ;;AAGA,cAAI,IAAIE,IAAR,IAAgB5I,KAAhB,EAAuB;;AAEnB0I,oBAAO1I,MAAM4I,IAAN,CAAP;;AAEAW,0BAAahK,MAAMW,IAAN,CAAWsJ,mBAAX,CAA+BZ,IAA/B,EAAqCF,KAAKQ,IAA1C,CAAb;;AAEA3J,mBAAMqB,KAAN,CAAYG,aAAZ,CAA0BC,OAA1B,CAAkCqG,WAAlC,CAA8CkC,UAA9C;AACA;;;AAGAhK,mBAAMG,EAAN,CAAS+J,+BAAT,CAAyCF,UAAzC,EAAqDb,KAAKS,OAA1D;AACH;AAEJ,MAzCD;;AA2CA;;;;AAIAzJ,QAAG2C,UAAH,GAAgB,YAAY;;AAExB9C,eAAME,IAAN,CAAWkD,GAAX,CAAe,qBAAf,EAAsC,MAAtC;;AAEAY,gBAAOmG,gBAAP,CAAwB,OAAxB,EAAiC,UAAUC,QAAV,EAAoBpE,GAApB,EAAyBqE,UAAzB,EAAqC;AAClErK,mBAAMa,aAAN,CAAoByJ,WAApB,CAAgCF,QAAhC,EAA0CG,KAA1C;AACH,UAFD,EAEG,KAFH;;AAIA;AACA9G,kBAAS0G,gBAAT,CAA0B,SAA1B,EAAqCnK,MAAMU,QAAN,CAAe8J,aAApD,EAAmE,KAAnE;;AAEA;AACAxK,eAAMqB,KAAN,CAAYc,QAAZ,CAAqBgI,gBAArB,CAAsC,SAAtC,EAAiDnK,MAAMU,QAAN,CAAe+J,eAAhE,EAAiF,KAAjF;;AAEA;AACAhH,kBAAS0G,gBAAT,CAA0B,OAA1B,EAAmCnK,MAAMU,QAAN,CAAegK,WAAlD,EAA+D,KAA/D;;AAEA;;;AAGA1K,eAAMqB,KAAN,CAAYc,QAAZ,CAAqBgI,gBAArB,CAAsC,OAAtC,EAA+CnK,MAAMU,QAAN,CAAeiK,eAA9D,EAA+E,KAA/E;;AAEA;;;AAGA3K,eAAMqB,KAAN,CAAYO,UAAZ,CAAuBuI,gBAAvB,CAAwC,OAAxC,EAAiDnK,MAAMU,QAAN,CAAekK,iBAAhE,EAAmF,KAAnF;;AAEA;;;AAGA5K,eAAMqB,KAAN,CAAYQ,kBAAZ,CAA+BsI,gBAA/B,CAAgD,OAAhD,EAAyDnK,MAAMU,QAAN,CAAemK,yBAAxE,EAAmG,KAAnG;AACA;;;;AAIA7K,eAAMqB,KAAN,CAAYc,QAAZ,CAAqBgI,gBAArB,CAAsC,OAAtC,EAA+CnK,MAAMU,QAAN,CAAeoK,kBAA9D,EAAkF,KAAlF;;AAEA;AACA,cAAK,IAAIC,MAAT,IAAmB/K,MAAMqB,KAAN,CAAYa,cAA/B,EAA8C;AAC1ClC,mBAAMqB,KAAN,CAAYa,cAAZ,CAA2B6I,MAA3B,EAAmCZ,gBAAnC,CAAoD,OAApD,EAA6DnK,MAAMU,QAAN,CAAesK,oBAA5E,EAAkG,KAAlG;AACH;AAEJ,MA1CD;;AA4CA;;;;AAIA7K,QAAG4C,cAAH,GAAoB,YAAW;;AAE3B,cAAI,IAAIoG,IAAR,IAAgBnJ,MAAMS,KAAtB,EAA6B;;AAEzB,iBAAI,OAAOT,MAAMS,KAAN,CAAY0I,IAAZ,EAAkBzG,OAAzB,IAAoC,UAAxC,EACI;;AAEJ1C,mBAAMS,KAAN,CAAY0I,IAAZ,EAAkBzG,OAAlB;AACH;AACJ,MATD;;AAWAvC,QAAG8K,gBAAH,GAAsB,UAASC,KAAT,EAAgB;;AAElC,aAAI,CAACA,KAAL,EAAY;;AAEZ;;;AAGAA,eAAMf,gBAAN,CAAuB,SAAvB,EAAkC,UAASI,KAAT,EAAgB;AAC9CvK,mBAAMU,QAAN,CAAeyK,YAAf,CAA4BZ,KAA5B,EAAmCW,KAAnC;AACH,UAFD,EAEG,KAFH;;AAIA;;;;;;;;;;;;;;;;;AAiBAA,eAAMf,gBAAN,CAAuB,OAAvB,EAAgC,UAAUI,KAAV,EAAiB;AAC7CvK,mBAAMU,QAAN,CAAe0K,WAAf,CAA2Bb,KAA3B;AACH,UAFD,EAEG,KAFH;;AAIAW,eAAMf,gBAAN,CAAuB,SAAvB,EAAkC,YAAU;AACxCnK,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqBC,IAArB;AACH,UAFD,EAEG,KAFH;AAIH,MApCD;;AAsCA;AACAnL,QAAG8C,UAAH,GAAgB,YAAW;;AAEvB,aAAId,WAAWnC,MAAMqB,KAAN,CAAYc,QAA3B;AAAA,aACIoJ,WAAW,EADf;;AAGA;AACAvL,eAAMoC,KAAN,CAAYG,MAAZ,GAAqBJ,SAASqJ,gBAAT,CAA0B,0BAA1B,CAArB;AACH,MAPD;;AASA;;;AAGArL,QAAGsL,eAAH,GAAqB,YAAU;;AAE3B,aAAIC,mBAAmB1L,MAAMiB,QAAN,CAAeG,kBAAtC;AAAA,aACIuK,YADJ;;AAGA,aAAK,CAAC3L,MAAMS,KAAN,CAAYiL,gBAAZ,CAAN,EAAqC;AACjC1L,mBAAME,IAAN,CAAWkD,GAAX,CAAe,mEAAf,EAAoF,MAApF,EAA4FsI,gBAA5F;AACA;AACH;;AAEDC,wBAAe3L,MAAMS,KAAN,CAAYiL,gBAAZ,EAA8BE,MAA9B,EAAf;;AAEAD,sBAAaE,YAAb,CAA0B,kBAA1B,EAA8C,qBAA9C;;AAEA7L,eAAMO,OAAN,CAAcuL,WAAd,CAA0B;AACtBhI,mBAAQ4H,gBADc;AAEtBR,oBAAQS;AAFc,UAA1B;;AAKA3L,eAAMO,OAAN,CAAcwL,kBAAd,CAAiCJ,YAAjC;AAEH,MArBD;;AAuBAxL,QAAG+J,+BAAH,GAAqC,UAASa,MAAT,EAAiBjH,IAAjB,EAAuB;;AAExDiH,gBAAOZ,gBAAP,CAAwB,WAAxB,EAAqC,UAASI,KAAT,EAAgB;;AAEjDvK,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqBW,WAArB,CAAiCzB,KAAjC,EAAwCzG,IAAxC;AAEH,UAJD,EAIG,KAJH;AAKH,MAPD;;AASA,YAAO3D,EAAP;AAEH,EA1YQ,CA0YN,EA1YM,CAAT;;AA4YAL,QAAOC,OAAP,GAAiBI,EAAjB,C;;;;;;;;ACnZA;;;;;;;;AAQA,KAAIC,YAAa,UAASA,SAAT,EAAmB;;AAEhCA,eAAU6L,KAAV,GAAkB,IAAlB;;AAEA;;;AAGA7L,eAAU8L,SAAV,GAAsB,IAAtB;;AAEA9L,eAAUsC,OAAV,GAAoB,YAAU;;AAE1B,aAAIuJ,QAAQxI,SAASgE,aAAT,CAAuB,OAAvB,CAAZ;;AAEAwE,eAAMnI,IAAN,GAAa,MAAb;AACAmI,eAAM9B,gBAAN,CAAuB,QAAvB,EAAiCnK,MAAMI,SAAN,CAAgB+L,YAAjD;;AAEAnM,eAAMI,SAAN,CAAgB6L,KAAhB,GAAwBA,KAAxB;AAEH,MATD;;AAWA;AACA7L,eAAUgM,UAAV,GAAuB,YAAW;;AAE9B;AACA,cAAKH,KAAL,GAAa,IAAb;;AAEA;AACA,cAAKvJ,OAAL;AACH,MAPD;;AASA;;;AAGAtC,eAAU+L,YAAV,GAAyB,UAAS5B,KAAT,EAAe;;AAEpC,aAAI0B,QAAc,IAAlB;AAAA,aACII,QAAcJ,MAAMI,KADxB;AAAA,aAEIC,cAAcD,MAAME,MAFxB;AAAA,aAGIC,YAAc,IAAIC,QAAJ,EAHlB;AAAA,aAIIC,IAJJ;AAAA,aAKIC,CALJ;;AAOAH,mBAAUI,MAAV,CAAiB,OAAjB,EAA0BP,MAAM,CAAN,CAA1B,EAAoCA,MAAM,CAAN,EAAShD,IAA7C;;AAEArJ,eAAMI,SAAN,CAAgB2F,IAAhB,CAAqB;AACjBvC,mBAAOgJ,SADU;AAEjB5F,yBAAa5G,MAAMI,SAAN,CAAgB8L,SAAhB,CAA0BtF,UAFtB;AAGjBJ,sBAAaxG,MAAMI,SAAN,CAAgB8L,SAAhB,CAA0B1F,OAHtB;AAIjBrD,oBAAanD,MAAMI,SAAN,CAAgB8L,SAAhB,CAA0B/I;AAJtB,UAArB;AAMH,MAjBD;;AAmBA;;;;AAIA/C,eAAUyM,eAAV,GAA4B,UAAUC,IAAV,EAAgB;;AAExC,cAAKZ,SAAL,GAAiBY,IAAjB;AACA,cAAKb,KAAL,CAAWc,KAAX;AAEH,MALD;;AAOA;;;AAGA3M,eAAU2F,IAAV,GAAiB,UAASM,MAAT,EAAgB;;AAE7B,aAAI2G,MAAM,IAAI9G,cAAJ,EAAV;AAAA,aACIU,aAAa,OAAOP,OAAOO,UAAd,IAA4B,UAA5B,GAAyCP,OAAOO,UAAhD,GAA6D,YAAU,CAAE,CAD1F;AAAA,aAEIJ,UAAa,OAAOH,OAAOG,OAAd,IAA4B,UAA5B,GAAyCH,OAAOG,OAAhD,GAA0D,YAAU,CAAE,CAFvF;AAAA,aAGIrD,QAAa,OAAOkD,OAAOlD,KAAd,IAA4B,UAA5B,GAAyCkD,OAAOlD,KAAhD,GAA0D,YAAU,CAAE,CAHvF;;AAKAyD;;AAEAoG,aAAIlG,IAAJ,CAAS,MAAT,EAAiB9G,MAAMiB,QAAN,CAAeE,eAAhC,EAAiD,IAAjD;;AAEA6L,aAAIjG,gBAAJ,CAAqB,kBAArB,EAAyC,gBAAzC;;AAEAiG,aAAIC,MAAJ,GAAa,YAAY;AACrB,iBAAID,IAAI9F,MAAJ,KAAe,GAAnB,EAAwB;AACpBV,yBAAQwG,IAAI7F,YAAZ;AACH,cAFD,MAEO;AACHlD,yBAAQb,GAAR,CAAY,mBAAZ,EAAiC4J,GAAjC;AACA7J;AACH;AACJ,UAPD;;AASA6J,aAAI5F,IAAJ,CAASf,OAAO7C,IAAhB;AACA,cAAK4I,UAAL;AAEH,MAzBD;;AA2BA,YAAOhM,SAAP;AAEH,EA/Fe,CA+Fb,EA/Fa,CAAhB;;AAiGAN,QAAOC,OAAP,GAAkBK,SAAlB,C;;;;;;;;ACzGA;;;;;;;AAOA,KAAIC,WAAY,UAASA,QAAT,EAAmB;;AAE/B;;;AAGAA,cAAS2C,kBAAT,GAA8B,YAAY;;AAEtC;;;AAGA,aAAI,CAAChD,MAAMoC,KAAN,CAAYE,MAAZ,CAAmB4K,KAAnB,CAAyBX,MAA9B,EAAsC;;AAElCvM,mBAAMG,EAAN,CAASsL,eAAT;AACA;AAEH;;AAEDpI,iBAAQC,OAAR;;AAEA;AAFA,UAGKX,IAHL,CAGU,YAAW;AACb,oBAAO3C,MAAMoC,KAAN,CAAYE,MAAnB;AACH,UALL;;AAOI;AAPJ,UAQKK,IARL,CAQU3C,MAAMK,QAAN,CAAe8M,YARzB;;AAUI;AAVJ,UAWKjK,KAXL,CAWW,UAASC,KAAT,EAAgB;AACnBnD,mBAAME,IAAN,CAAWkD,GAAX,CAAe,8BAAf,EAA+C,OAA/C,EAAwDD,KAAxD;AACH,UAbL;AAeH,MA3BD;;AA6BA;;;;;AAKA9C,cAAS8M,YAAT,GAAwB,UAAU3J,IAAV,EAAgB;;AAEpC,aAAIlB,SAASkB,KAAK0J,KAAlB;;AAEA;;;;AAIA,aAAIE,eAAe/J,QAAQC,OAAR,EAAnB;;AAEA,cAAK,IAAI+J,QAAQ,CAAjB,EAAoBA,QAAQ/K,OAAOiK,MAAnC,EAA4Cc,OAA5C,EAAsD;;AAElD;AACArN,mBAAMK,QAAN,CAAeiN,iBAAf,CAAiCF,YAAjC,EAA+C9K,MAA/C,EAAuD+K,KAAvD;AAEH;AAEJ,MAjBD;;AAmBA;;;AAGAhN,cAASiN,iBAAT,GAA6B,UAAUF,YAAV,EAAwB9K,MAAxB,EAAgC+K,KAAhC,EAAuC;;AAEhE;AACAD;;AAEA;AAFA,UAGKzK,IAHL,CAGU,YAAW;;AAEb,oBAAO3C,MAAMK,QAAN,CAAekN,YAAf,CAA4BjL,MAA5B,EAAqC+K,KAArC,CAAP;AAEH,UAPL;;AASI;;;AATJ,UAYK1K,IAZL,CAYU3C,MAAMK,QAAN,CAAemN,mBAZzB;;AAcI;;;AAdJ,UAiBK7K,IAjBL,CAiBU,UAAS8K,SAAT,EAAmB;;AAErB;;;AAGAzN,mBAAMO,OAAN,CAAcuL,WAAd,CAA0B2B,SAA1B;;AAEA;AACA,oBAAOA,UAAUvC,KAAjB;AAEH,UA3BL;;AA6BI;AA7BJ,UA8BKhI,KA9BL,CA8BW,UAASC,KAAT,EAAgB;AACnBnD,mBAAME,IAAN,CAAWkD,GAAX,CAAe,uCAAf,EAAwD,OAAxD,EAAiED,KAAjE;AACH,UAhCL;AAkCH,MArCD;;AAuCA;;;;AAIA9C,cAASkN,YAAT,GAAwB,UAAUG,UAAV,EAAsBL,KAAtB,EAA6B;;AAEjD,gBAAOhK,QAAQC,OAAR,GAAkBX,IAAlB,CAAuB,YAAW;;AAErC,oBAAO+K,WAAWL,KAAX,CAAP;AAEH,UAJM,CAAP;AAKH,MAPD;;AASA;;;;;;;;;;;;;AAaAhN,cAASmN,mBAAT,GAA+B,UAAUC,SAAV,EAAqB;;AAEhD;AACA,aAAIE,aAAaF,UAAU3J,IAA3B;AAAA,aACI8J,QAAaH,UAAUG,KAD3B;;AAGA;AACA;;AAEA;AACA,aAAI,CAAC5N,MAAMS,KAAN,CAAYkN,UAAZ,CAAL,EAA8B;AAC1B,mBAAM/J,sBAAiB+J,UAAjB,oBAAN;AACH;;AAED;AACA,aAAI,OAAO3N,MAAMS,KAAN,CAAYkN,UAAZ,EAAwB/B,MAA/B,IAAyC,UAA7C,EAAyD;;AAErD,mBAAMhI,sBAAiB+J,UAAjB,0CAAN;AACH;;AAED;AACA,aAAIzC,QAAQlL,MAAMS,KAAN,CAAYkN,UAAZ,EAAwB/B,MAAxB,CAA+B6B,UAAUjK,IAAzC,CAAZ;;AAEA;AACA,aAAIqK,YAAY7N,MAAMS,KAAN,CAAYkN,UAAZ,EAAwBG,WAAxB,IAAuC,KAAvD;;AAEA;AACA,gBAAO;AACHhK,mBAAY6J,UADT;AAEHzC,oBAAYA,KAFT;AAGH2C,wBAAYA,SAHT;AAIHD,oBAAYA;AAJT,UAAP;AAOH,MAlCD;;AAoCA,YAAOvN,QAAP;AAEH,EApKc,CAoKZ,EApKY,CAAf;;AAsKAP,QAAOC,OAAP,GAAiBM,QAAjB,C;;;;;;;;AC7KA;;;;;;;AAOA,KAAIC,QAAS,UAASA,KAAT,EAAgB;;AAEzB;;;;AAIAA,WAAMyN,UAAN,GAAmB,YAAY;;AAE3B;AACA/N,eAAMoC,KAAN,CAAY4L,IAAZ,GAAmBhO,MAAMqB,KAAN,CAAYc,QAAZ,CAAqB8L,SAAxC;;AAEA;AACAjO,eAAMoC,KAAN,CAAYC,UAAZ,GAAyB,EAAzB;;AAEAgB,iBAAQC,OAAR,GAEKX,IAFL,CAEU,YAAW;AACb,oBAAO3C,MAAMqB,KAAN,CAAYc,QAAZ,CAAqB+L,UAA5B;AACH,UAJL;AAKI;AALJ,UAMKvL,IANL,CAMU3C,MAAMM,KAAN,CAAY6N,SANtB,EAQKxL,IARL,CAQU,YAAW;AACb;AACH,UAVL,EAYKO,KAZL,CAYY,UAASC,KAAT,EAAgB;AACpBc,qBAAQb,GAAR,CAAY,mBAAZ;AACH,UAdL;AAgBH,MAxBD;;AA0BA9C,WAAM6N,SAAN,GAAkB,UAAS7L,MAAT,EAAiB;;AAE/B,aAAI8L,QAAQ/K,QAAQC,OAAR,EAAZ;;AAEA,cAAI,IAAI+J,QAAQ,CAAhB,EAAmBA,QAAQ/K,OAAOiK,MAAlC,EAA0Cc,OAA1C,EAAmD;;AAE/C;AACArN,mBAAMM,KAAN,CAAY+N,YAAZ,CAAyBD,KAAzB,EAAgC9L,MAAhC,EAAwC+K,KAAxC;AAEH;AAEJ,MAXD;;AAaA;AACA/M,WAAM+N,YAAN,GAAqB,UAASD,KAAT,EAAgB9L,MAAhB,EAAwB+K,KAAxB,EAA+B;;AAEhDe,eAAMzL,IAAN,CAAW,YAAW;AAClB,oBAAO3C,MAAMM,KAAN,CAAYiN,YAAZ,CAAyBjL,MAAzB,EAAiC+K,KAAjC,CAAP;AACH,UAFD,EAIK1K,IAJL,CAIU3C,MAAMM,KAAN,CAAYgO,sBAJtB;AAMH,MARD;;AAWA;;;;AAIAhO,WAAMiN,YAAN,GAAqB,UAAUG,UAAV,EAAsBL,KAAtB,EAA6B;;AAE9C,gBAAOhK,QAAQC,OAAR,GAAkBX,IAAlB,CAAuB,YAAW;;AAErC,oBAAO+K,WAAWL,KAAX,CAAP;AAEH,UAJM,CAAP;AAKH,MAPD;;AASA/M,WAAMgO,sBAAN,GAA+B,UAASpD,KAAT,EAAgB;;AAE3C,aAAIyC,aAAazC,MAAMqD,OAAN,CAAcpF,IAA/B;;AAEA;AACA,aAAI,CAACnJ,MAAMS,KAAN,CAAYkN,UAAZ,CAAL,EAA8B;AAC1B,mBAAM/J,sBAAiB+J,UAAjB,oBAAN;AACH;;AAED;AACA,aAAI,OAAO3N,MAAMS,KAAN,CAAYkN,UAAZ,EAAwBa,IAA/B,IAAuC,UAA3C,EAAuD;;AAEnD,mBAAM5K,sBAAiB+J,UAAjB,gCAAN;AACH;;AAED;AACA,aAAIc,eAAiBvD,MAAMgD,UAAN,CAAiB,CAAjB,CAArB;AAAA,aACIQ,iBAAiBD,aAAaP,UAAb,CAAwB,CAAxB,CADrB;AAAA,aAEIS,YAAiB3O,MAAMS,KAAN,CAAYkN,UAAZ,EAAwBa,IAAxB,CAA6BE,cAA7B,CAFrB;AAAA,aAGIE,MAHJ;;AAMAA,kBAAS;AACL9K,mBAAM6J,UADD;AAELnK,mBAAMmL;AAFD,UAAT;;AAKA;AACAC,gBAAOhB,KAAP,GAAe1C,MAAM2D,SAAN,CAAgBC,QAAhB,CAAyB9O,MAAMG,EAAN,CAAS4H,SAAT,CAAmBK,kBAA5C,CAAf;;AAEApI,eAAMoC,KAAN,CAAYC,UAAZ,CAAuB0M,IAAvB,CAA4BH,MAA5B;AACH,MA/BD;;AAiCA,YAAOtO,KAAP;AAEH,EAzGW,CAyGT,EAzGS,CAAZ;;AA2GAR,QAAOC,OAAP,GAAiBO,KAAjB,C;;;;;;;;AClHA;;;;;;;;AAQA,KAAIC,UAAW,UAASA,OAAT,EAAkB;;AAE7B;;;;AAIAA,aAAQyO,WAAR,GAAsB,IAAtB;;AAEA;;;;AAIAzO,aAAQ0O,UAAR,GAAqB,IAArB;;AAEA;;;AAGA1O,aAAQ2O,IAAR,GAAe,YAAY;;AAEvBlP,eAAME,IAAN,CAAWkD,GAAX,CAAe,YAAf;;AAEA;;;AAGApD,eAAMoC,KAAN,CAAY4L,IAAZ,GAAmBhO,MAAMqB,KAAN,CAAYc,QAAZ,CAAqB8L,SAAxC;AAEH,MATD;;AAWA;;;AAGA1N,aAAQ4O,cAAR,GAAyB,YAAW;;AAEhC,aAAIC,YAAYpL,OAAOqL,YAAP,EAAhB;AAAA,aACIC,OADJ;;AAGA,aAAIF,UAAUG,UAAV,KAAyB,IAA7B,EAAmC;AAC/B,oBAAO,IAAP;AACH;;AAED,aAAKH,UAAUG,UAAV,CAAqBzJ,QAArB,IAAiC9F,MAAME,IAAN,CAAWuE,SAAX,CAAqBC,GAA3D,EAAiE;AAC7D4K,uBAAUF,UAAUG,UAApB;AACH,UAFD,MAEO;AACHD,uBAAUF,UAAUI,SAAV,CAAoBC,aAA9B;AACH;;AAED,aAAK,CAACzP,MAAMc,MAAN,CAAa4O,iBAAb,CAA+BJ,OAA/B,CAAN,EAAgD;;AAE5C;AACA,iBAAIK,SAASL,QAAQhL,UAArB;;AAEA,oBAAOqL,UAAU,CAAC3P,MAAMc,MAAN,CAAa4O,iBAAb,CAA+BC,MAA/B,CAAlB,EAAyD;AACrDA,0BAASA,OAAOrL,UAAhB;AACH;;AAEDgL,uBAAUK,MAAV;AACH;;AAED,aAAIL,WAAWtP,MAAMqB,KAAN,CAAYc,QAA3B,EAAoC;AAChC,oBAAOmN,OAAP;AACH;;AAED,gBAAO,IAAP;AAEH,MAjCD;;AAmCA;;;AAGA/O,aAAQqP,SAAR,GAAoB,YAAW;;AAE3B5P,eAAMO,OAAN,CAAcyO,WAAd,CAA0BH,SAA1B,CAAoCgB,GAApC,CAAwC7P,MAAMG,EAAN,CAAS4H,SAAT,CAAmBI,iBAA3D;AACH,MAHD;;AAKA;;;AAGA5H,aAAQuP,SAAR,GAAoB,YAAW;;AAE3B,aAAI9P,MAAMO,OAAN,CAAcyO,WAAlB,EAA+B;AAC3BhP,mBAAMO,OAAN,CAAcyO,WAAd,CAA0BH,SAA1B,CAAoCkB,MAApC,CAA2C/P,MAAMG,EAAN,CAAS4H,SAAT,CAAmBI,iBAA9D;AACH;AAEJ,MAND;;AAQA;;;;;;AAMA5H,aAAQyP,kBAAR,GAA6B,UAASC,IAAT,EAAe;;AAExC,aAAI,CAACjQ,MAAME,IAAN,CAAW0F,SAAX,CAAqBqK,IAArB,CAAL,EAAiC;AAC7BA,oBAAOA,KAAK3L,UAAZ;AACH;;AAED,aAAI2L,SAASjQ,MAAMqB,KAAN,CAAYc,QAArB,IAAiC8N,SAASxM,SAASiF,IAAvD,EAA6D;;AAEzD,oBAAO,IAAP;AAEH,UAJD,MAIO;;AAEH,oBAAM,CAACuH,KAAKpB,SAAL,CAAeC,QAAf,CAAwB9O,MAAMG,EAAN,CAAS4H,SAAT,CAAmBC,eAA3C,CAAP,EAAoE;AAChEiI,wBAAOA,KAAK3L,UAAZ;AACH;;AAED,oBAAO2L,IAAP;AACH;AAEJ,MAnBD;;AAqBA;;;;;AAKA1P,aAAQwL,kBAAR,GAA6B,UAAUmE,UAAV,EAAsB;;AAE/C;AACAlQ,eAAMO,OAAN,CAAcuP,SAAd;;AAEA,aAAI,CAACI,UAAL,EAAiB;AACb;AACH;;AAED,cAAKlB,WAAL,GAAmB,KAAKgB,kBAAL,CAAwBE,UAAxB,CAAnB;AAEH,MAXD;;AAaA;;;;;;;;;;AAUA3P,aAAQ4P,YAAR,GAAuB,SAASC,aAAT,CAAuBC,WAAvB,EAAoCC,QAApC,EAA8C;;AAEjE,aAAI,CAACD,WAAD,IAAgB,CAACC,QAArB,EAA8B;AAC1BtQ,mBAAME,IAAN,CAAWkD,GAAX,CAAe,6BAAf;AACA;AACH;;AAED;AACA,gBAAM,CAACiN,YAAYxB,SAAZ,CAAsBC,QAAtB,CAA+B9O,MAAMG,EAAN,CAAS4H,SAAT,CAAmBC,eAAlD,CAAP,EAA2E;AACvEqI,2BAAcA,YAAY/L,UAA1B;AACH;;AAED;AACAtE,eAAMqB,KAAN,CAAYc,QAAZ,CAAqBoO,YAArB,CAAkCD,QAAlC,EAA4CD,WAA5C;;AAEA;;;AAGArQ,eAAMO,OAAN,CAAcwL,kBAAd,CAAiCuE,QAAjC;;AAEA;;;AAGAtQ,eAAMG,EAAN,CAAS8K,gBAAT,CAA0BqF,QAA1B;;AAEA;;;AAGAtQ,eAAMG,EAAN,CAAS8C,UAAT;AAEH,MA9BD;;AAgCA;;;;;;;;;;;;AAYA1C,aAAQuL,WAAR,GAAsB,UAAU2B,SAAV,EAAqB+C,cAArB,EAAsC;;AAExD,aAAIC,eAAkBzQ,MAAMO,OAAN,CAAcyO,WAApC;AAAA,aACI0B,kBAAkBjD,UAAUvC,KADhC;AAAA,aAEIyF,YAAkBlD,UAAU3J,IAFhC;AAAA,aAGI8J,QAAkBH,UAAUG,KAHhC;AAAA,aAIIE,cAAkBL,UAAUI,SAJhC;;AAMA,aAAIyC,WAAWtQ,MAAMO,OAAN,CAAcqQ,eAAd,CAA8BF,eAA9B,EAA+CC,SAA/C,EAA0D7C,WAA1D,CAAf;;AAEA,aAAIF,UAAU,IAAd,EAAoB;AAChB0C,sBAASzB,SAAT,CAAmBgB,GAAnB,CAAuB7P,MAAMG,EAAN,CAAS4H,SAAT,CAAmBK,kBAA1C;AACH;;AAED,aAAIqI,YAAJ,EAAkB;;AAEdzQ,mBAAME,IAAN,CAAWiE,WAAX,CAAuBsM,YAAvB,EAAqCH,QAArC;AAEH,UAJD,MAIO;AACH;;;AAGAtQ,mBAAMqB,KAAN,CAAYc,QAAZ,CAAqB2F,WAArB,CAAiCwI,QAAjC;AAEH;;AAED;;;AAGAtQ,eAAMG,EAAN,CAAS8K,gBAAT,CAA0BqF,QAA1B;;AAEA;;;AAGAtQ,eAAMO,OAAN,CAAcwL,kBAAd,CAAiCuE,QAAjC;;AAEA;;;AAGAtQ,eAAMG,EAAN,CAAS8C,UAAT;;AAGA,aAAKuN,cAAL,EAAsB;;AAElB;;;AAGA,iBAAIK,oBAAoB7Q,MAAMY,KAAN,CAAYkQ,oBAAZ,MAAsC,CAAC,CAA/D;;AAGA,iBAAID,qBAAqB,CAAC,CAA1B,EAA6B;;AAGzB,qBAAIE,kBAAkBT,SAASU,aAAT,CAAuB,mBAAvB,CAAtB;AAAA,qBACIC,YAAkBxN,SAASyN,cAAT,CAAwB,EAAxB,CADtB;;AAGAH,iCAAgBjJ,WAAhB,CAA4BmJ,SAA5B;AACAjR,uBAAMY,KAAN,CAAYuQ,GAAZ,CAAgBJ,eAAhB,EAAiC,CAAjC,EAAoC,CAApC;;AAEA/Q,uBAAMQ,OAAN,CAAc4Q,IAAd;AACApR,uBAAMQ,OAAN,CAAc6Q,cAAd;AAGH,cAbD,MAaO;;AAEH;AACAC,4BAAW,YAAY;;AAEnB;AACAtR,2BAAMY,KAAN,CAAY2Q,cAAZ,CAA2BV,iBAA3B;AACA7Q,2BAAMQ,OAAN,CAAc4Q,IAAd;AACApR,2BAAMQ,OAAN,CAAcsG,IAAd;AAEH,kBAPD,EAOG,EAPH;AASH;AAEJ;;AAED;;;;AAIAvG,iBAAQ0O,UAAR,GAAqB,KAArB;AAEH,MArFD;;AAuFA;;;;;;;AAOA1O,aAAQiR,WAAR,GAAsB,UAASC,cAAT,EAAyBnB,QAAzB,EAAmCnH,IAAnC,EAAwC;;AAE1D,aAAIuI,mBAAmB1R,MAAMO,OAAN,CAAcqQ,eAAd,CAA8BN,QAA9B,EAAwCnH,IAAxC,CAAvB;;AAEA;AACAnJ,eAAMO,OAAN,CAAc4P,YAAd,CAA2BsB,cAA3B,EAA2CC,gBAA3C;;AAEA;AACA1R,eAAMG,EAAN,CAAS8C,UAAT;AACH,MATD;;AAWA;;;;;;;;;;AAUA1C,aAAQoR,8BAAR,GAAyC,UAAUzG,KAAV,EAAiB0G,QAAjB,EAA2B;;AAEhE;;;;AAIA,aAAIC,cAAc3G,MAAMgD,UAAxB;AAAA,aACIb,KADJ;AAAA,aAEI4C,IAFJ;AAAA,aAGI6B,IAHJ;;AAKA,cAAIzE,QAAQ,CAAZ,EAAeA,QAAQwE,YAAYtF,MAAnC,EAA2Cc,OAA3C,EACA;AACI4C,oBAAO4B,YAAYxE,KAAZ,CAAP;;AAEA,iBAAI4C,KAAKnK,QAAL,IAAiB9F,MAAME,IAAN,CAAWuE,SAAX,CAAqBE,IAA1C,EAAgD;;AAE5CmN,wBAAO7B,KAAK8B,WAAL,CAAiBC,IAAjB,EAAP;;AAEA;;;AAGA,qBAAIF,SAAS,EAAb,EAAiB;;AAEb5G,2BAAM+G,WAAN,CAAkBhC,IAAlB;AACA2B;AACH;AACJ;AACJ;;AAED,aAAI1G,MAAMgD,UAAN,CAAiB3B,MAAjB,KAA4B,CAAhC,EAAmC;AAC/B,oBAAO9I,SAASyN,cAAT,CAAwB,EAAxB,CAAP;AACH;;AAED;AACA,aAAKU,WAAW,CAAhB,EACIA,WAAW,CAAX;;AAEJ,aAAIM,qBAAqB,KAAzB;;AAEA;AACA,aAAIN,aAAa,CAAjB,EAAoB;AAChBM,kCAAqB,IAArB;AACAN,wBAAW,CAAX;AACH;;AAED,gBAAQA,QAAR,EAAmB;;AAEf;AACA,iBAAKM,kBAAL,EAA0B;AACtBhH,yBAAQA,MAAMgD,UAAN,CAAiB,CAAjB,CAAR;AACH,cAFD,MAEO;AACHhD,yBAAQA,MAAMgD,UAAN,CAAiB0D,WAAW,CAA5B,CAAR;AACH;;AAED,iBAAK1G,MAAMpF,QAAN,IAAkB9F,MAAME,IAAN,CAAWuE,SAAX,CAAqBC,GAA5C,EAAiD;;AAE7CkN,4BAAW1G,MAAMgD,UAAN,CAAiB3B,MAA5B;AAEH,cAJD,MAIO,IAAIrB,MAAMpF,QAAN,IAAkB9F,MAAME,IAAN,CAAWuE,SAAX,CAAqBE,IAA3C,EAAiD;;AAEpDiN,4BAAW,CAAX;AACH;AAEJ;;AAED,gBAAO1G,KAAP;AACH,MAnED;;AAqEA;;;AAGA3K,aAAQqQ,eAAR,GAA0B,UAAU1F,KAAV,EAAiB/B,IAAjB,EAAuB2E,WAAvB,EAAoC;;AAE1D,aAAIwC,WAAetQ,MAAMW,IAAN,CAAWsP,IAAX,CAAgB,KAAhB,EAAuBjQ,MAAMG,EAAN,CAAS4H,SAAT,CAAmBC,eAA1C,EAA2D,EAA3D,CAAnB;AAAA,aACIyG,eAAezO,MAAMW,IAAN,CAAWsP,IAAX,CAAgB,KAAhB,EAAuBjQ,MAAMG,EAAN,CAAS4H,SAAT,CAAmBE,aAA1C,EAAyD,EAAzD,CADnB;;AAGAwG,sBAAa3G,WAAb,CAAyBoD,KAAzB;AACAoF,kBAASxI,WAAT,CAAqB2G,YAArB;;AAEA,aAAIX,WAAJ,EAAiB;AACbW,0BAAaI,SAAb,CAAuBgB,GAAvB,CAA2B7P,MAAMG,EAAN,CAAS4H,SAAT,CAAmBG,eAA9C;AACH;;AAEDoI,kBAAS/B,OAAT,CAAiBpF,IAAjB,GAAwBA,IAAxB;AACA,gBAAOmH,QAAP;AACH,MAdD;;AAgBA;;;AAGA/P,aAAQ4R,QAAR,GAAmB,YAAW;;AAE1B,aAAI/C,YAAYpL,OAAOqL,YAAP,GAAsB+C,UAAtB,CAAiC,CAAjC,CAAhB;;AAEA,gBAAOhD,SAAP;AACH,MALD;;AAOA;;;;;AAKA7O,aAAQ8R,UAAR,GAAqB,UAASC,UAAT,EAAqB;;AAEtC,aAAIlD,YAAiBpL,OAAOqL,YAAP,EAArB;AAAA,aACIE,aAAiBH,UAAUG,UAD/B;AAAA,aAEIgD,iBAAiBhD,WAAWwC,WAFhC;AAAA,aAGIS,cAAiBpD,UAAUqD,YAH/B;AAAA,aAIIC,eAJJ;AAAA,aAKIC,mBALJ;AAAA,aAMIC,cANJ;AAAA,aAOIC,kBAPJ;;AASA,aAAIC,eAAe9S,MAAMO,OAAN,CAAcyO,WAAd,CAA0BgC,aAA1B,CAAwC,mBAAxC,CAAnB;;AAGA0B,2BAAsBH,eAAeQ,SAAf,CAAyB,CAAzB,EAA4BP,WAA5B,CAAtB;AACAI,0BAAsBL,eAAeQ,SAAf,CAAyBP,WAAzB,CAAtB;;AAEAG,+BAAsBlP,SAASyN,cAAT,CAAwBwB,eAAxB,CAAtB;;AAEA,aAAIE,cAAJ,EAAoB;AAChBC,kCAAsBpP,SAASyN,cAAT,CAAwB0B,cAAxB,CAAtB;AACH;;AAED,aAAII,iBAAiB,EAArB;AAAA,aACIC,aAAiB,EADrB;AAAA,aAEIC,iBAAiB,KAFrB;;AAIA,aAAIL,kBAAJ,EAAwB;AACpBI,wBAAWlE,IAAX,CAAgB8D,kBAAhB;AACH;;AAED,cAAM,IAAIlG,IAAI,CAAR,EAAWwG,KAAjB,EAAwB,CAAC,EAAEA,QAAQL,aAAa5E,UAAb,CAAwBvB,CAAxB,CAAV,CAAzB,EAAgEA,GAAhE,EAAqE;;AAEjE,iBAAKwG,SAAS5D,UAAd,EAA2B;AACvB,qBAAK,CAAC2D,cAAN,EAAsB;AAClBF,oCAAejE,IAAf,CAAoBoE,KAApB;AACH,kBAFD,MAEO;AACHF,gCAAWlE,IAAX,CAAgBoE,KAAhB;AACH;AACJ,cAND,MAMO;AACHD,kCAAiB,IAAjB;AACH;AAEJ;;AAED;AACAlT,eAAMoC,KAAN,CAAYG,MAAZ,CAAmB+P,UAAnB,EAA+BrE,SAA/B,GAA2C,EAA3C;;AAEA;;;AAGA,aAAImF,uBAAuBJ,eAAezG,MAA1C;;AAEA,cAAII,IAAI,CAAR,EAAWA,IAAIyG,oBAAf,EAAqCzG,GAArC,EAA0C;AACtC3M,mBAAMoC,KAAN,CAAYG,MAAZ,CAAmB+P,UAAnB,EAA+BxK,WAA/B,CAA2CkL,eAAerG,CAAf,CAA3C;AACH;;AAED3M,eAAMoC,KAAN,CAAYG,MAAZ,CAAmB+P,UAAnB,EAA+BxK,WAA/B,CAA2C6K,mBAA3C;;AAEA;;;AAGA,aAAIU,mBAAmBJ,WAAW1G,MAAlC;AAAA,aACI+G,UAAmB7P,SAASgE,aAAT,CAAuB,KAAvB,CADvB;;AAGA,cAAIkF,IAAI,CAAR,EAAWA,IAAI0G,gBAAf,EAAiC1G,GAAjC,EAAsC;AAClC2G,qBAAQxL,WAAR,CAAoBmL,WAAWtG,CAAX,CAApB;AACH;;AAED2G,mBAAUA,QAAQrF,SAAlB;;AAEA;AACA,aAAIsF,iBAAiBvT,MAAMiB,QAAN,CAAeG,kBAApC;;AAEA;;;AAGApB,eAAMO,OAAN,CAAcuL,WAAd,CAA0B;AACtBhI,mBAAQyP,cADc;AAEtBrI,oBAAQlL,MAAMS,KAAN,CAAY8S,cAAZ,EAA4B3H,MAA5B,CAAmC;AACvCkG,uBAAOwB;AADgC,cAAnC;AAFc,UAA1B,EAKG,IALH;AAOH,MApFD;;AAsFA;;;;AAIA/S,aAAQiT,WAAR,GAAsB,UAAS3C,iBAAT,EAA4B4C,gBAA5B,EAA8C;;AAEhE;AACA,aAAI5C,sBAAsB,CAA1B,EAA6B;AACzB;AACH;;AAED,aAAI6C,WAAJ;AAAA,aACIC,sBAAsB3T,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBsO,iBAAnB,EAAsC5C,SADhE;;AAGA,aAAI,CAACwF,gBAAL,EAAuB;;AAEnBC,2BAAc1T,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBsO,oBAAoB,CAAvC,CAAd;AAEH,UAJD,MAIO;;AAEH6C,2BAAc1T,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBkR,gBAAnB,CAAd;AAEH;;AAEDC,qBAAYzF,SAAZ,IAAyB0F,mBAAzB;AACH,MArBD;;AAuBA;;;;;;AAMApT,aAAQqT,KAAR,GAAgB,UAASC,QAAT,EAAmB;;AAE/B,aAAIC,cAAc9T,MAAMO,OAAN,CAAcyO,WAAhC;AAAA,aACI7F,OAAc2K,YAAYvF,OAAZ,CAAoBpF,IADtC;;AAGA,aAAInJ,MAAMS,KAAN,CAAY0I,IAAZ,EAAkB4K,cAAtB,EAAsC;AACjC/T,mBAAMO,OAAN,CAAcyT,QAAd,CAAuBC,IAAvB,CAA4B,IAA5B,EAAkCJ,SAASK,UAA3C,CAAD;AACH,UAFD,MAEO;AACHlU,mBAAMO,OAAN,CAAc4T,gBAAd,CAA+BN,SAASK,UAAxC;AACH;AAEJ,MAXD;;AAaA;;;;;;AAMA3T,aAAQ4T,gBAAR,GAA2B,UAAS9S,KAAT,EAAgB;;AAEvC,aAAI4O,OAAW5O,MAAM,CAAN,CAAf;AAAA,aACI+S,WAAW3Q,SAASyN,cAAT,CAAwBjB,KAAK8B,WAA7B,CADf;;AAGA,aAAI/R,MAAME,IAAN,CAAW0F,SAAX,CAAqBqK,IAArB,CAAJ,EAAgC;AAC5BA,kBAAK3L,UAAL,CAAgBiM,YAAhB,CAA6B6D,QAA7B,EAAuCnE,IAAvC;AACH;AACJ,MARD;;AAUA;;;;;;;AAOA1P,aAAQyT,QAAR,GAAmB,UAAS5P,MAAT,EAAiB;;AAEhC,aAAI,CAACA,MAAL,EAAa;AACT;AACH;;AAED,aAAI6L,OAAO7L,OAAO,CAAP,CAAX;;AAEA,aAAI,CAAC6L,IAAL,EAAW;AACP;AACH;;AAED;;;;AAIA,cAAKoE,UAAL;;AAEA;;;;AAIA,aAAItT,YAAY,IAAIf,MAAMe,SAAV,CAAoBf,MAAMe,SAAN,CAAgBuT,MAAhB,CAAuBC,KAA3C,CAAhB;;AAEA,aAAIC,SAAJ,EACI7H,CADJ,EAEIxD,IAFJ;;AAIA;;;AAGA,aAAI8G,KAAKnK,QAAL,IAAiB9F,MAAME,IAAN,CAAWuE,SAAX,CAAqBE,IAA1C,EAAgD;AAC5C;AACH;;AAED;;;AAGA6P,qBAAYzT,UAAU0T,UAAV,CAAqBxE,IAArB,CAAZ;AACAA,cAAKyE,WAAL,CAAiBF,SAAjB;;AAEA;;AAEI;;AAEA;;AAEA;AACJ;;AAEA;;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;;AAEA;;;AAGA;;AAEA;AACA;AACA;AAEH,MAvFD;;AAyFA,YAAOjU,OAAP;AAEH,EAxoBa,CAwoBX,EAxoBW,CAAd;;AA0oBAT,QAAOC,OAAP,GAAiBQ,OAAjB,C;;;;;;;;AClpBA;;;;;;;;;;;AAWA,KAAIC,UAAW,UAASA,OAAT,EAAkB;;AAE7BA,aAAQP,IAAR,GAAe,YAAW;AACtBO,iBAAQS,QAAR,GAAmB,mBAAApB,CAAQ,CAAR,CAAnB;AACAW,iBAAQ6K,MAAR,GAAmB,mBAAAxL,CAAQ,EAAR,CAAnB;AACAW,iBAAQmB,OAAR,GAAmB,mBAAA9B,CAAQ,EAAR,CAAnB;AACH,MAJD;;AAMA;;;AAGAW,aAAQmU,oBAAR,GAA+B,EAA/B;;AAEAnU,aAAQoU,aAAR,GAAwB,EAAxB;;AAEApU,aAAQqU,MAAR,GAAiB,KAAjB;;AAEArU,aAAQsU,OAAR,GAAkB,IAAlB;;AAEA;;;AAGAtU,aAAQsG,IAAR,GAAe,YAAW;;AAEtB9G,eAAMqB,KAAN,CAAYb,OAAZ,CAAoBqO,SAApB,CAA8BgB,GAA9B,CAAkC,QAAlC;AACA,cAAKgF,MAAL,GAAc,IAAd;AAEH,MALD;;AAOA;;;AAGArU,aAAQuU,KAAR,GAAgB,YAAU;;AAEtB/U,eAAMqB,KAAN,CAAYb,OAAZ,CAAoBqO,SAApB,CAA8BkB,MAA9B,CAAqC,QAArC;;AAEAvP,iBAAQqU,MAAR,GAAkB,KAAlB;AACArU,iBAAQsU,OAAR,GAAkB,IAAlB;;AAEA,cAAK,IAAI/J,MAAT,IAAmB/K,MAAMqB,KAAN,CAAYa,cAA/B,EAA8C;AAC1ClC,mBAAMqB,KAAN,CAAYa,cAAZ,CAA2B6I,MAA3B,EAAmC8D,SAAnC,CAA6CkB,MAA7C,CAAoD,UAApD;AACH;;AAED;AACA/P,eAAMQ,OAAN,CAAcmB,OAAd,CAAsBoT,KAAtB;AACA/U,eAAMQ,OAAN,CAAcS,QAAd,CAAuB8T,KAAvB;AAEH,MAfD;;AAiBAvU,aAAQwU,MAAR,GAAiB,YAAU;;AAEvB,aAAK,CAAC,KAAKH,MAAX,EAAmB;;AAEf,kBAAK/N,IAAL;AAEH,UAJD,MAIO;;AAEH,kBAAKiO,KAAL;AAEH;AAEJ,MAZD;;AAcAvU,aAAQyU,cAAR,GAAyB,YAAW;AAChCjV,eAAMqB,KAAN,CAAYO,UAAZ,CAAuBiN,SAAvB,CAAiCgB,GAAjC,CAAqC,MAArC;AACH,MAFD;;AAIArP,aAAQ6Q,cAAR,GAAyB,YAAW;AAChCrR,eAAMqB,KAAN,CAAYO,UAAZ,CAAuBiN,SAAvB,CAAiCkB,MAAjC,CAAwC,MAAxC;AACH,MAFD;;AAIA;;;AAGAvP,aAAQ4Q,IAAR,GAAe,YAAW;;AAEtB;AACApR,eAAMQ,OAAN,CAAcmB,OAAd,CAAsBoT,KAAtB;;AAEA,aAAI,CAAC/U,MAAMO,OAAN,CAAcyO,WAAnB,EAAgC;AAC5B;AACH;;AAED,aAAIkG,gBAAgBlV,MAAMqB,KAAN,CAAYb,OAAZ,CAAoB2U,YAApB,IAAoCnV,MAAMQ,OAAN,CAAcmU,oBAAtE;AAAA,aACIS,iBAAiBpV,MAAMO,OAAN,CAAcyO,WAAd,CAA0BqG,SAA1B,GAAuCrV,MAAMQ,OAAN,CAAcmU,oBAAd,GAAqC,CAA5E,GAAiF3U,MAAMQ,OAAN,CAAcoU,aADpH;;AAGA5U,eAAMqB,KAAN,CAAYb,OAAZ,CAAoB8U,KAApB,CAA0BC,SAA1B,uBAAwDC,KAAKC,KAAL,CAAWL,cAAX,CAAxD;;AAEA;AACApV,eAAMQ,OAAN,CAAcS,QAAd,CAAuByU,iBAAvB;AAEH,MAjBD;;AAmBA,YAAOlV,OAAP;AAEH,EA/Fa,CA+FX,EA/FW,CAAd;;AAiGAA,SAAQP,IAAR;;AAEAH,QAAOC,OAAP,GAAiBS,OAAjB,C;;;;;;;;AC9GA,KAAIS,WAAY,UAASA,QAAT,EAAmB;;AAE/BA,cAAShB,IAAT,GAAgB,YAAW;AACvBJ,SAAA,mBAAAA,CAAQ,CAAR;AACH,MAFD;;AAIAoB,cAAS4T,MAAT,GAAkB,KAAlB;;AAEA5T,cAAS0U,OAAT,GAAmB,IAAnB;AACA1U,cAASS,OAAT,GAAmB,IAAnB;;AAEAT,cAAS2M,KAAT,GAAiB,IAAjB;;AAEA;;;AAGA3M,cAAS6F,IAAT,GAAgB,UAAS8O,QAAT,EAAkB;;AAE9B;;;;AAIA,aAAI,CAAC5V,MAAMS,KAAN,CAAYmV,QAAZ,CAAD,IAA0B,CAAC5V,MAAME,IAAN,CAAW0F,SAAX,CAAqB5F,MAAMS,KAAN,CAAYmV,QAAZ,EAAsB3U,QAA3C,CAA/B,EAAsF;;AAElFjB,mBAAME,IAAN,CAAWkD,GAAX,iBAA0BwS,QAA1B,2BAAuD,MAAvD;AACA;AAEH,UALD,MAKO;;AAEH5V,mBAAMqB,KAAN,CAAYW,cAAZ,CAA2B8F,WAA3B,CAAuC9H,MAAMS,KAAN,CAAYmV,QAAZ,EAAsB3U,QAA7D;AAEH;;AAED,aAAI6R,eAAe9S,MAAMO,OAAN,CAAcyO,WAAjC;;AAEA;AACAhP,eAAMqB,KAAN,CAAYU,aAAZ,CAA0B8M,SAA1B,CAAoCgB,GAApC,CAAwC,QAAxC;AACA7P,eAAMQ,OAAN,CAAcS,QAAd,CAAuB8H,kBAAvB;AACA,cAAK8L,MAAL,GAAc,IAAd;AACH,MAvBD;;AAyBA;;;AAGA5T,cAAS8T,KAAT,GAAiB,YAAU;;AAEvB/U,eAAMqB,KAAN,CAAYU,aAAZ,CAA0B8M,SAA1B,CAAoCkB,MAApC,CAA2C,QAA3C;AACA/P,eAAMqB,KAAN,CAAYW,cAAZ,CAA2BiM,SAA3B,GAAuC,EAAvC;;AAEA,cAAK4G,MAAL,GAAc,KAAd;AAEH,MAPD;;AASA;;;AAGA5T,cAAS+T,MAAT,GAAkB,UAAUY,QAAV,EAAoB;;AAElC,aAAK,CAAC,KAAKf,MAAX,EAAmB;;AAEf,kBAAK/N,IAAL,CAAU8O,QAAV;AAEH,UAJD,MAIO;;AAEH,kBAAKb,KAAL;AAEH;AAEJ,MAZD;;AAcA;;;AAGA9T,cAAS8H,kBAAT,GAA8B,YAAW;;AAErC;AACA,aAAI8M,eAAJ;;AAEA;AACA7V,eAAMqB,KAAN,CAAYY,eAAZ,CAA4BgM,SAA5B,GAAwC,EAAxC;;AAGA;AACA4H,2BAAkB7V,MAAMQ,OAAN,CAAcS,QAAd,CAAuB6U,mBAAvB,EAAlB;;AAEA;;;;AAIA;;;;AAIA9V,eAAMqB,KAAN,CAAYY,eAAZ,CAA4B6F,WAA5B,CAAwC+N,eAAxC;AAEH,MAtBD;;AAwBA;;;;;;;;;AASA5U,cAAS6U,mBAAT,GAA+B,YAAW;;AAEtC,aAAIC,sBAAsB/V,MAAMQ,OAAN,CAAcS,QAAd,CAAuB8U,mBAAvB,EAA1B;AAAA,aACIJ,OADJ;AAAA,aAEInS,IAFJ;;AAIA,aAAI,CAACuS,mBAAL,EAA0B;;AAEtBvS,oBAAO;AACHyK,4BAAY;AADT,cAAP;AAIH,UAND,MAMO;;AAEHzK,oBAAO;AACHyK,4BAAY;AADT,cAAP;AAIH;;AAED0H,mBAAU3V,MAAMW,IAAN,CAAWsP,IAAX,CAAgB,KAAhB,EAAuBjQ,MAAMG,EAAN,CAAS4H,SAAT,CAAmBM,aAA1C,EAAyD7E,IAAzD,CAAV;AACAmS,iBAAQxL,gBAAR,CAAyB,OAAzB,EAAkCnK,MAAMQ,OAAN,CAAcS,QAAd,CAAuB+U,cAAzD,EAAyE,KAAzE;;AAEA,gBAAOL,OAAP;AACH,MAxBD;;AA0BA;;;AAGA1U,cAAS+U,cAAT,GAA0B,YAAW;;AAEjC,aAAIhH,cAAchP,MAAMO,OAAN,CAAcyO,WAAhC;;AAEAA,qBAAYH,SAAZ,CAAsBmG,MAAtB,CAA6BhV,MAAMG,EAAN,CAAS4H,SAAT,CAAmBK,kBAAhD;;AAEApI,eAAMQ,OAAN,CAAcS,QAAd,CAAuB8T,KAAvB;AACH,MAPD;;AASA9T,cAAS8U,mBAAT,GAA+B,YAAW;;AAEtC,aAAIjD,eAAe9S,MAAMO,OAAN,CAAcyO,WAAjC;;AAEA,aAAI8D,YAAJ,EAAkB;AACd,oBAAOA,aAAajE,SAAb,CAAuBC,QAAvB,CAAgC9O,MAAMG,EAAN,CAAS4H,SAAT,CAAmBK,kBAAnD,CAAP;AACH,UAFD,MAEO;AACH,oBAAO,KAAP;AACH;AACJ,MATD;;AAWA;;;AAGAnH,cAAS2H,qBAAT,GAAiC,YAAW;;AAExC,aAAIqN,qBAAsBjW,MAAMW,IAAN,CAAWsP,IAAX,CAAgB,MAAhB,EAAwB,wBAAxB,EAAkD,EAAlD,CAA1B;AAAA,aACIiG,gBAAgBlW,MAAMW,IAAN,CAAWsP,IAAX,CAAgB,MAAhB,EAAwB,4BAAxB,EAAsD,EAAEhC,WAAY,+BAAd,EAAtD,CADpB;AAAA,aAEIkI,gBAAgBnW,MAAMW,IAAN,CAAWsP,IAAX,CAAgB,KAAhB,EAAuB,iCAAvB,EAA0D,EAA1D,CAFpB;AAAA,aAGImG,gBAAgBpW,MAAMW,IAAN,CAAWsP,IAAX,CAAgB,KAAhB,EAAuB,4BAAvB,EAAqD,EAAE8B,aAAc,cAAhB,EAArD,CAHpB;AAAA,aAIIsE,eAAgBrW,MAAMW,IAAN,CAAWsP,IAAX,CAAgB,KAAhB,EAAuB,2BAAvB,EAAoD,EAAE8B,aAAc,mBAAhB,EAApD,CAJpB;;AAMAmE,uBAAc/L,gBAAd,CAA+B,OAA/B,EAAwCnK,MAAMQ,OAAN,CAAcS,QAAd,CAAuBqV,mBAA/D,EAAoF,KAApF;;AAEAF,uBAAcjM,gBAAd,CAA+B,OAA/B,EAAwCnK,MAAMQ,OAAN,CAAcS,QAAd,CAAuBsV,sBAA/D,EAAuF,KAAvF;;AAEAF,sBAAalM,gBAAb,CAA8B,OAA9B,EAAuCnK,MAAMQ,OAAN,CAAcS,QAAd,CAAuBuV,qBAA9D,EAAqF,KAArF;;AAEAL,uBAAcrO,WAAd,CAA0BsO,aAA1B;AACAD,uBAAcrO,WAAd,CAA0BuO,YAA1B;;AAEAJ,4BAAmBnO,WAAnB,CAA+BoO,aAA/B;AACAD,4BAAmBnO,WAAnB,CAA+BqO,aAA/B;;AAEA;AACAnW,eAAMQ,OAAN,CAAcS,QAAd,CAAuB0U,OAAvB,GAAiCO,aAAjC;AACAlW,eAAMQ,OAAN,CAAcS,QAAd,CAAuBS,OAAvB,GAAiCyU,aAAjC;;AAEA,gBAAOF,kBAAP;AAEH,MA1BD;;AA4BAhV,cAASqV,mBAAT,GAA+B,YAAW;;AAEtC,aAAIG,SAASzW,MAAMQ,OAAN,CAAcS,QAAd,CAAuBS,OAApC;;AAEA,aAAI+U,OAAO5H,SAAP,CAAiBC,QAAjB,CAA0B,QAA1B,CAAJ,EAAyC;AACrC9O,mBAAMQ,OAAN,CAAcS,QAAd,CAAuByU,iBAAvB;AACH,UAFD,MAEO;AACH1V,mBAAMQ,OAAN,CAAcS,QAAd,CAAuByV,iBAAvB;AACH;;AAED1W,eAAMQ,OAAN,CAAcmB,OAAd,CAAsBoT,KAAtB;AACA/U,eAAMQ,OAAN,CAAcS,QAAd,CAAuB8T,KAAvB;AAEH,MAbD;;AAeA9T,cAASuV,qBAAT,GAAiC,YAAW;;AAExCxW,eAAMQ,OAAN,CAAcS,QAAd,CAAuBS,OAAvB,CAA+BmN,SAA/B,CAAyCkB,MAAzC,CAAgD,QAAhD;AACH,MAHD;;AAKA9O,cAASsV,sBAAT,GAAkC,YAAW;;AAEzC,aAAIzD,eAAe9S,MAAMO,OAAN,CAAcyO,WAAjC;AAAA,aACI2H,qBADJ;;AAGA7D,sBAAa/C,MAAb;;AAEA4G,iCAAwB3W,MAAMqB,KAAN,CAAYc,QAAZ,CAAqB+L,UAArB,CAAgC3B,MAAxD;;AAEA;;;AAGA,aAAIoK,0BAA0B,CAA9B,EAAiC;;AAE7B;AACA3W,mBAAMO,OAAN,CAAcyO,WAAd,GAA4B,IAA5B;;AAEA;AACAhP,mBAAMG,EAAN,CAASsL,eAAT;AACH;;AAEDzL,eAAMG,EAAN,CAAS8C,UAAT;;AAEAjD,eAAMQ,OAAN,CAAcuU,KAAd;AACH,MAxBD;;AA0BA9T,cAASyV,iBAAT,GAA6B,YAAW;AACpC1W,eAAMQ,OAAN,CAAcS,QAAd,CAAuBS,OAAvB,CAA+BmN,SAA/B,CAAyCgB,GAAzC,CAA6C,QAA7C;AACH,MAFD;;AAIA5O,cAASyU,iBAAT,GAA6B,YAAW;AACpC1V,eAAMQ,OAAN,CAAcS,QAAd,CAAuBS,OAAvB,CAA+BmN,SAA/B,CAAyCkB,MAAzC,CAAgD,QAAhD;AACH,MAFD;;AAIA,YAAO9O,QAAP;AAEH,EAlPc,CAkPZ,EAlPY,CAAf;;AAoPAA,UAAShB,IAAT;;AAEAH,QAAOC,OAAP,GAAiBkB,QAAjB,C;;;;;;;;ACtPA;;;;;;;;;AASA,KAAIoK,SAAU,UAASA,MAAT,EAAiB;;AAE3BA,YAAOpL,IAAP,GAAc,YAAW,CAExB,CAFD;;AAIAoL,YAAOuL,aAAP,GAAuB,IAAvB;AACAvL,YAAOwL,aAAP,GAAuB,IAAvB;AACAxL,YAAOyL,cAAP,GAAwB,IAAxB;;AAEA;;;;AAIAzL,YAAO0L,eAAP,GAAyB,IAAzB;;AAEA;;;;;AAKA1L,YAAOC,IAAP,GAAc,YAAW;;AAErB,aAAI0L,eAAe,KAAKC,gBAAL,EAAnB;AAAA,aACIzW,UAAeR,MAAMqB,KAAN,CAAYG,aAAZ,CAA0BD,OAD7C;AAAA,aAEIE,UAAezB,MAAMqB,KAAN,CAAYG,aAAZ,CAA0BC,OAF7C;;AAIA,aAAIuV,aAAazK,MAAb,GAAsB,CAA1B,EAA6B;;AAEzB;AACAvM,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqB+F,IAArB;;AAEA;AACA5Q,qBAAQqO,SAAR,CAAkBgB,GAAlB,CAAsB,QAAtB;;AAEA;AACA7P,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqB6L,WAArB;AACH;AAEJ,MAzBD;;AA2BA;;;;;AAKA7L,YAAO0J,KAAP,GAAe,YAAW;AACtB,aAAIvU,UAAUR,MAAMqB,KAAN,CAAYG,aAAZ,CAA0BD,OAAxC;AACAf,iBAAQqO,SAAR,CAAkBkB,MAAlB,CAAyB,QAAzB;AACH,MAHD;;AAKA;;;;;AAKA1E,YAAO+F,IAAP,GAAc,YAAW;;AAErB,aAAI,CAAC,KAAK0F,cAAV,EAA0B;AACtB,kBAAKA,cAAL,GAAsB,KAAKK,iBAAL,EAAtB;AACH;;AAED,aAAIC,SAAkB,KAAKC,kBAAL,EAAtB;AAAA,aACIzC,gBAAkB,CADtB;AAAA,aAEIpU,UAAkBR,MAAMqB,KAAN,CAAYG,aAAZ,CAA0BD,OAFhD;AAAA,aAGI+V,cAHJ;AAAA,aAIIC,cAJJ;;AAMA,aAAI/W,QAAQgX,YAAR,KAAyB,CAA7B,EAAgC;AAC5B5C,6BAAgB,EAAhB;AACH;;AAED0C,0BAAiBF,OAAOK,CAAP,GAAW,KAAKX,cAAL,CAAoBY,IAAhD;AACAH,0BAAiBH,OAAOO,CAAP,GAAW3T,OAAO4T,OAAlB,GAA4B,KAAKd,cAAL,CAAoBe,GAAhD,GAAsDjD,aAAtD,GAAsEpU,QAAQgX,YAA/F;;AAEAhX,iBAAQ8U,KAAR,CAAcC,SAAd,oBAAyCC,KAAKC,KAAL,CAAW6B,cAAX,CAAzC,YAA0E9B,KAAKC,KAAL,CAAW8B,cAAX,CAA1E;;AAEA;AACAvX,eAAMQ,OAAN,CAAc6K,MAAd,CAAqByM,YAArB;AACA9X,eAAMQ,OAAN,CAAc6K,MAAd,CAAqB0M,WAArB;AAEH,MAzBD;;AA2BA;;;;;;AAMA1M,YAAOW,WAAP,GAAqB,UAASzB,KAAT,EAAgBzG,IAAhB,EAAsB;;AAEvC;;;;AAIA,iBAAQA,IAAR;AACI,kBAAK,YAAL;AAAoB9D,uBAAMQ,OAAN,CAAc6K,MAAd,CAAqB2M,gBAArB,CAAsCzN,KAAtC,EAA6CzG,IAA7C,EAAoD;AACxE;AAAoB9D,uBAAMQ,OAAN,CAAc6K,MAAd,CAAqB4M,iBAArB,CAAuCnU,IAAvC,EAA8C;AAFtE;;AAKA;;;;AAIA9D,eAAMqB,KAAN,CAAYG,aAAZ,CAA0BC,OAA1B,CAAkCyM,UAAlC,CAA6CgK,OAA7C,CAAqDlY,MAAMQ,OAAN,CAAc6K,MAAd,CAAqB8M,UAA1E;AACH,MAhBD;;AAkBA;;;;;AAKA9M,YAAO8L,iBAAP,GAA2B,YAAW;;AAElC,aAAI5V,UAAUvB,MAAMqB,KAAN,CAAYE,OAA1B;AAAA,aACI6W,SAAU,KAAKC,SAAL,CAAe9W,OAAf,CADd;;AAGA,cAAKuV,cAAL,GAAsBsB,MAAtB;AACA,gBAAOA,MAAP;AAEH,MARD;;AAUA;;;;;;;;AAQA/M,YAAOgN,SAAP,GAAmB,UAAWxS,EAAX,EAAgB;;AAE/B,aAAIyS,KAAK,CAAT;AACA,aAAIC,KAAK,CAAT;;AAEA,gBAAO1S,MAAM,CAAC2S,MAAO3S,GAAG4S,UAAV,CAAP,IAAiC,CAACD,MAAO3S,GAAGwP,SAAV,CAAzC,EAAiE;AAC7DiD,mBAAOzS,GAAG4S,UAAH,GAAgB5S,GAAG6S,UAA1B;AACAH,mBAAO1S,GAAGwP,SAAH,GAAexP,GAAG8S,SAAzB;AACA9S,kBAAKA,GAAG+S,YAAR;AACH;AACD,gBAAO,EAAEf,KAAKU,EAAP,EAAWb,MAAMY,EAAjB,EAAP;AACH,MAXD;;AAaA;;;;;;AAMAjN,YAAOgM,kBAAP,GAA4B,YAAW;;AAEnC,aAAIwB,MAAMpV,SAAS2L,SAAnB;AAAA,aAA8B0J,KAA9B;AACA,aAAIrB,IAAI,CAAR;AAAA,aAAWE,IAAI,CAAf;;AAEA,aAAIkB,GAAJ,EAAS;;AAEL,iBAAIA,IAAI/U,IAAJ,IAAY,SAAhB,EAA2B;AACvBgV,yBAAQD,IAAIE,WAAJ,EAAR;AACAD,uBAAME,QAAN,CAAe,IAAf;AACAvB,qBAAIqB,MAAMG,YAAV;AACAtB,qBAAImB,MAAMI,WAAV;AACH;AAEJ,UATD,MASO,IAAIlV,OAAOqL,YAAX,EAAyB;;AAE5BwJ,mBAAM7U,OAAOqL,YAAP,EAAN;;AAEA,iBAAIwJ,IAAIM,UAAR,EAAoB;;AAEhBL,yBAAQD,IAAIzG,UAAJ,CAAe,CAAf,EAAkBgH,UAAlB,EAAR;AACA,qBAAIN,MAAMO,cAAV,EAA0B;AACtBP,2BAAME,QAAN,CAAe,IAAf;AACA,yBAAIM,OAAOR,MAAMO,cAAN,GAAuB,CAAvB,CAAX;AACA5B,yBAAI6B,KAAK5B,IAAT;AACAC,yBAAI2B,KAAKzB,GAAT;AACH;AAEJ;AACJ;AACD,gBAAO,EAAEJ,GAAGA,CAAL,EAAQE,GAAGA,CAAX,EAAP;AACH,MA/BD;;AAiCA;;;;;;AAMAtM,YAAO4L,gBAAP,GAA0B,SAASA,gBAAT,GAA2B;;AAEjD,aAAID,eAAe,EAAnB;;AAEA,aAAIhT,OAAOqL,YAAX,EAAwB;AAAE;AACtB2H,4BAAehT,OAAOqL,YAAP,GAAsBkK,QAAtB,EAAf;AACH;;AAED,gBAAOvC,YAAP;AACH,MATD;;AAWA;AACA3L,YAAO6L,WAAP,GAAqB,YAAW;;AAE5B,aAAIzV,UAAUzB,MAAMqB,KAAN,CAAYG,aAAZ,CAA0BC,OAAxC;AACAA,iBAAQoN,SAAR,CAAkBgB,GAAlB,CAAsB,QAAtB;;AAEA7P,eAAMQ,OAAN,CAAc6K,MAAd,CAAqBuL,aAArB,GAAqC,IAArC;;AAEA;AACA5W,eAAMqB,KAAN,CAAYG,aAAZ,CAA0BC,OAA1B,CAAkCyM,UAAlC,CAA6CgK,OAA7C,CAAqDlY,MAAMQ,OAAN,CAAc6K,MAAd,CAAqB8M,UAA1E;AAEH,MAVD;;AAYA;AACA9M,YAAOyM,YAAP,GAAsB,YAAW;AAC7B,aAAIrW,UAAUzB,MAAMqB,KAAN,CAAYG,aAAZ,CAA0BC,OAAxC;AACAA,iBAAQoN,SAAR,CAAkBkB,MAAlB,CAAyB,QAAzB;;AAEA/P,eAAMQ,OAAN,CAAc6K,MAAd,CAAqBuL,aAArB,GAAqC,KAArC;AACH,MALD;;AAOA;AACAvL,YAAOmO,WAAP,GAAqB,YAAW;AAC5B,aAAI/C,SAASzW,MAAMqB,KAAN,CAAYG,aAAZ,CAA0BE,OAAvC;AACA+U,gBAAO5H,SAAP,CAAiBgB,GAAjB,CAAqB,QAArB;;AAEA7P,eAAMQ,OAAN,CAAc6K,MAAd,CAAqBwL,aAArB,GAAqC,IAArC;AACH,MALD;;AAOA;AACAxL,YAAO0M,WAAP,GAAqB,YAAW;AAC5B,aAAItB,SAASzW,MAAMqB,KAAN,CAAYG,aAAZ,CAA0BE,OAAvC;AACA+U,gBAAOxI,SAAP,GAAmB,EAAnB;AACAwI,gBAAO5H,SAAP,CAAiBkB,MAAjB,CAAwB,QAAxB;AACA/P,eAAMQ,OAAN,CAAc6K,MAAd,CAAqBwL,aAArB,GAAqC,KAArC;AACH,MALD;;AAOA;AACAxL,YAAO2M,gBAAP,GAA0B,UAASzN,KAAT,EAAgBzG,IAAhB,EAAsB;;AAE5C,aAAI2V,WAAW,KAAKC,YAAL,EAAf;;AAEA,aAAIC,WAAkB3Z,MAAMO,OAAN,CAAcyO,WAApC;AAAA,aACI+H,kBAAkB/W,MAAMQ,OAAN,CAAc6K,MAAd,CAAqB0L,eAD3C;;AAGA,aAAI0C,QAAJ,EAAc;;AAEV,iBAAIrK,YAAcpL,OAAOqL,YAAP,EAAlB;AAAA,iBACIE,aAAcH,UAAUG,UAD5B;;AAGAwH,+BAAkB/W,MAAMQ,OAAN,CAAc6K,MAAd,CAAqBuO,aAArB,CAAmCD,QAAnC,CAAlB;;AAEA;;;;;;AAMA3Z,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqBwO,gBAArB,CAAsCF,QAAtC,EAAgD5C,eAAhD;;AAEA/W,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqB4M,iBAArB,CAAuC,QAAvC;AAEH,UAjBD,MAiBO;;AAEH;AACA,iBAAIxB,SAASzW,MAAMW,IAAN,CAAWmZ,YAAX,EAAb;AACA9Z,mBAAMqB,KAAN,CAAYG,aAAZ,CAA0BE,OAA1B,CAAkCoG,WAAlC,CAA8C2O,MAA9C;;AAEAzW,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqByM,YAArB;AACA9X,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqBmO,WAArB;;AAEAzC,+BAAkB/W,MAAMQ,OAAN,CAAc6K,MAAd,CAAqBuO,aAArB,CAAmCD,QAAnC,CAAlB;;AAEA;;;;;AAKAlD,oBAAOsD,KAAP;AACAxP,mBAAMyP,cAAN;;AAEA;AACAvD,oBAAOtM,gBAAP,CAAwB,SAAxB,EAAmC,UAASI,KAAT,EAAe;;AAE9C,qBAAIA,MAAM0P,OAAN,IAAiBja,MAAME,IAAN,CAAW2E,IAAX,CAAgBG,KAArC,EAA4C;;AAExChF,2BAAMQ,OAAN,CAAc6K,MAAd,CAAqBwO,gBAArB,CAAsCF,QAAtC,EAAgD5C,eAAhD;AACA/W,2BAAMQ,OAAN,CAAc6K,MAAd,CAAqB6O,SAArB,CAA+BzD,OAAO0D,KAAtC;;AAEA;;;AAGA5P,2BAAMyP,cAAN;AACAzP,2BAAM6P,wBAAN;;AAEApa,2BAAMQ,OAAN,CAAc6K,MAAd,CAAqBgP,UAArB;AACH;AAEJ,cAhBD,EAgBG,KAhBH;AAiBH;AACJ,MA9DD;;AAgEAhP,YAAOqO,YAAP,GAAsB,YAAW;;AAE7B,aAAID,WAAW,KAAf;;AAEAzZ,eAAMqB,KAAN,CAAYG,aAAZ,CAA0BC,OAA1B,CAAkCyM,UAAlC,CAA6CgK,OAA7C,CAAqD,UAAS/O,IAAT,EAAe;AAChE,iBAAImR,WAAWnR,KAAKoF,OAAL,CAAazK,IAA5B;;AAEA,iBAAIwW,YAAY,MAAZ,IAAsBnR,KAAK0F,SAAL,CAAeC,QAAf,CAAwB,cAAxB,CAA1B,EAAmE;AAC/D2K,4BAAW,IAAX;AACH;AACJ,UAND;;AAQA,gBAAOA,QAAP;AACH,MAbD;;AAeA;AACApO,YAAO4M,iBAAP,GAA2B,UAASnU,IAAT,EAAe;AACtCL,kBAAS8W,WAAT,CAAqBzW,IAArB,EAA2B,KAA3B,EAAkC,IAAlC;AACH,MAFD;;AAIA;;;;;;;AAOAuH,YAAO6O,SAAP,GAAmB,UAASlU,GAAT,EAAc;;AAE7BvC,kBAAS8W,WAAT,CAAqB,YAArB,EAAmC,KAAnC,EAA0CvU,GAA1C;;AAEA;AACAhG,eAAMQ,OAAN,CAAc6K,MAAd,CAAqB0M,WAArB;AACH,MAND;;AAQA;;;;;AAKA1M,YAAOuO,aAAP,GAAuB,UAASY,WAAT,EAAsB;;AAEzC,aAAI1B,QAAQ9U,OAAOqL,YAAP,GAAsB+C,UAAtB,CAAiC,CAAjC,CAAZ;AAAA,aACIqI,oBAAoB3B,MAAMM,UAAN,EADxB;AAAA,aAEI5W,KAFJ;;AAIAiY,2BAAkBC,kBAAlB,CAAqCF,WAArC;AACAC,2BAAkBE,MAAlB,CAAyB7B,MAAM8B,cAA/B,EAA+C9B,MAAM+B,WAArD;;AAEArY,iBAAQiY,kBAAkBlB,QAAlB,GAA6BhN,MAArC;;AAEA,gBAAO;AACH/J,oBAAOA,KADJ;AAEHsY,kBAAKtY,QAAQsW,MAAMS,QAAN,GAAiBhN;AAF3B,UAAP;AAIH,MAfD;;AAiBA;;;;;;;;AAQAlB,YAAOwO,gBAAP,GAA0B,UAASW,WAAT,EAAsBO,QAAtB,EAAgC;;AAEtD,aAAIjC,QAAYrV,SAASsV,WAAT,EAAhB;AAAA,aACIiC,YAAY,CADhB;;AAGAlC,eAAMmC,QAAN,CAAeT,WAAf,EAA4B,CAA5B;AACA1B,eAAME,QAAN,CAAe,IAAf;;AAEA,aAAIkC,YAAY,CAACV,WAAD,CAAhB;AAAA,aACIvK,IADJ;AAAA,aAEIkL,aAAa,KAFjB;AAAA,aAGIC,OAAO,KAHX;AAAA,aAIIC,aAJJ;;AAMA,gBAAO,CAACD,IAAD,KAAUnL,OAAOiL,UAAUI,GAAV,EAAjB,CAAP,EAA0C;;AAEtC,iBAAIrL,KAAKnK,QAAL,IAAiB,CAArB,EAAwB;;AAEpBuV,iCAAgBL,YAAY/K,KAAK1D,MAAjC;;AAEA,qBAAI,CAAC4O,UAAD,IAAeJ,SAASvY,KAAT,IAAkBwY,SAAjC,IAA8CD,SAASvY,KAAT,IAAkB6Y,aAApE,EAAmF;AAC/EvC,2BAAMmC,QAAN,CAAehL,IAAf,EAAqB8K,SAASvY,KAAT,GAAiBwY,SAAtC;AACAG,kCAAa,IAAb;AACH;AACD,qBAAIA,cAAcJ,SAASD,GAAT,IAAgBE,SAA9B,IAA2CD,SAASD,GAAT,IAAgBO,aAA/D,EAA8E;AAC1EvC,2BAAM6B,MAAN,CAAa1K,IAAb,EAAmB8K,SAASD,GAAT,GAAeE,SAAlC;AACAI,4BAAO,IAAP;AACH;AACDJ,6BAAYK,aAAZ;AACH,cAbD,MAaO;AACH,qBAAI1O,IAAIsD,KAAK/B,UAAL,CAAgB3B,MAAxB;AACA,wBAAOI,GAAP,EAAY;AACRuO,+BAAUnM,IAAV,CAAekB,KAAK/B,UAAL,CAAgBvB,CAAhB,CAAf;AACH;AACJ;AACJ;;AAED,aAAIkM,MAAM7U,OAAOqL,YAAP,EAAV;AACAwJ,aAAI0C,eAAJ;AACA1C,aAAI2C,QAAJ,CAAa1C,KAAb;AACH,MAxCD;;AA0CA;;;;;AAKAzN,YAAOgP,UAAP,GAAoB,YAAW;AAC3B,aAAIjL,YAAYpL,OAAOqL,YAAP,EAAhB;AACAD,mBAAUmM,eAAV;AACH,MAHD;;AAKA;;;;;AAKAlQ,YAAO8M,UAAP,GAAoB,UAAShP,IAAT,EAAe;AAC/B,aAAImR,WAAWnR,KAAKoF,OAAL,CAAazK,IAA5B;;AAEA,aAAIL,SAASgY,iBAAT,CAA2BnB,QAA3B,CAAJ,EAA0C;AACtCta,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqBqQ,oBAArB,CAA0CvS,IAA1C;AACH,UAFD,MAEO;AACHnJ,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqBsQ,sBAArB,CAA4CxS,IAA5C;AACH;;AAED;;;;AAIA,aAAIiG,YAAYpL,OAAOqL,YAAP,EAAhB;AAAA,aACIuM,MAAMxM,UAAUG,UAAV,CAAqBjL,UAD/B;;AAGA,aAAIsX,IAAIC,OAAJ,IAAe,GAAf,IAAsBvB,YAAY,MAAtC,EAA8C;AAC1Cta,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqBqQ,oBAArB,CAA0CvS,IAA1C;AACH;AACJ,MAnBD;;AAqBA;;;;;AAKAkC,YAAOqQ,oBAAP,GAA8B,UAAS3Q,MAAT,EAAiB;AAC3CA,gBAAO8D,SAAP,CAAiBgB,GAAjB,CAAqB,cAArB;;AAEA;AACA,aAAI9E,OAAOwD,OAAP,CAAezK,IAAf,IAAuB,MAA3B,EAAmC;AAC/B,iBAAI6F,OAAOoB,OAAOmD,UAAP,CAAkB,CAAlB,CAAX;AACAvE,kBAAKkF,SAAL,CAAekB,MAAf,CAAsB,cAAtB;AACApG,kBAAKkF,SAAL,CAAegB,GAAf,CAAmB,gBAAnB;AACH;AACJ,MATD;;AAWA;;;;;AAKAxE,YAAOsQ,sBAAP,GAAgC,UAAS5Q,MAAT,EAAiB;AAC7CA,gBAAO8D,SAAP,CAAiBkB,MAAjB,CAAwB,cAAxB;;AAEA;AACA,aAAIhF,OAAOwD,OAAP,CAAezK,IAAf,IAAuB,MAA3B,EAAmC;AAC/B,iBAAI6F,OAAOoB,OAAOmD,UAAP,CAAkB,CAAlB,CAAX;AACAvE,kBAAKkF,SAAL,CAAekB,MAAf,CAAsB,gBAAtB;AACApG,kBAAKkF,SAAL,CAAegB,GAAf,CAAmB,cAAnB;AACH;AACJ,MATD;;AAYA,YAAOxE,MAAP;AACH,EA9dY,CA8dV,EA9dU,CAAb;;AAgeAA,QAAOpL,IAAP;;AAEAH,QAAOC,OAAP,GAAiBsL,MAAjB,C;;;;;;;;AC3eA;;;;;;;;AAQA,KAAI1J,UAAW,UAASA,OAAT,EAAkB;;AAE7BA,aAAQ1B,IAAR,GAAe,YAAY;;AAEvBJ,SAAA,mBAAAA,CAAQ,CAAR;AAEH,MAJD;;AAMA8B,aAAQkT,MAAR,GAAiB,KAAjB;;AAEA;AACAlT,aAAQmF,IAAR,GAAe,YAAW;;AAEtB;AACA,aAAI9G,MAAMQ,OAAN,CAAcS,QAAd,CAAuB4T,MAA3B,EAAmC;;AAE/B7U,mBAAMQ,OAAN,CAAcS,QAAd,CAAuB8T,KAAvB;AAEH;;AAED;AACA/U,eAAMqB,KAAN,CAAYM,OAAZ,CAAoBkN,SAApB,CAA8BgB,GAA9B,CAAkC,QAAlC;;AAEA;AACA7P,eAAMqB,KAAN,CAAYO,UAAZ,CAAuBiN,SAAvB,CAAiCgB,GAAjC,CAAqC,SAArC;;AAEA;AACA7P,eAAMQ,OAAN,CAAcmB,OAAd,CAAsBkT,MAAtB,GAA+B,IAA/B;AAEH,MAlBD;;AAoBA;AACAlT,aAAQoT,KAAR,GAAgB,YAAW;;AAEvB;AACA/U,eAAMqB,KAAN,CAAYM,OAAZ,CAAoBkN,SAApB,CAA8BkB,MAA9B,CAAqC,QAArC;;AAEA;AACA/P,eAAMqB,KAAN,CAAYO,UAAZ,CAAuBiN,SAAvB,CAAiCkB,MAAjC,CAAwC,SAAxC;;AAEA;AACA/P,eAAMQ,OAAN,CAAcmB,OAAd,CAAsBkT,MAAtB,GAA+B,KAA/B;AAEH,MAXD;;AAaAlT,aAAQma,IAAR,GAAe,YAAU;;AAErB,aAAIC,cAAc/b,MAAMQ,OAAN,CAAcsU,OAAhC;AAAA,aACIrU,QAAcub,OAAOnX,IAAP,CAAY7E,MAAMS,KAAlB,CADlB;AAAA,aAEIwb,aAAcjc,MAAMqB,KAAN,CAAYa,cAF9B;AAAA,aAGIga,aAHJ;AAAA,aAIIC,oBAAoB,CAJxB;AAAA,aAKIC,YALJ;;AAOA;AACA,cAAK,IAAIjT,IAAT,IAAiBnJ,MAAMS,KAAvB,EAA+B;;AAE3B,iBAAI,CAACT,MAAMS,KAAN,CAAY0I,IAAZ,EAAkBG,gBAAvB,EAAyC;;AAErC6S;AAEH;AAGJ;;AAED,aAAK,CAACJ,WAAN,EAAoB;;AAEhB;AACA,kBAAKK,YAAL,IAAqBH,UAArB;AAAiC;AAAjC;AAEH,UALD,MAKO;;AAEHC,6BAAgBzb,MAAM4b,OAAN,CAAcN,WAAd,IAA6B,CAA7C;;AAEA,iBAAIO,sBAAsBJ,iBAAiBzb,MAAM8L,MAAN,IAAgB4P,oBAAoB,CAApC,CAA3C;;AAEA,iBAAKG,mBAAL,EAA2B;;AAEvBJ,iCAAgB,CAAhB;;AAEA;AACA,sBAAK,IAAI/S,IAAT,IAAiBnJ,MAAMS,KAAvB,EAA+B;;AAE3B,yBAAIT,MAAMS,KAAN,CAAY0I,IAAZ,EAAkBG,gBAAtB,EAAuC;;AAEnC;AAEH;;AAED4S;AACH;AAEJ;;AAEDE,4BAAe3b,MAAMyb,aAAN,CAAf;AAEH;;AAED,cAAK,IAAInR,MAAT,IAAmBkR,UAAnB;AAA+BA,wBAAWlR,MAAX,EAAmB8D,SAAnB,CAA6BkB,MAA7B,CAAoC,UAApC;AAA/B,UACAkM,WAAWG,YAAX,EAAyBvN,SAAzB,CAAmCgB,GAAnC,CAAuC,UAAvC;AACA7P,eAAMQ,OAAN,CAAcsU,OAAd,GAAwBsH,YAAxB;AAEH,MA1DD;;AA4DA;;;;AAIAza,aAAQqK,WAAR,GAAsB,YAAW;;AAE7B;;;AAGA,aAAIuQ,qBAAqB,CAAC,OAAD,EAAU,MAAV,EAAkB,MAAlB,EAA0B,WAA1B,EAAuC,SAAvC,CAAzB;AAAA,aACIpT,OAAqBnJ,MAAMS,KAAN,CAAYT,MAAMQ,OAAN,CAAcsU,OAA1B,CADzB;AAAA,aAEIhB,cAAqB9T,MAAMO,OAAN,CAAcyO,WAFvC;AAAA,aAGI6B,oBAAqB7Q,MAAMY,KAAN,CAAY0R,UAHrC;AAAA,aAII5B,eAJJ;AAAA,aAKI8L,cALJ;AAAA,aAMI/O,SANJ;;AAQA;AACAiD,2BAAkBvH,KAAKvG,IAAL,EAAlB;;AAEA;AACA6K,qBAAY;AACRvC,oBAAYwF,eADJ;AAER5M,mBAAYqF,KAAKrF,IAFT;AAGR+J,wBAAY;AAHJ,UAAZ;;AAMA,aACIiG,eACAyI,mBAAmBF,OAAnB,CAA2BvI,YAAYvF,OAAZ,CAAoBpF,IAA/C,MAAyD,CAAC,CAD1D,IAEA2K,YAAY/B,WAAZ,CAAwBC,IAAxB,OAAmC,EAHvC,EAIC;;AAEG;AACAhS,mBAAMO,OAAN,CAAciR,WAAd,CAA0BsC,WAA1B,EAAuCpD,eAAvC,EAAwDvH,KAAKrF,IAA7D;AAEH,UATD,MASO;;AAEH;AACA9D,mBAAMO,OAAN,CAAcuL,WAAd,CAA0B2B,SAA1B;;AAEA;AACAoD;AAEH;;AAED;AACA2L,0BAAiBrT,KAAKqT,cAAtB;;AAEA,aAAIA,kBAAkB,OAAOA,cAAP,IAAyB,UAA/C,EAA2D;;AAEvDA,4BAAe3V,IAAf,CAAoB0D,KAApB;AAEH;;AAED+G,oBAAW,YAAW;;AAElB;AACAtR,mBAAMY,KAAN,CAAY6b,UAAZ,CAAuB5L,iBAAvB;AAEH,UALD,EAKG,EALH;;AAQA;;;AAGA7Q,eAAMO,OAAN,CAAcwL,kBAAd;;AAEA;;;AAGA/L,eAAMQ,OAAN,CAAc4Q,IAAd;AACH,MApED;;AAsEA,YAAOzP,OAAP;AAEH,EArLa,CAqLX,EArLW,CAAd;;AAuLAA,SAAQ1B,IAAR;;AAEAH,QAAOC,OAAP,GAAiB4B,OAAjB,C;;;;;;;;ACjMA;;;;;;;AAOA,KAAIlB,QAAS,UAASA,KAAT,EAAgB;;AAEzB,UAAOA,KAAP;AAEH,EAJW,CAIT,EAJS,CAAZ;;AAMAX,QAAOC,OAAP,GAAiBU,KAAjB,C;;;;;;;;ACbA;;;;;;;AAOA,KAAIic,YAAa,UAASA,SAAT,EAAoB;;AAEjCA,eAAUC,mBAAV,GAAgC,IAAhC;;AAEAD,eAAUlS,aAAV,GAA0B,UAASD,KAAT,EAAe;AACrC,iBAAQA,MAAM0P,OAAd;AACI,kBAAKja,MAAME,IAAN,CAAW2E,IAAX,CAAgBG,KAArB;AAA6BhF,uBAAMU,QAAN,CAAekc,eAAf,CAA+BrS,KAA/B,EAA2C;AAD5E;AAGH,MAJD;;AAMAmS,eAAUjS,eAAV,GAA4B,UAASF,KAAT,EAAgB;AACxC,iBAAQA,MAAM0P,OAAd;AACI,kBAAKja,MAAME,IAAN,CAAW2E,IAAX,CAAgBE,GAArB;AAA6B/E,uBAAMU,QAAN,CAAemc,aAAf,CAA6BtS,KAA7B,EAAyD;AACtF,kBAAKvK,MAAME,IAAN,CAAW2E,IAAX,CAAgBG,KAArB;AAA6BhF,uBAAMU,QAAN,CAAeoc,6BAAf,CAA6CvS,KAA7C,EAAyD;AACtF,kBAAKvK,MAAME,IAAN,CAAW2E,IAAX,CAAgBO,GAArB;AAA6BpF,uBAAMU,QAAN,CAAeqc,gBAAf,CAAgCxS,KAAhC,EAAyD;AACtF;AAA6BvK,uBAAMU,QAAN,CAAesc,iBAAf,CAAiCzS,KAAjC,EAAyD;AAJ1F;AAMH,MAPD;;AASAmS,eAAUhS,WAAV,GAAwB,UAASH,KAAT,EAAe;AACnC,iBAAQA,MAAM0P,OAAd;AACI,kBAAKja,MAAME,IAAN,CAAW2E,IAAX,CAAgBU,EAArB;AACA,kBAAKvF,MAAME,IAAN,CAAW2E,IAAX,CAAgBS,IAArB;AACA,kBAAKtF,MAAME,IAAN,CAAW2E,IAAX,CAAgBY,KAArB;AACA,kBAAKzF,MAAME,IAAN,CAAW2E,IAAX,CAAgBW,IAArB;AAA6BxF,uBAAMU,QAAN,CAAeuc,eAAf,CAA+B1S,KAA/B,EAAuC;AAJxE;AAMH,MAPD;;AASAmS,eAAUG,aAAV,GAA0B,UAAStS,KAAT,EAAe;;AAErC,aAAK,CAACvK,MAAMQ,OAAN,CAAcqU,MAApB,EAA6B;AACzB7U,mBAAMQ,OAAN,CAAcsG,IAAd;AACH;;AAED,aAAI9G,MAAMQ,OAAN,CAAcqU,MAAd,IAAwB,CAAC7U,MAAMQ,OAAN,CAAcmB,OAAd,CAAsBkT,MAAnD,EAA2D;AACvD7U,mBAAMQ,OAAN,CAAcmB,OAAd,CAAsBmF,IAAtB;AACH,UAFD,MAEO;AACH9G,mBAAMQ,OAAN,CAAcmB,OAAd,CAAsBma,IAAtB;AACH;;AAEDvR,eAAMyP,cAAN;AACH,MAbD;;AAeA0C,eAAUE,eAAV,GAA4B,UAASrS,KAAT,EAAgB;;AAExC,aAAIvK,MAAMO,OAAN,CAAc0O,UAAlB,EAA8B;;AAE1B;;;;AAIAjP,mBAAMY,KAAN,CAAY0R,UAAZ,GAAyB,CAAC,CAA1B;;AAEAtS,mBAAMU,QAAN,CAAewc,mBAAf;AACH;AACJ,MAZD;;AAcA;;;;AAIAR,eAAUI,6BAAV,GAA0C,UAASvS,KAAT,EAAe;;AAErD,aAAIA,MAAMnG,MAAN,CAAa+Y,eAAb,IAAgC,MAApC,EAA4C;;AAExC;AACAnd,mBAAMY,KAAN,CAAYwc,qBAAZ;AACH;;AAED,aAAI,CAACpd,MAAMO,OAAN,CAAcyO,WAAnB,EAAgC;AAC5B;;;AAGAhP,mBAAMU,QAAN,CAAewc,mBAAf,CAAmC3S,KAAnC;AACA;AACH;;AAGD,aAAIsG,oBAA0B7Q,MAAMY,KAAN,CAAYkQ,oBAAZ,MAAsC,CAApE;AAAA,aACIgD,cAA0B9T,MAAMO,OAAN,CAAcyO,WAD5C;AAAA,aAEI7F,OAA0B2K,YAAYvF,OAAZ,CAAoBpF,IAFlD;AAAA,aAGIkU,0BAA0Brd,MAAMQ,OAAN,CAAcqU,MAAd,IACtB7U,MAAMQ,OAAN,CAAcsU,OADQ,IAEtBvK,MAAMnG,MAAN,IAAgBpE,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBsO,iBAAnB,CALxB;;AAOA;AACA,aAAIyM,mBAAmBtd,MAAMS,KAAN,CAAY0I,IAAZ,EAAkBmU,gBAAzC;;AAEA;AACA,aAAI/J,iBAAiBvT,MAAMiB,QAAN,CAAeG,kBAApC;;AAEA;;;AAGA,aAAKic,uBAAL,EAA+B;;AAE3B9S,mBAAMyP,cAAN;;AAEAha,mBAAMQ,OAAN,CAAcmB,OAAd,CAAsBqK,WAAtB,CAAkCzB,KAAlC;;AAEAvK,mBAAMQ,OAAN,CAAcuU,KAAd;;AAEA;;;AAGAxK,mBAAMgT,eAAN;AACAhT,mBAAM6P,wBAAN;;AAEA;AAEH;;AAED;;;AAGA,aAAK7P,MAAMiT,QAAN,IAAkB,CAACF,gBAAxB,EAA0C;AACtCtd,mBAAMU,QAAN,CAAewc,mBAAf,CAAmCld,MAAMO,OAAN,CAAcuS,YAAjD,EAA+DvI,KAA/D;AACAA,mBAAMyP,cAAN;AAEH,UAJD,MAIO,IAAMzP,MAAMiT,QAAN,IAAkB,CAACF,gBAApB,IAA0C,CAAC/S,MAAMiT,QAAP,IAAmBF,gBAAlE,EAAqF;AACxF;AACA;AACH;;AAED,aAAIG,iBAAiB,KAArB;AAAA,aACIC,mBAAmB1Z,OAAOqL,YAAP,EADvB;AAAA,aAEIsO,sBAAsBD,iBAAiBnO,UAF3C;AAAA,aAGIqO,sBAAsB5d,MAAMY,KAAN,CAAYgR,QAAZ,CAAqBiM,QAArB,EAH1B;AAAA,aAIIC,4CAA4C,KAJhD;;AAMA;;;;;AAKAA,qDAA4CH,uBAAuBA,oBAAoBrZ,UAApB,CAA+B6Y,eAA/B,IAAkD,MAArH;;AAEA;;;AAGA,aACIQ,oBAAoB7X,QAApB,IAAgC9F,MAAME,IAAN,CAAWuE,SAAX,CAAqBE,IAArD,IACA,CAACmZ,yCADD,IAEA,CAACF,mBAHL,EAIC;;AAEGrT,mBAAMyP,cAAN;;AAEAha,mBAAME,IAAN,CAAWkD,GAAX,CAAe,wBAAf;;AAEApD,mBAAMO,OAAN,CAAc8R,UAAd,CAAyBxB,iBAAzB;;AAEA;AACA,iBAAI,CAAC7Q,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBsO,oBAAoB,CAAvC,EAA0CkB,WAA1C,CAAsDC,IAAtD,EAAL,EAAmE;AAC/DhS,uBAAMQ,OAAN,CAAc6Q,cAAd;AACH;AAEJ,UAjBD,MAiBO;;AAEH,iBAAKsM,uBAAuBA,oBAAoBrZ,UAAhD,EAA4D;;AAExDmZ,kCAAiB,CAACE,oBAAoBrZ,UAApB,CAA+BE,WAAjD;AAEH;;AAED,iBAAKiZ,kBAAkBG,mBAAvB,EAA6C;;AAEzCrT,uBAAMyP,cAAN;;AAEAha,uBAAME,IAAN,CAAWkD,GAAX,CAAe,kDAAf;;AAEApD,uBAAMO,OAAN,CAAcuL,WAAd,CAA0B;AACtBhI,2BAAQyP,cADc;AAEtBrI,4BAAQlL,MAAMS,KAAN,CAAY8S,cAAZ,EAA4B3H,MAA5B;AAFc,kBAA1B,EAGG,IAHH;;AAKA5L,uBAAMQ,OAAN,CAAc4Q,IAAd;AACApR,uBAAMQ,OAAN,CAAcsG,IAAd;;AAEA;AACA9G,uBAAMQ,OAAN,CAAc6Q,cAAd;AAEH,cAjBD,MAiBO;;AAEHrR,uBAAME,IAAN,CAAWkD,GAAX,CAAe,yBAAf;AAEH;AAEJ;;AAED;AACApD,eAAMG,EAAN,CAAS8C,UAAT;AAEH,MApID;;AAsIAyZ,eAAUK,gBAAV,GAA6B,UAASxS,KAAT,EAAe;;AAExC;AACAvK,eAAMQ,OAAN,CAAcuU,KAAd;;AAEA;AACA/U,eAAMQ,OAAN,CAAcmB,OAAd,CAAsBoT,KAAtB;;AAEAxK,eAAMyP,cAAN;AAEH,MAVD;;AAYA0C,eAAUO,eAAV,GAA4B,UAAS1S,KAAT,EAAe;;AAEvCvK,eAAMO,OAAN,CAAcwL,kBAAd;;AAEA;AACA/L,eAAMQ,OAAN,CAAcuU,KAAd;AACA/U,eAAMQ,OAAN,CAAc4Q,IAAd;AAEH,MARD;;AAUAsL,eAAUM,iBAAV,GAA8B,UAASzS,KAAT,EAAgB;;AAE1CvK,eAAMQ,OAAN,CAAcuU,KAAd;;AAEA,aAAI,CAAC/U,MAAMQ,OAAN,CAAc6K,MAAd,CAAqBwL,aAA1B,EAAyC;AACrC7W,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqB0J,KAArB;AACA/U,mBAAMO,OAAN,CAAcuP,SAAd;AACH;AACJ,MARD;;AAUA4M,eAAU/R,eAAV,GAA4B,UAAUJ,KAAV,EAAiB;;AAEzCmS,mBAAUqB,8BAAV;;AAEA/d,eAAMO,OAAN,CAAcwL,kBAAd,CAAiCxB,MAAMnG,MAAvC;;AAEApE,eAAMG,EAAN,CAAS8C,UAAT;;AAEA,aAAI+T,eAAehX,MAAMQ,OAAN,CAAc6K,MAAd,CAAqB4L,gBAArB,EAAnB;;AAEA;;;AAGA,aAAID,aAAazK,MAAb,KAAwB,CAA5B,EAA+B;AAC3BvM,mBAAMQ,OAAN,CAAc6K,MAAd,CAAqB0J,KAArB;AACH;;AAED;AACA,aAAIxK,MAAMnG,MAAN,CAAa+Y,eAAb,IAAgC,MAApC,EAA4C;;AAExCnd,mBAAMY,KAAN,CAAYwc,qBAAZ;AAEH;;AAED,aAAIpd,MAAMO,OAAN,CAAcyO,WAAd,KAA8B,IAAlC,EAAwC;;AAEpC;;;AAGA,iBAAIgP,mBAAmBhe,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBgK,MAAnB,GAA4B,CAA5B,GAAgCvM,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBgK,MAAnB,GAA4B,CAA5D,GAAgE,CAAvF;;AAEA;AACA,iBAAIvM,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBgK,MAAvB,EAA+B;;AAE3B;AACA,qBAAI0R,kBAAmBje,MAAMO,OAAN,CAAcyP,kBAAd,CAAiChQ,MAAMoC,KAAN,CAAYG,MAAZ,CAAmByb,gBAAnB,CAAjC,CAAvB;AACH;;AAED;AACA,iBAAIhe,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBgK,MAAnB,IAA6BvM,MAAMoC,KAAN,CAAYG,MAAZ,CAAmByb,gBAAnB,EAAqCjM,WAArC,KAAqD,EAAlF,IAAwFkM,gBAAgB1P,OAAhB,CAAwBpF,IAAxB,IAAgCnJ,MAAMiB,QAAN,CAAeG,kBAA3I,EAA+J;;AAE3JpB,uBAAMY,KAAN,CAAY6b,UAAZ,CAAuBuB,gBAAvB;AAEH,cAJD,MAIO;;AAEH;AACA,qBAAIzK,iBAAiBvT,MAAMiB,QAAN,CAAeG,kBAApC;;AAEApB,uBAAMO,OAAN,CAAcuL,WAAd,CAA0B;AACtBhI,2BAAQyP,cADc;AAEtBrI,4BAAQlL,MAAMS,KAAN,CAAY8S,cAAZ,EAA4B3H,MAA5B;AAFc,kBAA1B;;AAKA;AACA,qBAAI5L,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBgK,MAAnB,KAA8B,CAAlC,EAAqC;;AAEjCvM,2BAAMY,KAAN,CAAY6b,UAAZ,CAAuBuB,gBAAvB;AAEH,kBAJD,MAIO;;AAEH;AACAhe,2BAAMY,KAAN,CAAY2Q,cAAZ,CAA2ByM,gBAA3B;AACH;AACJ;;AAED;;;AAGAhe,mBAAMQ,OAAN,CAAc4Q,IAAd;;AAGApR,mBAAMQ,OAAN,CAAcsG,IAAd;AAEH,UAjDD,MAiDO;;AAEH;;;AAGA9G,mBAAMQ,OAAN,CAAc4Q,IAAd;;AAEApR,mBAAMQ,OAAN,CAAcsG,IAAd;;AAEA;AACA9G,mBAAMQ,OAAN,CAAcS,QAAd,CAAuB8T,KAAvB;AACA/U,mBAAMQ,OAAN,CAAcmB,OAAd,CAAsBoT,KAAtB;AACH;;AAGD,aAAImJ,eAAe,CAACle,MAAMO,OAAN,CAAcyO,WAAd,CAA0B+C,WAA1B,CAAsCC,IAAtC,EAApB;;AAEA,aAAIkM,YAAJ,EAAkB;;AAEd;AACAle,mBAAMQ,OAAN,CAAc6Q,cAAd;AAEH,UALD,MAKO;;AAEH;AACArR,mBAAMQ,OAAN,CAAcyU,cAAd;AAEH;;AAED,aAAIkJ,kBAAkBne,MAAMO,OAAN,CAAcyO,WAAd,CAA0BT,OAA1B,CAAkCpF,IAAxD;;AAEA;AACA,aAAIgV,mBAAmBne,MAAMiB,QAAN,CAAeG,kBAAlC,IAAwD,CAAC8c,YAA7D,EAA2E;;AAEvEle,mBAAMO,OAAN,CAAcqP,SAAd;AAEH;AAEJ,MA/GD;;AAiHA;;;;;;;AAOA8M,eAAUqB,8BAAV,GAA2C,YAAW;;AAElD,aAAI3O,YAAapL,OAAOqL,YAAP,EAAjB;AAAA,aACIE,aAAaH,UAAUG,UAD3B;AAAA,aAEI6O,OAAO,KAFX;;AAIA,aAAIhP,UAAU+J,UAAV,IAAwB,CAA5B,EAA+B;;AAE3BnZ,mBAAMO,OAAN,CAAc0O,UAAd,GAA2B,IAA3B;AAEH,UAJD,MAIO;;AAEH,iBAAI,CAACjP,MAAME,IAAN,CAAW0F,SAAX,CAAqB2J,UAArB,CAAL,EAAuC;AACnCA,8BAAaA,WAAWjL,UAAxB;AACH;;AAED;AACA,iBAAIiL,WAAW4N,eAAX,IAA8B,MAAlC,EAA0C;AACtCiB,wBAAO,IAAP;AACH;;AAED,oBAAO7O,WAAW4N,eAAX,IAA8B,MAArC,EAA6C;AACzC5N,8BAAaA,WAAWjL,UAAxB;;AAEA,qBAAIiL,WAAW4N,eAAX,IAA8B,MAAlC,EAA0C;AACtCiB,4BAAO,IAAP;AACH;;AAED,qBAAI7O,cAAc9L,SAASiF,IAA3B,EAAiC;AAC7B;AACH;AACJ;;AAED;AACA1I,mBAAMO,OAAN,CAAc0O,UAAd,GAA2BmP,OAAO,KAAP,GAAe,IAA1C;AACH;AAEJ,MArCD;;AAuCA;;;;AAIA1B,eAAU1R,oBAAV,GAAiC,UAAUT,KAAV,EAAiB;;AAE9C,aAAIQ,SAAS,IAAb;;AAEA/K,eAAMQ,OAAN,CAAcsU,OAAd,GAAwB/J,OAAOwD,OAAP,CAAezK,IAAvC;;AAEA9D,eAAMQ,OAAN,CAAcmB,OAAd,CAAsBqK,WAAtB,CAAkCzB,KAAlC;AACAvK,eAAMQ,OAAN,CAAcuU,KAAd;AAEH,MATD;;AAWA2H,eAAU5R,kBAAV,GAA+B,UAAUP,KAAV,EAAiB;;AAE5C;;;AAGA,aAAI,KAAKoS,mBAAT,EAA6B;AACzB0B,0BAAa,KAAK1B,mBAAlB;AACH;;AAED;;;AAGA,cAAKA,mBAAL,GAA2BrL,WAAW,YAAW;;AAE7CtR,mBAAMO,OAAN,CAAc2O,IAAd;AAEH,UAJ0B,EAIxB,GAJwB,CAA3B;AAMH,MAlBD;;AAoBA;AACAwN,eAAU9R,iBAAV,GAA8B,YAAW;;AAErC,aAAI,CAAC5K,MAAMqB,KAAN,CAAYM,OAAZ,CAAoBkN,SAApB,CAA8BC,QAA9B,CAAuC,QAAvC,CAAL,EAAuD;;AAEnD9O,mBAAMQ,OAAN,CAAcmB,OAAd,CAAsBmF,IAAtB;AAEH,UAJD,MAIO;;AAEH9G,mBAAMQ,OAAN,CAAcmB,OAAd,CAAsBoT,KAAtB;AAEH;AACJ,MAXD;;AAaA;;;AAGA2H,eAAUvR,YAAV,GAAyB,UAASZ,KAAT,EAAgBW,KAAhB,EAAuB;;AAE5C,iBAAQX,MAAM0P,OAAd;;AAEI,kBAAKja,MAAME,IAAN,CAAW2E,IAAX,CAAgBW,IAArB;AACA,kBAAKxF,MAAME,IAAN,CAAW2E,IAAX,CAAgBY,KAArB;AACIzF,uBAAMU,QAAN,CAAe4d,4BAAf,CAA4CpT,KAA5C;AACA;;AAEJ,kBAAKlL,MAAME,IAAN,CAAW2E,IAAX,CAAgBC,SAArB;AACI9E,uBAAMU,QAAN,CAAe6d,gBAAf,CAAgCrT,KAAhC;AACA;;AAEJ,kBAAKlL,MAAME,IAAN,CAAW2E,IAAX,CAAgBU,EAArB;AACA,kBAAKvF,MAAME,IAAN,CAAW2E,IAAX,CAAgBS,IAArB;AACItF,uBAAMU,QAAN,CAAe8d,yBAAf,CAAyCtT,KAAzC;AACA;;AAdR;AAiBH,MAnBD;;AAqBA;;;AAGAwR,eAAU4B,4BAAV,GAAyC,UAAUpT,KAAV,EAAiB;;AAEtD,aAAIkE,YAAcpL,OAAOqL,YAAP,EAAlB;AAAA,aACI9M,SAAcvC,MAAMoC,KAAN,CAAYG,MAD9B;AAAA,aAEIkc,cAAcrP,UAAUG,UAF5B;AAAA,aAGImP,iBAHJ;;AAKA;AACA,aAAI,CAACD,WAAL,EAAiB;AACb,oBAAO,KAAP;AACH;;AAED;AACA,gBAAOA,YAAYtB,eAAZ,IAA+B,MAAtC,EAA8C;;AAE1CuB,iCAAoBD,YAAYna,UAAhC;AACAma,2BAAoBC,iBAApB;AACH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;AACA,gBAAOF,eAAelc,OAAOoc,oBAAP,CAAtB,EAAoD;AAChDA;AACH;;AAED;;;;AAIA,aAAI,CAACF,YAAY1M,WAAjB,EACA;AACI/R,mBAAMY,KAAN,CAAY2Q,cAAZ,CAA2BoN,oBAA3B;AACA;AACH;;AAED;;;AAGA,aAAIC,mBAAsB,KAA1B;AAAA,aACIhB,sBAAsB,KAD1B;;AAGA,aAAIiB,SAAJ,EACIC,eADJ;;AAGAD,qBAAYJ,YAAYvQ,UAAZ,CAAuBuQ,YAAYvQ,UAAZ,CAAuB3B,MAAvB,GAAgC,CAAvD,CAAZ;;AAEA,aAAIvM,MAAME,IAAN,CAAW0F,SAAX,CAAqBiZ,SAArB,CAAJ,EAAqC;;AAEjCC,+BAAkB9e,MAAMO,OAAN,CAAcoR,8BAAd,CAA6CkN,SAA7C,EAAwDA,UAAU3Q,UAAV,CAAqB3B,MAA7E,CAAlB;AAEH,UAJD,MAIO;;AAEHuS,+BAAkBD,SAAlB;AAEH;;AAEDD,4BAAmBxP,UAAUG,UAAV,IAAwBuP,eAA3C;AACAlB,+BAAsBkB,gBAAgBvS,MAAhB,IAA0B6C,UAAUqD,YAA1D;;AAEA,aAAK,CAACmM,gBAAD,IAAsB,CAAChB,mBAA5B,EAAkD;AAC9C5d,mBAAME,IAAN,CAAWkD,GAAX,CAAe,qDAAf;AACA,oBAAO,KAAP;AACH;;AAEDpD,eAAMY,KAAN,CAAY2Q,cAAZ,CAA2BoN,oBAA3B;AAEH,MAlED;;AAoEA;;;AAGAjC,eAAU8B,yBAAV,GAAsC,UAAUtT,KAAV,EAAiB;;AAEnD,aAAIkE,YAAcpL,OAAOqL,YAAP,EAAlB;AAAA,aACI9M,SAAcvC,MAAMoC,KAAN,CAAYG,MAD9B;AAAA,aAEIkc,cAAcrP,UAAUG,UAF5B;AAAA,aAGImP,iBAHJ;;AAKA;AACA,aAAI,CAACD,WAAL,EAAiB;AACb,oBAAO,KAAP;AACH;;AAED;;;AAGA,aAAKrP,UAAUqD,YAAV,KAA2B,CAAhC,EAAmC;AAC/B,oBAAO,KAAP;AACH;;AAED;AACA,gBAAOgM,YAAYtB,eAAZ,IAA+B,MAAtC,EAA8C;AAC1CuB,iCAAoBD,YAAYna,UAAhC;AACAma,2BAAoBC,iBAApB;AACH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;AACA,gBAAOF,eAAelc,OAAOoc,oBAAP,CAAtB,EAAoD;AAChDA;AACH;;AAED;;;AAGA,aAAII,oBAAsB,KAA1B;AAAA,aACIC,sBAAsB,KAD1B;;AAGA,aAAIC,UAAJ,EACIH,eADJ;;AAGA;;;;AAIA,aAAI,CAACL,YAAY1M,WAAjB,EAA8B;AAC1B/R,mBAAMY,KAAN,CAAYse,kBAAZ,CAA+BP,oBAA/B;AACA;AACH;;AAEDM,sBAAaR,YAAYvQ,UAAZ,CAAuB,CAAvB,CAAb;;AAEA,aAAIlO,MAAME,IAAN,CAAW0F,SAAX,CAAqBqZ,UAArB,CAAJ,EAAsC;;AAElCH,+BAAkB9e,MAAMO,OAAN,CAAcoR,8BAAd,CAA6CsN,UAA7C,EAAyD,CAAzD,CAAlB;AAEH,UAJD,MAIO;;AAEHH,+BAAkBG,UAAlB;AAEH;;AAEDF,6BAAsB3P,UAAUG,UAAV,IAAwBuP,eAA9C;AACAE,+BAAsB5P,UAAUqD,YAAV,KAA2B,CAAjD;;AAEA,aAAKsM,qBAAqBC,mBAA1B,EAAgD;;AAE5Chf,mBAAMY,KAAN,CAAYse,kBAAZ,CAA+BP,oBAA/B;AAEH;AAEJ,MAtED;;AAwEA;;;AAGAjC,eAAUQ,mBAAV,GAAgC,UAAU3S,KAAV,EAAiB;;AAE7C,aAAIgJ,iBAAkBvT,MAAMiB,QAAN,CAAeG,kBAArC;;AAEApB,eAAMO,OAAN,CAAcuL,WAAd,CAA0B;AACtBhI,mBAAQyP,cADc;AAEtBrI,oBAAQlL,MAAMS,KAAN,CAAY8S,cAAZ,EAA4B3H,MAA5B;AAFc,UAA1B,EAGG,IAHH;;AAKA5L,eAAMQ,OAAN,CAAc4Q,IAAd;AACApR,eAAMQ,OAAN,CAAcsG,IAAd;AAEH,MAZD;;AAcA4V,eAAU6B,gBAAV,GAA6B,UAAUrT,KAAV,EAAiB;;AAE1C,aAAI2F,oBAAoB7Q,MAAMY,KAAN,CAAYkQ,oBAAZ,EAAxB;AAAA,aACIgI,KADJ;AAAA,aAEIqG,eAFJ;AAAA,aAGIxI,qBAHJ;;AAKA,aAAIzL,MAAM6G,WAAN,CAAkBC,IAAlB,EAAJ,EAA8B;;AAE1B8G,qBAAkB9Y,MAAMO,OAAN,CAAc4R,QAAd,EAAlB;AACAgN,+BAAkBrG,MAAMsG,SAAN,GAAkBtG,MAAM+B,WAA1C;;AAGA,iBAAI7a,MAAMY,KAAN,CAAYgR,QAAZ,CAAqByN,OAArB,MAAkC,CAACF,eAAnC,IAAsDnf,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBsO,oBAAoB,CAAvC,CAA1D,EAAqG;;AAEjG7Q,uBAAMO,OAAN,CAAciT,WAAd,CAA0B3C,iBAA1B;AAEH,cAJD,MAIO;;AAEH;AAEH;AACJ;;AAED,aAAI,CAACsO,eAAL,EAAsB;AAClBjU,mBAAM6E,MAAN;AACH;;AAGD4G,iCAAwB3W,MAAMqB,KAAN,CAAYc,QAAZ,CAAqB+L,UAArB,CAAgC3B,MAAxD;;AAEA;;;AAGA,aAAIoK,0BAA0B,CAA9B,EAAiC;;AAE7B;AACA3W,mBAAMO,OAAN,CAAcyO,WAAd,GAA4B,IAA5B;;AAEA;AACAhP,mBAAMG,EAAN,CAASsL,eAAT;;AAEA;AACAzL,mBAAMG,EAAN,CAAS8C,UAAT;;AAEA;AACAqO,wBAAW,YAAY;;AAEnBtR,uBAAMY,KAAN,CAAYse,kBAAZ,CAA+B,CAA/B;AAEH,cAJD,EAIG,EAJH;AAMH,UAlBD,MAkBO;;AAEH,iBAAIlf,MAAMY,KAAN,CAAY0R,UAAZ,KAA2B,CAA/B,EAAkC;;AAE9B;AACAtS,uBAAMY,KAAN,CAAYse,kBAAZ,CAA+Blf,MAAMY,KAAN,CAAY0R,UAA3C;AAEH,cALD,MAKO;;AAEH;AACAtS,uBAAMY,KAAN,CAAY2Q,cAAZ,CAA2BvR,MAAMY,KAAN,CAAY0R,UAAvC;AAEH;AACJ;;AAEDtS,eAAMQ,OAAN,CAAc4Q,IAAd;;AAEA,aAAI,CAACpR,MAAMQ,OAAN,CAAcqU,MAAnB,EAA2B;AACvB7U,mBAAMQ,OAAN,CAAcsG,IAAd;AACH;;AAED;AACA9G,eAAMG,EAAN,CAAS8C,UAAT;;AAEA;AACAsH,eAAMyP,cAAN;AAEH,MA/ED;;AAiFA0C,eAAU4C,UAAV,GAAuB,UAAS/U,KAAT,EAAgB;;AAEnC,aAAIsG,oBAAoB7Q,MAAMY,KAAN,CAAYkQ,oBAAZ,EAAxB;AAAA,aACIb,OAAOjQ,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBsO,iBAAnB,CADX;;AAGAS,oBAAW,YAAW;;AAElBtR,mBAAMO,OAAN,CAAcyT,QAAd,CAAuB/D,IAAvB;;AAEA1F,mBAAMyP,cAAN;AAEH,UAND,EAMG,EANH;;AAQAzP,eAAM6P,wBAAN;AAEH,MAfD;;AAiBAsC,eAAUtR,WAAV,GAAwB,UAASb,KAAT,EAAgB;;AAEpC,aAAIsG,oBAAoB7Q,MAAMY,KAAN,CAAYkQ,oBAAZ,EAAxB;;AAEA;;;AAGA,aAAIyO,WAAW,IAAIC,gBAAJ,CAAqBxf,MAAMU,QAAN,CAAe+e,iBAApC,CAAf;;AAEA;;;AAGA,aAAIC,SAAS,EAAEC,YAAY,IAAd,EAAoBC,WAAW,IAA/B,EAAqCC,eAAe,KAApD,EAA2DC,SAAU,IAArE,EAAb;;AAEA;AACAP,kBAASQ,OAAT,CAAiB/f,MAAMoC,KAAN,CAAYG,MAAZ,CAAmBsO,iBAAnB,CAAjB,EAAwD6O,MAAxD;AACH,MAhBD;;AAkBA;;;AAGAhD,eAAU+C,iBAAV,GAA8B,UAASO,SAAT,EAAoB;;AAE9C,aAAIC,OAAO,IAAX;AAAA,aACIvf,QADJ;;AAGA;;;;;;;AAOAsf,mBAAU9H,OAAV,CAAkB,UAASrE,QAAT,EAAmB;AAChC7T,mBAAMO,OAAN,CAAcqT,KAAd,CAAoBK,IAApB,CAAyBgM,IAAzB,EAA+BpM,QAA/B,CAAD;AACH,UAFD;AAGH,MAfD;;AAiBA;;;AAGA6I,eAAU7R,yBAAV,GAAsC,YAAU;;AAE5C;;;;;;AAMA,aAAIqV,kBAAkBlgB,MAAMO,OAAN,CAAcyO,WAAd,CAA0BT,OAA1B,CAAkCpF,IAAxD;;AAEAnJ,eAAMQ,OAAN,CAAcS,QAAd,CAAuB+T,MAAvB,CAA8BkL,eAA9B;;AAEA;AACAlgB,eAAMQ,OAAN,CAAcmB,OAAd,CAAsBoT,KAAtB;AACA/U,eAAMQ,OAAN,CAAcS,QAAd,CAAuByU,iBAAvB;AAEH,MAhBD;;AAkBA,YAAOgH,SAAP;AAEH,EA7wBe,CA6wBb,EA7wBa,CAAhB;;AA+wBA5c,QAAOC,OAAP,GAAkB2c,SAAlB,C;;;;;;;;ACtxBA;;;;;;;AAOA,KAAI/b,OAAQ,UAASA,IAAT,EAAe;;AAEvB;;;AAGAA,UAAKY,OAAL,GAAe,YAAY;;AAEvB,aAAIA,UAAUkC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAlG,iBAAQwG,SAAR,IAAqB,cAArB;;AAEA,gBAAOxG,OAAP;AAEH,MARD;;AAUA;;;AAGAZ,UAAKwB,QAAL,GAAgB,YAAY;;AAExB,aAAIA,WAAWsB,SAASgE,aAAT,CAAuB,KAAvB,CAAf;;AAEAtF,kBAAS4F,SAAT,IAAsB,aAAtB;;AAEA,gBAAO5F,QAAP;AAEH,MARD;;AAUAxB,UAAK4H,OAAL,GAAe,YAAW;;AAEtB,aAAI2C,QAAQzH,SAASgE,aAAT,CAAuB,KAAvB,CAAZ;;AAEAyD,eAAMnD,SAAN,IAAmB,UAAnB;;AAEA,gBAAOmD,KAAP;AAEH,MARD;;AAUA;;;AAGAvK,UAAKH,OAAL,GAAe,YAAY;;AAEvB,aAAI2f,MAAM1c,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEA0Y,aAAIpY,SAAJ,IAAiB,YAAjB;;AAEA,gBAAOoY,GAAP;AACH,MAPD;;AASAxf,UAAK2H,cAAL,GAAsB,YAAW;;AAE7B,aAAI/G,UAAUkC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;AACAlG,iBAAQsN,SAAR,CAAkBgB,GAAlB,CAAsB,qBAAtB;;AAEA,gBAAOtO,OAAP;AACH,MAND;;AAQA;;;AAGAZ,UAAKa,aAAL,GAAqB,YAAW;;AAE5B,aAAI2e,MAAM1c,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEA0Y,aAAIpY,SAAJ,IAAiB,mBAAjB;;AAEA,gBAAOoY,GAAP;AAEH,MARD;;AAUA;;;AAGAxf,UAAKsI,oBAAL,GAA4B,YAAW;;AAEnC,aAAI1H,UAAUkC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAlG,iBAAQwG,SAAR,IAAqB,4BAArB;;AAEA,gBAAOxG,OAAP;AACH,MAPD;;AASA;;;AAGAZ,UAAKuI,oBAAL,GAA4B,YAAW;;AAEnC,aAAI3H,UAAUkC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAlG,iBAAQwG,SAAR,IAAqB,4BAArB;;AAEA,gBAAOxG,OAAP;AAEH,MARD;;AAUAZ,UAAKmZ,YAAL,GAAoB,YAAW;;AAE3B,aAAI7N,QAAQxI,SAASgE,aAAT,CAAuB,OAAvB,CAAZ;;AAEAwE,eAAMnI,IAAN,GAAoB,OAApB;AACAmI,eAAMlE,SAAN,IAAoB,cAApB;AACAkE,eAAMmU,WAAN,GAAoB,cAApB;AACAnU,eAAMJ,YAAN,CAAmB,MAAnB,EAA2B,aAA3B;;AAEAI,eAAMJ,YAAN,CAAmB,WAAnB,EAAgC,WAAhC;;AAEA,gBAAOI,KAAP;AAEH,MAbD;;AAeA;;;AAGAtL,UAAK8H,YAAL,GAAoB,YAAW;;AAE3B,aAAIyC,QAAQzH,SAASgE,aAAT,CAAuB,KAAvB,CAAZ;;AAEAyD,eAAM2D,SAAN,CAAgBgB,GAAhB,CAAoB,wBAApB;;AAEA,gBAAO3E,KAAP;AAEH,MARD;;AAUA;;;AAGAvK,UAAK6H,YAAL,GAAoB,YAAW;;AAE3B,aAAI0C,QAAQzH,SAASgE,aAAT,CAAuB,KAAvB,CAAZ;;AAEAyD,eAAMnD,SAAN,IAAmB,qBAAnB;;AAEA,gBAAOmD,KAAP;AACH,MAPD;;AASA;;;AAGAvK,UAAKoB,aAAL,GAAqB,YAAY;;AAE7B,aAAId,WAAWwC,SAASgE,aAAT,CAAuB,KAAvB,CAAf;;AAEAxG,kBAAS8G,SAAT,IAAsB,aAAtB;;AAEA,gBAAO9G,QAAP;AACH,MAPD;;AASAN,UAAKsB,eAAL,GAAuB,YAAW;;AAE9B,aAAIoe,MAAM5c,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEA4Y,aAAIxR,SAAJ,CAAcgB,GAAd,CAAkB,qBAAlB;;AAEA,gBAAOwQ,GAAP;AACH,MAPD,EASA1f,KAAKkI,eAAL,GAAuB,YAAW;;AAE9B,aAAIwX,MAAM5c,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEA4Y,aAAIxR,SAAJ,CAAcgB,GAAd,CAAkB,oBAAlB;;AAEA,gBAAOwQ,GAAP;AAEH,MAjBD;;AAmBA1f,UAAKiB,UAAL,GAAkB,YAAW;;AAEzB,aAAImJ,SAAStH,SAASgE,aAAT,CAAuB,MAAvB,CAAb;;AAEAsD,gBAAOhD,SAAP,GAAmB,kBAAnB;AACA;;AAEA,gBAAOgD,MAAP;AACH,MARD;;AAUA;;;AAGApK,UAAKgI,cAAL,GAAsB,YAAY;;AAE9B,aAAI2X,UAAU7c,SAASgE,aAAT,CAAuB,MAAvB,CAAd;;AAEA6Y,iBAAQvY,SAAR,GAAoB,0BAApB;;AAEA;AACAuY,iBAAQrS,SAAR,GAAoB,6BAApB;;AAEA,gBAAOqS,OAAP;AACH,MAVD;;AAYA;;;;AAIA3f,UAAKgB,OAAL,GAAe,YAAW;;AAEtB,aAAIJ,UAAUkC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAlG,iBAAQwG,SAAR,GAAoB,mBAApB;;AAEA,gBAAOxG,OAAP;AACH,MAPD;;AASA;;;;;;;;;AASAZ,UAAK6I,aAAL,GAAqB,UAAU1F,IAAV,EAAgByc,SAAhB,EAA2B;;AAE5C,aAAIxV,SAAatH,SAASgE,aAAT,CAAuB,IAAvB,CAAjB;AAAA,aACI+Y,YAAa/c,SAASgE,aAAT,CAAuB,GAAvB,CADjB;AAAA,aAEIgZ,aAAahd,SAASgE,aAAT,CAAuB,MAAvB,CAFjB;;AAIAsD,gBAAOwD,OAAP,CAAezK,IAAf,GAAsBA,IAAtB;AACAiH,gBAAOc,YAAP,CAAoB,OAApB,EAA6B/H,IAA7B;;AAEA0c,mBAAU3R,SAAV,CAAoBgB,GAApB,CAAwB0Q,SAAxB;AACAE,oBAAW5R,SAAX,CAAqBgB,GAArB,CAAyB,yBAAzB;;AAGA9E,gBAAOjD,WAAP,CAAmB0Y,SAAnB;AACAzV,gBAAOjD,WAAP,CAAmB2Y,UAAnB;;AAEA,gBAAO1V,MAAP;AAEH,MAlBD;;AAoBA;;;;;;;;AAQApK,UAAKsJ,mBAAL,GAA2B,UAASnG,IAAT,EAAeyc,SAAf,EAA0B;AACjD,aAAIxV,SAAatH,SAASgE,aAAT,CAAuB,QAAvB,CAAjB;AAAA,aACI+Y,YAAa/c,SAASgE,aAAT,CAAuB,GAAvB,CADjB;;AAGAsD,gBAAOjH,IAAP,GAAc,QAAd;AACAiH,gBAAOwD,OAAP,CAAezK,IAAf,GAAsBA,IAAtB;AACA0c,mBAAU3R,SAAV,CAAoBgB,GAApB,CAAwB0Q,SAAxB;;AAEAxV,gBAAOjD,WAAP,CAAmB0Y,SAAnB;;AAEA,gBAAOzV,MAAP;AACH,MAXD;;AAaA;;;AAGApK,UAAKuK,KAAL,GAAa,UAAU2Q,OAAV,EAAmBtb,OAAnB,EAA4B;;AAErC,aAAI0P,OAAOxM,SAASgE,aAAT,CAAuBoU,OAAvB,CAAX;;AAEA5L,cAAKhC,SAAL,GAAiB1N,WAAW,EAA5B;;AAEA,gBAAO0P,IAAP;AAEH,MARD;;AAUA;;;;;;AAMAtP,UAAKsP,IAAL,GAAY,UAAU4L,OAAV,EAAoB9T,SAApB,EAAgC2Y,UAAhC,EAA4C;;AAEpD,aAAI7a,KAAKpC,SAASgE,aAAT,CAAwBoU,OAAxB,CAAT;;AAEA,aAAK9T,SAAL,EAAiBlC,GAAGkC,SAAH,GAAeA,SAAf;;AAEjB,aAAK2Y,UAAL,EAAkB;;AAEd,kBAAK,IAAIrX,IAAT,IAAiBqX,UAAjB,EAA4B;AACxB7a,oBAAGwD,IAAH,IAAWqX,WAAWrX,IAAX,CAAX;AACH;AACJ;;AAED,gBAAOxD,EAAP;AACH,MAdD;;AAgBAlF,UAAKggB,aAAL,GAAqB,UAAS7c,IAAT,EAAevD,OAAf,EAAwB;;AAEzC,gBAAO;AACHuD,mBAAQA,IADL;AAEHoH,oBAAQ0V,QAAQngB,KAAR,CAAcqD,IAAd,EAAoB8H,MAApB,CAA2B;AAC/BkG,uBAAOvR;AADwB,cAA3B;AAFL,UAAP;AAMH,MARD;;AAUA,YAAOI,IAAP;AAEH,EA9SU,CA8SR,EA9SQ,CAAX;;AAgTAb,QAAOC,OAAP,GAAiBY,IAAjB,C;;;;;;;;ACvTA;;;;;;;AAOA,KAAIC,QAAS,UAASA,KAAT,EAAgB;;AAEzB;;;AAGAA,WAAM0R,UAAN,GAAmB,IAAnB;;AAEA;;;AAGA1R,WAAMwX,MAAN,GAAe,IAAf;;AAEA;;;AAGAxX,WAAMigB,gBAAN,GAAyB,IAAzB;;AAEA;;;;;;AAMAjgB,WAAMuQ,GAAN,GAAY,UAAUtL,EAAV,EAAewH,KAAf,EAAsB+K,MAAtB,EAA8B;;AAEtCA,kBAASA,UAAU,KAAKA,MAAf,IAAyB,CAAlC;AACA/K,iBAASA,SAAU,KAAKwT,gBAAf,IAAmC,CAA5C;;AAEA,aAAIC,SAASjb,GAAGqI,UAAhB;AAAA,aACI6S,SADJ;;AAGA,aAAKD,OAAOvU,MAAP,KAAkB,CAAvB,EAA2B;;AAEvBwU,yBAAYlb,EAAZ;AAEH,UAJD,MAIO;;AAEHkb,yBAAYD,OAAOzT,KAAP,CAAZ;AAEH;;AAED;AACA,aAAIxH,GAAGgW,OAAH,IAAc,OAAlB,EAA2B;AACvBhW,gBAAGkU,KAAH;AACA;AACH;;AAED,aAAI/Z,MAAME,IAAN,CAAW0F,SAAX,CAAqBmb,SAArB,CAAJ,EAAqC;;AAEjCA,yBAAY/gB,MAAMO,OAAN,CAAcoR,8BAAd,CAA6CoP,SAA7C,EAAwDA,UAAU7S,UAAV,CAAqB3B,MAA7E,CAAZ;AACH;;AAED,aAAIuM,QAAYrV,SAASsV,WAAT,EAAhB;AAAA,aACI3J,YAAYpL,OAAOqL,YAAP,EADhB;;AAGAiC,oBAAW,YAAW;;AAElBwH,mBAAMmC,QAAN,CAAe8F,SAAf,EAA0B3I,MAA1B;AACAU,mBAAM6B,MAAN,CAAaoG,SAAb,EAAwB3I,MAAxB;;AAEAhJ,uBAAUmM,eAAV;AACAnM,uBAAUoM,QAAV,CAAmB1C,KAAnB;;AAEA9Y,mBAAMY,KAAN,CAAYwc,qBAAZ;AAEH,UAVD,EAUG,EAVH;AAWH,MA3CD;;AA6CA;;;;AAIAxc,WAAMwc,qBAAN,GAA8B,YAAY;;AAEtC;AACA,aAAIhO,YAAcpL,OAAOqL,YAAP,EAAlB;AAAA,aACI9M,SAAcvC,MAAMoC,KAAN,CAAYG,MAD9B;AAAA,aAEIkc,cAAcrP,UAAUG,UAF5B;AAAA,aAGImP,iBAHJ;;AAKA,aAAI,CAACD,WAAL,EAAiB;AACb;AACH;;AAED;AACA,gBAAOA,YAAYtB,eAAZ,IAA+B,MAAtC,EAA8C;AAC1CuB,iCAAoBD,YAAYna,UAAhC;AACAma,2BAAoBC,iBAApB;AACH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;;AAEA,gBAAOF,eAAelc,OAAOoc,oBAAP,CAAtB,EAAoD;AAChDA;AACH;;AAED,cAAKrM,UAAL,GAAkBqM,oBAAlB;AACH,MA1BD;;AA4BA;;;AAGA/d,WAAMkQ,oBAAN,GAA6B,YAAW;AACpC,gBAAO,KAAKwB,UAAZ;AACH,MAFD;;AAIA;;;AAGA1R,WAAM2Q,cAAN,GAAuB,UAASlE,KAAT,EAAgB;;AAEnC,aAAI9K,SAASvC,MAAMoC,KAAN,CAAYG,MAAzB;AAAA,aACIye,YAAYze,OAAO8K,QAAQ,CAAf,CADhB;;AAGA,aAAI,CAAC2T,SAAL,EAAgB;AACZhhB,mBAAME,IAAN,CAAWkD,GAAX,CAAe,wBAAf;AACA;AACH;;AAED;;;;AAIA,aAAI,CAAC4d,UAAU9S,UAAV,CAAqB3B,MAA1B,EAAkC;AAC9B,iBAAI0U,mBAAmBxd,SAASyN,cAAT,CAAwB,EAAxB,CAAvB;AACA8P,uBAAUlZ,WAAV,CAAsBmZ,gBAAtB;AACH;;AAEDjhB,eAAMY,KAAN,CAAY0R,UAAZ,GAAyBjF,QAAQ,CAAjC;AACArN,eAAMY,KAAN,CAAYuQ,GAAZ,CAAgB6P,SAAhB,EAA2B,CAA3B,EAA8B,CAA9B;AACAhhB,eAAMO,OAAN,CAAcwL,kBAAd,CAAiCiV,SAAjC;AAEH,MAvBD;;AAyBA;;;;AAIApgB,WAAM6b,UAAN,GAAmB,UAASpP,KAAT,EAAgB;;AAE/B,aAAI9K,SAASvC,MAAMoC,KAAN,CAAYG,MAAzB;AAAA,aACImR,cAAcnR,OAAO8K,KAAP,CADlB;;AAGApJ,iBAAQid,MAAR,CAAgBxN,WAAhB,EAA8B,gDAA9B;;AAEA,aAAK,CAACA,WAAN,EAAoB;AAChB;AACH;;AAED;;;;AAIA,aAAI,CAACA,YAAYxF,UAAZ,CAAuB3B,MAA5B,EAAoC;AAChC,iBAAI0U,mBAAmBxd,SAASyN,cAAT,CAAwB,EAAxB,CAAvB;AACAwC,yBAAY5L,WAAZ,CAAwBmZ,gBAAxB;AACH;;AAEDjhB,eAAMY,KAAN,CAAY0R,UAAZ,GAAyBjF,KAAzB;AACArN,eAAMY,KAAN,CAAYuQ,GAAZ,CAAgBuC,WAAhB,EAA6B,CAA7B,EAAgC,CAAhC;AACA1T,eAAMO,OAAN,CAAcwL,kBAAd,CAAiC2H,WAAjC;AAEH,MAxBD;;AA0BA;;;AAGA9S,WAAMse,kBAAN,GAA2B,UAAS7R,KAAT,EAAgB;;AAEvCA,iBAAQA,SAAS,CAAjB;;AAEA,aAAI9K,SAASvC,MAAMoC,KAAN,CAAYG,MAAzB;AAAA,aACI4e,gBAAgB5e,OAAO8K,QAAQ,CAAf,CADpB;AAAA,aAEI+T,aAFJ;AAAA,aAGIC,qBAHJ;AAAA,aAIIJ,gBAJJ;;AAOA,aAAI,CAACE,aAAL,EAAoB;AAChBnhB,mBAAME,IAAN,CAAWkD,GAAX,CAAe,2BAAf;AACA;AACH;;AAEDge,yBAAgBphB,MAAMO,OAAN,CAAcoR,8BAAd,CAA6CwP,aAA7C,EAA4DA,cAAcjT,UAAd,CAAyB3B,MAArF,CAAhB;AACA8U,iCAAwBD,cAAc7U,MAAtC;;AAEA;;;;AAIA,aAAI,CAAC4U,cAAcjT,UAAd,CAAyB3B,MAA9B,EAAsC;;AAElC0U,gCAAmBxd,SAASyN,cAAT,CAAwB,EAAxB,CAAnB;AACAiQ,2BAAcrZ,WAAd,CAA0BmZ,gBAA1B;AACH;AACDjhB,eAAMY,KAAN,CAAY0R,UAAZ,GAAyBjF,QAAQ,CAAjC;AACArN,eAAMY,KAAN,CAAYuQ,GAAZ,CAAgBgQ,aAAhB,EAA+BA,cAAcjT,UAAd,CAAyB3B,MAAzB,GAAkC,CAAjE,EAAoE8U,qBAApE;AACArhB,eAAMO,OAAN,CAAcwL,kBAAd,CAAiCxJ,OAAO8K,QAAQ,CAAf,CAAjC;AACH,MA/BD;;AAiCAzM,WAAMgR,QAAN,GAAiB;;AAEbyN,kBAAU,mBAAW;;AAEjB,iBAAIjQ,YAAkBpL,OAAOqL,YAAP,EAAtB;AAAA,iBACIoD,eAAkBrD,UAAUqD,YADhC;AAAA,iBAEIlD,aAAkBH,UAAUG,UAFhC;AAAA,iBAGI0O,kBAAkBje,MAAMO,OAAN,CAAcyP,kBAAd,CAAiCT,UAAjC,CAHtB;AAAA,iBAIIoR,gBAAkB1C,gBAAgB/P,UAAhB,CAA2B,CAA3B,CAJtB;;AAMA,iBAAI,CAAClO,MAAME,IAAN,CAAW0F,SAAX,CAAqB2J,UAArB,CAAL,EAAuC;AACnCA,8BAAaA,WAAWjL,UAAxB;AACH;;AAED,iBAAIgd,cAAe/R,eAAeoR,cAAczS,UAAd,CAAyB,CAAzB,CAAlC;AAAA,iBACIqT,eAAe9O,iBAAiB,CADpC;;AAGA,oBAAO6O,eAAeC,YAAtB;AAEH,UAnBY;;AAqBb1D,mBAAW,oBAAW;;AAElB,iBAAIzO,YAAepL,OAAOqL,YAAP,EAAnB;AAAA,iBACIoD,eAAerD,UAAUqD,YAD7B;AAAA,iBAEIlD,aAAeH,UAAUG,UAF7B;;AAIA;AACA,oBAAO,CAACA,UAAD,IAAe,CAACA,WAAWhD,MAA3B,IAAqCkG,iBAAiBlD,WAAWhD,MAAxE;AACH;AA7BY,MAAjB;;AAgCA,YAAO3L,KAAP;AAEH,EA3OW,CA2OT,EA3OS,CAAZ;;AA6OAd,QAAOC,OAAP,GAAiBa,KAAjB,C;;;;;;;;ACpPA;;;;;;;AAOA,KAAIC,gBAAiB,UAASA,aAAT,EAAwB;;AAEzC;;;;AAIAA,mBAAcyJ,WAAd,GAA4B,UAASF,QAAT,EAAmBG,KAAnB,EAA0B;;AAElDvK,eAAMa,aAAN,CAAoBuG,IAApB,CAAyB,wCAAzB,EAAmEmD,MAAMzG,IAAzE,EAA+E,KAA/E;AAEH,MAJD;;AAMA;;;;;;AAMAjD,mBAAcuG,IAAd,GAAqB,UAASoa,OAAT,EAAkB1d,IAAlB,EAAwB8I,MAAxB,EAAgC;;AAEjD,aAAI6U,eAAezhB,MAAMW,IAAN,CAAWuK,KAAX,CAAiB,KAAjB,CAAnB;;AAEAuW,sBAAa1P,WAAb,GAA2ByP,OAA3B;AACAC,sBAAa5S,SAAb,CAAuBgB,GAAvB,CAA2B,sBAA3B,EAAmD,qBAAqB/L,IAAxE,EAA8E,SAA9E;;AAEA,aAAI,CAAC8I,MAAL,EAAa;AACT5M,mBAAMqB,KAAN,CAAYR,aAAZ,CAA0BoN,SAA1B,GAAsC,EAAtC;AACH;;AAEDjO,eAAMqB,KAAN,CAAYR,aAAZ,CAA0BiH,WAA1B,CAAsC2Z,YAAtC;;AAEAnQ,oBAAW,YAAY;AACnBmQ,0BAAa1R,MAAb;AACH,UAFD,EAEG,IAFH;AAIH,MAjBD;;AAmBA,YAAOlP,aAAP;AAEH,EAvCmB,CAuCjB,EAvCiB,CAApB;;AAyCAf,QAAOC,OAAP,GAAiBc,aAAjB,C;;;;;;;;AChDA;;;;;;;AAOA,KAAIC,SAAU,UAASA,MAAT,EAAiB;;AAE3B;AACAA,YAAO4gB,mBAAP,GAA6B,UAAS/Q,SAAT,EAAoBiL,GAApB,EAAyB;;AAElD5b,eAAMO,OAAN,CAAcuL,WAAd,CAA0B;AACtBhI,mBAAQ6M,UAAU7M,IADI;AAEtBoH,oBAAQyF,UAAU/E,MAAV,CAAiB;AACrBkG,uBAAO8J,IAAI3N;AADU,cAAjB;AAFc,UAA1B;AAOH,MATD;;AAWA;;;AAGAnN,YAAO4O,iBAAP,GAA2B,UAAUO,IAAV,EAAgB;;AAEvC,gBAAOA,KAAKnK,QAAL,IAAiB8a,QAAQ1gB,IAAR,CAAauE,SAAb,CAAuBC,GAAxC,IACHuL,KAAKpB,SAAL,CAAeC,QAAf,CAAwB8R,QAAQzgB,EAAR,CAAW4H,SAAX,CAAqBC,eAA7C,CADJ;AAGH,MALD;;AAOA,YAAOlH,MAAP;AAEH,EA1BY,CA0BV,EA1BU,CAAb;;AA4BAhB,QAAOC,OAAP,GAAiBe,MAAjB,C;;;;;;;;;;ACnCA;;;;;;;;;;;;;;;;;;;;;AAqBA,UAAS6gB,QAAT,GAAmB;AACf,SAAIhV,CAAJ,EAAOzI,CAAP,EAAU0d,OAAV;AACAA,eAAU1V,UAAU,CAAV,KAAgB,EAA1B;AACA,UAAKwT,MAAL,GAAc,EAAd;AACA,UAAKA,MAAL,CAAYnU,QAAZ,GAAuBqW,QAAQrW,QAAR,GAAmBqW,QAAQrW,QAA3B,GAAsC,EAA7D;AACA,UAAKmU,MAAL,CAAYC,UAAZ,GAAyBiC,QAAQjC,UAAR,GAAqBiC,QAAQjC,UAA7B,GAA0C,EAAnE;AACA,UAAKD,MAAL,CAAYC,UAAZ,CAAuBgC,SAASE,GAAhC,IAAuC,KAAKnC,MAAL,CAAYC,UAAZ,CAAuBgC,SAASE,GAAhC,IAAuC,KAAKnC,MAAL,CAAYC,UAAZ,CAAuBgC,SAASE,GAAhC,CAAvC,GAA8E,EAArH;AACA,UAAKnC,MAAL,CAAYoC,cAAZ,GAA6BF,QAAQE,cAAR,GAAyBF,QAAQE,cAAjC,GAAkD,KAA/E;AACA,UAAKC,gBAAL,GAAwB,EAAxB;AACA,UAAKrC,MAAL,CAAYsC,SAAZ,GAAwBJ,QAAQI,SAAR,GAAoBJ,QAAQI,SAA5B,GAAwC,EAAhE;AACA,UAAKtC,MAAL,CAAYuC,cAAZ,GAA6BL,QAAQK,cAAR,GAAyBL,QAAQK,cAAjC,GAAmD,EAAhF;AACA,UAAKC,GAAL,GAAWN,QAAQM,GAAR,GAAcN,QAAQM,GAAtB,GAA4Bze,QAAvC;AACA,UAAIkJ,IAAE,CAAN,EAAQA,IAAE,KAAK+S,MAAL,CAAYnU,QAAZ,CAAqBgB,MAA/B,EAAsCI,GAAtC,EAA2C;AACvC,cAAKoV,gBAAL,CAAsB,KAAKrC,MAAL,CAAYnU,QAAZ,CAAqBoB,CAArB,CAAtB,IAAiD,IAAjD;AACH;AACD,UAAK+S,MAAL,CAAYyC,uBAAZ,GAAsC,EAAtC;AACA,UAAKzC,MAAL,CAAY0C,mBAAZ,GAAkC,KAAlC;AACA,SAAGR,QAAQS,eAAX,EAA4B;;AAExB,aAAGT,QAAQS,eAAR,YAAmCC,KAAtC,EAA6C;AACzC,kBAAI3V,IAAE,CAAN,EAAQA,IAAEiV,QAAQS,eAAR,CAAwB9V,MAAlC,EAAyCI,GAAzC,EAA8C;AAC1C,sBAAK+S,MAAL,CAAYyC,uBAAZ,CAAoCP,QAAQS,eAAR,CAAwB1V,CAAxB,CAApC,IAAkE,IAAlE;AACH;AACJ,UAJD,MAKK;AACD,kBAAK+S,MAAL,CAAY0C,mBAAZ,GAAkC,IAAlC;AACH;AACJ;AACD,UAAKG,YAAL,GAAoBX,QAAQW,YAAR,GAAuBX,QAAQW,YAA/B,GAA8C,EAAlE;AACH;;AAEDZ,UAASa,cAAT,GAA0B,sDAA1B;;AAEA;AACAb,UAASc,QAAT,GAAoB,cAApB;AACAd,UAASE,GAAT,GAAe,SAAf;;AAEAF,UAASe,SAAT,CAAmBjO,UAAnB,GAAgC,UAASzL,SAAT,EAAoB;AAChD,SAAI2Z,WAAW,KAAKT,GAAL,CAASU,sBAAT,EAAf;AACA,UAAKC,eAAL,GAAuBF,QAAvB;AACA,UAAKG,eAAL,GAAuB,EAAvB;;AAIA;;;AAGA,cAASC,YAAT,CAAsBC,MAAtB,EAA8BC,QAA9B,EAAwC;AACpC,aAAItW,CAAJ;AACA,cAAIA,IAAE,CAAN,EAASA,IAAIsW,SAAS1W,MAAtB,EAA8BI,GAA9B,EAAmC;AAC/B,iBAAGsW,SAAStW,CAAT,KAAeqW,MAAlB,EACI,OAAOrW,CAAP;AACP;AACD,gBAAO,CAAC,CAAR;AACH;;AAED,cAASuW,kBAAT,GAA8B;AAC1B,aAAIC,SAAS,EAAb;AACA,aAAIC,YAAY,EAAhB;AACA,aAAIzW,CAAJ,EAAM0W,CAAN;AACA,cAAI1W,IAAE,CAAN,EAAQA,IAAET,UAAUK,MAApB,EAA2BI,GAA3B,EAAgC;AAC5B,iBAAG,CAACT,UAAUS,CAAV,CAAD,IAAiB,CAACT,UAAUS,CAAV,EAAaJ,MAAlC,EACI;AACJ,kBAAI8W,IAAE,CAAN,EAAQA,IAAEnX,UAAUS,CAAV,EAAaJ,MAAvB,EAA8B8W,GAA9B,EAAmC;AAC/B,qBAAGD,UAAUlX,UAAUS,CAAV,EAAa0W,CAAb,CAAV,CAAH,EACI;AACJD,2BAAUlX,UAAUS,CAAV,EAAa0W,CAAb,CAAV,IAA6B,IAA7B;AACAF,wBAAOpU,IAAP,CAAY7C,UAAUS,CAAV,EAAa0W,CAAb,CAAZ;AACH;AACJ;AACD,gBAAOF,MAAP;AACH;;AAED;;;;AAIA,cAASG,MAAT,CAAgBC,IAAhB,EAAsB;AAClB,aAAIC,KAAJ;AACA,iBAAOD,KAAKzd,QAAZ;AACI;AACA,kBAAK,CAAL;AACI2d,gCAAe5c,IAAf,CAAoB,IAApB,EAA0B0c,IAA1B;AACA;AACJ;AACA,kBAAK,CAAL;AACIC,yBAAQD,KAAKG,SAAL,CAAe,KAAf,CAAR;AACA,sBAAKb,eAAL,CAAqB/a,WAArB,CAAiC0b,KAAjC;AACA;AACJ;AACA,kBAAK,CAAL;AACIA,yBAAQD,KAAKG,SAAL,CAAe,KAAf,CAAR;AACA,sBAAKb,eAAL,CAAqB/a,WAArB,CAAiC0b,KAAjC;AACA;AACJ;AACA,kBAAK,CAAL;AACI,qBAAG,KAAK9D,MAAL,CAAYoC,cAAf,EAA+B;AAC3B0B,6BAAQD,KAAKG,SAAL,CAAe,KAAf,CAAR;AACA,0BAAKb,eAAL,CAAqB/a,WAArB,CAAiC0b,KAAjC;AACH;AACD;AACJ;AACI,qBAAIvf,WAAWA,QAAQb,GAAvB,EAA4Ba,QAAQb,GAAR,CAAY,mBAAZ,EAAiCmgB,KAAKzd,QAAtC;AAC5B;AAxBR;AA2BH;;AAED,cAAS2d,cAAT,CAAwBF,IAAxB,EAA8B;AAC1B,aAAI5W,CAAJ,EAAO0W,CAAP,EAAUG,KAAV,EAAiBG,cAAjB,EAAiCta,IAAjC,EAAuCua,kBAAvC,EAA2DC,IAA3D,EAAiEC,SAAjE,EAA4EC,SAA5E,EAAuF/B,SAAvF,EAAkGgC,GAAlG,EAAuGC,OAAvG;AACA,aAAI1O,YAAY2O,mBAAmBrd,IAAnB,CAAwB,IAAxB,EAA8B0c,IAA9B,CAAhB;;AAEAA,gBAAOhO,UAAUtF,IAAjB;AACA5G,gBAAOka,KAAKY,QAAL,CAAcC,WAAd,EAAP;;AAEA;AACAT,0BAAiB,KAAKd,eAAtB;AACA,aAAG,KAAKd,gBAAL,CAAsB1Y,IAAtB,KAA+BkM,UAAU8O,SAA5C,EAAuD;AACnD,kBAAKxB,eAAL,GAAuB,KAAKX,GAAL,CAASza,aAAT,CAAuB8b,KAAKY,QAA5B,CAAvB;AACAR,4BAAe7b,WAAf,CAA2B,KAAK+a,eAAhC;;AAEA;AACA,iBAAIyB,QAAQ,KAAK5E,MAAL,CAAYC,UAAxB;AACAiE,kCAAqBV,mBAAmBoB,MAAMjb,IAAN,CAAnB,EAAgCib,MAAM3C,SAASE,GAAf,CAAhC,EAAqDtM,UAAUgP,cAA/D,CAArB;AACA,kBAAI5X,IAAE,CAAN,EAAQA,IAAEiX,mBAAmBrX,MAA7B,EAAoCI,GAApC,EAAyC;AACrCmX,6BAAYF,mBAAmBjX,CAAnB,CAAZ;AACAkX,wBAAON,KAAK5D,UAAL,CAAgBmE,SAAhB,CAAP;AACA,qBAAGD,IAAH,EAAS;AACLI,+BAAU,IAAV;AACA;AACA,yBAAG,KAAKvE,MAAL,CAAYsC,SAAZ,CAAsB3Y,IAAtB,KAA+B,KAAKqW,MAAL,CAAYsC,SAAZ,CAAsB3Y,IAAtB,EAA4Bya,SAA5B,CAAlC,EAA0E;AACtE9B,qCAAY,KAAKtC,MAAL,CAAYsC,SAAZ,CAAsB3Y,IAAtB,EAA4Bya,SAA5B,CAAZ;AACAE,+BAAMH,KAAK1J,KAAL,CAAWiK,WAAX,GAAyBI,KAAzB,CAA+B7C,SAASa,cAAxC,CAAN;AACA,6BAAGwB,GAAH,EAAQ;AACJC,uCAAWlB,aAAaiB,IAAI,CAAJ,CAAb,EAAqBhC,SAArB,KAAmC,CAAC,CAA/C;AACH,0BAFD,MAGK;AACDiC,uCAAWlB,aAAapB,SAASc,QAAtB,EAAgCT,SAAhC,KAA8C,CAAC,CAA1D;AACH;AACJ;AACD,yBAAGiC,OAAH,EAAY;AACRF,qCAAYtgB,SAASghB,eAAT,CAAyBX,SAAzB,CAAZ;AACAC,mCAAU5J,KAAV,GAAkB0J,KAAK1J,KAAvB;AACA,8BAAK0I,eAAL,CAAqB6B,gBAArB,CAAsCX,SAAtC;AACH;AACJ;AACJ;;AAED;AACA,iBAAG,KAAKrE,MAAL,CAAYuC,cAAZ,CAA2B5Y,IAA3B,CAAH,EAAqC;AACjC,sBAAIya,SAAJ,IAAiB,KAAKpE,MAAL,CAAYuC,cAAZ,CAA2B5Y,IAA3B,CAAjB,EAAmD;AAC/C0a,iCAAYtgB,SAASghB,eAAT,CAAyBX,SAAzB,CAAZ;AACAC,+BAAU5J,KAAV,GAAkB,KAAKuF,MAAL,CAAYuC,cAAZ,CAA2B5Y,IAA3B,EAAiCya,SAAjC,CAAlB;AACA,0BAAKjB,eAAL,CAAqB6B,gBAArB,CAAsCX,SAAtC;AACH;AACJ;AACJ,UAvCD,CAuCE;AACF;AACA;AAzCA,cA0CK,IAAGhB,aAAaQ,IAAb,EAAmB,KAAKT,eAAxB,KAA4C,CAAC,CAAhD,EAAmD;AACpD,sBAAKD,eAAL,GAAuBU,KAAKG,SAAL,CAAe,IAAf,CAAvB;AACA;AACA,wBAAM,KAAKb,eAAL,CAAqB3U,UAArB,CAAgC3B,MAAhC,GAAyC,CAA/C,EAAkD;AAC9C,0BAAKsW,eAAL,CAAqB5Q,WAArB,CAAiC,KAAK4Q,eAAL,CAAqB5D,UAAtD;AACH;AACD0E,gCAAe7b,WAAf,CAA2B,KAAK+a,eAAhC;AACH;;AAED;AACA,aAAG,CAAC,KAAKnD,MAAL,CAAY0C,mBAAb,IAAoC,CAAC,KAAK1C,MAAL,CAAYyC,uBAAZ,CAAoC9Y,IAApC,CAAxC,EAAmF;AAC/E,kBAAIsD,IAAE,CAAN,EAAQA,IAAE4W,KAAKrV,UAAL,CAAgB3B,MAA1B,EAAiCI,GAAjC,EAAsC;AAClC2W,wBAAOzc,IAAP,CAAY,IAAZ,EAAkB0c,KAAKrV,UAAL,CAAgBvB,CAAhB,CAAlB;AACH;AACJ;;AAED;AACA,aAAG,KAAKkW,eAAL,CAAqB8B,SAAxB,EAAmC;AAC/B,kBAAK9B,eAAL,CAAqB8B,SAArB;AACH;AACD,cAAK9B,eAAL,GAAuBc,cAAvB;AACH,MA/I+C,CA+I9C;;AAEF,cAASO,kBAAT,CAA4BjU,IAA5B,EAAkC;AAC9B,aAAIrB,SAAS;AACT2V,6BAAe,EADN;AAETtU,mBAAMA,IAFG;AAGToU,wBAAW;AAHF,UAAb;AAKA,aAAI1X,CAAJ,EAAO0W,CAAP,EAAU9N,SAAV;AACA,cAAI5I,IAAE,CAAN,EAAQA,IAAE,KAAK4V,YAAL,CAAkBhW,MAA5B,EAAmCI,GAAnC,EAAwC;AACpC4I,yBAAY,KAAKgN,YAAL,CAAkB5V,CAAlB,EAAqB;AAC7BoV,mCAAkB,KAAKA,gBADM;AAE7BrC,yBAAQ,KAAKA,MAFgB;AAG7BzP,uBAAMA,IAHuB;AAI7B2U,4BAAW3U,KAAKkU,QAAL,CAAcC,WAAd,EAJkB;AAK7BtB,kCAAiB,KAAKA,eALO;AAM7BZ,sBAAK,KAAKA;AANmB,cAArB,CAAZ;AAQA,iBAAI3M,aAAa,IAAjB,EACI,SADJ,KAEK,IAAG,QAAOA,SAAP,yCAAOA,SAAP,MAAoB,QAAvB,EAAiC;AAClC,qBAAGA,UAAUuN,eAAV,IAA6BvN,UAAUuN,eAAV,YAAqCR,KAArE,EAA4E;AACxE,0BAAIe,IAAE,CAAN,EAAQA,IAAE9N,UAAUuN,eAAV,CAA0BvW,MAApC,EAA2C8W,GAA3C,EAAgD;AAC5C,6BAAGN,aAAaxN,UAAUuN,eAAV,CAA0BO,CAA1B,CAAb,EAA2C,KAAKP,eAAhD,KAAoE,CAAC,CAAxE,EAA2E;AACvE,kCAAKA,eAAL,CAAqB/T,IAArB,CAA0BwG,UAAUuN,eAAV,CAA0BO,CAA1B,CAA1B;AACH;AACJ;AACJ;AACDzU,wBAAOyV,SAAP,GAAmB9O,UAAU8O,SAAV,GAAsB,IAAtB,GAA6B,KAAhD;AACA,qBAAG9O,UAAUgP,cAAb,EAA6B;AACzB3V,4BAAO2V,cAAP,GAAwBrB,mBAAmBtU,OAAO2V,cAA1B,EAA0ChP,UAAUgP,cAApD,CAAxB;AACH;AACD3V,wBAAOqB,IAAP,GAAcsF,UAAUtF,IAAV,GAAiBsF,UAAUtF,IAA3B,GAAkCrB,OAAOqB,IAAvD;AACH,cAbI,MAcA;AACD,uBAAM,IAAIrM,KAAJ,CAAU,8CAAV,CAAN;AACH;AACJ;AACD,gBAAOgL,MAAP;AACH;;AAID,UAAIjC,IAAE,CAAN,EAAQA,IAAE3D,UAAUkF,UAAV,CAAqB3B,MAA/B,EAAsCI,GAAtC,EAA2C;AACvC2W,gBAAOzc,IAAP,CAAY,IAAZ,EAAkBmC,UAAUkF,UAAV,CAAqBvB,CAArB,CAAlB;AACH;;AAED,SAAGgW,SAASgC,SAAZ,EAAuB;AACnBhC,kBAASgC,SAAT;AACH;;AAED,YAAOhC,QAAP;AAEH,EApMD;;AAsMA,KAAK,IAAL,EAAoC;AAChCkC,KAAA,iCAAoB,EAApB,kCAAwB,YAAY;AAAE,gBAAOlD,QAAP;AAAkB,MAAxD;AACH;;AAED,oBAAA9hB,CAAQ,EAAR;AACA,oBAAAA,CAAQ,EAAR;AACA,oBAAAA,CAAQ,EAAR;;AAEAC,QAAOC,OAAP,GAAiB4hB,QAAjB,C;;;;;;;;ACxQA,KAAIA,WAAW,mBAAA9hB,CAAQ,EAAR,CAAf;;AAEA,KAAI,CAAC8hB,SAASrN,MAAd,EAAsB;AAClBqN,cAASrN,MAAT,GAAkB,EAAlB;AACH;;AAEDqN,UAASrN,MAAT,CAAgBC,KAAhB,GAAwB;AACpBhJ,eAAU,CACN,GADM,EACD,GADC,EACI,YADJ,EACkB,IADlB,EACwB,MADxB,EACgC,MADhC,EACwC,IADxC,EAC8C,IAD9C,EACoD,IADpD,EAC0D,IAD1D,EAEN,GAFM,EAED,IAFC,EAEK,IAFL,EAEW,GAFX,EAEgB,KAFhB,EAEuB,GAFvB,EAE4B,OAF5B,EAEqC,QAFrC,EAE+C,QAF/C,EAEyD,KAFzD,EAGN,KAHM,EAGC,GAHD,EAGM,IAHN,EAGY,IAHZ,EAGkB,IAHlB,EAGwB,IAHxB,EAG8B,IAH9B,EAGoC,IAHpC,EAG0C,IAH1C,EAGgD,MAHhD,CADU;AAKpBoU,iBAAY;AACR,cAAc,CAAC,MAAD,CADN;AAER,uBAAc,CAAC,MAAD,CAFN;AAGR,cAAc,CAAC,MAAD;AAHN,MALQ;;AAWpBsC,qBAAgB;AACZ,cAAK,EAAC,OAAO,UAAR;AADO,MAXI;;AAepBD,gBAAW;AACP,cAAc,EAAC,QAAQ,CAAC,KAAD,EAAQ,MAAR,EAAgB,OAAhB,EAAyB,QAAzB,EAAmCL,SAASc,QAA5C,CAAT,EADP;AAEP,uBAAc,EAAC,QAAQ,CAAC,MAAD,EAAS,OAAT,EAAkBd,SAASc,QAA3B,CAAT,EAFP;AAGP,cAAc,EAAC,QAAQ,CAAC,MAAD,EAAS,OAAT,EAAkBd,SAASc,QAA3B,CAAT;AAHP;AAfS,EAAxB;;AAsBAziB,OAAMe,SAAN,GAAkB4gB,QAAlB,C;;;;;;;;AC5BA,KAAIA,WAAW,mBAAA9hB,CAAQ,EAAR,CAAf;;AAEA,KAAI,CAAC8hB,SAASrN,MAAd,EAAsB;AAClBqN,cAASrN,MAAT,GAAkB,EAAlB;AACH;;AAEDqN,UAASrN,MAAT,CAAgBwQ,OAAhB,GAA0B;AACtBvZ,eAAU,CAAC,GAAD,EAAM,GAAN,EAAW,YAAX,EAAyB,IAAzB,EAA+B,SAA/B,EAA0C,MAA1C,EAAkD,MAAlD,EAA0D,KAA1D,EACN,UADM,EACM,IADN,EACY,IADZ,EACkB,IADlB,EACwB,IADxB,EAC8B,IAD9B,EACoC,IADpC,EAC0C,IAD1C,EACgD,IADhD,EACsD,IADtD,EAC4D,IAD5D,EAEN,GAFM,EAED,KAFC,EAEM,IAFN,EAEY,IAFZ,EAEkB,GAFlB,EAEuB,KAFvB,EAE8B,GAF9B,EAEmC,OAFnC,EAE4C,QAF5C,EAEsD,QAFtD,EAGN,KAHM,EAGC,KAHD,EAGQ,OAHR,EAGiB,OAHjB,EAG0B,IAH1B,EAGgC,OAHhC,EAGyC,IAHzC,EAG+C,OAH/C,EAGwD,IAHxD,EAG8D,GAH9D,EAIN,IAJM,CADY;AAMtBoU,iBAAY;AACR,cAAc,CAAC,MAAD,EAAS,OAAT,CADN;AAER,uBAAc,CAAC,MAAD,CAFN;AAGR,gBAAc,CAAC,MAAD,EAAS,OAAT,CAHN;AAIR,qBAAc,CAAC,MAAD,EAAS,OAAT,CAJN;AAKR,gBAAc,CAAC,OAAD,EAAU,KAAV,EAAiB,QAAjB,EAA2B,KAA3B,EAAkC,OAAlC,EAA2C,OAA3C,CALN;AAMR,eAAc,CAAC,OAAD,EAAU,MAAV,CANN;AAOR,cAAc,CAAC,MAAD,CAPN;AAQR,kBAAc,CAAC,SAAD,EAAY,OAAZ,CARN;AASR,eAAc,CAAC,MAAD,EAAS,MAAT,EAAiB,SAAjB,EAA4B,SAA5B,EAAuC,OAAvC,CATN;AAUR,eAAc,CAAC,MAAD,EAAS,MAAT,EAAiB,SAAjB,EAA4B,SAA5B,EAAuC,OAAvC,EACG,OADH,CAVN;AAYR,eAAc,CAAC,MAAD;AAZN,MANU;AAoBtBqC,gBAAW;AACP,cAAc,EAAC,QAAQ,CAAC,KAAD,EAAQ,MAAR,EAAgB,OAAhB,EAAyB,QAAzB,EAAmCL,SAASc,QAA5C,CAAT,EADP;AAEP,uBAAc,EAAC,QAAQ,CAAC,MAAD,EAAS,OAAT,EAAkBd,SAASc,QAA3B,CAAT,EAFP;AAGP,gBAAc,EAAC,OAAQ,CAAC,MAAD,EAAS,OAAT,EAAkBd,SAASc,QAA3B,CAAT,EAHP;AAIP,cAAc,EAAC,QAAQ,CAAC,MAAD,EAAS,OAAT,EAAkBd,SAASc,QAA3B,CAAT;AAJP;AApBW,EAA1B;;AA4BAziB,OAAMe,SAAN,GAAkB4gB,QAAlB,C;;;;;;;;AClCA,KAAIA,WAAW,mBAAA9hB,CAAQ,EAAR,CAAf;;AAEA,KAAI,CAAC8hB,SAASrN,MAAd,EAAsB;AAClBqN,cAASrN,MAAT,GAAkB,EAAlB;AACH;;AAEDqN,UAASrN,MAAT,CAAgByQ,UAAhB,GAA6B;AACzBxZ,eAAU,CAAC,GAAD,EAAM,GAAN,EAAW,IAAX,EAAiB,GAAjB,EAAsB,QAAtB,EAAgC,GAAhC;AADe,EAA7B;;AAIAvL,OAAMe,SAAN,GAAkB4gB,QAAlB,C","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 59b40846d3fc3e9171a2","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.2.1\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n codex.sanitizer = require('./modules/sanitizer/sanitize');\n };\n\n codex.version = VERSION;\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.1.2\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n if (userSettings.initialBlockPlugin) {\n codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin;\n }\n\n if (userSettings.uploadImagesUrl) {\n codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n document.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Redactor zone */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false);\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, 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 *\n * Method is used in codex.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 codex.callback._blockPaste(event)\n *\n * @uses codex.callback._blockPaste(event), the second method.\n */\n block.addEventListener('paste', function (event) {\n codex.callback._blockPaste(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.2.0\n */\n\nvar content = (function(content) {\n\n /**\n * Links to current active block\n * @type {null | Element}\n */\n content.currentNode = null;\n\n /**\n * clicked in redactor area\n * @type {null | Boolean}\n */\n content.editorArea = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n /**\n * Block is inserted, wait for new click that defined focusing on editors area\n * @type {boolean}\n */\n content.editorArea = false;\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n (codex.content.sanitize.bind(this, mutation.addedNodes))();\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var node = target[0];\n\n if (!node) {\n return;\n }\n\n /**\n * Disconnect Observer\n * hierarchy of function calls inherits context of observer\n */\n this.disconnect();\n\n /**\n * Sanitize configuration.\n * Using basic sanitize\n */\n var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC);\n\n var clearHTML,\n i,\n tool;\n\n /**\n * Don't sanitize text node\n */\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n return;\n }\n\n /**\n * Clear dirty content\n */\n clearHTML = sanitizer.clean_node(node);\n node.replaceWith(clearHTML);\n\n // for(i = 0; i < target.childNodes.length; i++) {\n\n // var node = target.childNodes[i];\n\n // console.log(\"Узел %o\", node);\n\n // node.replaceWith(clearHTML);\n // }\n\n // return;\n\n // for (i = 0; i < clearHTML.childNodes.length; i++) {\n //\n // var tag = clearHTML.childNodes[i],\n // blockType = null;\n //\n // for (tool in codex.tools) {\n //\n // var handleTags = codex.tools[tool].handleTagOnPaste;\n //\n // if (!handleTags) {\n // continue;\n // }\n //\n // if (handleTags.indexOf(tag.tagName) !== -1) {\n // blockType = codex.tools[tool];\n // break;\n // }\n //\n // }\n //\n // if (blockType) {\n // codex.parser.insertPastedContent(blockType, tag);\n // }\n //\n // }\n\n /**\n * Remove node where data pasted\n */\n // target = content.getFirstLevelBlock(target);\n\n // if (target) {\n // target.remove();\n // }\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.2.1\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n }\n };\n\n callbacks.redactorKeyDown = function(event) {\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n callbacks.enterKeyPressed = function(event) {\n\n if (codex.content.editorArea) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n }\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressedOnRedactorZone = function(event){\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.isClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.isClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorArea = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorArea = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = { attributes: true, childList: true, characterData: false, subtree : true };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n\n var self = this,\n callback;\n\n /**\n * using closure to call the function immediatelly.\n * Also, we should sanitize pasted or changed data one time and ignore\n * changings which makes sanitize method.\n * For that, we need to send Context, MutationObserver.__proto__ that contains\n * observer disconnect method.\n */\n mutations.forEach(function(mutation) {\n (codex.content.paste.bind(self, mutation))();\n });\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Copyright (c) 2010 by Gabriel Birke\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the 'Software'), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\nfunction Sanitize(){\n var i, e, options;\n options = arguments[0] || {};\n this.config = {};\n this.config.elements = options.elements ? options.elements : [];\n this.config.attributes = options.attributes ? options.attributes : {};\n this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];\n this.config.allow_comments = options.allow_comments ? options.allow_comments : false;\n this.allowed_elements = {};\n this.config.protocols = options.protocols ? options.protocols : {};\n this.config.add_attributes = options.add_attributes ? options.add_attributes : {};\n this.dom = options.dom ? options.dom : document;\n for(i=0;i 0) {\n this.current_element.removeChild(this.current_element.firstChild);\n }\n parent_element.appendChild(this.current_element);\n }\n\n // iterate over child nodes\n if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {\n for(i=0;i nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.3.1\n */\n\nvar janitor = require('html-janitor');\n\n\n/**\n * Default settings for sane.\n * @uses html-janitor\n */\nvar Config = {\n\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: true\n },\n i: true,\n b: true,\n strong: true,\n em: true,\n span: true\n }\n};\n\nvar content = (function(content) {\n\n /**\n * Links to current active block\n * @type {null | Element}\n */\n content.currentNode = null;\n\n /**\n * clicked in redactor area\n * @type {null | Boolean}\n */\n content.editorArea = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n /**\n * Block is inserted, wait for new click that defined focusing on editors area\n * @type {boolean}\n */\n content.editorArea = false;\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n (codex.content.sanitize.bind(this, mutation.addedNodes))();\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var node = target[0];\n\n if (!node) {\n return;\n }\n\n /**\n * Disconnect Observer\n * hierarchy of function calls inherits context of observer\n */\n this.disconnect();\n\n /**\n * Don't sanitize text node\n */\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n return;\n }\n\n /**\n * Clear dirty content\n */\n\n var sanitizer = new janitor(Config),\n clear = sanitizer.clean(node.outerHTML);\n\n var newFragment = document.createElement('DIV');\n newFragment.innerHTML = clear;\n\n node.replaceWith(newFragment.childNodes[0]);\n\n // for (i = 0; i < clearHTML.childNodes.length; i++) {\n //\n // var tag = clearHTML.childNodes[i],\n // blockType = null;\n //\n // for (tool in codex.tools) {\n //\n // var handleTags = codex.tools[tool].handleTagOnPaste;\n //\n // if (!handleTags) {\n // continue;\n // }\n //\n // if (handleTags.indexOf(tag.tagName) !== -1) {\n // blockType = codex.tools[tool];\n // break;\n // }\n //\n // }\n //\n // if (blockType) {\n // codex.parser.insertPastedContent(blockType, tag);\n // }\n //\n // }\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.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// ./~/html-janitor/src/html-janitor.js\n// module id = 8\n// module chunks = 0","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n }\n };\n\n callbacks.redactorKeyDown = function(event) {\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n callbacks.enterKeyPressed = function(event) {\n\n if (codex.content.editorArea) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n }\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressedOnRedactorZone = function(event){\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.isClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.isClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorArea = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorArea = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = {\n attributes: true,\n childList: true,\n characterData: false,\n subtree : true\n };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n\n var self = this,\n callback;\n\n /**\n * Calling function with context of this function.\n * Also, we should sanitize pasted or changed data one time and ignore\n * changings which makes sanitize method.\n * For that, we need to send Context, MutationObserver.__proto__ that contains\n * observer disconnect method.\n */\n console.warn('mutations count: %o', mutations.length);\n mutations.forEach(function(mutation) {\n codex.content.paste.call(self, mutation);\n });\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file diff --git a/editor.js b/editor.js index 5e68bd494..a3d2d67b4 100644 --- a/editor.js +++ b/editor.js @@ -3,7 +3,7 @@ * Codex Editor * * @author Codex Team - * @version 1.2.1 + * @version 1.2.5 */ var codex = (function(codex){ @@ -22,7 +22,6 @@ var codex = (function(codex){ codex.caret = require('./modules/caret'); codex.notifications = require('./modules/notifications'); codex.parser = require('./modules/parser'); - codex.sanitizer = require('./modules/sanitizer/sanitize'); }; codex.version = VERSION; diff --git a/example.html b/example.html index bdd675323..405045394 100644 --- a/example.html +++ b/example.html @@ -10,7 +10,7 @@ - + diff --git a/modules/callbacks.js b/modules/callbacks.js index 7a2ad0763..d6c06ddd3 100644 --- a/modules/callbacks.js +++ b/modules/callbacks.js @@ -2,7 +2,7 @@ * Codex Editor callbacks module * * @author Codex Team - * @version 1.2.1 + * @version 1.2.5 */ var callbacks = (function(callbacks) { @@ -737,7 +737,12 @@ var callbacks = (function(callbacks) { /** * configuration of the observer: */ - var config = { attributes: true, childList: true, characterData: false, subtree : true }; + var config = { + attributes: true, + childList: true, + characterData: false, + subtree : true + }; // pass in the target node, as well as the observer options observer.observe(codex.state.inputs[currentInputIndex], config); @@ -752,14 +757,15 @@ var callbacks = (function(callbacks) { callback; /** - * using closure to call the function immediatelly. + * Calling function with context of this function. * Also, we should sanitize pasted or changed data one time and ignore * changings which makes sanitize method. * For that, we need to send Context, MutationObserver.__proto__ that contains * observer disconnect method. */ + console.warn('mutations count: %o', mutations.length); mutations.forEach(function(mutation) { - (codex.content.paste.bind(self, mutation))(); + codex.content.paste.call(self, mutation); }); }; diff --git a/modules/content.js b/modules/content.js index ed55445e0..fd23279e7 100644 --- a/modules/content.js +++ b/modules/content.js @@ -3,9 +3,33 @@ * Works with DOM * * @author Codex Team - * @version 1.2.0 + * @version 1.3.1 */ +var janitor = require('html-janitor'); + + +/** + * Default settings for sane. + * @uses html-janitor + */ +var Config = { + + tags: { + p: {}, + a: { + href: true, + target: '_blank', + rel: true + }, + i: true, + b: true, + strong: true, + em: true, + span: true + } +}; + var content = (function(content) { /** @@ -581,16 +605,6 @@ var content = (function(content) { */ this.disconnect(); - /** - * Sanitize configuration. - * Using basic sanitize - */ - var sanitizer = new codex.sanitizer(codex.sanitizer.Config.BASIC); - - var clearHTML, - i, - tool; - /** * Don't sanitize text node */ @@ -601,19 +615,14 @@ var content = (function(content) { /** * Clear dirty content */ - clearHTML = sanitizer.clean_node(node); - node.replaceWith(clearHTML); - // for(i = 0; i < target.childNodes.length; i++) { + var sanitizer = new janitor(Config), + clear = sanitizer.clean(node.outerHTML); - // var node = target.childNodes[i]; + var newFragment = document.createElement('DIV'); + newFragment.innerHTML = clear; - // console.log("Узел %o", node); - - // node.replaceWith(clearHTML); - // } - - // return; + node.replaceWith(newFragment.childNodes[0]); // for (i = 0; i < clearHTML.childNodes.length; i++) { // @@ -641,15 +650,6 @@ var content = (function(content) { // // } - /** - * Remove node where data pasted - */ - // target = content.getFirstLevelBlock(target); - - // if (target) { - // target.remove(); - // } - }; return content; diff --git a/modules/sanitizer/config/basic.js b/modules/sanitizer/config/basic.js deleted file mode 100644 index f3c28f6cd..000000000 --- a/modules/sanitizer/config/basic.js +++ /dev/null @@ -1,29 +0,0 @@ -var Sanitize = require('../sanitize'); - -if (!Sanitize.Config) { - Sanitize.Config = {}; -} - -Sanitize.Config.BASIC = { - elements: [ - 'a', 'b', 'blockquote', 'br', 'cite', 'code', 'dd', 'dl', 'dt', 'em', - 'i', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', 'sub', - 'sup', 'u', 'ul', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'span'], - attributes: { - 'a' : ['href'], - 'blockquote': ['cite'], - 'q' : ['cite'] - }, - - add_attributes: { - 'a': {'rel': 'nofollow'} - }, - - protocols: { - 'a' : {'href': ['ftp', 'http', 'https', 'mailto', Sanitize.RELATIVE]}, - 'blockquote': {'cite': ['http', 'https', Sanitize.RELATIVE]}, - 'q' : {'cite': ['http', 'https', Sanitize.RELATIVE]} - } -}; - -codex.sanitizer = Sanitize; \ No newline at end of file diff --git a/modules/sanitizer/config/relaxed.js b/modules/sanitizer/config/relaxed.js deleted file mode 100644 index 034d3f637..000000000 --- a/modules/sanitizer/config/relaxed.js +++ /dev/null @@ -1,35 +0,0 @@ -var Sanitize = require('../sanitize'); - -if (!Sanitize.Config) { - Sanitize.Config = {}; -} - -Sanitize.Config.RELAXED = { - elements: ['a', 'b', 'blockquote', 'br', 'caption', 'cite', 'code', 'col', - 'colgroup', 'dd', 'dl', 'dt', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', - 'i', 'img', 'li', 'ol', 'p', 'pre', 'q', 'small', 'strike', 'strong', - 'sub', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 'thead', 'tr', 'u', - 'ul'], - attributes: { - 'a' : ['href', 'title'], - 'blockquote': ['cite'], - 'col' : ['span', 'width'], - 'colgroup' : ['span', 'width'], - 'img' : ['align', 'alt', 'height', 'src', 'title', 'width'], - 'ol' : ['start', 'type'], - 'q' : ['cite'], - 'table' : ['summary', 'width'], - 'td' : ['abbr', 'axis', 'colspan', 'rowspan', 'width'], - 'th' : ['abbr', 'axis', 'colspan', 'rowspan', 'scope', - 'width'], - 'ul' : ['type'] - }, - protocols: { - 'a' : {'href': ['ftp', 'http', 'https', 'mailto', Sanitize.RELATIVE]}, - 'blockquote': {'cite': ['http', 'https', Sanitize.RELATIVE]}, - 'img' : {'src' : ['http', 'https', Sanitize.RELATIVE]}, - 'q' : {'cite': ['http', 'https', Sanitize.RELATIVE]} - } -}; - -codex.sanitizer = Sanitize; \ No newline at end of file diff --git a/modules/sanitizer/config/restricted.js b/modules/sanitizer/config/restricted.js deleted file mode 100644 index 05838e0eb..000000000 --- a/modules/sanitizer/config/restricted.js +++ /dev/null @@ -1,11 +0,0 @@ -var Sanitize = require('../sanitize'); - -if (!Sanitize.Config) { - Sanitize.Config = {}; -} - -Sanitize.Config.RESTRICTED = { - elements: ['a', 'b', 'em', 'i', 'strong', 'u'] -}; - -codex.sanitizer = Sanitize; diff --git a/modules/sanitizer/sanitize.js b/modules/sanitizer/sanitize.js deleted file mode 100644 index 5f53356e8..000000000 --- a/modules/sanitizer/sanitize.js +++ /dev/null @@ -1,265 +0,0 @@ -/** - * Copyright (c) 2010 by Gabriel Birke - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the 'Software'), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ -function Sanitize(){ - var i, e, options; - options = arguments[0] || {}; - this.config = {}; - this.config.elements = options.elements ? options.elements : []; - this.config.attributes = options.attributes ? options.attributes : {}; - this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : []; - this.config.allow_comments = options.allow_comments ? options.allow_comments : false; - this.allowed_elements = {}; - this.config.protocols = options.protocols ? options.protocols : {}; - this.config.add_attributes = options.add_attributes ? options.add_attributes : {}; - this.dom = options.dom ? options.dom : document; - for(i=0;i 0) { - this.current_element.removeChild(this.current_element.firstChild); - } - parent_element.appendChild(this.current_element); - } - - // iterate over child nodes - if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) { - for(i=0;i -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap d3d5418cbf4d2ffeb61e?a8e8","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d3d5418cbf4d2ffeb61e","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file From ee54172b086e9308a04d8b360bf9f728ce0a20ae Mon Sep 17 00:00:00 2001 From: khaydarov Date: Tue, 10 Jan 2017 19:13:04 +0300 Subject: [PATCH 09/11] fixes --- codex-editor.js | 42 ++++++++++++++++++++++++++++-------------- codex-editor.js.map | 2 +- modules/callbacks.js | 14 ++++++-------- modules/content.js | 30 +++++++++++++++++++++++------- 4 files changed, 58 insertions(+), 30 deletions(-) diff --git a/codex-editor.js b/codex-editor.js index 3149ffe46..7e0ae069e 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -1179,11 +1179,17 @@ var codex = target: '_blank', rel: true }, - i: true, - b: true, + i: { + style: true + }, + b: { + style: ture + }, strong: true, em: true, - span: true + span: { + style: true + } } }; @@ -1199,7 +1205,7 @@ var codex = * clicked in redactor area * @type {null | Boolean} */ - content.editorArea = null; + content.editorAreaHightlighted = null; /** * Synchronizes redactor with original textarea @@ -1437,7 +1443,7 @@ var codex = * Block is inserted, wait for new click that defined focusing on editors area * @type {boolean} */ - content.editorArea = false; + content.editorAreaHightlighted = false; }; /** @@ -1687,7 +1693,7 @@ var codex = tool = workingNode.dataset.tool; if (codex.tools[tool].allowedToPaste) { - codex.content.sanitize.bind(this, mutation.addedNodes)(); + codex.content.sanitize.call(this, mutation.addedNodes); } else { codex.content.pasteTextContent(mutation.addedNodes); } @@ -1702,7 +1708,17 @@ var codex = content.pasteTextContent = function (nodes) { var node = nodes[0], + textNode; + + if (!node) { + return; + } + + if (node.nodeType == codex.core.nodeTypes.TEXT) { + textNode = document.createTextNode(node); + } else { textNode = document.createTextNode(node.textContent); + } if (codex.core.isDomNode(node)) { node.parentNode.replaceChild(textNode, node); @@ -3087,7 +3103,7 @@ var codex = callbacks.enterKeyPressed = function (event) { - if (codex.content.editorArea) { + if (codex.content.editorAreaHightlighted) { /** * it means that we lose input index, saved index before is not correct @@ -3254,7 +3270,7 @@ var codex = callbacks.redactorClicked = function (event) { - callbacks.isClickedOnFirstLevelBlockArea(); + callbacks.markWhenClickedOnFirstLevelBlockArea(); codex.content.workingNodeChanged(event.target); @@ -3362,7 +3378,7 @@ var codex = * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always * specifies to the first-level block. Other cases we just ignore. */ - callbacks.isClickedOnFirstLevelBlockArea = function () { + callbacks.markWhenClickedOnFirstLevelBlockArea = function () { var selection = window.getSelection(), anchorNode = selection.anchorNode, @@ -3370,7 +3386,7 @@ var codex = if (selection.rangeCount == 0) { - codex.content.editorArea = true; + codex.content.editorAreaHightlighted = true; } else { if (!codex.core.isDomNode(anchorNode)) { @@ -3395,7 +3411,7 @@ var codex = } /** If editable element founded, flag is "TRUE", Therefore we return "FALSE" */ - codex.content.editorArea = flag ? false : true; + codex.content.editorAreaHightlighted = flag ? false : true; } }; @@ -3734,8 +3750,7 @@ var codex = */ callbacks.handlePasteEvents = function (mutations) { - var self = this, - callback; + var self = this; /** * Calling function with context of this function. @@ -3744,7 +3759,6 @@ var codex = * For that, we need to send Context, MutationObserver.__proto__ that contains * observer disconnect method. */ - console.warn('mutations count: %o', mutations.length); mutations.forEach(function (mutation) { codex.content.paste.call(self, mutation); }); diff --git a/codex-editor.js.map b/codex-editor.js.map index d5effd351..4ffb5db1a 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap d3d5418cbf4d2ffeb61e","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./~/html-janitor/src/html-janitor.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","version","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","redactorKeyDown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","_blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","janitor","Config","tags","p","a","href","rel","b","strong","em","span","currentNode","editorArea","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","bind","addedNodes","pasteTextContent","textNode","disconnect","sanitizer","clear","clean","outerHTML","newFragment","replaceWith","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","enterKeyPressed","tabKeyPressed","enterKeyPressedOnRedactorZone","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","stopPropagation","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","isClickedOnFirstLevelBlockArea","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","blockPaste","observer","MutationObserver","handlePasteEvents","config","attributes","childList","characterData","subtree","observe","mutations","self","warn","currentToolType","bar","placeholder","div","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","insertPastedContent"],"mappings":"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","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d3d5418cbf4d2ffeb61e","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n };\n\n codex.version = VERSION;\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.1.2\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n if (userSettings.initialBlockPlugin) {\n codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin;\n }\n\n if (userSettings.uploadImagesUrl) {\n codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n document.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Redactor zone */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false);\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, 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 *\n * Method is used in codex.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 codex.callback._blockPaste(event)\n *\n * @uses codex.callback._blockPaste(event), the second method.\n */\n block.addEventListener('paste', function (event) {\n codex.callback._blockPaste(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.3.1\n */\n\nvar janitor = require('html-janitor');\n\n\n/**\n * Default settings for sane.\n * @uses html-janitor\n */\nvar Config = {\n\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: true\n },\n i: true,\n b: true,\n strong: true,\n em: true,\n span: true\n }\n};\n\nvar content = (function(content) {\n\n /**\n * Links to current active block\n * @type {null | Element}\n */\n content.currentNode = null;\n\n /**\n * clicked in redactor area\n * @type {null | Boolean}\n */\n content.editorArea = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n /**\n * Block is inserted, wait for new click that defined focusing on editors area\n * @type {boolean}\n */\n content.editorArea = false;\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n (codex.content.sanitize.bind(this, mutation.addedNodes))();\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var node = target[0];\n\n if (!node) {\n return;\n }\n\n /**\n * Disconnect Observer\n * hierarchy of function calls inherits context of observer\n */\n this.disconnect();\n\n /**\n * Don't sanitize text node\n */\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n return;\n }\n\n /**\n * Clear dirty content\n */\n\n var sanitizer = new janitor(Config),\n clear = sanitizer.clean(node.outerHTML);\n\n var newFragment = document.createElement('DIV');\n newFragment.innerHTML = clear;\n\n node.replaceWith(newFragment.childNodes[0]);\n\n // for (i = 0; i < clearHTML.childNodes.length; i++) {\n //\n // var tag = clearHTML.childNodes[i],\n // blockType = null;\n //\n // for (tool in codex.tools) {\n //\n // var handleTags = codex.tools[tool].handleTagOnPaste;\n //\n // if (!handleTags) {\n // continue;\n // }\n //\n // if (handleTags.indexOf(tag.tagName) !== -1) {\n // blockType = codex.tools[tool];\n // break;\n // }\n //\n // }\n //\n // if (blockType) {\n // codex.parser.insertPastedContent(blockType, tag);\n // }\n //\n // }\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.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// ./~/html-janitor/src/html-janitor.js\n// module id = 8\n// module chunks = 0","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n }\n };\n\n callbacks.redactorKeyDown = function(event) {\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n callbacks.enterKeyPressed = function(event) {\n\n if (codex.content.editorArea) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n }\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressedOnRedactorZone = function(event){\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.isClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.isClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorArea = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorArea = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = {\n attributes: true,\n childList: true,\n characterData: false,\n subtree : true\n };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n\n var self = this,\n callback;\n\n /**\n * Calling function with context of this function.\n * Also, we should sanitize pasted or changed data one time and ignore\n * changings which makes sanitize method.\n * For that, we need to send Context, MutationObserver.__proto__ that contains\n * observer disconnect method.\n */\n console.warn('mutations count: %o', mutations.length);\n mutations.forEach(function(mutation) {\n codex.content.paste.call(self, mutation);\n });\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 61f692f96a71c8599521","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./~/html-janitor/src/html-janitor.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","version","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","redactorKeyDown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","_blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","janitor","Config","tags","p","a","href","rel","style","b","ture","strong","em","span","currentNode","editorAreaHightlighted","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","disconnect","sanitizer","clear","clean","outerHTML","newFragment","replaceWith","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","enterKeyPressed","tabKeyPressed","enterKeyPressedOnRedactorZone","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","stopPropagation","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","markWhenClickedOnFirstLevelBlockArea","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","blockPaste","observer","MutationObserver","handlePasteEvents","config","attributes","childList","characterData","subtree","observe","mutations","self","currentToolType","bar","placeholder","div","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","insertPastedContent"],"mappings":"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","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 61f692f96a71c8599521","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n };\n\n codex.version = VERSION;\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.1.2\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n if (userSettings.initialBlockPlugin) {\n codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin;\n }\n\n if (userSettings.uploadImagesUrl) {\n codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n document.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Redactor zone */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false);\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, 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 *\n * Method is used in codex.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 codex.callback._blockPaste(event)\n *\n * @uses codex.callback._blockPaste(event), the second method.\n */\n block.addEventListener('paste', function (event) {\n codex.callback._blockPaste(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.3.1\n */\n\nvar janitor = require('html-janitor');\n\n\n/**\n * Default settings for sane.\n * @uses html-janitor\n */\nvar Config = {\n\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: true\n },\n i: {\n style: true\n },\n b: {\n style: ture\n },\n strong: true,\n em: true,\n span: {\n style: true\n }\n }\n};\n\nvar content = (function(content) {\n\n /**\n * Links to current active block\n * @type {null | Element}\n */\n content.currentNode = null;\n\n /**\n * clicked in redactor area\n * @type {null | Boolean}\n */\n content.editorAreaHightlighted = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n /**\n * Block is inserted, wait for new click that defined focusing on editors area\n * @type {boolean}\n */\n content.editorAreaHightlighted = false;\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize.call(this, mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode;\n\n if (!node) {\n return;\n }\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n textNode = document.createTextNode(node);\n } else {\n textNode = document.createTextNode(node.textContent);\n }\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var node = target[0];\n\n if (!node) {\n return;\n }\n\n /**\n * Disconnect Observer\n * hierarchy of function calls inherits context of observer\n */\n this.disconnect();\n\n /**\n * Don't sanitize text node\n */\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n return;\n }\n\n /**\n * Clear dirty content\n */\n\n var sanitizer = new janitor(Config),\n clear = sanitizer.clean(node.outerHTML);\n\n var newFragment = document.createElement('DIV');\n newFragment.innerHTML = clear;\n\n node.replaceWith(newFragment.childNodes[0]);\n\n // for (i = 0; i < clearHTML.childNodes.length; i++) {\n //\n // var tag = clearHTML.childNodes[i],\n // blockType = null;\n //\n // for (tool in codex.tools) {\n //\n // var handleTags = codex.tools[tool].handleTagOnPaste;\n //\n // if (!handleTags) {\n // continue;\n // }\n //\n // if (handleTags.indexOf(tag.tagName) !== -1) {\n // blockType = codex.tools[tool];\n // break;\n // }\n //\n // }\n //\n // if (blockType) {\n // codex.parser.insertPastedContent(blockType, tag);\n // }\n //\n // }\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.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// ./~/html-janitor/src/html-janitor.js\n// module id = 8\n// module chunks = 0","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n }\n };\n\n callbacks.redactorKeyDown = function(event) {\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n callbacks.enterKeyPressed = function(event) {\n\n if (codex.content.editorAreaHightlighted) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n }\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressedOnRedactorZone = function(event){\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.markWhenClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.markWhenClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorAreaHightlighted = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorAreaHightlighted = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = {\n attributes: true,\n childList: true,\n characterData: false,\n subtree : true\n };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n\n var self = this;\n\n /**\n * Calling function with context of this function.\n * Also, we should sanitize pasted or changed data one time and ignore\n * changings which makes sanitize method.\n * For that, we need to send Context, MutationObserver.__proto__ that contains\n * observer disconnect method.\n */\n mutations.forEach(function(mutation) {\n codex.content.paste.call(self, mutation);\n });\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file diff --git a/modules/callbacks.js b/modules/callbacks.js index d6c06ddd3..24a708407 100644 --- a/modules/callbacks.js +++ b/modules/callbacks.js @@ -50,7 +50,7 @@ var callbacks = (function(callbacks) { callbacks.enterKeyPressed = function(event) { - if (codex.content.editorArea) { + if (codex.content.editorAreaHightlighted) { /** * it means that we lose input index, saved index before is not correct @@ -234,7 +234,7 @@ var callbacks = (function(callbacks) { callbacks.redactorClicked = function (event) { - callbacks.isClickedOnFirstLevelBlockArea(); + callbacks.markWhenClickedOnFirstLevelBlockArea(); codex.content.workingNodeChanged(event.target); @@ -352,7 +352,7 @@ var callbacks = (function(callbacks) { * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always * specifies to the first-level block. Other cases we just ignore. */ - callbacks.isClickedOnFirstLevelBlockArea = function() { + callbacks.markWhenClickedOnFirstLevelBlockArea = function() { var selection = window.getSelection(), anchorNode = selection.anchorNode, @@ -360,7 +360,7 @@ var callbacks = (function(callbacks) { if (selection.rangeCount == 0) { - codex.content.editorArea = true; + codex.content.editorAreaHightlighted = true; } else { @@ -386,7 +386,7 @@ var callbacks = (function(callbacks) { } /** If editable element founded, flag is "TRUE", Therefore we return "FALSE" */ - codex.content.editorArea = flag ? false : true; + codex.content.editorAreaHightlighted = flag ? false : true; } }; @@ -753,8 +753,7 @@ var callbacks = (function(callbacks) { */ callbacks.handlePasteEvents = function(mutations) { - var self = this, - callback; + var self = this; /** * Calling function with context of this function. @@ -763,7 +762,6 @@ var callbacks = (function(callbacks) { * For that, we need to send Context, MutationObserver.__proto__ that contains * observer disconnect method. */ - console.warn('mutations count: %o', mutations.length); mutations.forEach(function(mutation) { codex.content.paste.call(self, mutation); }); diff --git a/modules/content.js b/modules/content.js index fd23279e7..235ef6749 100644 --- a/modules/content.js +++ b/modules/content.js @@ -22,11 +22,17 @@ var Config = { target: '_blank', rel: true }, - i: true, - b: true, + i: { + style: true + }, + b: { + style: ture + }, strong: true, em: true, - span: true + span: { + style: true + } } }; @@ -42,7 +48,7 @@ var content = (function(content) { * clicked in redactor area * @type {null | Boolean} */ - content.editorArea = null; + content.editorAreaHightlighted = null; /** * Synchronizes redactor with original textarea @@ -297,7 +303,7 @@ var content = (function(content) { * Block is inserted, wait for new click that defined focusing on editors area * @type {boolean} */ - content.editorArea = false; + content.editorAreaHightlighted = false; }; @@ -557,7 +563,7 @@ var content = (function(content) { tool = workingNode.dataset.tool; if (codex.tools[tool].allowedToPaste) { - (codex.content.sanitize.bind(this, mutation.addedNodes))(); + codex.content.sanitize.call(this, mutation.addedNodes); } else { codex.content.pasteTextContent(mutation.addedNodes); } @@ -572,8 +578,18 @@ var content = (function(content) { */ content.pasteTextContent = function(nodes) { - var node = nodes[0], + var node = nodes[0], + textNode; + + if (!node) { + return; + } + + if (node.nodeType == codex.core.nodeTypes.TEXT) { + textNode = document.createTextNode(node); + } else { textNode = document.createTextNode(node.textContent); + } if (codex.core.isDomNode(node)) { node.parentNode.replaceChild(textNode, node); From cf3c4c555b8947d34a35ea23cc278b4d790ff5c0 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Tue, 10 Jan 2017 19:24:58 +0300 Subject: [PATCH 10/11] last fixes, code improved after review --- codex-editor.js | 42 +++++++++++++++++++++--------------------- codex-editor.js.map | 2 +- modules/callbacks.js | 7 ++++++- modules/content.js | 21 ++++++--------------- modules/draw.js | 2 +- modules/ui.js | 10 ++++++---- 6 files changed, 41 insertions(+), 43 deletions(-) diff --git a/codex-editor.js b/codex-editor.js index 7e0ae069e..d6f538dd6 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -695,7 +695,7 @@ var codex = * We have two type of sanitization * First - uses deep-first search algorithm to get sub nodes, * sanitizes whole Block_content and replaces cleared nodes - * + * This method is deprecated * Method is used in codex.callback.blockPaste(event) * * Secont - uses Mutation observer. @@ -703,12 +703,14 @@ var codex = * Callback gets changed node, not whole Block_content. * Inserted or changed node, which we've gotten have been cleared and replaced with diry node * - * Method is used in codex.callback._blockPaste(event) + * Method is used in codex.callback.blockPasteViaSanitize(event) + * + * @uses html-janitor + * @example codex.callback.blockPasteViaSanitize(event), the second method. * - * @uses codex.callback._blockPaste(event), the second method. */ block.addEventListener('paste', function (event) { - codex.callback._blockPaste(event); + codex.callback.blockPasteViaSanitize(event); }, false); block.addEventListener('mouseup', function () { @@ -1179,17 +1181,11 @@ var codex = target: '_blank', rel: true }, - i: { - style: true - }, - b: { - style: ture - }, + i: true, + b: true, strong: true, em: true, - span: { - style: true - } + span: true } }; @@ -1730,7 +1726,7 @@ var codex = * * Sanitizes HTML content * @param {Element} target - inserted element - * @uses Sanitize library and BASIC configuration + * @uses Sanitize library html-janitor */ content.sanitize = function (target) { @@ -1760,14 +1756,11 @@ var codex = /** * Clear dirty content */ - var sanitizer = new janitor(Config), clear = sanitizer.clean(node.outerHTML); - var newFragment = document.createElement('DIV'); - newFragment.innerHTML = clear; - - node.replaceWith(newFragment.childNodes[0]); + var div = codex.draw.node('DIV', [], { innerHTML: clear }); + node.replaceWith(div.childNodes[0]); // for (i = 0; i < clearHTML.childNodes.length; i++) { // @@ -3707,6 +3700,11 @@ var codex = event.preventDefault(); }; + /** + * @deprecated + * + * @param event + */ callbacks.blockPaste = function (event) { var currentInputIndex = codex.caret.getCurrentInputIndex(), @@ -3722,7 +3720,7 @@ var codex = event.stopImmediatePropagation(); }; - callbacks._blockPaste = function (event) { + callbacks.blockPasteViaSanitize = function (event) { var currentInputIndex = codex.caret.getCurrentInputIndex(); @@ -3950,7 +3948,9 @@ var codex = div.classList.add('ce-settings_default'); return div; - }, draw.pluginsSettings = function () { + }; + + draw.pluginsSettings = function () { var div = document.createElement('div'); diff --git a/codex-editor.js.map b/codex-editor.js.map index 4ffb5db1a..7767cc9ac 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 61f692f96a71c8599521","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./~/html-janitor/src/html-janitor.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","version","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","redactorKeyDown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","_blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","janitor","Config","tags","p","a","href","rel","style","b","ture","strong","em","span","currentNode","editorAreaHightlighted","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","disconnect","sanitizer","clear","clean","outerHTML","newFragment","replaceWith","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","enterKeyPressed","tabKeyPressed","enterKeyPressedOnRedactorZone","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","stopPropagation","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","markWhenClickedOnFirstLevelBlockArea","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","blockPaste","observer","MutationObserver","handlePasteEvents","config","attributes","childList","characterData","subtree","observe","mutations","self","currentToolType","bar","placeholder","div","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","insertPastedContent"],"mappings":"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","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 61f692f96a71c8599521","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n };\n\n codex.version = VERSION;\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.1.2\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n if (userSettings.initialBlockPlugin) {\n codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin;\n }\n\n if (userSettings.uploadImagesUrl) {\n codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n document.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Redactor zone */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false);\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, 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 *\n * Method is used in codex.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 codex.callback._blockPaste(event)\n *\n * @uses codex.callback._blockPaste(event), the second method.\n */\n block.addEventListener('paste', function (event) {\n codex.callback._blockPaste(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.3.1\n */\n\nvar janitor = require('html-janitor');\n\n\n/**\n * Default settings for sane.\n * @uses html-janitor\n */\nvar Config = {\n\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: true\n },\n i: {\n style: true\n },\n b: {\n style: ture\n },\n strong: true,\n em: true,\n span: {\n style: true\n }\n }\n};\n\nvar content = (function(content) {\n\n /**\n * Links to current active block\n * @type {null | Element}\n */\n content.currentNode = null;\n\n /**\n * clicked in redactor area\n * @type {null | Boolean}\n */\n content.editorAreaHightlighted = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n /**\n * Block is inserted, wait for new click that defined focusing on editors area\n * @type {boolean}\n */\n content.editorAreaHightlighted = false;\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize.call(this, mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode;\n\n if (!node) {\n return;\n }\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n textNode = document.createTextNode(node);\n } else {\n textNode = document.createTextNode(node.textContent);\n }\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library and BASIC configuration\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var node = target[0];\n\n if (!node) {\n return;\n }\n\n /**\n * Disconnect Observer\n * hierarchy of function calls inherits context of observer\n */\n this.disconnect();\n\n /**\n * Don't sanitize text node\n */\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n return;\n }\n\n /**\n * Clear dirty content\n */\n\n var sanitizer = new janitor(Config),\n clear = sanitizer.clean(node.outerHTML);\n\n var newFragment = document.createElement('DIV');\n newFragment.innerHTML = clear;\n\n node.replaceWith(newFragment.childNodes[0]);\n\n // for (i = 0; i < clearHTML.childNodes.length; i++) {\n //\n // var tag = clearHTML.childNodes[i],\n // blockType = null;\n //\n // for (tool in codex.tools) {\n //\n // var handleTags = codex.tools[tool].handleTagOnPaste;\n //\n // if (!handleTags) {\n // continue;\n // }\n //\n // if (handleTags.indexOf(tag.tagName) !== -1) {\n // blockType = codex.tools[tool];\n // break;\n // }\n //\n // }\n //\n // if (blockType) {\n // codex.parser.insertPastedContent(blockType, tag);\n // }\n //\n // }\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.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// ./~/html-janitor/src/html-janitor.js\n// module id = 8\n// module chunks = 0","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n }\n };\n\n callbacks.redactorKeyDown = function(event) {\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n callbacks.enterKeyPressed = function(event) {\n\n if (codex.content.editorAreaHightlighted) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n }\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressedOnRedactorZone = function(event){\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.markWhenClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.markWhenClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorAreaHightlighted = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorAreaHightlighted = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n callbacks._blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = {\n attributes: true,\n childList: true,\n characterData: false,\n subtree : true\n };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n\n var self = this;\n\n /**\n * Calling function with context of this function.\n * Also, we should sanitize pasted or changed data one time and ignore\n * changings which makes sanitize method.\n * For that, we need to send Context, MutationObserver.__proto__ that contains\n * observer disconnect method.\n */\n mutations.forEach(function(mutation) {\n codex.content.paste.call(self, mutation);\n });\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n },\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap a4aee9941b6940e5932b","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./~/html-janitor/src/html-janitor.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","version","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","redactorKeyDown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPasteViaSanitize","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","janitor","Config","tags","p","a","href","rel","b","strong","em","span","currentNode","editorAreaHightlighted","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","disconnect","sanitizer","clear","clean","outerHTML","div","replaceWith","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","enterKeyPressed","tabKeyPressed","enterKeyPressedOnRedactorZone","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","stopPropagation","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","markWhenClickedOnFirstLevelBlockArea","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","blockPaste","observer","MutationObserver","handlePasteEvents","config","attributes","childList","characterData","subtree","observe","mutations","self","currentToolType","bar","placeholder","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","insertPastedContent"],"mappings":"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","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap a4aee9941b6940e5932b","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n };\n\n codex.version = VERSION;\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.1.2\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n if (userSettings.initialBlockPlugin) {\n codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin;\n }\n\n if (userSettings.uploadImagesUrl) {\n codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n document.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Redactor zone */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false);\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, 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 codex.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 codex.callback.blockPasteViaSanitize(event)\n *\n * @uses html-janitor\n * @example codex.callback.blockPasteViaSanitize(event), the second method.\n *\n */\n block.addEventListener('paste', function (event) {\n codex.callback.blockPasteViaSanitize(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.3.1\n */\n\nvar janitor = require('html-janitor');\n\n\n/**\n * Default settings for sane.\n * @uses html-janitor\n */\nvar Config = {\n\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: true\n },\n i: true,\n b: true,\n strong: true,\n em: true,\n span: true\n }\n};\n\nvar content = (function(content) {\n\n /**\n * Links to current active block\n * @type {null | Element}\n */\n content.currentNode = null;\n\n /**\n * clicked in redactor area\n * @type {null | Boolean}\n */\n content.editorAreaHightlighted = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n /**\n * Block is inserted, wait for new click that defined focusing on editors area\n * @type {boolean}\n */\n content.editorAreaHightlighted = false;\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize.call(this, mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode;\n\n if (!node) {\n return;\n }\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n textNode = document.createTextNode(node);\n } else {\n textNode = document.createTextNode(node.textContent);\n }\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library html-janitor\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var node = target[0];\n\n if (!node) {\n return;\n }\n\n /**\n * Disconnect Observer\n * hierarchy of function calls inherits context of observer\n */\n this.disconnect();\n\n /**\n * Don't sanitize text node\n */\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n return;\n }\n\n /**\n * Clear dirty content\n */\n var sanitizer = new janitor(Config),\n clear = sanitizer.clean(node.outerHTML);\n\n var div = codex.draw.node('DIV', [], { innerHTML: clear });\n node.replaceWith(div.childNodes[0]);\n\n // for (i = 0; i < clearHTML.childNodes.length; i++) {\n //\n // var tag = clearHTML.childNodes[i],\n // blockType = null;\n //\n // for (tool in codex.tools) {\n //\n // var handleTags = codex.tools[tool].handleTagOnPaste;\n //\n // if (!handleTags) {\n // continue;\n // }\n //\n // if (handleTags.indexOf(tag.tagName) !== -1) {\n // blockType = codex.tools[tool];\n // break;\n // }\n //\n // }\n //\n // if (blockType) {\n // codex.parser.insertPastedContent(blockType, tag);\n // }\n //\n // }\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.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// ./~/html-janitor/src/html-janitor.js\n// module id = 8\n// module chunks = 0","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n }\n };\n\n callbacks.redactorKeyDown = function(event) {\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n callbacks.enterKeyPressed = function(event) {\n\n if (codex.content.editorAreaHightlighted) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n }\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressedOnRedactorZone = function(event){\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.markWhenClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.markWhenClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorAreaHightlighted = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorAreaHightlighted = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n /**\n * @deprecated\n *\n * @param event\n */\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n callbacks.blockPasteViaSanitize = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = {\n attributes: true,\n childList: true,\n characterData: false,\n subtree : true\n };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n\n var self = this;\n\n /**\n * Calling function with context of this function.\n * Also, we should sanitize pasted or changed data one time and ignore\n * changings which makes sanitize method.\n * For that, we need to send Context, MutationObserver.__proto__ that contains\n * observer disconnect method.\n */\n mutations.forEach(function(mutation) {\n codex.content.paste.call(self, mutation);\n });\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n };\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file diff --git a/modules/callbacks.js b/modules/callbacks.js index 24a708407..080340b33 100644 --- a/modules/callbacks.js +++ b/modules/callbacks.js @@ -708,6 +708,11 @@ var callbacks = (function(callbacks) { }; + /** + * @deprecated + * + * @param event + */ callbacks.blockPaste = function(event) { var currentInputIndex = codex.caret.getCurrentInputIndex(), @@ -725,7 +730,7 @@ var callbacks = (function(callbacks) { }; - callbacks._blockPaste = function(event) { + callbacks.blockPasteViaSanitize = function(event) { var currentInputIndex = codex.caret.getCurrentInputIndex(); diff --git a/modules/content.js b/modules/content.js index 235ef6749..d18804cbd 100644 --- a/modules/content.js +++ b/modules/content.js @@ -22,17 +22,11 @@ var Config = { target: '_blank', rel: true }, - i: { - style: true - }, - b: { - style: ture - }, + i: true, + b: true, strong: true, em: true, - span: { - style: true - } + span: true } }; @@ -601,7 +595,7 @@ var content = (function(content) { * * Sanitizes HTML content * @param {Element} target - inserted element - * @uses Sanitize library and BASIC configuration + * @uses Sanitize library html-janitor */ content.sanitize = function(target) { @@ -631,14 +625,11 @@ var content = (function(content) { /** * Clear dirty content */ - var sanitizer = new janitor(Config), clear = sanitizer.clean(node.outerHTML); - var newFragment = document.createElement('DIV'); - newFragment.innerHTML = clear; - - node.replaceWith(newFragment.childNodes[0]); + var div = codex.draw.node('DIV', [], { innerHTML: clear }); + node.replaceWith(div.childNodes[0]); // for (i = 0; i < clearHTML.childNodes.length; i++) { // diff --git a/modules/draw.js b/modules/draw.js index aaa9b9bb3..8c1c4ac86 100644 --- a/modules/draw.js +++ b/modules/draw.js @@ -160,7 +160,7 @@ var draw = (function(draw) { div.classList.add('ce-settings_default'); return div; - }, + }; draw.pluginsSettings = function() { diff --git a/modules/ui.js b/modules/ui.js index 7b4fc25ae..99151c3a3 100644 --- a/modules/ui.js +++ b/modules/ui.js @@ -330,7 +330,7 @@ var ui = (function(ui){ * We have two type of sanitization * First - uses deep-first search algorithm to get sub nodes, * sanitizes whole Block_content and replaces cleared nodes - * + * This method is deprecated * Method is used in codex.callback.blockPaste(event) * * Secont - uses Mutation observer. @@ -338,12 +338,14 @@ var ui = (function(ui){ * Callback gets changed node, not whole Block_content. * Inserted or changed node, which we've gotten have been cleared and replaced with diry node * - * Method is used in codex.callback._blockPaste(event) + * Method is used in codex.callback.blockPasteViaSanitize(event) + * + * @uses html-janitor + * @example codex.callback.blockPasteViaSanitize(event), the second method. * - * @uses codex.callback._blockPaste(event), the second method. */ block.addEventListener('paste', function (event) { - codex.callback._blockPaste(event); + codex.callback.blockPasteViaSanitize(event); }, false); block.addEventListener('mouseup', function(){ From a39bf72559b88da54184175469f9194579705867 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Tue, 10 Jan 2017 19:57:23 +0300 Subject: [PATCH 11/11] updated --- codex-editor.js | 12 ++++++------ codex-editor.js.map | 2 +- modules/content.js | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/codex-editor.js b/codex-editor.js index d6f538dd6..50bafa0e9 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -1179,13 +1179,13 @@ var codex = a: { href: true, target: '_blank', - rel: true + rel: 'nofollow' }, - i: true, - b: true, - strong: true, - em: true, - span: true + i: {}, + b: {}, + strong: {}, + em: {}, + span: {} } }; diff --git a/codex-editor.js.map b/codex-editor.js.map index 7767cc9ac..e413069e7 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap a4aee9941b6940e5932b","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./~/html-janitor/src/html-janitor.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","version","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","redactorKeyDown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPasteViaSanitize","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","janitor","Config","tags","p","a","href","rel","b","strong","em","span","currentNode","editorAreaHightlighted","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","disconnect","sanitizer","clear","clean","outerHTML","div","replaceWith","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","enterKeyPressed","tabKeyPressed","enterKeyPressedOnRedactorZone","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","stopPropagation","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","markWhenClickedOnFirstLevelBlockArea","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","blockPaste","observer","MutationObserver","handlePasteEvents","config","attributes","childList","characterData","subtree","observe","mutations","self","currentToolType","bar","placeholder","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","insertPastedContent"],"mappings":"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","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap a4aee9941b6940e5932b","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n };\n\n codex.version = VERSION;\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.1.2\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n if (userSettings.initialBlockPlugin) {\n codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin;\n }\n\n if (userSettings.uploadImagesUrl) {\n codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n document.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Redactor zone */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false);\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, 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 codex.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 codex.callback.blockPasteViaSanitize(event)\n *\n * @uses html-janitor\n * @example codex.callback.blockPasteViaSanitize(event), the second method.\n *\n */\n block.addEventListener('paste', function (event) {\n codex.callback.blockPasteViaSanitize(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.3.1\n */\n\nvar janitor = require('html-janitor');\n\n\n/**\n * Default settings for sane.\n * @uses html-janitor\n */\nvar Config = {\n\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: true\n },\n i: true,\n b: true,\n strong: true,\n em: true,\n span: true\n }\n};\n\nvar content = (function(content) {\n\n /**\n * Links to current active block\n * @type {null | Element}\n */\n content.currentNode = null;\n\n /**\n * clicked in redactor area\n * @type {null | Boolean}\n */\n content.editorAreaHightlighted = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n /**\n * Block is inserted, wait for new click that defined focusing on editors area\n * @type {boolean}\n */\n content.editorAreaHightlighted = false;\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize.call(this, mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode;\n\n if (!node) {\n return;\n }\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n textNode = document.createTextNode(node);\n } else {\n textNode = document.createTextNode(node.textContent);\n }\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library html-janitor\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var node = target[0];\n\n if (!node) {\n return;\n }\n\n /**\n * Disconnect Observer\n * hierarchy of function calls inherits context of observer\n */\n this.disconnect();\n\n /**\n * Don't sanitize text node\n */\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n return;\n }\n\n /**\n * Clear dirty content\n */\n var sanitizer = new janitor(Config),\n clear = sanitizer.clean(node.outerHTML);\n\n var div = codex.draw.node('DIV', [], { innerHTML: clear });\n node.replaceWith(div.childNodes[0]);\n\n // for (i = 0; i < clearHTML.childNodes.length; i++) {\n //\n // var tag = clearHTML.childNodes[i],\n // blockType = null;\n //\n // for (tool in codex.tools) {\n //\n // var handleTags = codex.tools[tool].handleTagOnPaste;\n //\n // if (!handleTags) {\n // continue;\n // }\n //\n // if (handleTags.indexOf(tag.tagName) !== -1) {\n // blockType = codex.tools[tool];\n // break;\n // }\n //\n // }\n //\n // if (blockType) {\n // codex.parser.insertPastedContent(blockType, tag);\n // }\n //\n // }\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.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// ./~/html-janitor/src/html-janitor.js\n// module id = 8\n// module chunks = 0","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n }\n };\n\n callbacks.redactorKeyDown = function(event) {\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n callbacks.enterKeyPressed = function(event) {\n\n if (codex.content.editorAreaHightlighted) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n }\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressedOnRedactorZone = function(event){\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.markWhenClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.markWhenClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorAreaHightlighted = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorAreaHightlighted = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n /**\n * @deprecated\n *\n * @param event\n */\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n callbacks.blockPasteViaSanitize = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = {\n attributes: true,\n childList: true,\n characterData: false,\n subtree : true\n };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n\n var self = this;\n\n /**\n * Calling function with context of this function.\n * Also, we should sanitize pasted or changed data one time and ignore\n * changings which makes sanitize method.\n * For that, we need to send Context, MutationObserver.__proto__ that contains\n * observer disconnect method.\n */\n mutations.forEach(function(mutation) {\n codex.content.paste.call(self, mutation);\n });\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n };\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 711a6ea5a8264430281a","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./~/html-janitor/src/html-janitor.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","version","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","redactorKeyDown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPasteViaSanitize","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","classList","contains","push","janitor","Config","tags","p","a","href","rel","b","strong","em","span","currentNode","editorAreaHightlighted","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","disconnect","sanitizer","clear","clean","outerHTML","div","replaceWith","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","enterKeyPressed","tabKeyPressed","enterKeyPressedOnRedactorZone","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","stopPropagation","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","markWhenClickedOnFirstLevelBlockArea","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","blockPaste","observer","MutationObserver","handlePasteEvents","config","attributes","childList","characterData","subtree","observe","mutations","self","currentToolType","bar","placeholder","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","insertPastedContent"],"mappings":"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","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\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\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.loaded = 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// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 711a6ea5a8264430281a","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n *\n * Codex Editor\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n codex.core = require('./modules/core');\n codex.ui = require('./modules/ui');\n codex.transport = require('./modules/transport');\n codex.renderer = require('./modules/renderer');\n codex.saver = require('./modules/saver');\n codex.content = require('./modules/content');\n codex.toolbar = require('./modules/toolbar/toolbar');\n codex.tools = require('./modules/tools');\n codex.callback = require('./modules/callbacks');\n codex.draw = require('./modules/draw');\n codex.caret = require('./modules/caret');\n codex.notifications = require('./modules/notifications');\n codex.parser = require('./modules/parser');\n };\n\n codex.version = VERSION;\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : 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 codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\n * Codex Editor Core\n *\n * @author Codex Team\n * @version 1.1.2\n */\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n if (userSettings.initialBlockPlugin) {\n codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin;\n }\n\n if (userSettings.uploadImagesUrl) {\n codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { 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 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\n * Codex Editor UI module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.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} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (!tool.displayInToolbox) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.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 underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\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 = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n document.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Redactor zone */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false);\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n };\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, 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 codex.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 codex.callback.blockPasteViaSanitize(event)\n *\n * @uses html-janitor\n * @example codex.callback.blockPasteViaSanitize(event), the second method.\n *\n */\n block.addEventListener('paste', function (event) {\n codex.callback.blockPasteViaSanitize(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type,\n cover = blockData.cover;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched,\n cover : cover\n };\n\n };\n\n return renderer;\n\n})({});\n\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @author Codex Team\n * @version 1.3.1\n */\n\nvar janitor = require('html-janitor');\n\n\n/**\n * Default settings for sane.\n * @uses html-janitor\n */\nvar Config = {\n\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: 'nofollow'\n },\n i: {},\n b: {},\n strong: {},\n em: {},\n span: {}\n }\n};\n\nvar content = (function(content) {\n\n /**\n * Links to current active block\n * @type {null | Element}\n */\n content.currentNode = null;\n\n /**\n * clicked in redactor area\n * @type {null | Boolean}\n */\n content.editorAreaHightlighted = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n cover = blockData.cover,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (cover === true) {\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\n }\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n /**\n * Block is inserted, wait for new click that defined focusing on editors area\n * @type {boolean}\n */\n content.editorAreaHightlighted = false;\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize.call(this, mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode;\n\n if (!node) {\n return;\n }\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n textNode = document.createTextNode(node);\n } else {\n textNode = document.createTextNode(node.textContent);\n }\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses Sanitize library html-janitor\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n var node = target[0];\n\n if (!node) {\n return;\n }\n\n /**\n * Disconnect Observer\n * hierarchy of function calls inherits context of observer\n */\n this.disconnect();\n\n /**\n * Don't sanitize text node\n */\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n return;\n }\n\n /**\n * Clear dirty content\n */\n var sanitizer = new janitor(Config),\n clear = sanitizer.clean(node.outerHTML);\n\n var div = codex.draw.node('DIV', [], { innerHTML: clear });\n node.replaceWith(div.childNodes[0]);\n\n // for (i = 0; i < clearHTML.childNodes.length; i++) {\n //\n // var tag = clearHTML.childNodes[i],\n // blockType = null;\n //\n // for (tool in codex.tools) {\n //\n // var handleTags = codex.tools[tool].handleTagOnPaste;\n //\n // if (!handleTags) {\n // continue;\n // }\n //\n // if (handleTags.indexOf(tag.tagName) !== -1) {\n // blockType = codex.tools[tool];\n // break;\n // }\n //\n // }\n //\n // if (blockType) {\n // codex.parser.insertPastedContent(blockType, tag);\n // }\n //\n // }\n\n };\n\n return content;\n\n})({});\n\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.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// ./~/html-janitor/src/html-janitor.js\n// module id = 8\n// module chunks = 0","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\n * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function () {\n\n require('./toolbar');\n\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n\n codex.toolbar.settings.close();\n\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n hiddenToolsAmount = 0,\n toolToSelect;\n\n /** Count toolbox hidden tools */\n for( var tool in codex.tools ) {\n\n if (!codex.tools[tool].displayInToolbox) {\n\n hiddenToolsAmount ++;\n\n }\n\n\n }\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( var tool in codex.tools ) {\n\n if (codex.tools[tool].displayInToolbox){\n\n break;\n\n }\n\n nextToolIndex ++;\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n barButtons[toolToSelect].classList.add('selected');\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\n * Codex Editor tools\n * This tools will be appended in toolbox\n *\n * @author Codex Team\n * @version 1.0\n */\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\n * Codex Editor callbacks module\n *\n * @author Codex Team\n * @version 1.2.5\n */\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n }\n };\n\n callbacks.redactorKeyDown = function(event) {\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n callbacks.enterKeyPressed = function(event) {\n\n if (codex.content.editorAreaHightlighted) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n }\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressedOnRedactorZone = function(event){\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.markWhenClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.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 = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.markWhenClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorAreaHightlighted = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorAreaHightlighted = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n /**\n * @deprecated\n *\n * @param event\n */\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n callbacks.blockPasteViaSanitize = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handlePasteEvents);\n\n /**\n * configuration of the observer:\n */\n var config = {\n attributes: true,\n childList: true,\n characterData: false,\n subtree : true\n };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handlePasteEvents = function(mutations) {\n\n var self = this;\n\n /**\n * Calling function with context of this function.\n * Also, we should sanitize pasted or changed data one time and ignore\n * changings which makes sanitize method.\n * For that, we need to send Context, MutationObserver.__proto__ that contains\n * observer disconnect method.\n */\n mutations.forEach(function(mutation) {\n codex.content.paste.call(self, mutation);\n });\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n };\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file diff --git a/modules/content.js b/modules/content.js index d18804cbd..5ebdd1d52 100644 --- a/modules/content.js +++ b/modules/content.js @@ -20,13 +20,13 @@ var Config = { a: { href: true, target: '_blank', - rel: true + rel: 'nofollow' }, - i: true, - b: true, - strong: true, - em: true, - span: true + i: {}, + b: {}, + strong: {}, + em: {}, + span: {} } };