From 8dea3af111412509fbba39006bcac0e27f407597 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Mon, 19 Dec 2016 19:34:26 +0300 Subject: [PATCH 01/14] cover restoring fixed --- codex-editor.js | 14 +- example.html | 25 +- modules/content.js | 5 + modules/renderer.js | 9 +- plugins.js | 2247 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 2288 insertions(+), 12 deletions(-) create mode 100644 plugins.js diff --git a/codex-editor.js b/codex-editor.js index ccd848ddd..d746b276b 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -954,7 +954,8 @@ var codex = renderer.createBlockFromData = function (blockData) { /** New parser */ - var pluginName = blockData.type; + var pluginName = blockData.type, + cover = blockData.cover; /** Get first key of object that stores plugin name */ // for (var pluginName in blockData) break; @@ -973,9 +974,6 @@ var codex = /** New Parser */ var block = codex.tools[pluginName].render(blockData.data); - /** Fire the render method with data */ - // var block = codex.tools[pluginName].render(blockData[pluginName]); - /** is first-level block stretched */ var stretched = codex.tools[pluginName].isStretched || false; @@ -983,7 +981,8 @@ var codex = return { type: pluginName, block: block, - stretched: stretched + stretched: stretched, + cover: cover }; }; @@ -1275,10 +1274,15 @@ var codex = var workingBlock = codex.content.currentNode, newBlockContent = blockData.block, blockType = blockData.type, + cover = blockData.cover, isStretched = blockData.stretched; var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched); + if (cover === true) { + newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE); + } + if (workingBlock) { codex.core.insertAfter(workingBlock, newBlock); diff --git a/example.html b/example.html index 91f97dc27..9d011ef6e 100644 --- a/example.html +++ b/example.html @@ -9,19 +9,40 @@ - + + + + + + + + + + + + + diff --git a/modules/content.js b/modules/content.js index 99576dc5a..fe3c4e258 100644 --- a/modules/content.js +++ b/modules/content.js @@ -179,10 +179,15 @@ var content = (function(content) { var workingBlock = codex.content.currentNode, newBlockContent = blockData.block, blockType = blockData.type, + cover = blockData.cover, isStretched = blockData.stretched; var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched); + if (cover === true) { + newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE); + } + if (workingBlock) { codex.core.insertAfter(workingBlock, newBlock); diff --git a/modules/renderer.js b/modules/renderer.js index acd8f8e0d..de26162bc 100644 --- a/modules/renderer.js +++ b/modules/renderer.js @@ -129,7 +129,8 @@ var renderer = (function(renderer) { renderer.createBlockFromData = function (blockData) { /** New parser */ - var pluginName = blockData.type; + var pluginName = blockData.type, + cover = blockData.cover; /** Get first key of object that stores plugin name */ // for (var pluginName in blockData) break; @@ -148,9 +149,6 @@ var renderer = (function(renderer) { /** New Parser */ var block = codex.tools[pluginName].render(blockData.data); - /** Fire the render method with data */ - // var block = codex.tools[pluginName].render(blockData[pluginName]); - /** is first-level block stretched */ var stretched = codex.tools[pluginName].isStretched || false; @@ -158,7 +156,8 @@ var renderer = (function(renderer) { return { type : pluginName, block : block, - stretched : stretched + stretched : stretched, + cover : cover }; }; diff --git a/plugins.js b/plugins.js new file mode 100644 index 000000000..0db744c46 --- /dev/null +++ b/plugins.js @@ -0,0 +1,2247 @@ +var tools = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + /** + * @author Khaydarov Murod + * murod.haydarov@gmail.com + */ + + var tools = function (tools) { + + tools.paragraph = __webpack_require__(18); + tools.header = __webpack_require__(19); + tools.code = __webpack_require__(20); + tools.link = __webpack_require__(21); + tools.list = __webpack_require__(22); + tools.quote = __webpack_require__(23); + tools.image = __webpack_require__(24); + tools.paste = __webpack_require__(25); + tools.twitter = __webpack_require__(26); + tools.instagram = __webpack_require__(27); + + return tools; + }({}); + + module.exports = tools; + +/***/ }, +/* 1 */, +/* 2 */, +/* 3 */, +/* 4 */, +/* 5 */, +/* 6 */, +/* 7 */, +/* 8 */, +/* 9 */, +/* 10 */, +/* 11 */, +/* 12 */, +/* 13 */, +/* 14 */, +/* 15 */, +/* 16 */, +/* 17 */, +/* 18 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Paragraph Plugin\ + * Creates P tag and adds content to this tag + */ + // var tools = require('./../plugins'); + + var paragraphTool = { + + /** + * Make initial header block + * @param {object} JSON with block data + * @return {Element} element to append + */ + make: function make(data) { + + var tag = document.createElement('DIV'); + + tag.classList.add('ce-paragraph'); + + if (data && data.text) { + tag.innerHTML = data.text; + } + + tag.contentEditable = true; + + /** + * if plugin need to add placeholder + * tag.setAttribute('data-placeholder', 'placehoder'); + */ + + /** + * @uses Paste tool callback. + * Function analyzes pasted data + * If pasted URL from instagram, twitter or Image + * it renders via Social widgets content or uploads image and uses Image tool to render + */ + tag.addEventListener('paste', tools.paste.callbacks.pasted, false); + + return tag; + }, + + /** + * Method to render HTML block from JSON + */ + render: function render(data) { + + return paragraphTool.make(data); + }, + + /** + * Method to extract JSON data from HTML block + */ + save: function save(blockContent) { + + var data = { + text: null, + format: "html", + introText: '<>' + }; + + data.text = blockContent.innerHTML; + + return data; + } + + }; + + /** + * Now plugin is ready. + * Add it to redactor tools + */ + module.exports = { + + type: 'paragraph', + iconClassname: 'ce-icon-paragraph', + make: paragraphTool.make, + appendCallback: null, + settings: null, + render: paragraphTool.render, + save: paragraphTool.save, + displayInToolbox: false, + enableLineBreaks: false, + allowedToPaste: true + + }; + +/***/ }, +/* 19 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Example of making plugin + * H e a d e r + */ + var headerTool = { + + /** + * Make initial header block + * @param {object} JSON with block data + * @return {Element} element to append + */ + make: function make(data) { + + var availableTypes = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'], + tag; + + if (data && data.type && availableTypes.includes(data.type)) { + + tag = document.createElement(data.type); + + /** + * Save header type in data-attr. + * We need it in save method to extract type from HTML to JSON + */ + tag.dataset.headerData = data.type; + } else { + + tag = document.createElement('H2'); + tag.dataset.headerData = 'H2'; + } + + if (data && data.text) { + tag.textContent = data.text; + } + + tag.classList.add('ce-header'); + tag.setAttribute('data-placeholder', 'Heading'); + tag.contentEditable = true; + + return tag; + }, + + /** + * Method to render HTML block from JSON + */ + render: function render(data) { + + return headerTool.make(data); + }, + + /** + * Method to extract JSON data from HTML block + */ + save: function save(blockContent) { + + var data = { + "heading-styles": blockContent.dataset.headerData, + format: "html", + text: null + + }; + + data.text = blockContent.textContent; + + return data; + }, + + /** + * Block appending callback + */ + appendCallback: function appendCallback(argument) { + + console.log('header appended...'); + }, + + /** + * Settings panel content + * - - - - - - - - - - - - - + * | настройки H1 H2 H3 | + * - - - - - - - - - - - - - + * @return {Element} element contains all settings + */ + makeSettings: function makeSettings() { + + var holder = document.createElement('DIV'), + types = { + H2: 'Заголовок раздела', + H3: 'Подзаголовок', + H4: 'Заголовок 3-его уровня' + }, + selectTypeButton; + + /** Add holder classname */ + holder.className = 'ce_plugin_header--settings'; + + /** Now add type selectors */ + for (var type in types) { + + selectTypeButton = document.createElement('SPAN'); + + selectTypeButton.textContent = types[type]; + selectTypeButton.className = 'ce_plugin_header--select_button'; + + this.addSelectTypeClickListener(selectTypeButton, type); + + holder.appendChild(selectTypeButton); + } + + return holder; + }, + + /** + * Binds click event to passed button + */ + addSelectTypeClickListener: function addSelectTypeClickListener(el, type) { + + el.addEventListener('click', function () { + + headerTool.selectTypeClicked(type); + }, false); + }, + + /** + * Replaces old header with new type + * @params {string} type - new header tagName: H1—H6 + */ + selectTypeClicked: function selectTypeClicked(type) { + + var old_header, new_header; + + /** Now current header stored as a currentNode */ + old_header = codex.content.currentNode.querySelector('[contentEditable]'); + + /** Making new header */ + new_header = document.createElement(type); + + new_header.innerHTML = old_header.innerHTML; + new_header.contentEditable = true; + new_header.setAttribute('data-placeholder', 'Heading'); + new_header.classList.add('ce-header'); + + new_header.dataset.headerData = type; + + codex.content.switchBlock(old_header, new_header, 'header'); + + /** Close settings after replacing */ + codex.toolbar.settings.close(); + } + + }; + + /** + * Now plugin is ready. + * Add it to redactor tools + */ + module.exports = { + + type: 'header', + iconClassname: 'ce-icon-header', + make: headerTool.make, + appendCallback: headerTool.appendCallback, + settings: headerTool.makeSettings(), + render: headerTool.render, + save: headerTool.save, + displayInToolbox: true, + enableLineBreaks: false + + }; + +/***/ }, +/* 20 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Code Plugin\ + * Creates code tag and adds content to this tag + */ + var codeTool = { + + baseClass: "ce-code", + + /** + * Make initial header block + * @param {object} JSON with block data + * @return {Element} element to append + */ + make: function make(data) { + + var tag = document.createElement('code'); + + tag.classList.add(codeTool.baseClass); + + if (data && data.text) { + tag.innerHTML = data.text; + } + + tag.contentEditable = true; + + return tag; + }, + + /** + * Method to render HTML block from JSON + */ + render: function render(data) { + + return codeTool.make(data); + }, + + /** + * Method to extract JSON data from HTML block + */ + save: function save(blockContent) { + + var data = { + text: null + }; + + data.text = blockContent.innerHTML; + + return data; + } + + }; + + /** + * Now plugin is ready. + * Add it to redactor tools + */ + module.exports = { + + type: 'code', + iconClassname: 'ce-icon-code', + make: codeTool.make, + appendCallback: null, + settings: null, + render: codeTool.render, + save: codeTool.save, + displayInToolbox: true, + enableLineBreaks: true + + }; + +/***/ }, +/* 21 */ +/***/ function(module, exports) { + + "use strict"; + + /** + * Created by nostr on 29.06.16. + */ + + /** + * Link tool plugin + */ + var linkTool = { + + defaultText: 'Insert link here ...', + ENTER_KEY: 13, + + currentBlock: null, + currentInput: null, + elementClasses: { + link: "tool-link-link", + image: "tool-link-image", + title: "tool-link-title", + description: "tool-link-description", + loader: "tool-link-loader", + error: "tool-link-error" + }, + + /** + * Make initial header block + * @param {object} JSON with block data + * @return {Element} element to append + */ + makeNewBlock: function makeNewBlock(data) { + + var wrapper = linkTool.ui.mainBlock(), + tag = linkTool.ui.input(); + + linkTool.currentInput = tag; + + wrapper.appendChild(tag); + + wrapper.classList.add('ce-link'); + /** + * Bind callbacks + **/ + tag.addEventListener('paste', linkTool.blockPasteCallback, false); + tag.addEventListener('keydown', linkTool.blockKeyDownCallback, false); + + return wrapper; + }, + + /** + * Method to render HTML block from JSON + */ + render: function render(json) { + + var block = linkTool.ui.mainBlock(), + tag = linkTool.ui.make(json); + + block.classList.add('ce-link'); + block.appendChild(tag); + + return block; + }, + + /** + * Method to extract JSON data from HTML block + */ + save: function save(blockContent) { + + var linkElement = linkTool.elementClasses.link; + + var data = { + url: blockContent.querySelector("." + linkElement).href, + shortLink: blockContent.querySelector("." + linkElement).textContent, + image: blockContent.querySelector("." + linkTool.elementClasses.image).src, + title: blockContent.querySelector("." + linkTool.elementClasses.title).textContent, + description: blockContent.querySelector("." + linkTool.elementClasses.description).textContent + }; + + return data; + }, + + blockPasteCallback: function blockPasteCallback(event) { + + var clipboardData = event.clipboardData || window.clipboardData, + pastedData = clipboardData.getData('Text'), + block = event.target.parentNode; + + linkTool.renderLink(pastedData, block); + + event.stopPropagation(); + }, + + blockKeyDownCallback: function blockKeyDownCallback(event) { + + var inputTag = event.target, + block = inputTag.parentNode, + url; + + if (block.classList.contains(linkTool.elementClasses.error)) { + block.classList.remove(linkTool.elementClasses.error); + } + + if (event.keyCode == linkTool.ENTER_KEY) { + + url = inputTag.value; + + linkTool.renderLink(url, block); + + event.preventDefault(); + } + }, + + /** + * @todo move request-url to accepted settings + */ + renderLink: function renderLink(url, block) { + + Promise.resolve().then(function () { + return linkTool.urlify(url); + }).then(function (url) { + + /* Show loader gif **/ + block.classList.add(linkTool.elementClasses.loader); + + return fetch('/club/linkInfo?url=' + encodeURI(url)); + }).then(function (response) { + + if (response.status == "200") { + + return response.json(); + } else { + + return Error("Invalid response status: %o", response); + } + }).then(function (json) { + console.log(json); + linkTool.composeLinkPreview(json, block); + }).catch(function (error) { + + /* Hide loader gif **/ + block.classList.remove(linkTool.elementClasses.loader); + + block.classList.add(linkTool.elementClasses.error); + + codex.core.log('Error while doing things with link paste: %o', 'error', error); + }); + }, + + urlify: function urlify(text) { + + var urlRegex = /(https?:\/\/\S+)/g; + + var links = text.match(urlRegex); + + if (links) { + return links[0]; + } + + return Promise.reject(Error("Url is not matched")); + }, + + composeLinkPreview: function composeLinkPreview(json, currentBlock) { + + if (json == {}) { + + return; + } + + var previewBlock = linkTool.ui.make(json); + + linkTool.currentInput.remove(); + + currentBlock.appendChild(previewBlock); + + currentBlock.classList.remove(linkTool.elementClasses.loader); + } + + }; + + linkTool.ui = { + + make: function make(json) { + + var wrapper = this.wrapper(), + siteImage = this.image(json.image, linkTool.elementClasses.image), + siteTitle = this.title(json.title), + siteDescription = this.description(json.description), + siteLink = this.link(json.url, json.url); + + wrapper.appendChild(siteImage); + wrapper.appendChild(siteTitle); + wrapper.appendChild(siteLink); + wrapper.appendChild(siteDescription); + + siteTitle.contentEditable = true; + siteDescription.contentEditable = true; + + return wrapper; + }, + + mainBlock: function mainBlock() { + + var wrapper = document.createElement('div'); + + wrapper.classList += "ceditor-tool-link"; + + return wrapper; + }, + + input: function input() { + + var inputTag = document.createElement('input'); + + inputTag.classList += "ceditor-tool-link-input"; + + inputTag.placeholder = linkTool.defaultText; + + inputTag.contentEditable = false; + + return inputTag; + }, + + wrapper: function wrapper() { + + var wrapper = document.createElement('div'); + + wrapper.className += 'tool-link-panel clearfix'; + + return wrapper; + }, + + image: function image(imageSrc, imageClass) { + + var imageTag = document.createElement('img'); + + imageTag.classList += imageClass; + + imageTag.setAttribute('src', imageSrc); + + return imageTag; + }, + + link: function link(linkUrl, linkText) { + + var linkTag = document.createElement('a'); + + linkTag.classList += linkTool.elementClasses.link; + + linkTag.href = linkUrl; + + linkTag.target = "_blank"; + + linkTag.innerText = linkText; + + return linkTag; + }, + + title: function title(titleText) { + + var titleTag = document.createElement('div'); + + titleTag.classList.add("tool-link-content", linkTool.elementClasses.title); + + titleTag.innerHTML = titleText; + + return titleTag; + }, + + description: function description(descriptionText) { + + var descriptionTag = document.createElement('div'); + + descriptionTag.classList.add("tool-link-content", linkTool.elementClasses.description); + + descriptionTag.innerHTML = descriptionText; + + return descriptionTag; + } + + }; + + module.exports = { + + type: 'link', + iconClassname: 'ce-icon-link', + make: linkTool.makeNewBlock, + appendCallback: linkTool.appendCallback, + render: linkTool.render, + save: linkTool.save, + displayInToolbox: true, + enableLineBreaks: true + + }; + +/***/ }, +/* 22 */ +/***/ function(module, exports) { + + "use strict"; + + /** + * Code Plugin\ + * Creates code tag and adds content to this tag + */ + var listTool = { + + baseClass: "tool-list", + elementClasses: { + li: "tool-list-li" + }, + + /** + * Make initial header block + * @param {object} JSON with block data + * @return {Element} element to append + */ + make: function make() { + + var tag = listTool.ui.make(), + li = listTool.ui.block("li", "tool-link-li"); + + var br = document.createElement("br"); + + li.appendChild(br); + tag.appendChild(li); + + tag.classList.add('ce-list'); + + return tag; + }, + + /** + * Method to render HTML block from JSON + */ + render: function render(data) { + + var type = data.type == 'ordered' ? 'OL' : 'UL', + tag = listTool.ui.make(type); + + tag.classList.add('ce-list'); + + data.items.forEach(function (element, index, array) { + + var newLi = listTool.ui.block("li", listTool.elementClasses.li); + + newLi.innerHTML = element; + + tag.dataset.type = data.type; + tag.appendChild(newLi); + }); + + return tag; + }, + + /** + * Method to extract JSON data from HTML block + */ + save: function save(blockContent) { + + var data = { + type: null, + items: [] + }; + + for (var index = 0; index < blockContent.childNodes.length; index++) { + data.items[index] = blockContent.childNodes[index].textContent; + }data.type = blockContent.dataset.type; + + return data; + }, + + makeSettings: function makeSettings(data) { + + var holder = document.createElement('DIV'), + selectTypeButton; + + /** Add holder classname */ + holder.className = 'ce_plugin_list--settings'; + + var orderedButton = listTool.ui.button("ordered"), + unorderedButton = listTool.ui.button("unordered"); + + orderedButton.addEventListener('click', function (event) { + listTool.changeBlockStyle(event, 'ol'); + codex.toolbar.settings.close(); + }); + + unorderedButton.addEventListener('click', function (event) { + listTool.changeBlockStyle(event, 'ul'); + codex.toolbar.settings.close(); + }); + + holder.appendChild(orderedButton); + holder.appendChild(unorderedButton); + + return holder; + }, + + changeBlockStyle: function changeBlockStyle(event, blockType) { + + var currentBlock = codex.content.currentNode, + newEditable = listTool.ui.make(blockType), + oldEditable = currentBlock.querySelector("[contenteditable]"); + + newEditable.dataset.type = blockType; + newEditable.innerHTML = oldEditable.innerHTML; + newEditable.classList.add('ce-list'); + + codex.content.switchBlock(currentBlock, newEditable, 'list'); + } + + }; + + listTool.ui = { + + make: function make(blockType) { + + var wrapper = this.block(blockType || 'UL', listTool.baseClass); + + wrapper.dataset.type = 'ul'; + wrapper.contentEditable = true; + + return wrapper; + }, + + block: function block(blockType, blockClass) { + + var block = document.createElement(blockType); + + if (blockClass) block.classList.add(blockClass); + + return block; + }, + + button: function button(buttonType) { + + var types = { + unordered: 'Обычный список', + ordered: 'Нумерованный список' + }, + button = document.createElement('SPAN'); + + button.innerHTML = types[buttonType]; + + button.className = 'ce_plugin_list--select_button'; + + return button; + } + }; + + /** + * Now plugin is ready. + * Add it to redactor tools + */ + module.exports = { + + type: 'list', + iconClassname: 'ce-icon-list-bullet', + make: listTool.make, + appendCallback: null, + settings: listTool.makeSettings(), + render: listTool.render, + save: listTool.save, + displayInToolbox: true, + enableLineBreaks: true + + }; + +/***/ }, +/* 23 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Codex Team + * @author Khaydarov Murod + */ + + var quoteTools = { + + /** Default path to redactors images */ + path: '/upload/redactor_images/', + + /** + * Default quote style + */ + defaultStyle: 'withPhoto', + + /** + * Make Quote from JSON datasets + */ + makeBlockToAppend: function makeBlockToAppend(data) { + + var tag; + + if (data && data.size) { + + data.style = 'withPhoto'; + + switch (data.style) { + case 'simple': + tag = quoteTools.makeSimpleQuote(data); + break; + case 'withCaption': + tag = quoteTools.makeQuoteWithCaption(data); + break; + case 'withPhoto': + tag = quoteTools.makeQuoteWithPhoto(data); + break; + } + } else { + + var settings = { + style: 'withPhoto', + text: '', + author: '', + job: '', + photo: '' + }; + + tag = quoteTools.makeQuoteWithPhoto(settings); + } + + return tag; + }, + + render: function render(data) { + return quoteTools.makeBlockToAppend(data); + }, + + save: function save(blockContent) { + + /** + * Extracts JSON quote data from HTML block + * @param {Text} text, {Text} author, {Object} photo + */ + var parsedblock = quoteTools.parseBlockQuote(blockContent); + data = { + style: parsedblock.style, + text: parsedblock.text, + author: parsedblock.author, + job: parsedblock.job, + photo: parsedblock.photo, + "format": "html", + "cite": parsedblock.author, + "size": "small" + }; + + return data; + }, + + makeSettings: function makeSettings(data) { + + var holder = document.createElement('DIV'), + types = { + simple: 'Простая цитата', + withCaption: 'Цитата с подписью', + withPhoto: 'Цитата с фото и ФИО' + }, + selectTypeButton; + + /** Add holder classname */ + holder.className = quoteTools.styles.settings.holder; + + /** Now add type selectors */ + for (var type in types) { + + selectTypeButton = document.createElement('SPAN'); + + selectTypeButton.textContent = types[type]; + selectTypeButton.className = quoteTools.styles.settings.buttons; + + selectTypeButton.dataset.style = type; + + if (type == quoteTools.defaultStyle) { + selectTypeButton.classList.add(quoteTools.styles.settings.selectedType); + } + + // var quoteStyle = quoteTools.selectTypeQuoteStyle(type); + + selectTypeButton.addEventListener('click', quoteTools.changeStyleClicked, false); + // quoteTools.addSelectTypeClickListener(selectTypeButton, quoteStyle); + + holder.appendChild(selectTypeButton); + } + + return holder; + }, + + changeStyleClicked: function changeStyleClicked() { + + var changeStyleButton = this, + quote = codex.content.currentNode.querySelector('.' + quoteTools.styles.ce_quote), + newStyle = changeStyleButton.dataset.style, + styleSelectors = this.parentNode.childNodes; + + quote.dataset.quoteStyle = newStyle; + + /** + * Mark selected style button + */ + for (var i = styleSelectors.length - 1; i >= 0; i--) { + styleSelectors[i].classList.remove(quoteTools.styles.settings.selectedType); + } + + this.classList.add(quoteTools.styles.settings.selectedType); + }, + + /** + * @deprecated + */ + selectTypeQuoteStyle: function selectTypeQuoteStyle(type) { + + /** + * Choose Quote style to replace + */ + switch (type) { + case 'simple': + quoteStyleFunction = quoteTools.makeSimpleQuote; + break; + case 'withCaption': + quoteStyleFunction = quoteTools.makeQuoteWithCaption; + break; + case 'withPhoto': + quoteStyleFunction = quoteTools.makeQuoteWithPhoto; + break; + } + + return quoteStyleFunction; + }, + + /** + * @deprecated + */ + addSelectTypeClickListener: function addSelectTypeClickListener(el, quoteStyle) { + + el.addEventListener('click', function () { + + /** + * Parsing currentNode to JSON. + */ + var parsedOldQuote = quoteTools.parseBlockQuote(), + newStyledQuote = quoteStyle(parsedOldQuote); + + var wrapper = codex.content.composeNewBlock(newStyledQuote, 'quote'); + wrapper.appendChild(newStyledQuote); + + codex.content.switchBlock(codex.content.currentNode, newStyledQuote, 'quote'); + + /** Close settings after replacing */ + codex.toolbar.settings.close(); + }, false); + }, + + /** + * @deprecated + */ + makeSimpleQuote: function makeSimpleQuote(data) { + + var wrapper = quoteTools.ui.makeBlock('BLOCKQUOTE', [quoteTools.styles.simple.text, quoteTools.styles.quoteText]); + + wrapper.innerHTML = data.text || ''; + + wrapper.dataset.quoteStyle = 'simple'; + wrapper.classList.add(quoteTools.styles.ce_quote); + wrapper.contentEditable = 'true'; + + return wrapper; + }, + + /** + * @deprecated + */ + makeQuoteWithCaption: function makeQuoteWithCaption(data) { + + var wrapper = quoteTools.ui.blockquote(), + text = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withCaption.blockquote, quoteTools.styles.quoteText]), + author = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withCaption.author, quoteTools.styles.quoteAuthor]); + + /* make text block ontentEditable */ + text.contentEditable = 'true'; + + text.innerHTML = data.text; + + /* make Author contentEditable */ + author.contentEditable = 'true'; + + author.textContent = data.cite; + + /* Appending created components */ + wrapper.dataset.quoteStyle = 'withCaption'; + wrapper.classList.add(quoteTools.styles.ce_quote); + + wrapper.appendChild(text); + wrapper.appendChild(author); + + return wrapper; + }, + + makeQuoteWithPhoto: function makeQuoteWithPhoto(data) { + + var wrapper = quoteTools.ui.blockquote(), + photo = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.photo]), + author = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.author, quoteTools.styles.quoteAuthor]), + job = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.job, quoteTools.styles.authorsJob]), + quote = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.quote, quoteTools.styles.quoteText]); + + /* Default Image src */ + if (!data.photo) { + + var icon = quoteTools.ui.makeBlock('SPAN', ['ce-icon-picture']); + photo.appendChild(icon); + } else { + + var authorsPhoto = quoteTools.ui.img(quoteTools.styles.authorsPhoto); + authorsPhoto.src = data.photo; + + photo.classList.add(quoteTools.styles.authorsPhotoWrapper); + photo.appendChild(authorsPhoto); + } + + photo.addEventListener('click', quoteTools.fileUploadClicked, false); + + /* make author block contentEditable */ + author.contentEditable = 'true'; + author.textContent = data.cite; + + /* Author's position and job */ + job.contentEditable = 'true'; + job.textContent = data.job; + + var authorsWrapper = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.authorHolder]); + authorsWrapper.appendChild(author); + authorsWrapper.appendChild(job); + + /* make quote text contentEditable */ + quote.contentEditable = 'true'; + quote.innerHTML = data.text; + + wrapper.classList.add(quoteTools.styles.ce_quote); + wrapper.classList.add(quoteTools.styles.withPhoto.wrapper); + wrapper.dataset.quoteStyle = 'withPhoto'; + + wrapper.appendChild(quote); + wrapper.appendChild(photo); + wrapper.appendChild(authorsWrapper); + + return wrapper; + }, + + parseBlockQuote: function parseBlockQuote(block) { + + var currentNode = block || codex.content.currentNode, + photo = currentNode.getElementsByTagName('img')[0], + author = currentNode.querySelector('.' + quoteTools.styles.quoteAuthor), + job = currentNode.querySelector('.' + quoteTools.styles.authorsJob), + quote; + + /** Simple quote text placed in Blockquote tag*/ + if (currentNode.dataset.quoteStyle == 'simple') quote = currentNode.innerHTML;else quote = currentNode.querySelector('.' + quoteTools.styles.quoteText).innerHTML; + + if (job) job = job.textContent; + + if (author) author = author.textContent; + + if (photo) photo = photo.src; + + var data = { + style: currentNode.dataset.quoteStyle, + text: quote, + author: author, + job: job, + photo: photo + }; + + return data; + }, + + fileUploadClicked: function fileUploadClicked() { + + var success = quoteTools.photoUploadingCallbacks.success, + error = quoteTools.photoUploadingCallbacks.error; + + codex.transport.selectAndUpload({ + success: success, + error: error + }); + } + + }; + + quoteTools.styles = { + + ce_quote: 'ce-quote', + quoteText: 'ce_quote--text', + quoteAuthor: 'ce_quote--author', + authorsJob: 'ce_quote--job', + authorsPhoto: 'authorsPhoto', + authorsPhotoWrapper: 'authorsPhoto-wrapper', + + simple: { + text: 'quoteStyle-simple--text' + }, + + withCaption: { + blockquote: 'quoteStyle-withCaption--blockquote', + author: 'quoteStyle-withCaption--author' + }, + + withPhoto: { + photo: 'quoteStyle-withPhoto--photo', + author: 'quoteStyle-withPhoto--author', + job: 'quoteStyle-withPhoto--job', + quote: 'quoteStyle-withPhoto--quote', + wrapper: 'quoteStyle-withPhoto--wrapper', + authorHolder: 'quoteStyle-withPhoto--authorWrapper' + }, + + settings: { + holder: 'ce_plugin_quote--settings', + caption: 'ce_plugin_quote--caption', + buttons: 'ce_plugin_quote--select_button', + selectedType: 'ce-quote-settings--selected' + } + }; + + quoteTools.ui = { + + wrapper: function wrapper($classList) { + + var el = document.createElement('DIV'); + + el.classList.add($classList); + + return el; + }, + + blockquote: function blockquote() { + + var el = document.createElement('BLOCKQUOTE'); + + return el; + }, + + img: function img(attribute) { + var imageTag = document.createElement('IMG'); + imageTag.classList.add(attribute); + + return imageTag; + }, + + makeBlock: function makeBlock(tag, classList) { + + var el = document.createElement(tag); + + if (classList) { + + for (var i = 0; i < classList.length; i++) { + el.className += ' ' + classList[i]; + } + } + return el; + } + + }; + + quoteTools.photoUploadingCallbacks = { + + /** + * Success callbacks for uploaded photo. + * Replace upload icon with uploaded photo + */ + success: function success(result) { + + var parsed = JSON.parse(result), + filename = parsed.filename, + uploadImageWrapper = codex.content.currentNode.querySelector('.' + quoteTools.styles.withPhoto.photo), + authorsPhoto = quoteTools.ui.img(quoteTools.styles.authorsPhoto); + + authorsPhoto.src = quoteTools.path + 'b_' + filename; + + /** Remove icon from image wrapper */ + uploadImageWrapper.innerHTML = ''; + + /** Appending uploaded image */ + uploadImageWrapper.classList.add(quoteTools.styles.authorsPhotoWrapper); + uploadImageWrapper.appendChild(authorsPhoto); + }, + + /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ + error: function error(result) { + + console.log('Can\'t upload an image'); + codex.notifications.errorThrown(); + } + + }; + + module.exports = { + + type: 'quote', + iconClassname: 'ce-icon-quote', + make: quoteTools.makeBlockToAppend, + appendCallback: null, + settings: quoteTools.makeSettings(), + render: quoteTools.render, + save: quoteTools.save, + displayInToolbox: true, + enableLineBreaks: true, + allowedToPaste: true + + }; + +/***/ }, +/* 24 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Image plugin for codex-editor + * @author CodeX Team + * + * @version 1.1.3 + */ + var ceImage = { + + elementClasses: { + + ce_image: 'ce-image', + loading: 'ce-plugin-image__loader', + blockStretched: 'ce-block--stretched', + uploadedImage: { + centered: 'ce-plugin-image__uploaded--centered', + stretched: 'ce-plugin-image__uploaded--stretched' + }, + imageCaption: 'ce-plugin-image__caption', + imageWrapper: 'ce-plugin-image__wrapper', + formHolder: 'ce-plugin-image__holder', + uploadButton: 'ce-plugin-image__button' + + }, + + holder: null, + + /** Default path to redactors images */ + path: '/upload/redactor_images/', + + make: function make(data) { + + var holder; + + if (data) { + + if (data.isStretch !== 'true') { + holder = ceImage.ui.makeImage(data, ceImage.elementClasses.uploadedImage.centered, 'false'); + } else { + holder = ceImage.ui.makeImage(data, ceImage.elementClasses.uploadedImage.stretched, 'true'); + } + + return holder; + } else { + + holder = ceImage.ui.makeForm(); + + return holder; + } + }, + + /** + * this tool works when tool is clicked in toolbox + */ + appendCallback: function appendCallback(event) { + + /** Upload image and call success callback*/ + ceImage.uploadButtonClicked(event); + }, + + /** + * Settings panel content + * @return {Element} element contains all settings + */ + makeSettings: function makeSettings() { + + var holder = document.createElement('DIV'), + types = { + centered: 'По центру', + stretched: 'На всю ширину' + }, + selectTypeButton; + + /** Add holder classname */ + holder.className = 'ce_plugin_image--settings'; + + /** Now add type selectors */ + for (var type in types) { + + selectTypeButton = document.createElement('SPAN'); + + selectTypeButton.textContent = types[type]; + selectTypeButton.className = 'ce_plugin_image--select_button'; + + this.addSelectTypeClickListener(selectTypeButton, type); + + holder.appendChild(selectTypeButton); + } + + return holder; + }, + + addSelectTypeClickListener: function addSelectTypeClickListener(el, type) { + + el.addEventListener('click', function () { + + ceImage.selectTypeClicked(type); + }, false); + }, + + selectTypeClicked: function selectTypeClicked(type) { + + var current = codex.content.currentNode, + blockContent = current.childNodes[0], + image = ceImage.ui.getImage(current), + wrapper = current.querySelector('.' + ceImage.elementClasses.imageWrapper); + + /** Clear classList */ + current.className = ''; + image.className = ''; + + /** Add important first-level class ce_block */ + current.classList.add(codex.ui.className.BLOCK_CLASSNAME); + + if (type === 'stretched') { + + image.classList.add(ceImage.elementClasses.uploadedImage.stretched); + + blockContent.classList.add(ceImage.elementClasses.blockStretched); + + /** Setting dataset for saver */ + wrapper.dataset.stretched = true; + } else if (type === 'centered') { + + image.classList.add(ceImage.elementClasses.uploadedImage.centered); + + blockContent.classList.remove(ceImage.elementClasses.blockStretched); + + /** Setting dataset for saver */ + wrapper.dataset.stretched = false; + } + }, + + render: function render(data) { + + return this.make(data); + }, + + save: function save(block) { + + var content = block, + image = ceImage.ui.getImage(content), + caption = content.querySelector('.' + ceImage.elementClasses.imageCaption); + + var data = { + background: false, + border: false, + isStretch: content.dataset.stretched, + file: { + url: image.src, + bigUrl: null, + width: image.width, + height: image.height, + additionalData: null + }, + caption: caption.textContent, + cover: null + }; + + return data; + }, + + uploadButtonClicked: function uploadButtonClicked(event) { + + var beforeSend = ceImage.photoUploadingCallbacks.beforeSend, + success = ceImage.photoUploadingCallbacks.success, + error = ceImage.photoUploadingCallbacks.error; + + /** Define callbacks */ + codex.transport.selectAndUpload({ + beforeSend: beforeSend, + success: success, + error: error + }); + } + + }; + + ceImage.ui = { + + holder: function holder() { + + var element = document.createElement('DIV'); + + element.classList.add(ceImage.elementClasses.formHolder); + element.classList.add(ceImage.elementClasses.ce_image); + + return element; + }, + + uploadButton: function uploadButton() { + + var button = document.createElement('SPAN'); + + button.classList.add(ceImage.elementClasses.uploadButton); + + button.innerHTML = ' '; + button.innerHTML += 'Загрузить фотографию'; + + return button; + }, + + /** + * @param {string} source - file path + * @param {string} style - css class + * @return {object} image - document IMG tag + */ + image: function image(source, style) { + + var image = document.createElement('IMG'); + + image.classList.add(style); + + image.src = source; + + return image; + }, + + wrapper: function wrapper() { + + var div = document.createElement('div'); + + div.classList.add(ceImage.elementClasses.imageWrapper); + + return div; + }, + + caption: function caption() { + + var div = document.createElement('div'); + + div.classList.add(ceImage.elementClasses.imageCaption); + div.contentEditable = true; + + return div; + }, + /** + * Draws form for image upload + */ + makeForm: function makeForm() { + + var holder = ceImage.ui.holder(), + uploadButton = ceImage.ui.uploadButton(); + + holder.appendChild(uploadButton); + + uploadButton.addEventListener('click', ceImage.uploadButtonClicked, false); + + ceImage.holder = holder; + + return holder; + }, + + /** + * wraps image and caption + * @param {object} data - image information + * @param {string} imageTypeClass - plugin's style + * @param {boolean} stretched - stretched or not + * @return wrapped block with image and caption + */ + makeImage: function makeImage(data, imageTypeClass, stretched) { + + var file = data.file.url, + text = data.caption, + type = data.type, + image = ceImage.ui.image(file, imageTypeClass), + caption = ceImage.ui.caption(), + wrapper = ceImage.ui.wrapper(); + + caption.textContent = text; + + wrapper.dataset.stretched = stretched; + /** Appeding to the wrapper */ + wrapper.appendChild(image); + wrapper.appendChild(caption); + + return wrapper; + }, + + /** + * @param {HTML} data - Rendered block with image + */ + getImage: function getImage(data) { + + var image = data.querySelector('.' + ceImage.elementClasses.uploadedImage.centered) || data.querySelector('.' + ceImage.elementClasses.uploadedImage.stretched); + + return image; + }, + + /** + * wraps image and caption + * @deprecated + * @param {object} data - image information + * @return wrapped block with image and caption + */ + centeredImage: function centeredImage(data) { + + var file = data.file.url, + text = data.caption, + type = data.type, + image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.centered), + caption = ceImage.ui.caption(), + wrapper = ceImage.ui.wrapper(); + + caption.textContent = text; + + wrapper.dataset.stretched = 'false'; + + /** Appeding to the wrapper */ + wrapper.appendChild(image); + wrapper.appendChild(caption); + + return wrapper; + }, + + /** + * wraps image and caption + * @deprecated + * @param {object} data - image information + * @return stretched image + */ + stretchedImage: function stretchedImage(data) { + + var file = data.file.url, + text = data.caption, + type = data.type, + image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.stretched), + caption = ceImage.ui.caption(), + wrapper = ceImage.ui.wrapper(); + + caption.textContent = text; + + wrapper.dataset.stretched = 'true'; + /** Appeding to the wrapper */ + wrapper.appendChild(image); + wrapper.appendChild(caption); + + return wrapper; + } + + }; + + ceImage.photoUploadingCallbacks = { + + /** Before sending ajax request */ + beforeSend: function beforeSend() { + ceImage.holder.classList.add(ceImage.elementClasses.loading); + }, + + /** Photo was uploaded successfully */ + success: function success(result) { + + var parsed = JSON.parse(result), + data, + currentBlock = codex.content.currentNode, + image; + + /** + * Preparing {Object} data to draw an image + * @uses ceImage.make method + */ + data = { + background: false, + border: false, + isStretch: false, + file: { + url: ceImage.path + 'o_' + parsed.filename, + bigUrl: null, + width: null, + height: null, + additionalData: null + }, + caption: '', + cover: null + }; + + image = ceImage.make(data); + + /** + * If current block is empty, we can replace it to uploaded image + * Or insert new block + */ + codex.content.switchBlock(ceImage.holder, image, 'image'); + }, + + /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ + error: function error(result) { + console.log('Choosen file is not an image or image is corrupted'); + codex.notifications.errorThrown(); + } + + }; + + /** + * Add plugin it to redactor tools + */ + module.exports = { + + type: 'image', + iconClassname: 'ce-icon-picture', + make: ceImage.make, + appendCallback: ceImage.appendCallback, + settings: ceImage.makeSettings(), + render: ceImage.render, + save: ceImage.save, + isStretched: true, + displayInToolbox: true, + enableLineBreaks: false + + }; + +/***/ }, +/* 25 */ +/***/ function(module, exports) { + + "use strict"; + + /** + * Paste plugin. + * + * Listens on paste event and pastes content from: + * - Instagram + * - Twitter + * - VK + * - Facebook + * - Image + * - External Link + * + */ + + /** + * @protected + * + * Main tool settings. + */ + var pasteTool = {}; + + /** + * Make elements to insert or switch + * + * @uses Core codex.draw module + */ + pasteTool.ui = { + + /** + * Upload image by URL + * + * @uses codex Image tool + * @param filename + * @returns {Element} + */ + uploadedImage: function uploadedImage(filename) { + + var data = { + background: false, + border: false, + isStretch: false, + file: { + url: "upload/redactor_images/" + filename, + bigUrl: "upload/redactor_images/" + filename, + width: null, + height: null, + additionalData: "null" + }, + caption: '', + cover: null + }; + + /** Using Image plugin make method */ + var image = codex.tools.image.make(data); + + return image; + } + + }; + + /** + * + * Callbacks + */ + pasteTool.callbacks = { + + /** + * Saves data + * @param event + */ + pasted: function pasted(event) { + + var clipBoardData = event.clipboardData || window.clipboardData, + content = clipBoardData.getData('Text'); + + pasteTool.callbacks.analize(content); + }, + + /** + * Analizes pated string and calls necessary method + */ + analize: function analize(string) { + + var regexTemplates = { + image: /(?:([^:\/?#]+):)?(?:\/\/([^\/?#]*))?([^?#]*\.(?:jpe?g|gif|png))(?:\?([^#]*))?(?:#(.*))?/i, + instagram: new RegExp("http?.+instagram.com\/p?."), + twitter: new RegExp("http?.+twitter.com?.+\/"), + facebook: /https?.+facebook.+\/\d+\?/, + vk: /https?.+vk?.com\/feed\?w=wall\d+_\d+/ + }, + image = regexTemplates.image.test(string), + instagram = regexTemplates.instagram.exec(string), + twitter = regexTemplates.twitter.exec(string), + facebook = regexTemplates.facebook.test(string), + vk = regexTemplates.vk.test(string); + + if (image) { + + pasteTool.callbacks.uploadImage(string); + } else if (instagram) { + + pasteTool.callbacks.instagramMedia(instagram); + } else if (twitter) { + + pasteTool.callbacks.twitterMedia(twitter); + } else if (facebook) { + + pasteTool.callbacks.facebookMedia(string); + } else if (vk) { + + pasteTool.callbacks.vkMedia(string); + } + }, + + /** + * Direct upload + * @param url + */ + uploadImage: function uploadImage(path) { + + var ajaxUrl = location.protocol + '//' + location.hostname + ':32769', + file, + image, + current = codex.content.currentNode, + beforeSend, + success_callback; + + /** When image is uploaded to redactors folder */ + success_callback = function success_callback(data) { + + console.log(data); + return; + var file = JSON.parse(data); + image = pasteTool.ui.uploadedImage(file.filename); + codex.content.switchBlock(current, image, 'image'); + }; + + /** Before sending XMLHTTP request */ + beforeSend = function beforeSend() { + var content = current.querySelector('.ce-block__content'); + content.classList.add('ce-plugin-image__loader'); + }; + + /** Preparing data for XMLHTTP */ + var data = { + url: '/club/fetchImage', + type: "POST", + data: { + url: path + }, + beforeSend: beforeSend, + success: success_callback + }; + + codex.core.ajax(data); + }, + + /** + * callback for instagram url's + * Using instagram Embed Widgete to render + * @uses Instagram tool + * @param url + */ + instagramMedia: function instagramMedia(url) { + + var fullUrl = url.input, + data; + + data = { + instagram_url: fullUrl + }; + + codex.tools.instagram.make(data, true); + }, + + /** + * callback for tweets + * Using Twittter Widget to render + * @uses Twitter tool + * @param url + */ + twitterMedia: function twitterMedia(url) { + + var fullUrl = url.input, + tweetId, + arr, + data; + + arr = fullUrl.split('/'); + tweetId = arr.pop(); + + /** Example */ + data = { + media: true, + conversation: false, + user: { + profile_image_url: "http:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", + profile_image_url_https: "https:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", + screen_name: "Niketas", + name: "Никита Лихачёв" + }, + id: tweetId, + text: "ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\/\/t.co\/iWyOHf4xr2", + created_at: "Tue Jun 28 14:09:12 +0000 2016", + status_url: "https:\/\/twitter.com\/Niketas\/status\/747793978511101953", + caption: "Caption" + }; + + codex.tools.twitter.make(data); + } + + }; + + module.exports = { + + type: 'paste', + iconClassname: '', + prepare: pasteTool.prepare, + make: pasteTool.make, + appendCallback: null, + settings: null, + render: null, + save: pasteTool.save, + callbacks: pasteTool.callbacks, + displayInToolbox: false, + enableLineBreaks: false, + allowedToPaste: false + + }; + +/***/ }, +/* 26 */ +/***/ function(module, exports) { + + "use strict"; + + /** + * Twitter plugin + * @version 1.0.0 + */ + + var twitterTool = { + + /** + * Prepare twitter scripts + */ + prepare: function prepare() { + + var script = "//platform.twitter.com/widgets.js"; + + /** + * Load script + */ + codex.core.importScript(script, 'twitterAPI'); + }, + + make: function make(data) { + + if (!data.id) return; + + twitterTool.content.twitter(data.id); + }, + + save: function save(blockContent) { + + var data; + + data = { + media: true, + conversation: false, + user: { + profile_image_url: "http:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", + profile_image_url_https: "https:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", + screen_name: "Niketas", + name: "Никита Лихачёв" + }, + id: blockContent.dataset.tweetId, + text: "ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\/\/t.co\/iWyOHf4xr2", + created_at: "Tue Jun 28 14:09:12 +0000 2016", + status_url: "https:\/\/twitter.com\/Niketas\/status\/747793978511101953", + caption: "Caption" + }; + + return data; + }, + + render: function render(data) { + return twitterTool.make(data); + } + + }; + + twitterTool.content = { + + /** + * Twitter render method appends content after block + * @param tweetId + */ + twitter: function twitter(tweetId) { + + var tweet = twitterTool.content.twitterBlock(); + + codex.content.switchBlock(codex.content.currentNode, tweet, 'twitter'); + + var blockContent = codex.content.currentNode.childNodes[0]; + blockContent.classList.add('twitter__loader'); + + window.twttr.widgets.createTweet(tweetId, blockContent); + + setTimeout(function () { + blockContent.classList.remove('twitter__loader'); + }, 500); + + /** Remove empty DIV */ + blockContent.childNodes[0].remove(); + }, + + twitterBlock: function twitterBlock() { + var block = codex.draw.node('DIV', '', {}); + return block; + } + }; + + module.exports = { + + type: 'twitter', + iconClassname: 'ce-icon-twitter', + prepare: twitterTool.prepare, + make: twitterTool.make, + appendCallback: null, + settings: null, + render: twitterTool.render, + save: twitterTool.save, + displayInToolbox: false, + enableLineBreaks: false, + allowedToPaste: false + + }; + +/***/ }, +/* 27 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Instagram plugin + * @version 1.0.0 + */ + var instagramTool = { + + /** + * Prepare before usage + * Load important scripts to render embed + */ + prepare: function prepare() { + + var script = "//platform.instagram.com/en_US/embeds.js"; + + /** + * Load widget + */ + codex.core.importScript(script, 'instagramAPI'); + }, + + /** + * Make instagram embed via Widgets method + */ + make: function make(data, isInternal) { + + if (!data.instagram_url) return; + + var block = instagramTool.content.instagramBlock(data.instagram_url); + + if (isInternal) { + + setTimeout(function () { + + /** Render block */ + instagramTool.content.render(block); + }, 200); + } + + return block; + + if (!isInternal) { + instagramTool.content.render(block); + } + }, + + /** + * Saving JSON output. + * Upload data via ajax + */ + save: function save(blockContent) { + + var data; + + if (!blockContent) return; + + /** Example */ + data = { + instagram_url: blockContent.src + }; + + return data; + }, + + /** + * Render data + */ + render: function render(data) { + return instagramTool.make(data); + } + + }; + + instagramTool.content = { + + render: function render(content) { + + codex.content.switchBlock(codex.content.currentNode, content, 'instagram'); + + var blockContent = codex.content.currentNode.childNodes[0]; + blockContent.classList.add('instagram__loader'); + + window.instgrm.Embeds.process(); + + setTimeout(function () { + blockContent.classList.remove('instagram__loader'); + }, 500); + }, + + /** + * Drawing html content. + * + * @param url + * @returns {Element} blockquote - HTML template for Instagram Embed JS + */ + instagramBlock: function instagramBlock(url) { + + var blockquote = codex.draw.node('BLOCKQUOTE', 'instagram-media instagram', {}), + div = codex.draw.node('DIV', '', {}), + paragraph = codex.draw.node('P', 'ce-paste__instagram--p', {}), + anchor = codex.draw.node('A', '', { href: url }); + + blockquote.dataset.instgrmVersion = 4; + + paragraph.appendChild(anchor); + div.appendChild(paragraph); + blockquote.appendChild(div); + + return blockquote; + } + + }; + + module.exports = { + + type: 'instagram', + iconClassname: 'ce-icon-instagram', + prepare: instagramTool.prepare, + make: instagramTool.make, + appendCallback: null, + settings: null, + render: instagramTool.render, + save: instagramTool.save, + displayInToolbox: false, + enableLineBreaks: false, + allowedToPaste: false + + }; + +/***/ } +/******/ ]); +//# sourceMappingURL=plugins.js.map \ No newline at end of file From 0b7f33058ed7dfcf50eda232e53e9a53d9f19423 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Mon, 19 Dec 2016 19:55:29 +0300 Subject: [PATCH 02/14] upd --- example.html | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/example.html b/example.html index 9d011ef6e..a7aae2a3c 100644 --- a/example.html +++ b/example.html @@ -18,15 +18,7 @@ textareaId : "codex_area", tools : tools, data : { - items: [ - { - type : 'paragraph', - data : { - text : "The promise constructor takes one argument, a callback with two parameters, resolve and reject. Do something within the callback, perhaps async, then call resolve if everything worked, otherwise call reject.Like 'throw' in plain old JavaScript, it's customary, but not required, to reject with an Error object. The benefit of Error objects is they capture a stack trace, making debugging tools more helpful. Here's how you use that promise:", - }, - cover : true - } - ], + items: [], count: 0 } }); From 876cc23b4a32a073e78f98eac0f23ef2f62fb5ee Mon Sep 17 00:00:00 2001 From: khaydarov Date: Mon, 19 Dec 2016 20:39:20 +0300 Subject: [PATCH 03/14] fetch fixed in safari --- codex-editor.js.map | 2 +- package.json | 4 +- plugins.js | 8 +- plugins.js.map | 1 + webpack.config.js | 8 +- whatwg-fetch.js | 510 ++++++++++++++++++++++++++++++++++++++++++++ whatwg-fetch.js.map | 1 + 7 files changed, 525 insertions(+), 9 deletions(-) create mode 100644 plugins.js.map create mode 100644 whatwg-fetch.js create mode 100644 whatwg-fetch.js.map diff --git a/codex-editor.js.map b/codex-editor.js.map index dfb063556..20753b9e1 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 30a0c46f7ae52f7bc215","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","settings","tools","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","toolbar","inlineToolbar","buttons","actions","toolbox","notifications","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","core","prepare","then","ui","make","addTools","bindEvents","preparePlugins","transport","renderer","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","draw","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","callback","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","content","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","stretched","isStretched","saver","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","cover","classList","contains","push","currentNode","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","parser","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","caret","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 30a0c46f7ae52f7bc215","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","var codex = (function(codex){\n\n var init = function() {\n\n require('./modules/core');\n require('./modules/ui');\n require('./modules/transport');\n require('./modules/renderer');\n require('./modules/saver');\n require('./modules/content');\n require('./modules/toolbar/toolbar');\n require('./modules/tools');\n require('./modules/callbacks');\n require('./modules/draw');\n require('./modules/caret');\n require('./modules/notifications');\n require('./modules/parser');\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","var codex = require('./../editor');\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\ncodex.core = core;\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","var codex = require('../editor');\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 == false) {\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\ncodex.ui = ui;\nmodule.exports = codex;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","var codex = require('../editor');\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\ncodex.transport = transport;\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","var codex = require('../editor');\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\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 /** Fire the render method with data */\n // var block = codex.tools[pluginName].render(blockData[pluginName]);\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 };\n\n };\n\n return renderer;\n\n})({});\n\ncodex.renderer = renderer;\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","var codex = require('../editor');\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\ncodex.saver = saver;\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","var codex = require('../editor');\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 isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\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\ncodex.content = content;\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","var codex = require('../../editor');\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 this.opened = false;\n\n this.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\ncodex.toolbar = toolbar;\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var codex = require('../../editor');\n\nvar 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","var codex = require('../../editor');\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","var codex = require('../../editor');\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 tool,\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( 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 - 1);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( tool in codex.tools ) {\n\n nextToolIndex ++;\n\n if (!codex.tools[tool].displayInToolbox){\n break;\n }\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","var codex = require('../editor');\n\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\ncodex.tools = tools;\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var codex = require('../editor');\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 if (codex.caret.position.atStart() && !selectionLength) {\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\ncodex.callback = callbacks;\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","var codex = require('../editor');\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\ncodex.draw = draw;\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","var codex = require('../editor');\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\ncodex.caret = caret;\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","var codex = require('../editor');\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\ncodex.notifications = notifications;\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","var codex = require('../editor');\n\nvar parser = (function(parser) {\n\n parser.init = function() {\n\n };\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\nparser.init();\n\ncodex.parser = parser;\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 1b4b99a4780faf88126c","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","settings","tools","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","toolbar","inlineToolbar","buttons","actions","toolbox","notifications","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","core","prepare","then","ui","make","addTools","bindEvents","preparePlugins","transport","renderer","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","draw","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","callback","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","content","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","saver","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","parser","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","caret","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 1b4b99a4780faf88126c","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","var codex = (function(codex){\n\n var init = function() {\n\n require('./modules/core');\n require('./modules/ui');\n require('./modules/transport');\n require('./modules/renderer');\n require('./modules/saver');\n require('./modules/content');\n require('./modules/toolbar/toolbar');\n require('./modules/tools');\n require('./modules/callbacks');\n require('./modules/draw');\n require('./modules/caret');\n require('./modules/notifications');\n require('./modules/parser');\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","var codex = require('./../editor');\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\ncodex.core = core;\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","var codex = require('../editor');\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 == false) {\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\ncodex.ui = ui;\nmodule.exports = codex;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","var codex = require('../editor');\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\ncodex.transport = transport;\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","var codex = require('../editor');\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\ncodex.renderer = renderer;\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","var codex = require('../editor');\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\ncodex.saver = saver;\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","var codex = require('../editor');\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\ncodex.content = content;\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","var codex = require('../../editor');\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 this.opened = false;\n\n this.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\ncodex.toolbar = toolbar;\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var codex = require('../../editor');\n\nvar 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","var codex = require('../../editor');\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","var codex = require('../../editor');\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 tool,\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( 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 - 1);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( tool in codex.tools ) {\n\n nextToolIndex ++;\n\n if (!codex.tools[tool].displayInToolbox){\n break;\n }\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","var codex = require('../editor');\n\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\ncodex.tools = tools;\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var codex = require('../editor');\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 if (codex.caret.position.atStart() && !selectionLength) {\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\ncodex.callback = callbacks;\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","var codex = require('../editor');\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\ncodex.draw = draw;\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","var codex = require('../editor');\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\ncodex.caret = caret;\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","var codex = require('../editor');\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\ncodex.notifications = notifications;\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","var codex = require('../editor');\n\nvar parser = (function(parser) {\n\n parser.init = function() {\n\n };\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\nparser.init();\n\ncodex.parser = parser;\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file diff --git a/package.json b/package.json index 25cf020e6..3f4c32a4b 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,9 @@ }, "author": "Codex Team", "license": "ISC", - "dependencies": {}, + "dependencies": { + "whatwg-fetch": "^2.0.1" + }, "devDependencies": { "babel-core": "^6.21.0", "babel-loader": "^6.2.10", diff --git a/plugins.js b/plugins.js index 0db744c46..b45fb16c7 100644 --- a/plugins.js +++ b/plugins.js @@ -638,7 +638,7 @@ var tools = var wrapper = document.createElement('div'); - wrapper.classList += "ceditor-tool-link"; + wrapper.classList.add("ceditor-tool-link"); return wrapper; }, @@ -647,7 +647,7 @@ var tools = var inputTag = document.createElement('input'); - inputTag.classList += "ceditor-tool-link-input"; + inputTag.classList.add("ceditor-tool-link-input"); inputTag.placeholder = linkTool.defaultText; @@ -669,7 +669,7 @@ var tools = var imageTag = document.createElement('img'); - imageTag.classList += imageClass; + imageTag.classList.add(imageClass); imageTag.setAttribute('src', imageSrc); @@ -680,7 +680,7 @@ var tools = var linkTag = document.createElement('a'); - linkTag.classList += linkTool.elementClasses.link; + linkTag.classList.add(linkTool.elementClasses.link); linkTag.href = linkUrl; diff --git a/plugins.js.map b/plugins.js.map new file mode 100644 index 000000000..85089b6ef --- /dev/null +++ b/plugins.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap f3b0eedf9fd882cac43c","webpack:///./plugins/plugins.js","webpack:///./plugins/paragraph/paragraph.js","webpack:///./plugins/header/header.js","webpack:///./plugins/code/code.js","webpack:///./plugins/link/link.js","webpack:///./plugins/list/list.js","webpack:///./plugins/quote/quote.js","webpack:///./plugins/image/image.js","webpack:///./plugins/paste/paste.js","webpack:///./plugins/twitter/twitter.js","webpack:///./plugins/instagram/instagram.js"],"names":["tools","paragraph","require","header","code","link","list","quote","image","paste","twitter","instagram","module","exports","paragraphTool","make","data","tag","document","createElement","classList","add","text","innerHTML","contentEditable","addEventListener","callbacks","pasted","render","save","blockContent","format","introText","type","iconClassname","appendCallback","settings","displayInToolbox","enableLineBreaks","allowedToPaste","headerTool","availableTypes","includes","dataset","headerData","textContent","setAttribute","argument","console","log","makeSettings","holder","types","H2","H3","H4","selectTypeButton","className","addSelectTypeClickListener","appendChild","el","selectTypeClicked","old_header","new_header","codex","content","currentNode","querySelector","switchBlock","toolbar","close","codeTool","baseClass","linkTool","defaultText","ENTER_KEY","currentBlock","currentInput","elementClasses","title","description","loader","error","makeNewBlock","wrapper","ui","mainBlock","input","blockPasteCallback","blockKeyDownCallback","json","block","linkElement","url","href","shortLink","src","event","clipboardData","window","pastedData","getData","target","parentNode","renderLink","stopPropagation","inputTag","contains","remove","keyCode","value","preventDefault","Promise","resolve","then","urlify","fetch","encodeURI","response","status","Error","composeLinkPreview","catch","core","urlRegex","links","match","reject","previewBlock","siteImage","siteTitle","siteDescription","siteLink","placeholder","imageSrc","imageClass","imageTag","linkUrl","linkText","linkTag","innerText","titleText","titleTag","descriptionText","descriptionTag","listTool","li","br","items","forEach","element","index","array","newLi","childNodes","length","orderedButton","button","unorderedButton","changeBlockStyle","blockType","newEditable","oldEditable","blockClass","buttonType","unordered","ordered","quoteTools","path","defaultStyle","makeBlockToAppend","size","style","makeSimpleQuote","makeQuoteWithCaption","makeQuoteWithPhoto","author","job","photo","parsedblock","parseBlockQuote","simple","withCaption","withPhoto","styles","buttons","selectedType","changeStyleClicked","changeStyleButton","ce_quote","newStyle","styleSelectors","quoteStyle","i","selectTypeQuoteStyle","quoteStyleFunction","parsedOldQuote","newStyledQuote","composeNewBlock","makeBlock","quoteText","blockquote","quoteAuthor","cite","authorsJob","icon","authorsPhoto","img","authorsPhotoWrapper","fileUploadClicked","authorsWrapper","authorHolder","getElementsByTagName","success","photoUploadingCallbacks","transport","selectAndUpload","caption","$classList","attribute","result","parsed","JSON","parse","filename","uploadImageWrapper","notifications","errorThrown","ceImage","ce_image","loading","blockStretched","uploadedImage","centered","stretched","imageCaption","imageWrapper","formHolder","uploadButton","isStretch","makeImage","makeForm","uploadButtonClicked","current","getImage","BLOCK_CLASSNAME","background","border","file","bigUrl","width","height","additionalData","cover","beforeSend","source","div","imageTypeClass","centeredImage","stretchedImage","isStretched","pasteTool","clipBoardData","analize","string","regexTemplates","RegExp","facebook","vk","test","exec","uploadImage","instagramMedia","twitterMedia","facebookMedia","vkMedia","ajaxUrl","location","protocol","hostname","success_callback","ajax","fullUrl","instagram_url","tweetId","arr","split","pop","media","conversation","user","profile_image_url","profile_image_url_https","screen_name","name","id","created_at","status_url","prepare","twitterTool","script","importScript","tweet","twitterBlock","twttr","widgets","createTweet","setTimeout","draw","node","instagramTool","isInternal","instagramBlock","instgrm","Embeds","process","anchor","instgrmVersion"],"mappings":"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","file":"plugins.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 f3b0eedf9fd882cac43c","/**\n * @author Khaydarov Murod\n * murod.haydarov@gmail.com\n */\n\nvar tools = (function(tools) {\n\n tools.paragraph = require('./paragraph/paragraph');\n tools.header = require('./header/header');\n tools.code = require('./code/code');\n tools.link = require('./link/link');\n tools.list = require('./list/list');\n tools.quote = require('./quote/quote');\n tools.image = require('./image/image');\n tools.paste = require('./paste/paste');\n tools.twitter = require('./twitter/twitter');\n tools.instagram = require('./instagram/instagram');\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/plugins.js","/**\n* Paragraph Plugin\\\n* Creates P tag and adds content to this tag\n*/\n// var tools = require('./../plugins');\n\nvar paragraphTool = {\n\n /**\n * Make initial header block\n * @param {object} JSON with block data\n * @return {Element} element to append\n */\n make : function (data) {\n\n var tag = document.createElement('DIV');\n\n tag.classList.add('ce-paragraph');\n\n if (data && data.text) {\n tag.innerHTML = data.text;\n }\n\n tag.contentEditable = true;\n\n /**\n * if plugin need to add placeholder\n * tag.setAttribute('data-placeholder', 'placehoder');\n */\n\n /**\n * @uses Paste tool callback.\n * Function analyzes pasted data\n * If pasted URL from instagram, twitter or Image\n * it renders via Social widgets content or uploads image and uses Image tool to render\n */\n tag.addEventListener('paste', tools.paste.callbacks.pasted, false);\n\n return tag;\n\n },\n\n /**\n * Method to render HTML block from JSON\n */\n render : function (data) {\n\n return paragraphTool.make(data);\n\n },\n\n /**\n * Method to extract JSON data from HTML block\n */\n save : function (blockContent){\n\n var data = {\n text : null,\n format: \"html\",\n introText: '<>'\n };\n\n data.text = blockContent.innerHTML;\n\n return data;\n\n }\n\n};\n\n/**\n* Now plugin is ready.\n* Add it to redactor tools\n*/\nmodule.exports = {\n\n type : 'paragraph',\n iconClassname : 'ce-icon-paragraph',\n make : paragraphTool.make,\n appendCallback : null,\n settings : null,\n render : paragraphTool.render,\n save : paragraphTool.save,\n displayInToolbox : false,\n enableLineBreaks : false,\n allowedToPaste : true\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/paragraph/paragraph.js","/**\n* Example of making plugin\n* H e a d e r\n*/\nvar headerTool = {\n\n /**\n * Make initial header block\n * @param {object} JSON with block data\n * @return {Element} element to append\n */\n make : function (data) {\n\n var availableTypes = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'],\n tag;\n\n if (data && data.type && availableTypes.includes(data.type)) {\n\n tag = document.createElement( data.type );\n\n /**\n * Save header type in data-attr.\n * We need it in save method to extract type from HTML to JSON\n */\n tag.dataset.headerData = data.type;\n\n } else {\n\n tag = document.createElement( 'H2' );\n tag.dataset.headerData = 'H2';\n\n }\n\n if (data && data.text) {\n tag.textContent = data.text;\n }\n\n tag.classList.add('ce-header');\n tag.setAttribute('data-placeholder', 'Heading');\n tag.contentEditable = true;\n\n return tag;\n\n },\n\n /**\n * Method to render HTML block from JSON\n */\n render : function (data) {\n\n return headerTool.make(data);\n\n },\n\n /**\n * Method to extract JSON data from HTML block\n */\n save : function (blockContent) {\n\n var data = {\n \"heading-styles\": blockContent.dataset.headerData,\n format:\"html\",\n text : null,\n\n };\n\n data.text = blockContent.textContent;\n\n return data;\n\n },\n\n /**\n * Block appending callback\n */\n appendCallback : function (argument) {\n\n console.log('header appended...');\n\n },\n\n /**\n * Settings panel content\n * - - - - - - - - - - - - -\n * | настройки H1 H2 H3 |\n * - - - - - - - - - - - - -\n * @return {Element} element contains all settings\n */\n makeSettings : function () {\n\n var holder = document.createElement('DIV'),\n types = {\n H2: 'Заголовок раздела',\n H3: 'Подзаголовок',\n H4: 'Заголовок 3-его уровня'\n },\n selectTypeButton;\n\n /** Add holder classname */\n holder.className = 'ce_plugin_header--settings';\n\n /** Now add type selectors */\n for (var type in types){\n\n selectTypeButton = document.createElement('SPAN');\n\n selectTypeButton.textContent = types[type];\n selectTypeButton.className = 'ce_plugin_header--select_button';\n\n this.addSelectTypeClickListener(selectTypeButton, type);\n\n holder.appendChild(selectTypeButton);\n\n }\n\n return holder;\n\n },\n\n /**\n * Binds click event to passed button\n */\n addSelectTypeClickListener : function (el, type) {\n\n el.addEventListener('click', function () {\n\n headerTool.selectTypeClicked(type);\n\n }, false);\n },\n\n /**\n * Replaces old header with new type\n * @params {string} type - new header tagName: H1—H6\n */\n selectTypeClicked : function (type) {\n\n var old_header, new_header;\n\n /** Now current header stored as a currentNode */\n old_header = codex.content.currentNode.querySelector('[contentEditable]');\n\n /** Making new header */\n new_header = document.createElement(type);\n\n new_header.innerHTML = old_header.innerHTML;\n new_header.contentEditable = true;\n new_header.setAttribute('data-placeholder', 'Heading');\n new_header.classList.add('ce-header');\n\n new_header.dataset.headerData = type;\n\n codex.content.switchBlock(old_header, new_header, 'header');\n\n /** Close settings after replacing */\n codex.toolbar.settings.close();\n },\n\n};\n\n/**\n* Now plugin is ready.\n* Add it to redactor tools\n*/\nmodule.exports = {\n\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};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/header/header.js","/**\n * Code Plugin\\\n * Creates code tag and adds content to this tag\n */\nvar codeTool = {\n\n baseClass : \"ce-code\",\n\n /**\n * Make initial header block\n * @param {object} JSON with block data\n * @return {Element} element to append\n */\n make : function (data) {\n\n var tag = document.createElement('code');\n\n tag.classList.add(codeTool.baseClass);\n\n if (data && data.text) {\n tag.innerHTML = data.text;\n }\n\n tag.contentEditable = true;\n\n return tag;\n\n },\n\n /**\n * Method to render HTML block from JSON\n */\n render : function (data) {\n\n return codeTool.make(data);\n\n },\n\n /**\n * Method to extract JSON data from HTML block\n */\n save : function (blockContent){\n\n var data = {\n text : null,\n };\n\n data.text = blockContent.innerHTML;\n\n return data;\n\n },\n\n};\n\n/**\n * Now plugin is ready.\n * Add it to redactor tools\n */\nmodule.exports = {\n\n type : 'code',\n iconClassname : 'ce-icon-code',\n make : codeTool.make,\n appendCallback : null,\n settings : null,\n render : codeTool.render,\n save : codeTool.save,\n displayInToolbox : true,\n enableLineBreaks : true\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/code/code.js","/**\n * Created by nostr on 29.06.16.\n */\n\n/**\n * Link tool plugin\n */\nvar linkTool = {\n\n defaultText : 'Insert link here ...',\n ENTER_KEY : 13,\n\n currentBlock : null,\n currentInput : null,\n elementClasses : {\n link : \"tool-link-link\",\n image : \"tool-link-image\",\n title : \"tool-link-title\",\n description : \"tool-link-description\",\n loader : \"tool-link-loader\",\n error : \"tool-link-error\"\n },\n\n /**\n * Make initial header block\n * @param {object} JSON with block data\n * @return {Element} element to append\n */\n makeNewBlock : function (data) {\n\n var wrapper = linkTool.ui.mainBlock(),\n tag = linkTool.ui.input();\n\n linkTool.currentInput = tag;\n\n wrapper.appendChild(tag);\n\n wrapper.classList.add('ce-link');\n /**\n * Bind callbacks\n **/\n tag.addEventListener('paste', linkTool.blockPasteCallback, false);\n tag.addEventListener('keydown', linkTool.blockKeyDownCallback, false);\n\n return wrapper;\n\n },\n\n /**\n * Method to render HTML block from JSON\n */\n render : function (json) {\n\n var block = linkTool.ui.mainBlock(),\n tag = linkTool.ui.make(json);\n\n block.classList.add('ce-link');\n block.appendChild(tag);\n\n return block;\n\n },\n\n /**\n * Method to extract JSON data from HTML block\n */\n save : function (blockContent){\n\n var linkElement = linkTool.elementClasses.link;\n\n var data = {\n url : blockContent.querySelector(\".\" + linkElement).href,\n shortLink : blockContent.querySelector(\".\" + linkElement).textContent,\n image : blockContent.querySelector(\".\" + linkTool.elementClasses.image).src,\n title : blockContent.querySelector(\".\" + linkTool.elementClasses.title).textContent,\n description : blockContent.querySelector(\".\" + linkTool.elementClasses.description).textContent\n };\n\n return data;\n\n },\n\n blockPasteCallback : function (event) {\n\n var clipboardData = event.clipboardData || window.clipboardData,\n pastedData = clipboardData.getData('Text'),\n block = event.target.parentNode;\n\n linkTool.renderLink(pastedData, block);\n\n event.stopPropagation();\n\n },\n\n blockKeyDownCallback : function (event) {\n\n var inputTag = event.target,\n block = inputTag.parentNode,\n url;\n\n if ( block.classList.contains(linkTool.elementClasses.error) )\n {\n block.classList.remove(linkTool.elementClasses.error);\n }\n\n if (event.keyCode == linkTool.ENTER_KEY) {\n\n url = inputTag.value;\n\n linkTool.renderLink(url, block);\n\n event.preventDefault();\n\n }\n\n },\n\n /**\n * @todo move request-url to accepted settings\n */\n renderLink : function (url, block) {\n\n Promise.resolve()\n\n .then(function () {\n return linkTool.urlify(url);\n })\n\n .then(function (url) {\n\n /* Show loader gif **/\n block.classList.add(linkTool.elementClasses.loader);\n\n return fetch('/club/linkInfo?url=' + encodeURI(url));\n })\n\n .then(function (response) {\n\n if (response.status == \"200\"){\n\n return response.json();\n\n } else {\n\n return Error(\"Invalid response status: %o\", response);\n\n }\n\n })\n\n .then(function (json) {\n console.log(json);\n linkTool.composeLinkPreview(json, block);\n })\n\n .catch(function(error) {\n\n /* Hide loader gif **/\n block.classList.remove(linkTool.elementClasses.loader);\n\n block.classList.add(linkTool.elementClasses.error);\n\n codex.core.log('Error while doing things with link paste: %o', 'error', error);\n });\n\n },\n\n urlify : function (text) {\n\n var urlRegex = /(https?:\\/\\/\\S+)/g;\n\n var links = text.match(urlRegex);\n\n if (links) {\n return links[0];\n }\n\n return Promise.reject(Error(\"Url is not matched\"));\n\n },\n\n composeLinkPreview : function (json, currentBlock) {\n\n if (json == {}) {\n\n return;\n\n }\n \n var previewBlock = linkTool.ui.make(json);\n\n linkTool.currentInput.remove();\n\n currentBlock.appendChild(previewBlock);\n\n currentBlock.classList.remove(linkTool.elementClasses.loader);\n\n }\n\n};\n\nlinkTool.ui = {\n\n make : function (json) {\n\n var wrapper = this.wrapper(),\n siteImage = this.image(json.image, linkTool.elementClasses.image),\n siteTitle = this.title(json.title),\n siteDescription = this.description(json.description),\n siteLink = this.link(json.url, json.url);\n\n wrapper.appendChild(siteImage);\n wrapper.appendChild(siteTitle);\n wrapper.appendChild(siteLink);\n wrapper.appendChild(siteDescription);\n\n siteTitle.contentEditable = true;\n siteDescription.contentEditable = true;\n\n return wrapper;\n\n },\n\n mainBlock : function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.classList.add(\"ceditor-tool-link\");\n\n return wrapper;\n\n },\n\n input : function () {\n\n var inputTag = document.createElement('input');\n\n inputTag.classList.add(\"ceditor-tool-link-input\");\n\n inputTag.placeholder = linkTool.defaultText;\n\n inputTag.contentEditable = false;\n\n return inputTag;\n\n },\n\n wrapper : function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'tool-link-panel clearfix';\n\n return wrapper;\n\n },\n\n image : function (imageSrc, imageClass) {\n\n var imageTag = document.createElement('img');\n\n imageTag.classList.add(imageClass);\n\n imageTag.setAttribute('src', imageSrc);\n\n return imageTag;\n\n },\n\n link : function (linkUrl, linkText) {\n\n var linkTag = document.createElement('a');\n\n linkTag.classList.add(linkTool.elementClasses.link);\n\n linkTag.href = linkUrl;\n\n linkTag.target = \"_blank\";\n\n linkTag.innerText = linkText;\n\n return linkTag;\n\n },\n\n title : function (titleText) {\n\n var titleTag = document.createElement('div');\n\n titleTag.classList.add(\"tool-link-content\", linkTool.elementClasses.title);\n\n titleTag.innerHTML = titleText;\n\n return titleTag;\n },\n\n description : function (descriptionText) {\n\n var descriptionTag = document.createElement('div');\n\n descriptionTag.classList.add(\"tool-link-content\", linkTool.elementClasses.description);\n\n descriptionTag.innerHTML = descriptionText;\n\n return descriptionTag;\n },\n\n};\n\nmodule.exports = {\n\n type : 'link',\n iconClassname : 'ce-icon-link',\n make : linkTool.makeNewBlock,\n appendCallback : linkTool.appendCallback,\n render : linkTool.render,\n save : linkTool.save,\n displayInToolbox : true,\n enableLineBreaks : true\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/link/link.js","/**\n * Code Plugin\\\n * Creates code tag and adds content to this tag\n */\nvar listTool = {\n\n baseClass : \"tool-list\",\n elementClasses : {\n li : \"tool-list-li\"\n },\n\n /**\n * Make initial header block\n * @param {object} JSON with block data\n * @return {Element} element to append\n */\n make : function () {\n\n var tag = listTool.ui.make(),\n li = listTool.ui.block(\"li\", \"tool-link-li\");\n\n var br = document.createElement(\"br\");\n\n li.appendChild(br);\n tag.appendChild(li);\n\n tag.classList.add('ce-list');\n\n return tag;\n\n },\n\n /**\n * Method to render HTML block from JSON\n */\n render : function (data) {\n\n var type = data.type == 'ordered' ? 'OL' : 'UL',\n tag = listTool.ui.make(type);\n\n tag.classList.add('ce-list');\n\n data.items.forEach(function (element, index, array) {\n\n var newLi = listTool.ui.block(\"li\", listTool.elementClasses.li);\n\n newLi.innerHTML = element;\n\n tag.dataset.type = data.type;\n tag.appendChild(newLi);\n\n });\n\n return tag;\n\n },\n\n /**\n * Method to extract JSON data from HTML block\n */\n save : function (blockContent){\n\n var data = {\n type : null,\n items : [],\n };\n\n for(var index = 0; index < blockContent.childNodes.length; index++)\n data.items[index] = blockContent.childNodes[index].textContent;\n\n data.type = blockContent.dataset.type;\n\n return data;\n\n },\n\n makeSettings : function(data) {\n\n var holder = document.createElement('DIV'),\n selectTypeButton;\n\n /** Add holder classname */\n holder.className = 'ce_plugin_list--settings';\n\n var orderedButton = listTool.ui.button(\"ordered\"),\n unorderedButton = listTool.ui.button(\"unordered\");\n\n orderedButton.addEventListener('click', function (event) {\n listTool.changeBlockStyle(event, 'ol');\n codex.toolbar.settings.close();\n });\n\n unorderedButton.addEventListener('click', function (event) {\n listTool.changeBlockStyle(event, 'ul');\n codex.toolbar.settings.close();\n });\n\n holder.appendChild(orderedButton);\n holder.appendChild(unorderedButton);\n\n return holder;\n\n },\n\n changeBlockStyle : function (event, blockType) {\n\n var currentBlock = codex.content.currentNode,\n newEditable = listTool.ui.make(blockType),\n oldEditable = currentBlock.querySelector(\"[contenteditable]\");\n\n newEditable.dataset.type = blockType;\n newEditable.innerHTML = oldEditable.innerHTML;\n newEditable.classList.add('ce-list');\n\n codex.content.switchBlock(currentBlock, newEditable, 'list');\n },\n\n};\n\nlistTool.ui = {\n\n make : function (blockType) {\n\n var wrapper = this.block(blockType || 'UL', listTool.baseClass);\n\n wrapper.dataset.type = 'ul';\n wrapper.contentEditable = true;\n\n return wrapper;\n\n },\n\n block : function (blockType, blockClass) {\n\n var block = document.createElement(blockType);\n\n if ( blockClass ) block.classList.add(blockClass);\n\n return block;\n\n },\n\n button : function (buttonType) {\n\n var types = {\n unordered : 'Обычный список',\n ordered : 'Нумерованный список'\n },\n button = document.createElement('SPAN');\n\n button.innerHTML = types[buttonType];\n\n button.className = 'ce_plugin_list--select_button';\n\n return button;\n }\n};\n\n/**\n * Now plugin is ready.\n * Add it to redactor tools\n */\nmodule.exports = {\n\n type : 'list',\n iconClassname : 'ce-icon-list-bullet',\n make : listTool.make,\n appendCallback : null,\n settings : listTool.makeSettings(),\n render : listTool.render,\n save : listTool.save,\n displayInToolbox : true,\n enableLineBreaks : true\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/list/list.js","/**\n* Codex Team\n* @author Khaydarov Murod\n*/\n\nvar quoteTools = {\n\n /** Default path to redactors images */\n path : '/upload/redactor_images/',\n\n /**\n * Default quote style\n */\n defaultStyle : 'withPhoto',\n\n /**\n * Make Quote from JSON datasets\n */\n makeBlockToAppend : function(data) {\n\n var tag;\n\n if (data && data.size) {\n\n data.style = 'withPhoto';\n \n switch (data.style) {\n case 'simple':\n tag = quoteTools.makeSimpleQuote(data);\n break;\n case 'withCaption':\n tag = quoteTools.makeQuoteWithCaption(data);\n break;\n case 'withPhoto':\n tag = quoteTools.makeQuoteWithPhoto(data);\n break;\n }\n } else {\n\n var settings = {\n style : 'withPhoto',\n text : '',\n author : '',\n job : '',\n photo : ''\n };\n\n tag = quoteTools.makeQuoteWithPhoto(settings);\n\n }\n\n return tag;\n },\n\n render : function(data) {\n return quoteTools.makeBlockToAppend(data);\n },\n\n save : function(blockContent) {\n\n /**\n * Extracts JSON quote data from HTML block\n * @param {Text} text, {Text} author, {Object} photo\n */\n var parsedblock = quoteTools.parseBlockQuote(blockContent);\n data = {\n style : parsedblock.style,\n text : parsedblock.text,\n author : parsedblock.author,\n job : parsedblock.job,\n photo : parsedblock.photo,\n \"format\":\"html\",\n \"cite\": parsedblock.author,\n \"size\": \"small\"\n };\n\n return data;\n },\n\n makeSettings : function(data) {\n\n var holder = document.createElement('DIV'),\n types = {\n simple : 'Простая цитата',\n withCaption : 'Цитата с подписью',\n withPhoto : 'Цитата с фото и ФИО'\n },\n selectTypeButton;\n\n /** Add holder classname */\n holder.className = quoteTools.styles.settings.holder;\n\n /** Now add type selectors */\n for (var type in types){\n\n selectTypeButton = document.createElement('SPAN');\n\n selectTypeButton.textContent = types[type];\n selectTypeButton.className = quoteTools.styles.settings.buttons;\n\n selectTypeButton.dataset.style = type;\n\n if ( type == quoteTools.defaultStyle ){\n selectTypeButton.classList.add(quoteTools.styles.settings.selectedType);\n }\n\n // var quoteStyle = quoteTools.selectTypeQuoteStyle(type);\n\n selectTypeButton.addEventListener('click', quoteTools.changeStyleClicked, false);\n // quoteTools.addSelectTypeClickListener(selectTypeButton, quoteStyle);\n\n holder.appendChild(selectTypeButton);\n\n }\n\n return holder;\n\n },\n\n changeStyleClicked : function() {\n\n var changeStyleButton = this,\n quote = codex.content.currentNode.querySelector('.' + quoteTools.styles.ce_quote),\n newStyle = changeStyleButton.dataset.style,\n styleSelectors = this.parentNode.childNodes;\n\n quote.dataset.quoteStyle = newStyle;\n\n /**\n * Mark selected style button\n */\n for (var i = styleSelectors.length - 1; i >= 0; i--) {\n styleSelectors[i].classList.remove(quoteTools.styles.settings.selectedType);\n }\n\n this.classList.add(quoteTools.styles.settings.selectedType);\n\n },\n\n /**\n * @deprecated\n */\n selectTypeQuoteStyle : function(type) {\n\n /**\n * Choose Quote style to replace\n */\n switch (type) {\n case 'simple':\n quoteStyleFunction = quoteTools.makeSimpleQuote;\n break;\n case 'withCaption':\n quoteStyleFunction = quoteTools.makeQuoteWithCaption;\n break;\n case 'withPhoto':\n quoteStyleFunction = quoteTools.makeQuoteWithPhoto;\n break;\n }\n\n return quoteStyleFunction;\n\n },\n\n /**\n * @deprecated\n */\n addSelectTypeClickListener : function(el, quoteStyle) {\n\n el.addEventListener('click', function () {\n\n /**\n * Parsing currentNode to JSON.\n */\n var parsedOldQuote = quoteTools.parseBlockQuote(),\n newStyledQuote = quoteStyle(parsedOldQuote);\n\n var wrapper = codex.content.composeNewBlock(newStyledQuote, 'quote');\n wrapper.appendChild(newStyledQuote);\n\n codex.content.switchBlock(codex.content.currentNode, newStyledQuote, 'quote');\n\n /** Close settings after replacing */\n codex.toolbar.settings.close();\n\n }, false);\n\n },\n\n /**\n * @deprecated\n */\n makeSimpleQuote : function(data) {\n\n var wrapper = quoteTools.ui.makeBlock('BLOCKQUOTE', [quoteTools.styles.simple.text, quoteTools.styles.quoteText]);\n\n wrapper.innerHTML = data.text || '';\n\n wrapper.dataset.quoteStyle = 'simple';\n wrapper.classList.add(quoteTools.styles.ce_quote);\n wrapper.contentEditable = 'true';\n\n return wrapper;\n },\n\n /**\n * @deprecated\n */\n makeQuoteWithCaption : function(data) {\n\n var wrapper = quoteTools.ui.blockquote(),\n text = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withCaption.blockquote, quoteTools.styles.quoteText]),\n author = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withCaption.author, quoteTools.styles.quoteAuthor]);\n\n /* make text block ontentEditable */\n text.contentEditable = 'true';\n\n text.innerHTML = data.text;\n\n /* make Author contentEditable */\n author.contentEditable = 'true';\n\n author.textContent = data.cite;\n\n /* Appending created components */\n wrapper.dataset.quoteStyle = 'withCaption';\n wrapper.classList.add(quoteTools.styles.ce_quote);\n\n wrapper.appendChild(text);\n wrapper.appendChild(author);\n\n return wrapper;\n\n },\n\n makeQuoteWithPhoto : function(data) {\n\n var wrapper = quoteTools.ui.blockquote(),\n photo = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.photo]),\n author = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.author, quoteTools.styles.quoteAuthor]),\n job = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.job, quoteTools.styles.authorsJob]),\n quote = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.quote, quoteTools.styles.quoteText]);\n\n /* Default Image src */\n if (!data.photo) {\n\n var icon = quoteTools.ui.makeBlock('SPAN', ['ce-icon-picture']);\n photo.appendChild(icon);\n\n } else {\n\n var authorsPhoto = quoteTools.ui.img(quoteTools.styles.authorsPhoto);\n authorsPhoto.src = data.photo;\n\n photo.classList.add(quoteTools.styles.authorsPhotoWrapper);\n photo.appendChild(authorsPhoto);\n }\n\n\n photo.addEventListener('click', quoteTools.fileUploadClicked, false);\n\n /* make author block contentEditable */\n author.contentEditable = 'true';\n author.textContent = data.cite;\n\n /* Author's position and job */\n job.contentEditable = 'true';\n job.textContent = data.job;\n\n var authorsWrapper = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.authorHolder]);\n authorsWrapper.appendChild(author);\n authorsWrapper.appendChild(job);\n\n /* make quote text contentEditable */\n quote.contentEditable = 'true';\n quote.innerHTML = data.text;\n\n wrapper.classList.add(quoteTools.styles.ce_quote);\n wrapper.classList.add(quoteTools.styles.withPhoto.wrapper);\n wrapper.dataset.quoteStyle = 'withPhoto';\n\n wrapper.appendChild(quote);\n wrapper.appendChild(photo);\n wrapper.appendChild(authorsWrapper);\n\n return wrapper;\n },\n\n parseBlockQuote : function(block) {\n\n var currentNode = block || codex.content.currentNode,\n photo = currentNode.getElementsByTagName('img')[0],\n author = currentNode.querySelector('.' + quoteTools.styles.quoteAuthor),\n job = currentNode.querySelector('.' + quoteTools.styles.authorsJob),\n quote ;\n\n /** Simple quote text placed in Blockquote tag*/\n if ( currentNode.dataset.quoteStyle == 'simple' )\n quote = currentNode.innerHTML;\n else\n quote = currentNode.querySelector('.' + quoteTools.styles.quoteText).innerHTML;\n\n if (job)\n job = job.textContent;\n\n if (author)\n author = author.textContent;\n\n if (photo)\n photo = photo.src;\n\n var data = {\n style : currentNode.dataset.quoteStyle,\n text : quote,\n author : author,\n job : job,\n photo : photo,\n };\n\n return data;\n },\n\n fileUploadClicked : function() {\n\n var success = quoteTools.photoUploadingCallbacks.success,\n error = quoteTools.photoUploadingCallbacks.error;\n\n codex.transport.selectAndUpload({\n success,\n error,\n });\n\n }\n\n};\n\nquoteTools.styles = {\n\n ce_quote : 'ce-quote',\n quoteText : 'ce_quote--text',\n quoteAuthor : 'ce_quote--author',\n authorsJob : 'ce_quote--job',\n authorsPhoto : 'authorsPhoto',\n authorsPhotoWrapper : 'authorsPhoto-wrapper',\n\n simple : {\n text : 'quoteStyle-simple--text',\n },\n\n withCaption : {\n blockquote : 'quoteStyle-withCaption--blockquote',\n author : 'quoteStyle-withCaption--author',\n },\n\n withPhoto : {\n photo : 'quoteStyle-withPhoto--photo',\n author : 'quoteStyle-withPhoto--author',\n job : 'quoteStyle-withPhoto--job',\n quote : 'quoteStyle-withPhoto--quote',\n wrapper : 'quoteStyle-withPhoto--wrapper',\n authorHolder : 'quoteStyle-withPhoto--authorWrapper',\n },\n\n settings : {\n holder : 'ce_plugin_quote--settings',\n caption : 'ce_plugin_quote--caption',\n buttons : 'ce_plugin_quote--select_button',\n selectedType : 'ce-quote-settings--selected'\n },\n};\n\nquoteTools.ui = {\n\n wrapper : function($classList) {\n\n var el = document.createElement('DIV');\n\n el.classList.add($classList);\n\n return el;\n\n },\n\n blockquote : function() {\n\n var el = document.createElement('BLOCKQUOTE');\n\n return el;\n\n },\n\n img : function(attribute) {\n var imageTag = document.createElement('IMG');\n imageTag.classList.add(attribute);\n\n return imageTag;\n },\n\n makeBlock : function(tag, classList) {\n\n var el = document.createElement(tag);\n\n\n if ( classList ) {\n\n for( var i = 0; i < classList.length; i++)\n el.className += ' ' + classList[i];\n\n }\n return el;\n\n }\n\n};\n\nquoteTools.photoUploadingCallbacks = {\n\n /**\n * Success callbacks for uploaded photo.\n * Replace upload icon with uploaded photo\n */\n success : function(result) {\n\n var parsed = JSON.parse(result),\n filename = parsed.filename,\n uploadImageWrapper = codex.content.currentNode.querySelector('.' + quoteTools.styles.withPhoto.photo),\n authorsPhoto = quoteTools.ui.img(quoteTools.styles.authorsPhoto);\n\n authorsPhoto.src = quoteTools.path + 'b_' + filename;\n\n /** Remove icon from image wrapper */\n uploadImageWrapper.innerHTML = '';\n\n /** Appending uploaded image */\n uploadImageWrapper.classList.add(quoteTools.styles.authorsPhotoWrapper);\n uploadImageWrapper.appendChild(authorsPhoto);\n },\n\n /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */\n error : function(result) {\n\n console.log('Can\\'t upload an image');\n codex.notifications.errorThrown();\n\n }\n\n};\n\nmodule.exports = {\n\n type : 'quote',\n iconClassname : 'ce-icon-quote',\n make : quoteTools.makeBlockToAppend,\n appendCallback : null,\n settings : quoteTools.makeSettings(),\n render : quoteTools.render,\n save : quoteTools.save,\n displayInToolbox : true,\n enableLineBreaks : true,\n allowedToPaste : true\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/quote/quote.js","/**\n* Image plugin for codex-editor\n* @author CodeX Team \n*\n* @version 1.1.3\n*/\nvar ceImage = {\n\n elementClasses : {\n\n ce_image : 'ce-image',\n loading : 'ce-plugin-image__loader',\n blockStretched: 'ce-block--stretched',\n uploadedImage : {\n centered : 'ce-plugin-image__uploaded--centered',\n stretched : 'ce-plugin-image__uploaded--stretched',\n },\n imageCaption : 'ce-plugin-image__caption',\n imageWrapper : 'ce-plugin-image__wrapper',\n formHolder : 'ce-plugin-image__holder',\n uploadButton : 'ce-plugin-image__button',\n\n },\n\n holder : null,\n\n /** Default path to redactors images */\n path : '/upload/redactor_images/',\n\n make : function ( data ) {\n\n var holder;\n\n if (data) {\n\n if ( data.isStretch !== 'true') {\n holder = ceImage.ui.makeImage(data, ceImage.elementClasses.uploadedImage.centered, 'false');\n } else {\n holder = ceImage.ui.makeImage(data, ceImage.elementClasses.uploadedImage.stretched, 'true');\n }\n\n return holder;\n\n } else {\n\n holder = ceImage.ui.makeForm();\n\n return holder;\n }\n },\n\n /**\n * this tool works when tool is clicked in toolbox\n */\n appendCallback : function(event) {\n\n /** Upload image and call success callback*/\n ceImage.uploadButtonClicked(event);\n\n },\n\n /**\n * Settings panel content\n * @return {Element} element contains all settings\n */\n makeSettings : function () {\n\n var holder = document.createElement('DIV'),\n types = {\n centered : 'По центру',\n stretched : 'На всю ширину',\n },\n selectTypeButton;\n\n /** Add holder classname */\n holder.className = 'ce_plugin_image--settings';\n\n /** Now add type selectors */\n for (var type in types){\n\n selectTypeButton = document.createElement('SPAN');\n\n selectTypeButton.textContent = types[type];\n selectTypeButton.className = 'ce_plugin_image--select_button';\n\n this.addSelectTypeClickListener(selectTypeButton, type);\n\n holder.appendChild(selectTypeButton);\n\n }\n\n return holder;\n\n },\n\n addSelectTypeClickListener : function(el, type) {\n\n el.addEventListener('click', function() {\n\n ceImage.selectTypeClicked(type);\n\n }, false);\n\n },\n\n selectTypeClicked : function(type) {\n\n var current = codex.content.currentNode,\n blockContent = current.childNodes[0],\n image = ceImage.ui.getImage(current),\n wrapper = current.querySelector('.' + ceImage.elementClasses.imageWrapper);\n\n /** Clear classList */\n current.className = '';\n image.className = '';\n\n /** Add important first-level class ce_block */\n current.classList.add(codex.ui.className.BLOCK_CLASSNAME);\n\n if (type === 'stretched') {\n\n image.classList.add(ceImage.elementClasses.uploadedImage.stretched);\n\n blockContent.classList.add(ceImage.elementClasses.blockStretched);\n\n /** Setting dataset for saver */\n wrapper.dataset.stretched = true;\n\n } else if (type === 'centered') {\n\n image.classList.add(ceImage.elementClasses.uploadedImage.centered);\n\n blockContent.classList.remove(ceImage.elementClasses.blockStretched);\n\n /** Setting dataset for saver */\n wrapper.dataset.stretched = false;\n }\n },\n\n render : function( data ) {\n\n return this.make(data);\n },\n\n save : function ( block ) {\n\n var content = block,\n image = ceImage.ui.getImage(content),\n caption = content.querySelector('.' + ceImage.elementClasses.imageCaption);\n\n var data = {\n background : false,\n border : false,\n isStretch : content.dataset.stretched,\n file : {\n url : image.src,\n bigUrl : null,\n width : image.width,\n height : image.height,\n additionalData :null,\n },\n caption : caption.textContent,\n cover : null,\n };\n\n return data;\n },\n\n uploadButtonClicked : function(event) {\n\n var beforeSend = ceImage.photoUploadingCallbacks.beforeSend,\n success = ceImage.photoUploadingCallbacks.success,\n error = ceImage.photoUploadingCallbacks.error;\n\n /** Define callbacks */\n codex.transport.selectAndUpload({\n beforeSend,\n success,\n error,\n });\n },\n\n};\n\nceImage.ui = {\n\n holder : function(){\n\n var element = document.createElement('DIV');\n\n element.classList.add(ceImage.elementClasses.formHolder);\n element.classList.add(ceImage.elementClasses.ce_image);\n\n return element;\n },\n\n uploadButton : function(){\n\n var button = document.createElement('SPAN');\n\n button.classList.add(ceImage.elementClasses.uploadButton);\n\n button.innerHTML = ' ';\n button.innerHTML += 'Загрузить фотографию';\n\n return button;\n\n },\n\n /**\n * @param {string} source - file path\n * @param {string} style - css class\n * @return {object} image - document IMG tag\n */\n image : function(source, style) {\n\n var image = document.createElement('IMG');\n\n image.classList.add(style);\n\n image.src = source;\n\n return image;\n },\n\n wrapper : function() {\n\n var div = document.createElement('div');\n\n div.classList.add(ceImage.elementClasses.imageWrapper);\n\n return div;\n },\n\n caption : function() {\n\n var div = document.createElement('div');\n\n div.classList.add(ceImage.elementClasses.imageCaption);\n div.contentEditable = true;\n\n return div;\n },\n /**\n * Draws form for image upload\n */\n makeForm : function() {\n\n var holder = ceImage.ui.holder(),\n uploadButton = ceImage.ui.uploadButton();\n\n holder.appendChild(uploadButton);\n\n uploadButton.addEventListener('click', ceImage.uploadButtonClicked, false );\n\n ceImage.holder = holder;\n\n return holder;\n },\n\n\n /**\n * wraps image and caption\n * @param {object} data - image information\n * @param {string} imageTypeClass - plugin's style\n * @param {boolean} stretched - stretched or not\n * @return wrapped block with image and caption\n */\n makeImage : function(data, imageTypeClass, stretched) {\n\n var file = data.file.url,\n text = data.caption,\n type = data.type,\n image = ceImage.ui.image(file, imageTypeClass),\n caption = ceImage.ui.caption(),\n wrapper = ceImage.ui.wrapper();\n\n caption.textContent = text;\n\n wrapper.dataset.stretched = stretched;\n /** Appeding to the wrapper */\n wrapper.appendChild(image);\n wrapper.appendChild(caption);\n\n return wrapper;\n },\n\n /**\n * @param {HTML} data - Rendered block with image\n */\n getImage : function(data) {\n\n var image = data.querySelector('.' + ceImage.elementClasses.uploadedImage.centered) ||\n data.querySelector('.' + ceImage.elementClasses.uploadedImage.stretched);\n\n return image;\n },\n\n /**\n * wraps image and caption\n * @deprecated\n * @param {object} data - image information\n * @return wrapped block with image and caption\n */\n centeredImage : function(data) {\n\n var file = data.file.url,\n text = data.caption,\n type = data.type,\n image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.centered),\n caption = ceImage.ui.caption(),\n wrapper = ceImage.ui.wrapper();\n\n caption.textContent = text;\n\n wrapper.dataset.stretched = 'false';\n\n /** Appeding to the wrapper */\n wrapper.appendChild(image);\n wrapper.appendChild(caption);\n\n return wrapper;\n },\n\n /**\n * wraps image and caption\n * @deprecated\n * @param {object} data - image information\n * @return stretched image\n */\n stretchedImage : function(data) {\n\n var file = data.file.url,\n text = data.caption,\n type = data.type,\n image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.stretched),\n caption = ceImage.ui.caption(),\n wrapper = ceImage.ui.wrapper();\n\n caption.textContent = text;\n\n wrapper.dataset.stretched = 'true';\n /** Appeding to the wrapper */\n wrapper.appendChild(image);\n wrapper.appendChild(caption);\n\n return wrapper;\n\n }\n\n};\n\nceImage.photoUploadingCallbacks = {\n\n /** Before sending ajax request */\n beforeSend : function() {\n ceImage.holder.classList.add(ceImage.elementClasses.loading);\n },\n\n /** Photo was uploaded successfully */\n success : function(result) {\n\n var parsed = JSON.parse(result),\n data,\n currentBlock = codex.content.currentNode,\n image;\n\n /**\n * Preparing {Object} data to draw an image\n * @uses ceImage.make method\n */\n data = {\n background : false,\n border : false,\n isStretch : false,\n file : {\n url : ceImage.path + 'o_' + parsed.filename,\n bigUrl : null,\n width : null,\n height : null,\n additionalData : null,\n },\n caption : '',\n cover : null,\n };\n\n image = ceImage.make(data);\n\n /**\n * If current block is empty, we can replace it to uploaded image\n * Or insert new block\n */\n codex.content.switchBlock(ceImage.holder, image, 'image');\n },\n\n /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */\n error : function(result) {\n console.log('Choosen file is not an image or image is corrupted');\n codex.notifications.errorThrown();\n }\n\n};\n\n\n/**\n* Add plugin it to redactor tools\n*/\nmodule.exports = {\n\n type : 'image',\n iconClassname : 'ce-icon-picture',\n make : ceImage.make,\n appendCallback : ceImage.appendCallback,\n settings : ceImage.makeSettings(),\n render : ceImage.render,\n save : ceImage.save,\n isStretched : true,\n displayInToolbox : true,\n enableLineBreaks : false\n\n};\n\n\n// WEBPACK FOOTER //\n// ./plugins/image/image.js","/**\n * Paste plugin.\n *\n * Listens on paste event and pastes content from:\n * - Instagram\n * - Twitter\n * - VK\n * - Facebook\n * - Image\n * - External Link\n *\n */\n\n/**\n * @protected\n *\n * Main tool settings.\n */\nvar pasteTool = {\n\n};\n\n/**\n * Make elements to insert or switch\n *\n * @uses Core codex.draw module\n */\npasteTool.ui = {\n\n /**\n * Upload image by URL\n *\n * @uses codex Image tool\n * @param filename\n * @returns {Element}\n */\n uploadedImage : function(filename) {\n\n var data = {\n background: false,\n border: false,\n isStretch: false,\n file: {\n url: \"upload/redactor_images/\" + filename,\n bigUrl: \"upload/redactor_images/\" + filename,\n width: null,\n height: null,\n additionalData: \"null\"\n },\n caption: '',\n cover: null\n };\n\n /** Using Image plugin make method */\n var image = codex.tools.image.make(data);\n\n return image;\n\n }\n\n};\n\n\n/**\n *\n * Callbacks\n */\npasteTool.callbacks = {\n\n /**\n * Saves data\n * @param event\n */\n pasted : function(event) {\n\n var clipBoardData = event.clipboardData || window.clipboardData,\n content = clipBoardData.getData('Text');\n\n pasteTool.callbacks.analize(content);\n },\n\n /**\n * Analizes pated string and calls necessary method\n */\n analize : function(string) {\n\n var regexTemplates = {\n image : /(?:([^:\\/?#]+):)?(?:\\/\\/([^\\/?#]*))?([^?#]*\\.(?:jpe?g|gif|png))(?:\\?([^#]*))?(?:#(.*))?/i,\n instagram : new RegExp(\"http?.+instagram.com\\/p?.\"),\n twitter : new RegExp(\"http?.+twitter.com?.+\\/\"),\n facebook : /https?.+facebook.+\\/\\d+\\?/,\n vk : /https?.+vk?.com\\/feed\\?w=wall\\d+_\\d+/,\n },\n\n image = regexTemplates.image.test(string),\n instagram = regexTemplates.instagram.exec(string),\n twitter = regexTemplates.twitter.exec(string),\n facebook = regexTemplates.facebook.test(string),\n vk = regexTemplates.vk.test(string);\n\n if (image) {\n\n pasteTool.callbacks.uploadImage(string);\n\n } else if (instagram) {\n\n pasteTool.callbacks.instagramMedia(instagram);\n\n } else if (twitter) {\n\n pasteTool.callbacks.twitterMedia(twitter);\n\n } else if (facebook) {\n\n pasteTool.callbacks.facebookMedia(string);\n\n } else if (vk) {\n\n pasteTool.callbacks.vkMedia(string);\n\n }\n\n },\n\n /**\n * Direct upload\n * @param url\n */\n uploadImage : function(path) {\n\n var ajaxUrl = location.protocol + '//' + location.hostname + ':32769',\n file,\n image,\n current = codex.content.currentNode,\n beforeSend,\n success_callback;\n\n /** When image is uploaded to redactors folder */\n success_callback = function(data) {\n\n console.log(data);\n return;\n var file = JSON.parse(data);\n image = pasteTool.ui.uploadedImage(file.filename);\n codex.content.switchBlock(current, image, 'image');\n\n };\n\n /** Before sending XMLHTTP request */\n beforeSend = function() {\n var content = current.querySelector('.ce-block__content');\n content.classList.add('ce-plugin-image__loader');\n };\n\n /** Preparing data for XMLHTTP */\n var data = {\n url: '/club/fetchImage',\n type: \"POST\",\n data : {\n url: path\n },\n beforeSend : beforeSend,\n success : success_callback\n };\n\n codex.core.ajax(data);\n },\n\n /**\n * callback for instagram url's\n * Using instagram Embed Widgete to render\n * @uses Instagram tool\n * @param url\n */\n instagramMedia : function(url) {\n\n var fullUrl = url.input,\n data;\n\n\n data = {\n instagram_url: fullUrl\n };\n\n codex.tools.instagram.make(data, true);\n\n },\n\n /**\n * callback for tweets\n * Using Twittter Widget to render\n * @uses Twitter tool\n * @param url\n */\n twitterMedia : function(url) {\n\n var fullUrl = url.input,\n tweetId,\n arr,\n data;\n\n arr = fullUrl.split('/');\n tweetId = arr.pop();\n\n /** Example */\n data = {\n media:true,\n conversation:false,\n user:{\n profile_image_url:\"http:\\/\\/pbs.twimg.com\\/profile_images\\/1817165982\\/nikita-likhachev-512_normal.jpg\",\n profile_image_url_https:\"https:\\/\\/pbs.twimg.com\\/profile_images\\/1817165982\\/nikita-likhachev-512_normal.jpg\",\n screen_name:\"Niketas\",\n name:\"Никита Лихачёв\"\n },\n id: tweetId,\n text:\"ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\\/\\/t.co\\/iWyOHf4xr2\",\n created_at:\"Tue Jun 28 14:09:12 +0000 2016\",\n status_url:\"https:\\/\\/twitter.com\\/Niketas\\/status\\/747793978511101953\",\n caption:\"Caption\"\n };\n\n codex.tools.twitter.make(data);\n }\n\n};\n\nmodule.exports = {\n\n type : 'paste',\n iconClassname : '',\n prepare : pasteTool.prepare,\n make : pasteTool.make,\n appendCallback : null,\n settings : null,\n render : null,\n save : pasteTool.save,\n callbacks : pasteTool.callbacks,\n displayInToolbox : false,\n enableLineBreaks : false,\n allowedToPaste : false\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/paste/paste.js","/**\n * Twitter plugin\n * @version 1.0.0\n */\n\nvar twitterTool = {\n\n /**\n * Prepare twitter scripts\n */\n prepare : function() {\n\n var script = \"//platform.twitter.com/widgets.js\";\n\n /**\n * Load script\n */\n codex.core.importScript(script, 'twitterAPI');\n\n },\n\n make : function(data) {\n\n if (!data.id)\n return;\n\n twitterTool.content.twitter(data.id);\n },\n\n save : function(blockContent) {\n\n var data;\n\n data = {\n media:true,\n conversation:false,\n user:{\n profile_image_url:\"http:\\/\\/pbs.twimg.com\\/profile_images\\/1817165982\\/nikita-likhachev-512_normal.jpg\",\n profile_image_url_https:\"https:\\/\\/pbs.twimg.com\\/profile_images\\/1817165982\\/nikita-likhachev-512_normal.jpg\",\n screen_name:\"Niketas\",\n name:\"Никита Лихачёв\"\n },\n id: blockContent.dataset.tweetId,\n text:\"ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\\/\\/t.co\\/iWyOHf4xr2\",\n created_at:\"Tue Jun 28 14:09:12 +0000 2016\",\n status_url:\"https:\\/\\/twitter.com\\/Niketas\\/status\\/747793978511101953\",\n caption:\"Caption\"\n };\n\n return data;\n\n },\n\n render : function(data) {\n return twitterTool.make(data);\n }\n\n};\n\ntwitterTool.content = {\n\n /**\n * Twitter render method appends content after block\n * @param tweetId\n */\n twitter : function(tweetId) {\n\n var tweet = twitterTool.content.twitterBlock();\n\n codex.content.switchBlock(codex.content.currentNode, tweet, 'twitter');\n\n var blockContent = codex.content.currentNode.childNodes[0];\n blockContent.classList.add('twitter__loader');\n\n window.twttr.widgets.createTweet(tweetId, blockContent);\n\n setTimeout(function() {\n blockContent.classList.remove('twitter__loader');\n }, 500);\n\n /** Remove empty DIV */\n blockContent.childNodes[0].remove();\n\n },\n\n twitterBlock : function() {\n var block = codex.draw.node('DIV', '', {});\n return block;\n }\n};\n\nmodule.exports = {\n\n type : 'twitter',\n iconClassname : 'ce-icon-twitter',\n prepare : twitterTool.prepare,\n make : twitterTool.make,\n appendCallback : null,\n settings : null,\n render : twitterTool.render,\n save : twitterTool.save,\n displayInToolbox : false,\n enableLineBreaks : false,\n allowedToPaste : false\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/twitter/twitter.js","/**\n * Instagram plugin\n * @version 1.0.0\n */\nvar instagramTool = {\n\n /**\n * Prepare before usage\n * Load important scripts to render embed\n */\n prepare : function() {\n\n var script = \"//platform.instagram.com/en_US/embeds.js\";\n\n /**\n * Load widget\n */\n codex.core.importScript(script, 'instagramAPI');\n },\n\n /**\n * Make instagram embed via Widgets method\n */\n make : function(data, isInternal) {\n\n if (!data.instagram_url)\n return;\n\n var block = instagramTool.content.instagramBlock(data.instagram_url);\n\n if (isInternal) {\n\n setTimeout(function() {\n\n /** Render block */\n instagramTool.content.render(block);\n\n }, 200);\n }\n\n\n return block;\n\n if (!isInternal) {\n instagramTool.content.render(block);\n }\n },\n\n /**\n * Saving JSON output.\n * Upload data via ajax\n */\n save : function(blockContent) {\n\n var data;\n\n if (!blockContent)\n return;\n\n /** Example */\n data = {\n instagram_url: blockContent.src\n };\n\n return data;\n\n },\n\n /**\n * Render data\n */\n render : function(data) {\n return instagramTool.make(data);\n }\n\n};\n\ninstagramTool.content = {\n\n render : function(content) {\n\n codex.content.switchBlock(codex.content.currentNode, content, 'instagram');\n\n var blockContent = codex.content.currentNode.childNodes[0];\n blockContent.classList.add('instagram__loader');\n\n window.instgrm.Embeds.process();\n\n setTimeout(function(){\n blockContent.classList.remove('instagram__loader');\n }, 500);\n },\n\n /**\n * Drawing html content.\n *\n * @param url\n * @returns {Element} blockquote - HTML template for Instagram Embed JS\n */\n instagramBlock : function(url) {\n\n var blockquote = codex.draw.node('BLOCKQUOTE', 'instagram-media instagram', {}),\n div = codex.draw.node('DIV', '', {}),\n paragraph = codex.draw.node('P', 'ce-paste__instagram--p', {}),\n anchor = codex.draw.node('A', '', { href : url });\n\n blockquote.dataset.instgrmVersion = 4;\n\n paragraph.appendChild(anchor);\n div.appendChild(paragraph);\n blockquote.appendChild(div);\n\n return blockquote;\n\n }\n\n};\n\nmodule.exports = {\n\n type : 'instagram',\n iconClassname : 'ce-icon-instagram',\n prepare : instagramTool.prepare,\n make : instagramTool.make,\n appendCallback : null,\n settings : null,\n render : instagramTool.render,\n save : instagramTool.save,\n displayInToolbox : false,\n enableLineBreaks : false,\n allowedToPaste : false\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/instagram/instagram.js"],"sourceRoot":""} \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index c2688891f..bb0a58746 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -13,11 +13,13 @@ var ExtractTextWebpackPlugin = require('extract-text-webpack-plugin'); module.exports = { entry: { - codex: "./index" + "whatwg-fetch": "whatwg-fetch", + "codex-editor": "./index", + "plugins": "./plugins/plugins" }, output: { - filename: "./codex.editor.js", - library: ["codex", "editor"] + filename: "[name].js", + library: ["codex"] }, watch: true, diff --git a/whatwg-fetch.js b/whatwg-fetch.js new file mode 100644 index 000000000..7935e5a8f --- /dev/null +++ b/whatwg-fetch.js @@ -0,0 +1,510 @@ +var fetch = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports) { + + (function(self) { + 'use strict'; + + if (self.fetch) { + return + } + + var support = { + searchParams: 'URLSearchParams' in self, + iterable: 'Symbol' in self && 'iterator' in Symbol, + blob: 'FileReader' in self && 'Blob' in self && (function() { + try { + new Blob() + return true + } catch(e) { + return false + } + })(), + formData: 'FormData' in self, + arrayBuffer: 'ArrayBuffer' in self + } + + if (support.arrayBuffer) { + var viewClasses = [ + '[object Int8Array]', + '[object Uint8Array]', + '[object Uint8ClampedArray]', + '[object Int16Array]', + '[object Uint16Array]', + '[object Int32Array]', + '[object Uint32Array]', + '[object Float32Array]', + '[object Float64Array]' + ] + + var isDataView = function(obj) { + return obj && DataView.prototype.isPrototypeOf(obj) + } + + var isArrayBufferView = ArrayBuffer.isView || function(obj) { + return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 + } + } + + function normalizeName(name) { + if (typeof name !== 'string') { + name = String(name) + } + if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { + throw new TypeError('Invalid character in header field name') + } + return name.toLowerCase() + } + + function normalizeValue(value) { + if (typeof value !== 'string') { + value = String(value) + } + return value + } + + // Build a destructive iterator for the value list + function iteratorFor(items) { + var iterator = { + next: function() { + var value = items.shift() + return {done: value === undefined, value: value} + } + } + + if (support.iterable) { + iterator[Symbol.iterator] = function() { + return iterator + } + } + + return iterator + } + + function Headers(headers) { + this.map = {} + + if (headers instanceof Headers) { + headers.forEach(function(value, name) { + this.append(name, value) + }, this) + + } else if (headers) { + Object.getOwnPropertyNames(headers).forEach(function(name) { + this.append(name, headers[name]) + }, this) + } + } + + Headers.prototype.append = function(name, value) { + name = normalizeName(name) + value = normalizeValue(value) + var oldValue = this.map[name] + this.map[name] = oldValue ? oldValue+','+value : value + } + + Headers.prototype['delete'] = function(name) { + delete this.map[normalizeName(name)] + } + + Headers.prototype.get = function(name) { + name = normalizeName(name) + return this.has(name) ? this.map[name] : null + } + + Headers.prototype.has = function(name) { + return this.map.hasOwnProperty(normalizeName(name)) + } + + Headers.prototype.set = function(name, value) { + this.map[normalizeName(name)] = normalizeValue(value) + } + + Headers.prototype.forEach = function(callback, thisArg) { + for (var name in this.map) { + if (this.map.hasOwnProperty(name)) { + callback.call(thisArg, this.map[name], name, this) + } + } + } + + Headers.prototype.keys = function() { + var items = [] + this.forEach(function(value, name) { items.push(name) }) + return iteratorFor(items) + } + + Headers.prototype.values = function() { + var items = [] + this.forEach(function(value) { items.push(value) }) + return iteratorFor(items) + } + + Headers.prototype.entries = function() { + var items = [] + this.forEach(function(value, name) { items.push([name, value]) }) + return iteratorFor(items) + } + + if (support.iterable) { + Headers.prototype[Symbol.iterator] = Headers.prototype.entries + } + + function consumed(body) { + if (body.bodyUsed) { + return Promise.reject(new TypeError('Already read')) + } + body.bodyUsed = true + } + + function fileReaderReady(reader) { + return new Promise(function(resolve, reject) { + reader.onload = function() { + resolve(reader.result) + } + reader.onerror = function() { + reject(reader.error) + } + }) + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader() + var promise = fileReaderReady(reader) + reader.readAsArrayBuffer(blob) + return promise + } + + function readBlobAsText(blob) { + var reader = new FileReader() + var promise = fileReaderReady(reader) + reader.readAsText(blob) + return promise + } + + function readArrayBufferAsText(buf) { + var view = new Uint8Array(buf) + var chars = new Array(view.length) + + for (var i = 0; i < view.length; i++) { + chars[i] = String.fromCharCode(view[i]) + } + return chars.join('') + } + + function bufferClone(buf) { + if (buf.slice) { + return buf.slice(0) + } else { + var view = new Uint8Array(buf.byteLength) + view.set(new Uint8Array(buf)) + return view.buffer + } + } + + function Body() { + this.bodyUsed = false + + this._initBody = function(body) { + this._bodyInit = body + if (!body) { + this._bodyText = '' + } else if (typeof body === 'string') { + this._bodyText = body + } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { + this._bodyBlob = body + } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { + this._bodyFormData = body + } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { + this._bodyText = body.toString() + } else if (support.arrayBuffer && support.blob && isDataView(body)) { + this._bodyArrayBuffer = bufferClone(body.buffer) + // IE 10-11 can't handle a DataView body. + this._bodyInit = new Blob([this._bodyArrayBuffer]) + } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { + this._bodyArrayBuffer = bufferClone(body) + } else { + throw new Error('unsupported BodyInit type') + } + + if (!this.headers.get('content-type')) { + if (typeof body === 'string') { + this.headers.set('content-type', 'text/plain;charset=UTF-8') + } else if (this._bodyBlob && this._bodyBlob.type) { + this.headers.set('content-type', this._bodyBlob.type) + } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { + this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8') + } + } + } + + if (support.blob) { + this.blob = function() { + var rejected = consumed(this) + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return Promise.resolve(this._bodyBlob) + } else if (this._bodyArrayBuffer) { + return Promise.resolve(new Blob([this._bodyArrayBuffer])) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as blob') + } else { + return Promise.resolve(new Blob([this._bodyText])) + } + } + + this.arrayBuffer = function() { + if (this._bodyArrayBuffer) { + return consumed(this) || Promise.resolve(this._bodyArrayBuffer) + } else { + return this.blob().then(readBlobAsArrayBuffer) + } + } + } + + this.text = function() { + var rejected = consumed(this) + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return readBlobAsText(this._bodyBlob) + } else if (this._bodyArrayBuffer) { + return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as text') + } else { + return Promise.resolve(this._bodyText) + } + } + + if (support.formData) { + this.formData = function() { + return this.text().then(decode) + } + } + + this.json = function() { + return this.text().then(JSON.parse) + } + + return this + } + + // HTTP methods whose capitalization should be normalized + var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'] + + function normalizeMethod(method) { + var upcased = method.toUpperCase() + return (methods.indexOf(upcased) > -1) ? upcased : method + } + + function Request(input, options) { + options = options || {} + var body = options.body + + if (typeof input === 'string') { + this.url = input + } else { + if (input.bodyUsed) { + throw new TypeError('Already read') + } + this.url = input.url + this.credentials = input.credentials + if (!options.headers) { + this.headers = new Headers(input.headers) + } + this.method = input.method + this.mode = input.mode + if (!body && input._bodyInit != null) { + body = input._bodyInit + input.bodyUsed = true + } + } + + this.credentials = options.credentials || this.credentials || 'omit' + if (options.headers || !this.headers) { + this.headers = new Headers(options.headers) + } + this.method = normalizeMethod(options.method || this.method || 'GET') + this.mode = options.mode || this.mode || null + this.referrer = null + + if ((this.method === 'GET' || this.method === 'HEAD') && body) { + throw new TypeError('Body not allowed for GET or HEAD requests') + } + this._initBody(body) + } + + Request.prototype.clone = function() { + return new Request(this, { body: this._bodyInit }) + } + + function decode(body) { + var form = new FormData() + body.trim().split('&').forEach(function(bytes) { + if (bytes) { + var split = bytes.split('=') + var name = split.shift().replace(/\+/g, ' ') + var value = split.join('=').replace(/\+/g, ' ') + form.append(decodeURIComponent(name), decodeURIComponent(value)) + } + }) + return form + } + + function parseHeaders(rawHeaders) { + var headers = new Headers() + rawHeaders.split('\r\n').forEach(function(line) { + var parts = line.split(':') + var key = parts.shift().trim() + if (key) { + var value = parts.join(':').trim() + headers.append(key, value) + } + }) + return headers + } + + Body.call(Request.prototype) + + function Response(bodyInit, options) { + if (!options) { + options = {} + } + + this.type = 'default' + this.status = 'status' in options ? options.status : 200 + this.ok = this.status >= 200 && this.status < 300 + this.statusText = 'statusText' in options ? options.statusText : 'OK' + this.headers = new Headers(options.headers) + this.url = options.url || '' + this._initBody(bodyInit) + } + + Body.call(Response.prototype) + + Response.prototype.clone = function() { + return new Response(this._bodyInit, { + status: this.status, + statusText: this.statusText, + headers: new Headers(this.headers), + url: this.url + }) + } + + Response.error = function() { + var response = new Response(null, {status: 0, statusText: ''}) + response.type = 'error' + return response + } + + var redirectStatuses = [301, 302, 303, 307, 308] + + Response.redirect = function(url, status) { + if (redirectStatuses.indexOf(status) === -1) { + throw new RangeError('Invalid status code') + } + + return new Response(null, {status: status, headers: {location: url}}) + } + + self.Headers = Headers + self.Request = Request + self.Response = Response + + self.fetch = function(input, init) { + return new Promise(function(resolve, reject) { + var request = new Request(input, init) + var xhr = new XMLHttpRequest() + + xhr.onload = function() { + var options = { + status: xhr.status, + statusText: xhr.statusText, + headers: parseHeaders(xhr.getAllResponseHeaders() || '') + } + options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL') + var body = 'response' in xhr ? xhr.response : xhr.responseText + resolve(new Response(body, options)) + } + + xhr.onerror = function() { + reject(new TypeError('Network request failed')) + } + + xhr.ontimeout = function() { + reject(new TypeError('Network request failed')) + } + + xhr.open(request.method, request.url, true) + + if (request.credentials === 'include') { + xhr.withCredentials = true + } + + if ('responseType' in xhr && support.blob) { + xhr.responseType = 'blob' + } + + request.headers.forEach(function(value, name) { + xhr.setRequestHeader(name, value) + }) + + xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit) + }) + } + self.fetch.polyfill = true + })(typeof self !== 'undefined' ? self : this); + + +/***/ } +/******/ ]); +//# sourceMappingURL=whatwg-fetch.js.map \ No newline at end of file diff --git a/whatwg-fetch.js.map b/whatwg-fetch.js.map new file mode 100644 index 000000000..411b6886b --- /dev/null +++ b/whatwg-fetch.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/bootstrap 1b4b99a4780faf88126c?8819*","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 1b4b99a4780faf88126c","(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 = 2"],"sourceRoot":""} \ No newline at end of file From f69d85d50c4f0c2da8daff1b687302f533246bea Mon Sep 17 00:00:00 2001 From: khaydarov Date: Mon, 19 Dec 2016 21:17:01 +0300 Subject: [PATCH 04/14] updated --- codex-editor.js.map | 2 +- example.html | 167 +++- plugins.js | 2247 ------------------------------------------- plugins.js.map | 1 - webpack.config.js | 3 +- whatwg-fetch.js | 2 +- whatwg-fetch.js.map | 2 +- 7 files changed, 156 insertions(+), 2268 deletions(-) delete mode 100644 plugins.js delete mode 100644 plugins.js.map diff --git a/codex-editor.js.map b/codex-editor.js.map index 20753b9e1..77e75cd91 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 1b4b99a4780faf88126c","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","settings","tools","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","toolbar","inlineToolbar","buttons","actions","toolbox","notifications","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","core","prepare","then","ui","make","addTools","bindEvents","preparePlugins","transport","renderer","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","draw","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","callback","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","content","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","saver","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","parser","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","caret","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 1b4b99a4780faf88126c","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","var codex = (function(codex){\n\n var init = function() {\n\n require('./modules/core');\n require('./modules/ui');\n require('./modules/transport');\n require('./modules/renderer');\n require('./modules/saver');\n require('./modules/content');\n require('./modules/toolbar/toolbar');\n require('./modules/tools');\n require('./modules/callbacks');\n require('./modules/draw');\n require('./modules/caret');\n require('./modules/notifications');\n require('./modules/parser');\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","var codex = require('./../editor');\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\ncodex.core = core;\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","var codex = require('../editor');\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 == false) {\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\ncodex.ui = ui;\nmodule.exports = codex;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","var codex = require('../editor');\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\ncodex.transport = transport;\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","var codex = require('../editor');\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\ncodex.renderer = renderer;\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","var codex = require('../editor');\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\ncodex.saver = saver;\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","var codex = require('../editor');\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\ncodex.content = content;\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","var codex = require('../../editor');\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 this.opened = false;\n\n this.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\ncodex.toolbar = toolbar;\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var codex = require('../../editor');\n\nvar 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","var codex = require('../../editor');\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","var codex = require('../../editor');\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 tool,\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( 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 - 1);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( tool in codex.tools ) {\n\n nextToolIndex ++;\n\n if (!codex.tools[tool].displayInToolbox){\n break;\n }\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","var codex = require('../editor');\n\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\ncodex.tools = tools;\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var codex = require('../editor');\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 if (codex.caret.position.atStart() && !selectionLength) {\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\ncodex.callback = callbacks;\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","var codex = require('../editor');\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\ncodex.draw = draw;\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","var codex = require('../editor');\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\ncodex.caret = caret;\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","var codex = require('../editor');\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\ncodex.notifications = notifications;\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","var codex = require('../editor');\n\nvar parser = (function(parser) {\n\n parser.init = function() {\n\n };\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\nparser.init();\n\ncodex.parser = parser;\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 3ad68690caed808ff875","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","settings","tools","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","toolbar","inlineToolbar","buttons","actions","toolbox","notifications","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","core","prepare","then","ui","make","addTools","bindEvents","preparePlugins","transport","renderer","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","draw","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","callback","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","content","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","saver","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","parser","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","caret","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":";;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,KAAII,QAAS,UAASA,KAAT,EAAe;;AAExB,SAAIC,OAAO,SAAPA,IAAO,GAAW;;AAElBJ,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,EAAR;AACAA,SAAA,mBAAAA,CAAQ,EAAR;AACAA,SAAA,mBAAAA,CAAQ,EAAR;AACAA,SAAA,mBAAAA,CAAQ,EAAR;AACAA,SAAA,mBAAAA,CAAQ,EAAR;AACAA,SAAA,mBAAAA,CAAQ,EAAR;AACH,MAfD;;AAiBA;;;;;AAKAG,WAAME,QAAN,GAAiB;AACbC,gBAAY,CAAC,WAAD,EAAc,QAAd,EAAwB,SAAxB,EAAmC,MAAnC,EAA2C,OAA3C,EAAoD,MAApD,EAA4D,SAA5D,EAAuE,WAAvE,EAAoF,OAApF,CADC;AAEbC,qBAAY,cAFC;AAGbC,0BAAiB,oBAHJ;;AAKb;AACAC,6BAAoB;AANP,MAAjB;;AASA;;;;;AAKAN,WAAMO,KAAN,GAAc;AACVC,mBAAoB,IADV;AAEVC,kBAAoB,IAFV;AAGVC,kBAAoB,IAHV;AAIVC,wBAAoB;AAChBF,sBAAU,IADM;AAEhBG,sBAAU,IAFM;AAGhBC,sBAAU;AAHM,UAJV;AASVC,kBAAoB,IATV;AAUVC,wBAAoB,IAVV;AAWVC,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;;;;;AAKAvB,WAAMwB,KAAN,GAAc;AACVC,qBAAY,EADF;AAEVC,iBAAY,EAFF;AAGVC,iBAAY;AAHF,MAAd;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA3B,WAAM4B,KAAN,GAAc,UAAUC,YAAV,EAAwB;;AAElC5B;;AAEA,cAAK6B,IAAL,CAAUC,OAAV,CAAkBF,YAAlB;;AAEA;AAFA,UAGKG,IAHL,CAGU,KAAKC,EAAL,CAAQC,IAHlB,EAIKF,IAJL,CAIU,KAAKC,EAAL,CAAQE,QAJlB,EAKKH,IALL,CAKU,KAAKC,EAAL,CAAQG,UALlB,EAMKJ,IANL,CAMU,KAAKC,EAAL,CAAQI,cANlB,EAOKL,IAPL,CAOU,KAAKM,SAAL,CAAeP,OAPzB,EAQKC,IARL,CAQU,KAAKO,QAAL,CAAcC,kBARxB,EASKR,IATL,CASU,KAAKC,EAAL,CAAQQ,UATlB,EAUKC,KAVL,CAUW,UAAUC,KAAV,EAAiB;AACpB3C,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,sCAAf,EAAuD,MAAvD,EAA+DD,KAA/D;AACH,UAZL;AAcH,MAlBD;;AAoBA,YAAO3C,KAAP;AAEH,EA3HW,CA2HT,EA3HS,CAAZ;;AA6HAF,QAAOC,OAAP,GAAiBC,KAAjB,C;;;;;;;;;;AC7HA,KAAIA,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIiC,OAAQ,UAASA,IAAT,EAAe;;AAEvB;;;;;;AAMAA,UAAKC,OAAL,GAAe,UAAUF,YAAV,EAAwB;;AAEnC,gBAAO,IAAIgB,OAAJ,CAAY,UAASC,OAAT,EAAkBC,MAAlB,EAA0B;;AAEzC,iBAAKlB,YAAL,EAAmB;;AAEf7B,uBAAME,QAAN,CAAeC,KAAf,GAAuB0B,aAAa1B,KAAb,IAAsBH,MAAME,QAAN,CAAeC,KAA5D;AAEH;;AAED,iBAAI0B,aAAamB,IAAjB,EAAuB;AACnBhD,uBAAMwB,KAAN,CAAYE,MAAZ,GAAqBG,aAAamB,IAAlC;AACH;;AAEDhD,mBAAMO,KAAN,CAAYC,QAAZ,GAAuByC,SAASC,cAAT,CAAwBrB,aAAazB,UAAb,IAA2BJ,MAAME,QAAN,CAAeE,UAAlE,CAAvB;;AAEA,iBAAI,QAAOJ,MAAMO,KAAN,CAAYC,QAAnB,MAAgC2C,SAAhC,IAA6CnD,MAAMO,KAAN,CAAYC,QAAZ,KAAyB,IAA1E,EAAgF;AAC5EuC,wBAAOK,MAAM,mCAAmCvB,aAAazB,UAAtD,CAAP;AACH,cAFD,MAEO;AACH0C;AACH;AAEJ,UApBM,CAAP;AAsBH,MAxBD;;AA0BA;;;;AAIAhB,UAAKc,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;;;;;AAKA5B,UAAK6B,WAAL,GAAmB,UAAUC,MAAV,EAAkBC,OAAlB,EAA2B;AAC1CD,gBAAOE,UAAP,CAAkBC,YAAlB,CAA+BF,OAA/B,EAAwCD,OAAOI,WAA/C;AACH,MAFD;;AAIA;;;;;AAKAlC,UAAKmC,SAAL,GAAiB;AACbC,cAAU,CADG;AAEbC,eAAU,CAFG;AAGbC,kBAAU;AAHG,MAAjB;;AAMA;;;;AAIAtC,UAAKuC,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;;;;;AAKArD,UAAKsD,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;;;AAGApC,UAAKyD,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;AACA/D,UAAK+E,YAAL,GAAoB,UAASC,UAAT,EAAqBC,YAArB,EAAmC;;AAEnD;AACA,aAAK,CAACA,YAAD,IAAkBA,gBAAgB9D,SAASC,cAAT,CAAwB,eAAe6D,YAAvC,CAAvC,EAA+F;AAC3F/G,mBAAM8B,IAAN,CAAWc,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,YAAOlF,IAAP;AAEH,EA5KU,CA4KR,EA5KQ,CAAX;;AA8KA9B,OAAM8B,IAAN,GAAaA,IAAb;;AAEAhC,QAAOC,OAAP,GAAiB+B,IAAjB,C;;;;;;;;AClLA,KAAI9B,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIoC,KAAM,UAASA,EAAT,EAAY;;AAElB;;;AAGAA,QAAGsF,SAAH,GAAe;;AAEX;;;AAGAC,0BAAkB,UALP;;AAOP;;;AAGAC,wBAAgB,mBAVT;;AAYP;;;AAGAC,0BAAkB,qBAfX;;AAiBP;;;AAGAC,4BAAoB,mBApBb;;AAsBP;;;AAGAC,6BAAqB,qBAzBd;;AA2BP;;;AAGAC,wBAAgB;;AA9BT,MAAf;;AAkCA;;;;;AAKA5F,QAAGC,IAAH,GAAU,YAAY;;AAElB,aAAIzB,OAAJ,EACIC,OADJ,EAEIoH,cAFJ,EAGInH,aAHJ,EAIIY,QAJJ,EAKIwG,OALJ,EAMIhH,aANJ,EAOIiH,YAPJ,EAQI7G,aARJ,EASIF,kBATJ,EAUIC,eAVJ,EAWIJ,OAXJ,EAYIE,UAZJ;;AAcA;AACAP,mBAAUT,MAAMiI,IAAN,CAAWxH,OAAX,EAAV;;AAEA;AACAT,eAAM8B,IAAN,CAAW6B,WAAX,CAAuB3D,MAAMO,KAAN,CAAYC,QAAnC,EAA6CC,OAA7C;;AAEA;AACAM,yBAAgBf,MAAMiI,IAAN,CAAWC,YAAX,EAAhB;AACAlI,eAAMO,KAAN,CAAYQ,aAAZ,GAA4BkC,SAASkF,IAAT,CAAcb,WAAd,CAA0BvG,aAA1B,CAA5B;;AAEA;AACAL,mBAAwBV,MAAMiI,IAAN,CAAWvH,OAAX,EAAxB;AACAoH,0BAAwB9H,MAAMiI,IAAN,CAAWH,cAAX,EAAxB;AACAnH,yBAAwBX,MAAMiI,IAAN,CAAWtH,aAAX,EAAxB;AACAK,sBAAwBhB,MAAMiI,IAAN,CAAWjH,UAAX,EAAxB;AACAC,8BAAwBjB,MAAMiI,IAAN,CAAWG,cAAX,EAAxB;AACAlH,2BAAwBlB,MAAMU,OAAN,CAAcR,QAAd,CAAuBmI,qBAAvB,EAAxB;AACAlH,yBAAwBnB,MAAMiI,IAAN,CAAW9G,aAAX,EAAxB;AACA6G,wBAAwBhI,MAAMiI,IAAN,CAAWD,YAAX,EAAxB;AACAlH,mBAAwBd,MAAMiI,IAAN,CAAWnH,OAAX,EAAxB;AACAS,oBAAwBvB,MAAMiI,IAAN,CAAW1G,QAAX,EAAxB;;AAEA;AACA,aAAIF,kBAAkBrB,MAAMiI,IAAN,CAAW5G,eAAX,EAAtB;AAAA,aACID,iBAAkBpB,MAAMiI,IAAN,CAAWK,eAAX,EADtB;;AAGA;AACAnH,uBAAcmG,WAAd,CAA0BlG,cAA1B;AACAD,uBAAcmG,WAAd,CAA0BjG,eAA1B;;AAEA;;;AAGA2G,sBAAaV,WAAb,CAAyBrG,kBAAzB;AACA+G,sBAAaV,WAAb,CAAyBpG,eAAzB;AACA8G,sBAAaV,WAAb,CAAyBnG,aAAzB;;AAEA;AACA2G,wBAAeR,WAAf,CAA2BtG,UAA3B;;AAEA;AACA8G,wBAAeR,WAAf,CAA2BxG,OAA3B;;AAEA;AACAJ,iBAAQ4G,WAAR,CAAoBU,YAApB;;AAEA;AACAtH,iBAAQ4G,WAAR,CAAoBQ,cAApB;;AAEArH,iBAAQ6G,WAAR,CAAoB5G,OAApB;;AAEAD,iBAAQ6G,WAAR,CAAoB/F,QAApB;;AAEA;AACAvB,eAAMO,KAAN,CAAYE,OAAZ,GAAiCA,OAAjC;AACAT,eAAMO,KAAN,CAAYG,OAAZ,GAAiCA,OAAjC;AACAV,eAAMO,KAAN,CAAYS,UAAZ,GAAiCA,UAAjC;AACAhB,eAAMO,KAAN,CAAYO,OAAZ,GAAiCA,OAAjC;AACAd,eAAMO,KAAN,CAAYY,aAAZ,GAAiCA,aAAjC;AACAnB,eAAMO,KAAN,CAAYa,cAAZ,GAAiCA,cAAjC;AACApB,eAAMO,KAAN,CAAYc,eAAZ,GAAiCA,eAAjC;AACArB,eAAMO,KAAN,CAAYU,kBAAZ,GAAiCA,kBAAjC;AACAjB,eAAMO,KAAN,CAAYW,eAAZ,GAAiCA,eAAjC;;AAEAlB,eAAMO,KAAN,CAAYgB,QAAZ,GAAuBA,QAAvB;;AAEAvB,eAAMiC,EAAN,CAASsG,iBAAT,CAA2B5H,aAA3B;;AAEA;AACAX,eAAMU,OAAN,CAAcR,QAAd,CAAuBsI,kBAAvB;AACH,MAtFD;;AAwFAvG,QAAGsG,iBAAH,GAAuB,UAASE,SAAT,EAAoB;;AAEvC;AACAzI,eAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAA1B,GAAoCgI,SAApC;;AAEA;AACAzI,eAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,GAAoCZ,MAAMiI,IAAN,CAAWS,oBAAX,EAApC;;AAEA;AACA1I,eAAMO,KAAN,CAAYI,aAAZ,CAA0BE,OAA1B,GAAoCb,MAAMiI,IAAN,CAAWU,oBAAX,EAApC;;AAEA;AACA3I,eAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAA1B,CAAkC6G,WAAlC,CAA8CtH,MAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAAxE;AACAZ,eAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAA1B,CAAkC6G,WAAlC,CAA8CtH,MAAMO,KAAN,CAAYI,aAAZ,CAA0BE,OAAxE;;AAEAb,eAAMO,KAAN,CAAYE,OAAZ,CAAoB6G,WAApB,CAAgCtH,MAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAA1D;AACH,MAhBD;;AAkBA;;;;AAIAwB,QAAGE,QAAH,GAAc,YAAY;;AAEtB,aAAIyG,IAAJ,EACIC,WADJ;;AAGA,cAAI,IAAIC,IAAR,IAAgB9I,MAAME,QAAN,CAAeC,KAA/B,EAAsC;AAClCyI,oBAAO5I,MAAME,QAAN,CAAeC,KAAf,CAAqB2I,IAArB,CAAP;AACA9I,mBAAMG,KAAN,CAAY2I,IAAZ,IAAoBF,IAApB,CAAyB;AAC5B;;AAED;AACA,cAAK,IAAIE,IAAT,IAAiB9I,MAAMG,KAAvB,EAA6B;;AAEzByI,oBAAO5I,MAAMG,KAAN,CAAY2I,IAAZ,CAAP;;AAEA,iBAAIF,KAAKG,gBAAL,IAAyB,KAA7B,EAAoC;AAChC;AACH;;AAED,iBAAI,CAACH,KAAKI,aAAV,EAAyB;AACrBhJ,uBAAM8B,IAAN,CAAWc,GAAX,CAAe,gDAAf,EAAiE,MAAjE,EAAyEkG,IAAzE;AACA;AACH;;AAED,iBAAI,OAAOF,KAAK1G,IAAZ,IAAoB,UAAxB,EAAoC;AAChClC,uBAAM8B,IAAN,CAAWc,GAAX,CAAe,qCAAf,EAAsD,MAAtD,EAA8DkG,IAA9D;AACA;AACH;;AAED;;;AAGAD,2BAAc7I,MAAMiI,IAAN,CAAWgB,aAAX,CAAyBH,IAAzB,EAA+BF,KAAKI,aAApC,CAAd;;AAEAhJ,mBAAMO,KAAN,CAAYO,OAAZ,CAAoBwG,WAApB,CAAgCuB,WAAhC;;AAEA;AACA7I,mBAAMO,KAAN,CAAYe,cAAZ,CAA2BwH,IAA3B,IAAmCD,WAAnC;AACH;;AAGD;;;AAGA7I,eAAMiC,EAAN,CAASiH,qBAAT;AAGH,MA/CD;;AAiDAjH,QAAGiH,qBAAH,GAA2B,YAAW;;AAElC,aAAI/I,QAAQ;;AAERgJ,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,IAAgB3I,KAAhB,EAAuB;;AAEnByI,oBAAOzI,MAAM2I,IAAN,CAAP;;AAEAW,0BAAazJ,MAAMiI,IAAN,CAAWyB,mBAAX,CAA+BZ,IAA/B,EAAqCF,KAAKQ,IAA1C,CAAb;;AAEApJ,mBAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,CAAkC0G,WAAlC,CAA8CmC,UAA9C;AACA;;;AAGAzJ,mBAAMiC,EAAN,CAAS0H,+BAAT,CAAyCF,UAAzC,EAAqDb,KAAKS,OAA1D;AACH;AAEJ,MAzCD;;AA2CA;;;;AAIApH,QAAGG,UAAH,GAAgB,YAAY;;AAExBpC,eAAM8B,IAAN,CAAWc,GAAX,CAAe,qBAAf,EAAsC,MAAtC;;AAEAY,gBAAOoG,gBAAP,CAAwB,OAAxB,EAAiC,UAAUC,QAAV,EAAoBrE,GAApB,EAAyBsE,UAAzB,EAAqC;AAClE9J,mBAAMe,aAAN,CAAoBgJ,WAApB,CAAgCF,QAAhC,EAA0CG,KAA1C;AACH,UAFD,EAEG,KAFH;;AAIA;AACAhK,eAAMO,KAAN,CAAYgB,QAAZ,CAAqBqI,gBAArB,CAAsC,SAAtC,EAAiD5J,MAAMiK,QAAN,CAAeC,aAAhE,EAA+E,KAA/E;;AAEA;AACAjH,kBAAS2G,gBAAT,CAA0B,OAA1B,EAAmC5J,MAAMiK,QAAN,CAAeE,WAAlD,EAA+D,KAA/D;;AAEA;;;AAGAnK,eAAMO,KAAN,CAAYgB,QAAZ,CAAqBqI,gBAArB,CAAsC,OAAtC,EAA+C5J,MAAMiK,QAAN,CAAeG,eAA9D,EAA+E,KAA/E;;AAEA;;;AAGApK,eAAMO,KAAN,CAAYS,UAAZ,CAAuB4I,gBAAvB,CAAwC,OAAxC,EAAiD5J,MAAMiK,QAAN,CAAeI,iBAAhE,EAAmF,KAAnF;;AAEA;;;AAGArK,eAAMO,KAAN,CAAYU,kBAAZ,CAA+B2I,gBAA/B,CAAgD,OAAhD,EAAyD5J,MAAMiK,QAAN,CAAeK,yBAAxE,EAAmG,KAAnG;AACA;;;;AAIAtK,eAAMO,KAAN,CAAYgB,QAAZ,CAAqBqI,gBAArB,CAAsC,OAAtC,EAA+C5J,MAAMiK,QAAN,CAAeM,kBAA9D,EAAkF,KAAlF;;AAEA;AACA,cAAK,IAAIC,MAAT,IAAmBxK,MAAMO,KAAN,CAAYe,cAA/B,EAA8C;AAC1CtB,mBAAMO,KAAN,CAAYe,cAAZ,CAA2BkJ,MAA3B,EAAmCZ,gBAAnC,CAAoD,OAApD,EAA6D5J,MAAMiK,QAAN,CAAeQ,oBAA5E,EAAkG,KAAlG;AACH;AAEJ,MAvCD;;AAyCA;;;;AAIAxI,QAAGI,cAAH,GAAoB,YAAW;;AAE3B,cAAI,IAAIuG,IAAR,IAAgB5I,MAAMG,KAAtB,EAA6B;;AAEzB,iBAAI,OAAOH,MAAMG,KAAN,CAAYyI,IAAZ,EAAkB7G,OAAzB,IAAoC,UAAxC,EACI;;AAEJ/B,mBAAMG,KAAN,CAAYyI,IAAZ,EAAkB7G,OAAlB;AACH;AACJ,MATD,EAWAE,GAAGyI,gBAAH,GAAsB,UAASC,KAAT,EAAgB;;AAElC,aAAI,CAACA,KAAL,EAAY;;AAEZ;;;AAGAA,eAAMf,gBAAN,CAAuB,SAAvB,EAAkC,UAASI,KAAT,EAAgB;AAC9ChK,mBAAMiK,QAAN,CAAeW,YAAf,CAA4BZ,KAA5B,EAAmCW,KAAnC;AACH,UAFD,EAEG,KAFH;;AAIA;;;AAGAA,eAAMf,gBAAN,CAAuB,OAAvB,EAAgC,UAAUI,KAAV,EAAiB;AAC7ChK,mBAAMiK,QAAN,CAAeY,UAAf,CAA0Bb,KAA1B;AACH,UAFD,EAEG,KAFH;;AAIAW,eAAMf,gBAAN,CAAuB,SAAvB,EAAkC,YAAU;AACxC5J,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBC,IAArB;AACH,UAFD,EAEG,KAFH;AAIH,MAjCD;;AAmCA;AACA9I,QAAGQ,UAAH,GAAgB,YAAW;;AAEvB,aAAIlB,WAAWvB,MAAMO,KAAN,CAAYgB,QAA3B;AAAA,aACIyJ,WAAW,EADf;;AAGA;AACAhL,eAAMwB,KAAN,CAAYG,MAAZ,GAAqBJ,SAAS0J,gBAAT,CAA0B,0BAA1B,CAArB;AACH,MAPD;;AASA;;;AAGAhJ,QAAGiJ,eAAH,GAAqB,YAAU;;AAE3B,aAAIC,mBAAmBnL,MAAME,QAAN,CAAeI,kBAAtC;AAAA,aACI8K,YADJ;;AAGA,aAAK,CAACpL,MAAMG,KAAN,CAAYgL,gBAAZ,CAAN,EAAqC;AACjCnL,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,mEAAf,EAAoF,MAApF,EAA4FuI,gBAA5F;AACA;AACH;;AAEDC,wBAAepL,MAAMG,KAAN,CAAYgL,gBAAZ,EAA8BE,MAA9B,EAAf;;AAEAD,sBAAaE,YAAb,CAA0B,kBAA1B,EAA8C,qBAA9C;;AAEAtL,eAAMuL,OAAN,CAAcC,WAAd,CAA0B;AACtBlI,mBAAQ6H,gBADc;AAEtBR,oBAAQS;AAFc,UAA1B;;AAKApL,eAAMuL,OAAN,CAAcE,kBAAd,CAAiCL,YAAjC;AAEH,MArBD;;AAuBAnJ,QAAG0H,+BAAH,GAAqC,UAASa,MAAT,EAAiBlH,IAAjB,EAAuB;;AAExDkH,gBAAOZ,gBAAP,CAAwB,WAAxB,EAAqC,UAASI,KAAT,EAAgB;;AAEjDhK,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBY,WAArB,CAAiC1B,KAAjC,EAAwC1G,IAAxC;AAEH,UAJD,EAIG,KAJH;AAKH,MAPD;;AASA,YAAOrB,EAAP;AAEH,EAzXQ,CAyXN,EAzXM,CAAT;;AA2XAjC,OAAMiC,EAAN,GAAWA,EAAX;AACAnC,QAAOC,OAAP,GAAiBC,KAAjB,C;;;;;;;;AC9XA,KAAIA,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIyC,YAAa,UAASA,SAAT,EAAmB;;AAEhCA,eAAUqJ,KAAV,GAAkB,IAAlB;;AAEA;;;AAGArJ,eAAUsJ,SAAV,GAAsB,IAAtB;;AAEAtJ,eAAUP,OAAV,GAAoB,YAAU;;AAE1B,aAAI4J,QAAQ1I,SAASgE,aAAT,CAAuB,OAAvB,CAAZ;;AAEA0E,eAAMrI,IAAN,GAAa,MAAb;AACAqI,eAAM/B,gBAAN,CAAuB,QAAvB,EAAiC5J,MAAMsC,SAAN,CAAgBuJ,YAAjD;;AAEA7L,eAAMsC,SAAN,CAAgBqJ,KAAhB,GAAwBA,KAAxB;AAEH,MATD;;AAWA;AACArJ,eAAUwJ,UAAV,GAAuB,YAAW;;AAE9B;AACA,cAAKH,KAAL,GAAa,IAAb;;AAEA;AACA,cAAK5J,OAAL;AACH,MAPD;;AASA;;;AAGAO,eAAUuJ,YAAV,GAAyB,UAAS7B,KAAT,EAAe;;AAEpC,aAAI2B,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,EAASjD,IAA7C;;AAEA9I,eAAMsC,SAAN,CAAgBiD,IAAhB,CAAqB;AACjBvC,mBAAOkJ,SADU;AAEjB9F,yBAAapG,MAAMsC,SAAN,CAAgBsJ,SAAhB,CAA0BxF,UAFtB;AAGjBJ,sBAAahG,MAAMsC,SAAN,CAAgBsJ,SAAhB,CAA0B5F,OAHtB;AAIjBrD,oBAAa3C,MAAMsC,SAAN,CAAgBsJ,SAAhB,CAA0BjJ;AAJtB,UAArB;AAMH,MAjBD;;AAmBA;;;;AAIAL,eAAUiK,eAAV,GAA4B,UAAUC,IAAV,EAAgB;;AAExC,cAAKZ,SAAL,GAAiBY,IAAjB;AACA,cAAKb,KAAL,CAAWc,KAAX;AAEH,MALD;;AAOA;;;AAGAnK,eAAUiD,IAAV,GAAiB,UAASM,MAAT,EAAgB;;AAE7B,aAAI6G,MAAM,IAAIhH,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;;AAEAsG,aAAIpG,IAAJ,CAAS,MAAT,EAAiBtG,MAAME,QAAN,CAAeG,eAAhC,EAAiD,IAAjD;;AAEAqM,aAAInG,gBAAJ,CAAqB,kBAArB,EAAyC,gBAAzC;;AAEAmG,aAAIC,MAAJ,GAAa,YAAY;AACrB,iBAAID,IAAIhG,MAAJ,KAAe,GAAnB,EAAwB;AACpBV,yBAAQ0G,IAAI/F,YAAZ;AACH,cAFD,MAEO;AACHlD,yBAAQb,GAAR,CAAY,mBAAZ,EAAiC8J,GAAjC;AACA/J;AACH;AACJ,UAPD;;AASA+J,aAAI9F,IAAJ,CAASf,OAAO7C,IAAhB;AACA,cAAK8I,UAAL;AAEH,MAzBD;;AA2BA,YAAOxJ,SAAP;AAEH,EA/Fe,CA+Fb,EA/Fa,CAAhB;;AAiGAtC,OAAMsC,SAAN,GAAkBA,SAAlB;AACAxC,QAAOC,OAAP,GAAkBuC,SAAlB,C;;;;;;;;ACpGA,KAAItC,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAI0C,WAAY,UAASA,QAAT,EAAmB;;AAE/B;;;AAGAA,cAASC,kBAAT,GAA8B,YAAY;;AAEtC;;;AAGA,aAAI,CAACxC,MAAMwB,KAAN,CAAYE,MAAZ,CAAmBkL,KAAnB,CAAyBX,MAA9B,EAAsC;;AAElCjM,mBAAMiC,EAAN,CAASiJ,eAAT;AACA;AAEH;;AAEDrI,iBAAQC,OAAR;;AAEA;AAFA,UAGKd,IAHL,CAGU,YAAW;AACb,oBAAOhC,MAAMwB,KAAN,CAAYE,MAAnB;AACH,UALL;;AAOI;AAPJ,UAQKM,IARL,CAQUhC,MAAMuC,QAAN,CAAesK,YARzB;;AAUI;AAVJ,UAWKnK,KAXL,CAWW,UAASC,KAAT,EAAgB;AACnB3C,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,8BAAf,EAA+C,OAA/C,EAAwDD,KAAxD;AACH,UAbL;AAeH,MA3BD;;AA6BA;;;;;AAKAJ,cAASsK,YAAT,GAAwB,UAAU7J,IAAV,EAAgB;;AAEpC,aAAItB,SAASsB,KAAK4J,KAAlB;;AAEA;;;;AAIA,aAAIE,eAAejK,QAAQC,OAAR,EAAnB;;AAEA,cAAK,IAAIiK,QAAQ,CAAjB,EAAoBA,QAAQrL,OAAOuK,MAAnC,EAA4Cc,OAA5C,EAAsD;;AAElD;AACA/M,mBAAMuC,QAAN,CAAeyK,iBAAf,CAAiCF,YAAjC,EAA+CpL,MAA/C,EAAuDqL,KAAvD;AAEH;AAEJ,MAjBD;;AAmBA;;;AAGAxK,cAASyK,iBAAT,GAA6B,UAAUF,YAAV,EAAwBpL,MAAxB,EAAgCqL,KAAhC,EAAuC;;AAEhE;AACAD;;AAEA;AAFA,UAGK9K,IAHL,CAGU,YAAW;;AAEb,oBAAOhC,MAAMuC,QAAN,CAAe0K,YAAf,CAA4BvL,MAA5B,EAAqCqL,KAArC,CAAP;AAEH,UAPL;;AASI;;;AATJ,UAYK/K,IAZL,CAYUhC,MAAMuC,QAAN,CAAe2K,mBAZzB;;AAcI;;;AAdJ,UAiBKlL,IAjBL,CAiBU,UAASmL,SAAT,EAAmB;;AAErB;;;AAGAnN,mBAAMuL,OAAN,CAAcC,WAAd,CAA0B2B,SAA1B;;AAEA;AACA,oBAAOA,UAAUxC,KAAjB;AAEH,UA3BL;;AA6BI;AA7BJ,UA8BKjI,KA9BL,CA8BW,UAASC,KAAT,EAAgB;AACnB3C,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,uCAAf,EAAwD,OAAxD,EAAiED,KAAjE;AACH,UAhCL;AAkCH,MArCD;;AAuCA;;;;AAIAJ,cAAS0K,YAAT,GAAwB,UAAUG,UAAV,EAAsBL,KAAtB,EAA6B;;AAEjD,gBAAOlK,QAAQC,OAAR,GAAkBd,IAAlB,CAAuB,YAAW;;AAErC,oBAAOoL,WAAWL,KAAX,CAAP;AAEH,UAJM,CAAP;AAKH,MAPD;;AASA;;;;;;;;;;;;;AAaAxK,cAAS2K,mBAAT,GAA+B,UAAUC,SAAV,EAAqB;;AAEhD;AACA,aAAIE,aAAaF,UAAU7J,IAA3B;AAAA,aACIgK,QAAaH,UAAUG,KAD3B;;AAGA;AACA;;AAEA;AACA,aAAI,CAACtN,MAAMG,KAAN,CAAYkN,UAAZ,CAAL,EAA8B;AAC1B,mBAAMjK,sBAAiBiK,UAAjB,oBAAN;AACH;;AAED;AACA,aAAI,OAAOrN,MAAMG,KAAN,CAAYkN,UAAZ,EAAwBhC,MAA/B,IAAyC,UAA7C,EAAyD;;AAErD,mBAAMjI,sBAAiBiK,UAAjB,0CAAN;AACH;;AAED;AACA,aAAI1C,QAAQ3K,MAAMG,KAAN,CAAYkN,UAAZ,EAAwBhC,MAAxB,CAA+B8B,UAAUnK,IAAzC,CAAZ;;AAEA;AACA,aAAIuK,YAAYvN,MAAMG,KAAN,CAAYkN,UAAZ,EAAwBG,WAAxB,IAAuC,KAAvD;;AAEA;AACA,gBAAO;AACHlK,mBAAY+J,UADT;AAEH1C,oBAAYA,KAFT;AAGH4C,wBAAYA,SAHT;AAIHD,oBAAYA;AAJT,UAAP;AAOH,MAlCD;;AAoCA,YAAO/K,QAAP;AAEH,EApKc,CAoKZ,EApKY,CAAf;;AAsKAvC,OAAMuC,QAAN,GAAiBA,QAAjB;AACAzC,QAAOC,OAAP,GAAiBwC,QAAjB,C;;;;;;;;ACzKA,KAAIvC,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAI4N,QAAS,UAASA,KAAT,EAAgB;;AAEzB;;;;AAIAA,WAAMC,UAAN,GAAmB,YAAY;;AAE3B;AACA1N,eAAMwB,KAAN,CAAYmM,IAAZ,GAAmB3N,MAAMO,KAAN,CAAYgB,QAAZ,CAAqBqM,SAAxC;;AAEA;AACA5N,eAAMwB,KAAN,CAAYC,UAAZ,GAAyB,EAAzB;;AAEAoB,iBAAQC,OAAR,GAEKd,IAFL,CAEU,YAAW;AACb,oBAAOhC,MAAMO,KAAN,CAAYgB,QAAZ,CAAqBsM,UAA5B;AACH,UAJL;AAKI;AALJ,UAMK7L,IANL,CAMUhC,MAAMyN,KAAN,CAAYK,SANtB,EAQK9L,IARL,CAQU,YAAW;AACb;AACH,UAVL,EAYKU,KAZL,CAYY,UAASC,KAAT,EAAgB;AACpBc,qBAAQb,GAAR,CAAY,mBAAZ;AACH,UAdL;AAgBH,MAxBD;;AA0BA6K,WAAMK,SAAN,GAAkB,UAASpM,MAAT,EAAiB;;AAE/B,aAAIqM,QAAQlL,QAAQC,OAAR,EAAZ;;AAEA,cAAI,IAAIiK,QAAQ,CAAhB,EAAmBA,QAAQrL,OAAOuK,MAAlC,EAA0Cc,OAA1C,EAAmD;;AAE/C;AACA/M,mBAAMyN,KAAN,CAAYO,YAAZ,CAAyBD,KAAzB,EAAgCrM,MAAhC,EAAwCqL,KAAxC;AAEH;AAEJ,MAXD;;AAaA;AACAU,WAAMO,YAAN,GAAqB,UAASD,KAAT,EAAgBrM,MAAhB,EAAwBqL,KAAxB,EAA+B;;AAEhDgB,eAAM/L,IAAN,CAAW,YAAW;AAClB,oBAAOhC,MAAMyN,KAAN,CAAYR,YAAZ,CAAyBvL,MAAzB,EAAiCqL,KAAjC,CAAP;AACH,UAFD,EAIK/K,IAJL,CAIUhC,MAAMyN,KAAN,CAAYQ,sBAJtB;AAMH,MARD;;AAWA;;;;AAIAR,WAAMR,YAAN,GAAqB,UAAUG,UAAV,EAAsBL,KAAtB,EAA6B;;AAE9C,gBAAOlK,QAAQC,OAAR,GAAkBd,IAAlB,CAAuB,YAAW;;AAErC,oBAAOoL,WAAWL,KAAX,CAAP;AAEH,UAJM,CAAP;AAKH,MAPD;;AASAU,WAAMQ,sBAAN,GAA+B,UAAStD,KAAT,EAAgB;;AAE3C,aAAI0C,aAAa1C,MAAMuD,OAAN,CAActF,IAA/B;;AAEA;AACA,aAAI,CAAC5I,MAAMG,KAAN,CAAYkN,UAAZ,CAAL,EAA8B;AAC1B,mBAAMjK,sBAAiBiK,UAAjB,oBAAN;AACH;;AAED;AACA,aAAI,OAAOrN,MAAMG,KAAN,CAAYkN,UAAZ,EAAwBc,IAA/B,IAAuC,UAA3C,EAAuD;;AAEnD,mBAAM/K,sBAAiBiK,UAAjB,gCAAN;AACH;;AAED;AACA,aAAIe,eAAiBzD,MAAMkD,UAAN,CAAiB,CAAjB,CAArB;AAAA,aACIQ,iBAAiBD,aAAaP,UAAb,CAAwB,CAAxB,CADrB;AAAA,aAEIS,YAAiBtO,MAAMG,KAAN,CAAYkN,UAAZ,EAAwBc,IAAxB,CAA6BE,cAA7B,CAFrB;AAAA,aAGIE,MAHJ;;AAMAA,kBAAS;AACLjL,mBAAM+J,UADD;AAELrK,mBAAMsL;AAFD,UAAT;;AAKA;AACAC,gBAAOjB,KAAP,GAAe3C,MAAM6D,SAAN,CAAgBC,QAAhB,CAAyBzO,MAAMiC,EAAN,CAASsF,SAAT,CAAmBK,kBAA5C,CAAf;;AAEA5H,eAAMwB,KAAN,CAAYC,UAAZ,CAAuBiN,IAAvB,CAA4BH,MAA5B;AACH,MA/BD;;AAiCA,YAAOd,KAAP;AAEH,EAzGW,CAyGT,EAzGS,CAAZ;;AA2GAzN,OAAMyN,KAAN,GAAcA,KAAd;AACA3N,QAAOC,OAAP,GAAiB0N,KAAjB,C;;;;;;;;AC9GA,KAAIzN,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAI0L,UAAW,UAASA,OAAT,EAAkB;;AAE7BA,aAAQoD,WAAR,GAAsB,IAAtB;;AAEA;;;AAGApD,aAAQqD,IAAR,GAAe,YAAY;;AAEvB5O,eAAM8B,IAAN,CAAWc,GAAX,CAAe,YAAf;;AAEA;;;AAGA5C,eAAMwB,KAAN,CAAYmM,IAAZ,GAAmB3N,MAAMO,KAAN,CAAYgB,QAAZ,CAAqBqM,SAAxC;AAEH,MATD;;AAWA;;;AAGArC,aAAQsD,cAAR,GAAyB,YAAW;;AAEhC,aAAIC,YAAYtL,OAAOuL,YAAP,EAAhB;AAAA,aACIC,OADJ;;AAGA,aAAIF,UAAUG,UAAV,KAAyB,IAA7B,EAAmC;AAC/B,oBAAO,IAAP;AACH;;AAED,aAAKH,UAAUG,UAAV,CAAqB3J,QAArB,IAAiCtF,MAAM8B,IAAN,CAAWmC,SAAX,CAAqBC,GAA3D,EAAiE;AAC7D8K,uBAAUF,UAAUG,UAApB;AACH,UAFD,MAEO;AACHD,uBAAUF,UAAUI,SAAV,CAAoBC,aAA9B;AACH;;AAED,aAAK,CAACnP,MAAMoP,MAAN,CAAaC,iBAAb,CAA+BL,OAA/B,CAAN,EAAgD;;AAE5C;AACA,iBAAIM,SAASN,QAAQlL,UAArB;;AAEA,oBAAOwL,UAAU,CAACtP,MAAMoP,MAAN,CAAaC,iBAAb,CAA+BC,MAA/B,CAAlB,EAAyD;AACrDA,0BAASA,OAAOxL,UAAhB;AACH;;AAEDkL,uBAAUM,MAAV;AACH;;AAED,aAAIN,WAAWhP,MAAMO,KAAN,CAAYgB,QAA3B,EAAoC;AAChC,oBAAOyN,OAAP;AACH;;AAED,gBAAO,IAAP;AAEH,MAjCD;;AAmCA;;;AAGAzD,aAAQgE,SAAR,GAAoB,YAAW;;AAE3BvP,eAAMuL,OAAN,CAAcoD,WAAd,CAA0BH,SAA1B,CAAoCgB,GAApC,CAAwCxP,MAAMiC,EAAN,CAASsF,SAAT,CAAmBI,iBAA3D;AACH,MAHD;;AAKA;;;AAGA4D,aAAQkE,SAAR,GAAoB,YAAW;;AAE3B,aAAIzP,MAAMuL,OAAN,CAAcoD,WAAlB,EAA+B;AAC3B3O,mBAAMuL,OAAN,CAAcoD,WAAd,CAA0BH,SAA1B,CAAoCkB,MAApC,CAA2C1P,MAAMiC,EAAN,CAASsF,SAAT,CAAmBI,iBAA9D;AACH;AAEJ,MAND;;AAQA;;;;;;AAMA4D,aAAQoE,kBAAR,GAA6B,UAASC,IAAT,EAAe;;AAExC,aAAI,CAAC5P,MAAM8B,IAAN,CAAWsD,SAAX,CAAqBwK,IAArB,CAAL,EAAiC;AAC7BA,oBAAOA,KAAK9L,UAAZ;AACH;;AAED,aAAI8L,SAAS5P,MAAMO,KAAN,CAAYgB,QAArB,IAAiCqO,SAAS3M,SAASkF,IAAvD,EAA6D;;AAEzD,oBAAO,IAAP;AAEH,UAJD,MAIO;;AAEH,oBAAM,CAACyH,KAAKpB,SAAL,CAAeC,QAAf,CAAwBzO,MAAMiC,EAAN,CAASsF,SAAT,CAAmBC,eAA3C,CAAP,EAAoE;AAChEoI,wBAAOA,KAAK9L,UAAZ;AACH;;AAED,oBAAO8L,IAAP;AACH;AAEJ,MAnBD;;AAqBA;;;;;AAKArE,aAAQE,kBAAR,GAA6B,UAAUoE,UAAV,EAAsB;;AAE/C;AACA7P,eAAMuL,OAAN,CAAckE,SAAd;;AAEA,aAAI,CAACI,UAAL,EAAiB;AACb;AACH;;AAED,cAAKlB,WAAL,GAAmB,KAAKgB,kBAAL,CAAwBE,UAAxB,CAAnB;AAEH,MAXD;;AAaA;;;;;;;;;;AAUAtE,aAAQuE,YAAR,GAAuB,SAASC,aAAT,CAAuBC,WAAvB,EAAoCC,QAApC,EAA8C;;AAEjE,aAAI,CAACD,WAAD,IAAgB,CAACC,QAArB,EAA8B;AAC1BjQ,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,6BAAf;AACA;AACH;;AAED;AACA,gBAAM,CAACoN,YAAYxB,SAAZ,CAAsBC,QAAtB,CAA+BzO,MAAMiC,EAAN,CAASsF,SAAT,CAAmBC,eAAlD,CAAP,EAA2E;AACvEwI,2BAAcA,YAAYlM,UAA1B;AACH;;AAED;AACA9D,eAAMO,KAAN,CAAYgB,QAAZ,CAAqB2O,YAArB,CAAkCD,QAAlC,EAA4CD,WAA5C;;AAEA;;;AAGAhQ,eAAMuL,OAAN,CAAcE,kBAAd,CAAiCwE,QAAjC;;AAEA;;;AAGAjQ,eAAMiC,EAAN,CAASyI,gBAAT,CAA0BuF,QAA1B;;AAEA;;;AAGAjQ,eAAMiC,EAAN,CAASQ,UAAT;AAEH,MA9BD;;AAgCA;;;;;;;;;;;;AAYA8I,aAAQC,WAAR,GAAsB,UAAU2B,SAAV,EAAqBgD,cAArB,EAAsC;;AAExD,aAAIC,eAAkBpQ,MAAMuL,OAAN,CAAcoD,WAApC;AAAA,aACI0B,kBAAkBlD,UAAUxC,KADhC;AAAA,aAEI2F,YAAkBnD,UAAU7J,IAFhC;AAAA,aAGIgK,QAAkBH,UAAUG,KAHhC;AAAA,aAIIE,cAAkBL,UAAUI,SAJhC;;AAMA,aAAI0C,WAAWjQ,MAAMuL,OAAN,CAAcgF,eAAd,CAA8BF,eAA9B,EAA+CC,SAA/C,EAA0D9C,WAA1D,CAAf;;AAEA,aAAIF,UAAU,IAAd,EAAoB;AAChB2C,sBAASzB,SAAT,CAAmBgB,GAAnB,CAAuBxP,MAAMiC,EAAN,CAASsF,SAAT,CAAmBK,kBAA1C;AACH;;AAED,aAAIwI,YAAJ,EAAkB;;AAEdpQ,mBAAM8B,IAAN,CAAW6B,WAAX,CAAuByM,YAAvB,EAAqCH,QAArC;AAEH,UAJD,MAIO;AACH;;;AAGAjQ,mBAAMO,KAAN,CAAYgB,QAAZ,CAAqB+F,WAArB,CAAiC2I,QAAjC;AAEH;;AAED;;;AAGAjQ,eAAMiC,EAAN,CAASyI,gBAAT,CAA0BuF,QAA1B;;AAEA;;;AAGAjQ,eAAMuL,OAAN,CAAcE,kBAAd,CAAiCwE,QAAjC;;AAEA;;;AAGAjQ,eAAMiC,EAAN,CAASQ,UAAT;;AAGA,aAAK0N,cAAL,EAAsB;;AAElB;;;AAGA,iBAAIK,oBAAoBxQ,MAAMyQ,KAAN,CAAYC,oBAAZ,MAAsC,CAAC,CAA/D;;AAGA,iBAAIF,qBAAqB,CAAC,CAA1B,EAA6B;;AAGzB,qBAAIG,kBAAkBV,SAASW,aAAT,CAAuB,mBAAvB,CAAtB;AAAA,qBACIC,YAAkB5N,SAAS6N,cAAT,CAAwB,EAAxB,CADtB;;AAGAH,iCAAgBrJ,WAAhB,CAA4BuJ,SAA5B;AACA7Q,uBAAMyQ,KAAN,CAAYM,GAAZ,CAAgBJ,eAAhB,EAAiC,CAAjC,EAAoC,CAApC;;AAEA3Q,uBAAMU,OAAN,CAAcsQ,IAAd;AACAhR,uBAAMU,OAAN,CAAcuQ,cAAd;AAGH,cAbD,MAaO;;AAEH;AACAC,4BAAW,YAAY;;AAEnB;AACAlR,2BAAMyQ,KAAN,CAAYU,cAAZ,CAA2BX,iBAA3B;AACAxQ,2BAAMU,OAAN,CAAcsQ,IAAd;AACAhR,2BAAMU,OAAN,CAAc4F,IAAd;AAEH,kBAPD,EAOG,EAPH;AASH;AAEJ;AAEJ,MA/ED;;AAiFA;;;;;;;AAOAiF,aAAQ6F,WAAR,GAAsB,UAASC,cAAT,EAAyBpB,QAAzB,EAAmCrH,IAAnC,EAAwC;;AAE1D,aAAI0I,mBAAmBtR,MAAMuL,OAAN,CAAcgF,eAAd,CAA8BN,QAA9B,EAAwCrH,IAAxC,CAAvB;;AAEA;AACA5I,eAAMuL,OAAN,CAAcuE,YAAd,CAA2BuB,cAA3B,EAA2CC,gBAA3C;;AAEA;AACAtR,eAAMiC,EAAN,CAASQ,UAAT;AACH,MATD;;AAWA;;;;;;;;;;AAUA8I,aAAQgG,8BAAR,GAAyC,UAAU5G,KAAV,EAAiB6G,QAAjB,EAA2B;;AAEhE;;;;AAIA,aAAIC,cAAc9G,MAAMkD,UAAxB;AAAA,aACId,KADJ;AAAA,aAEI6C,IAFJ;AAAA,aAGI8B,IAHJ;;AAKA,cAAI3E,QAAQ,CAAZ,EAAeA,QAAQ0E,YAAYxF,MAAnC,EAA2Cc,OAA3C,EACA;AACI6C,oBAAO6B,YAAY1E,KAAZ,CAAP;;AAEA,iBAAI6C,KAAKtK,QAAL,IAAiBtF,MAAM8B,IAAN,CAAWmC,SAAX,CAAqBE,IAA1C,EAAgD;;AAE5CuN,wBAAO9B,KAAK+B,WAAL,CAAiBC,IAAjB,EAAP;;AAEA;;;AAGA,qBAAIF,SAAS,EAAb,EAAiB;;AAEb/G,2BAAMkH,WAAN,CAAkBjC,IAAlB;AACA4B;AACH;AACJ;AACJ;;AAED,aAAI7G,MAAMkD,UAAN,CAAiB5B,MAAjB,KAA4B,CAAhC,EAAmC;AAC/B,oBAAOhJ,SAAS6N,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;AACtBnH,yBAAQA,MAAMkD,UAAN,CAAiB,CAAjB,CAAR;AACH,cAFD,MAEO;AACHlD,yBAAQA,MAAMkD,UAAN,CAAiB2D,WAAW,CAA5B,CAAR;AACH;;AAED,iBAAK7G,MAAMrF,QAAN,IAAkBtF,MAAM8B,IAAN,CAAWmC,SAAX,CAAqBC,GAA5C,EAAiD;;AAE7CsN,4BAAW7G,MAAMkD,UAAN,CAAiB5B,MAA5B;AAEH,cAJD,MAIO,IAAItB,MAAMrF,QAAN,IAAkBtF,MAAM8B,IAAN,CAAWmC,SAAX,CAAqBE,IAA3C,EAAiD;;AAEpDqN,4BAAW,CAAX;AACH;AAEJ;;AAED,gBAAO7G,KAAP;AACH,MAnED;;AAqEA;;;AAGAY,aAAQgF,eAAR,GAA0B,UAAU5F,KAAV,EAAiB/B,IAAjB,EAAuB4E,WAAvB,EAAoC;;AAE1D,aAAIyC,WAAejQ,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,KAAhB,EAAuB5P,MAAMiC,EAAN,CAASsF,SAAT,CAAmBC,eAA1C,EAA2D,EAA3D,CAAnB;AAAA,aACI4G,eAAepO,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,KAAhB,EAAuB5P,MAAMiC,EAAN,CAASsF,SAAT,CAAmBE,aAA1C,EAAyD,EAAzD,CADnB;;AAGA2G,sBAAa9G,WAAb,CAAyBqD,KAAzB;AACAsF,kBAAS3I,WAAT,CAAqB8G,YAArB;;AAEA,aAAIZ,WAAJ,EAAiB;AACbY,0BAAaI,SAAb,CAAuBgB,GAAvB,CAA2BxP,MAAMiC,EAAN,CAASsF,SAAT,CAAmBG,eAA9C;AACH;;AAEDuI,kBAAS/B,OAAT,CAAiBtF,IAAjB,GAAwBA,IAAxB;AACA,gBAAOqH,QAAP;AACH,MAdD;;AAgBA;;;AAGA1E,aAAQwG,QAAR,GAAmB,YAAW;;AAE1B,aAAIjD,YAAYtL,OAAOuL,YAAP,GAAsBiD,UAAtB,CAAiC,CAAjC,CAAhB;;AAEA,gBAAOlD,SAAP;AACH,MALD;;AAOA;;;;;AAKAvD,aAAQ0G,UAAR,GAAqB,UAASC,UAAT,EAAqB;;AAEtC,aAAIpD,YAAiBtL,OAAOuL,YAAP,EAArB;AAAA,aACIE,aAAiBH,UAAUG,UAD/B;AAAA,aAEIkD,iBAAiBlD,WAAW0C,WAFhC;AAAA,aAGIS,cAAiBtD,UAAUuD,YAH/B;AAAA,aAIIC,eAJJ;AAAA,aAKIC,mBALJ;AAAA,aAMIC,cANJ;AAAA,aAOIC,kBAPJ;;AASA,aAAIC,eAAe1S,MAAMuL,OAAN,CAAcoD,WAAd,CAA0BiC,aAA1B,CAAwC,mBAAxC,CAAnB;;AAGA0B,2BAAsBH,eAAeQ,SAAf,CAAyB,CAAzB,EAA4BP,WAA5B,CAAtB;AACAI,0BAAsBL,eAAeQ,SAAf,CAAyBP,WAAzB,CAAtB;;AAEAG,+BAAsBtP,SAAS6N,cAAT,CAAwBwB,eAAxB,CAAtB;;AAEA,aAAIE,cAAJ,EAAoB;AAChBC,kCAAsBxP,SAAS6N,cAAT,CAAwB0B,cAAxB,CAAtB;AACH;;AAED,aAAII,iBAAiB,EAArB;AAAA,aACIC,aAAiB,EADrB;AAAA,aAEIC,iBAAiB,KAFrB;;AAIA,aAAIL,kBAAJ,EAAwB;AACpBI,wBAAWnE,IAAX,CAAgB+D,kBAAhB;AACH;;AAED,cAAM,IAAIpG,IAAI,CAAR,EAAW0G,KAAjB,EAAwB,CAAC,EAAEA,QAAQL,aAAa7E,UAAb,CAAwBxB,CAAxB,CAAV,CAAzB,EAAgEA,GAAhE,EAAqE;;AAEjE,iBAAK0G,SAAS9D,UAAd,EAA2B;AACvB,qBAAK,CAAC6D,cAAN,EAAsB;AAClBF,oCAAelE,IAAf,CAAoBqE,KAApB;AACH,kBAFD,MAEO;AACHF,gCAAWnE,IAAX,CAAgBqE,KAAhB;AACH;AACJ,cAND,MAMO;AACHD,kCAAiB,IAAjB;AACH;AAEJ;;AAED;AACA9S,eAAMwB,KAAN,CAAYG,MAAZ,CAAmBuQ,UAAnB,EAA+BtE,SAA/B,GAA2C,EAA3C;;AAEA;;;AAGA,aAAIoF,uBAAuBJ,eAAe3G,MAA1C;;AAEA,cAAII,IAAI,CAAR,EAAWA,IAAI2G,oBAAf,EAAqC3G,GAArC,EAA0C;AACtCrM,mBAAMwB,KAAN,CAAYG,MAAZ,CAAmBuQ,UAAnB,EAA+B5K,WAA/B,CAA2CsL,eAAevG,CAAf,CAA3C;AACH;;AAEDrM,eAAMwB,KAAN,CAAYG,MAAZ,CAAmBuQ,UAAnB,EAA+B5K,WAA/B,CAA2CiL,mBAA3C;;AAEA;;;AAGA,aAAIU,mBAAmBJ,WAAW5G,MAAlC;AAAA,aACIiH,UAAmBjQ,SAASgE,aAAT,CAAuB,KAAvB,CADvB;;AAGA,cAAIoF,IAAI,CAAR,EAAWA,IAAI4G,gBAAf,EAAiC5G,GAAjC,EAAsC;AAClC6G,qBAAQ5L,WAAR,CAAoBuL,WAAWxG,CAAX,CAApB;AACH;;AAED6G,mBAAUA,QAAQtF,SAAlB;;AAEA;AACA,aAAIuF,iBAAiB,WAArB;;AAEA;;;AAGAnT,eAAMuL,OAAN,CAAcC,WAAd,CAA0B;AACtBlI,mBAAQ6P,cADc;AAEtBxI,oBAAQ3K,MAAMG,KAAN,CAAYgT,cAAZ,EAA4B9H,MAA5B,CAAmC;AACvCqG,uBAAOwB;AADgC,cAAnC;AAFc,UAA1B,EAKG,IALH;AAOH,MApFD;;AAsFA;;;;AAIA3H,aAAQ6H,WAAR,GAAsB,UAAS5C,iBAAT,EAA4B6C,gBAA5B,EAA8C;;AAEhE;AACA,aAAI7C,sBAAsB,CAA1B,EAA6B;AACzB;AACH;;AAED,aAAI8C,WAAJ;AAAA,aACIC,sBAAsBvT,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB6O,iBAAnB,EAAsC5C,SADhE;;AAGA,aAAI,CAACyF,gBAAL,EAAuB;;AAEnBC,2BAActT,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB6O,oBAAoB,CAAvC,CAAd;AAEH,UAJD,MAIO;;AAEH8C,2BAActT,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB0R,gBAAnB,CAAd;AAEH;;AAEDC,qBAAY1F,SAAZ,IAAyB2F,mBAAzB;AACH,MArBD;;AAuBA;;;;;;AAMAhI,aAAQiI,KAAR,GAAgB,UAASC,QAAT,EAAmB;;AAE/B,aAAIC,cAAc1T,MAAMuL,OAAN,CAAcoD,WAAhC;AAAA,aACI/F,OAAc8K,YAAYxF,OAAZ,CAAoBtF,IADtC;;AAGA,aAAI5I,MAAMG,KAAN,CAAYyI,IAAZ,EAAkB+K,cAAtB,EAAsC;AAClC3T,mBAAMuL,OAAN,CAAcqI,QAAd,CAAuBH,SAASI,UAAhC;AACH,UAFD,MAEO;AACH7T,mBAAMuL,OAAN,CAAcuI,gBAAd,CAA+BL,SAASI,UAAxC;AACH;AAEJ,MAXD;;AAaA;;;;;;AAMAtI,aAAQuI,gBAAR,GAA2B,UAASvT,KAAT,EAAgB;;AAEvC,aAAIqP,OAAWrP,MAAM,CAAN,CAAf;AAAA,aACIwT,WAAW9Q,SAAS6N,cAAT,CAAwBlB,KAAK+B,WAA7B,CADf;;AAGA,aAAI3R,MAAM8B,IAAN,CAAWsD,SAAX,CAAqBwK,IAArB,CAAJ,EAAgC;AAC5BA,kBAAK9L,UAAL,CAAgBoM,YAAhB,CAA6B6D,QAA7B,EAAuCnE,IAAvC;AACH;AACJ,MARD;;AAUA;;;;;;;AAOArE,aAAQqI,QAAR,GAAmB,UAAShQ,MAAT,EAAiB;;AAEhC,aAAI,CAACA,MAAL,EAAa;AACT;AACH;;AAED,cAAK,IAAIyI,IAAI,CAAb,EAAgBA,IAAIzI,OAAOiK,UAAP,CAAkB5B,MAAtC,EAA8CI,GAA9C,EAAmD;AAC/C,kBAAK2H,GAAL,CAASpQ,OAAOiK,UAAP,CAAkBxB,CAAlB,CAAT;AACH;AACJ,MATD;;AAWA;;;;AAIAd,aAAQ0I,WAAR,GAAsB,UAASrQ,MAAT,EAAiB;;AAEnC,aAAIsQ,IAAJ;AAAA,aACIhB,UAAU,IADd;AAAA,aAEIiB,YAAc,CAAC,GAAD,EAAM,YAAN,EAAoB,IAApB,EAA0B,MAA1B,EAAkC,IAAlC,EAAwC,IAAxC,EAA8C,IAA9C,EAAoD,IAApD,EAA0D,IAA1D,EAAgE,IAAhE,EAAsE,IAAtE,EAA4E,IAA5E,EAAkF,KAAlF,EAAyF,KAAzF,EAAgG,QAAhG,EAA0G,SAA1G,CAFlB;AAAA,aAGIC,cAAc,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,EAAqB,GAArB,EAA0B,IAA1B,CAHlB;AAAA,aAIIC,cAAc,CAACD,YAAYE,QAAZ,CAAqB1Q,OAAO2Q,OAA5B,CAJnB;AAAA,aAKIC,qBAAqBL,UAAUG,QAAV,CAAmB1Q,OAAO2Q,OAA1B,CALzB;;AAOA,aAAI,CAACvU,MAAM8B,IAAN,CAAWsD,SAAX,CAAqBxB,MAArB,CAAL,EAAkC;AAC9B,oBAAOA,MAAP;AACH;;AAED,aAAI,CAACA,OAAOE,UAAZ,EAAuB;AACnB,oBAAOF,MAAP;AACH;;AAED,aAAIyQ,WAAJ,EAAiB;;AAEb,iBAAIG,kBAAJ,EAAwB;;AAEpBtB,2BAAUjQ,SAASgE,aAAT,CAAuB,GAAvB,CAAV;AACAiM,yBAAQtF,SAAR,GAAoBhK,OAAOgK,SAA3B;AACAhK,wBAAOE,UAAP,CAAkBoM,YAAlB,CAA+BgD,OAA/B,EAAwCtP,MAAxC;AACAA,0BAASsP,OAAT;AAEH,cAPD,MAOO;;AAEHA,2BAAUjQ,SAAS6N,cAAT,OAA4BlN,OAAO+N,WAAnC,OAAV;AACAuB,yBAAQvB,WAAR,GAAsBuB,QAAQvB,WAAR,CAAoB8C,OAApB,CAA4B,SAA5B,EAAuC,GAAvC,CAAtB;AACA7Q,wBAAOE,UAAP,CAAkBoM,YAAlB,CAA+BgD,OAA/B,EAAwCtP,MAAxC;AAEH;AACJ;;AAED;AACA,aAAIA,OAAO2Q,OAAP,IAAkB,GAAtB,EAA2B;AACvBL,oBAAOtQ,OAAO8Q,YAAP,CAAoB,MAApB,CAAP;AACH;;AAED;AACA,gBAAM9Q,OAAO+Q,UAAP,CAAkB1I,MAAlB,GAA2B,CAAjC,EAAoC;AAChCrI,oBAAOgR,eAAP,CAAuBhR,OAAO+Q,UAAP,CAAkB,CAAlB,EAAqB7L,IAA5C;AACH;;AAED;AACA,aAAIoL,IAAJ,EAAU;AACNtQ,oBAAO0H,YAAP,CAAoB,MAApB,EAA4B4I,IAA5B;AACH;;AAED,gBAAOtQ,MAAP;AAEH,MApDD;;AAsDA;;;;;AAKA2H,aAAQyI,GAAR,GAAc,UAAS3O,EAAT,EAAa;;AAEvB,aAAI,CAACrF,MAAM8B,IAAN,CAAWsD,SAAX,CAAqBC,EAArB,CAAL,EACI;;AAEJ,aAAIwP,YAAY,KAAKZ,WAAL,CAAiB5O,EAAjB,CAAhB;;AAEA,cAAI,IAAIgH,IAAI,CAAZ,EAAeA,IAAIwI,UAAUhH,UAAV,CAAqB5B,MAAxC,EAAgDI,GAAhD,EAAqD;AACjD,kBAAK2H,GAAL,CAASa,UAAUhH,UAAV,CAAqBxB,CAArB,CAAT;AACH;AAEJ,MAXD;;AAaA,YAAOd,OAAP;AAEH,EAtnBa,CAsnBX,EAtnBW,CAAd;;AAwnBAvL,OAAMuL,OAAN,GAAgBA,OAAhB;AACAzL,QAAOC,OAAP,GAAiBwL,OAAjB,C;;;;;;;;AC3nBA,KAAIvL,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIa,UAAW,UAASA,OAAT,EAAkB;;AAE7BA,aAAQT,IAAR,GAAe,YAAW;AACtBS,iBAAQR,QAAR,GAAmB,mBAAAL,CAAQ,CAAR,CAAnB;AACAa,iBAAQoK,MAAR,GAAmB,mBAAAjL,CAAQ,EAAR,CAAnB;AACAa,iBAAQI,OAAR,GAAmB,mBAAAjB,CAAQ,EAAR,CAAnB;AACH,MAJD;;AAMA;;;AAGAa,aAAQoU,oBAAR,GAA+B,EAA/B;;AAEApU,aAAQqU,aAAR,GAAwB,EAAxB;;AAEArU,aAAQsU,MAAR,GAAiB,KAAjB;;AAEAtU,aAAQuU,OAAR,GAAkB,IAAlB;;AAEA;;;AAGAvU,aAAQ4F,IAAR,GAAe,YAAW;;AAEtBtG,eAAMO,KAAN,CAAYG,OAAZ,CAAoB8N,SAApB,CAA8BgB,GAA9B,CAAkC,QAAlC;AACA,cAAKwF,MAAL,GAAc,IAAd;AAEH,MALD;;AAOA;;;AAGAtU,aAAQwU,KAAR,GAAgB,YAAU;;AAEtBlV,eAAMO,KAAN,CAAYG,OAAZ,CAAoB8N,SAApB,CAA8BkB,MAA9B,CAAqC,QAArC;AACA,cAAKsF,MAAL,GAAe,KAAf;;AAEA,cAAKC,OAAL,GAAe,IAAf;;AAEA,cAAK,IAAIzK,MAAT,IAAmBxK,MAAMO,KAAN,CAAYe,cAA/B,EAA8C;AAC1CtB,mBAAMO,KAAN,CAAYe,cAAZ,CAA2BkJ,MAA3B,EAAmCgE,SAAnC,CAA6CkB,MAA7C,CAAoD,UAApD;AACH;;AAED;AACA1P,eAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;AACAlV,eAAMU,OAAN,CAAcR,QAAd,CAAuBgV,KAAvB;AAEH,MAfD;;AAiBAxU,aAAQyU,MAAR,GAAiB,YAAU;;AAEvB,aAAK,CAAC,KAAKH,MAAX,EAAmB;;AAEf,kBAAK1O,IAAL;AAEH,UAJD,MAIO;;AAEH,kBAAK4O,KAAL;AAEH;AAEJ,MAZD;;AAcAxU,aAAQ0U,cAAR,GAAyB,YAAW;AAChCpV,eAAMO,KAAN,CAAYS,UAAZ,CAAuBwN,SAAvB,CAAiCgB,GAAjC,CAAqC,MAArC;AACH,MAFD;;AAIA9O,aAAQuQ,cAAR,GAAyB,YAAW;AAChCjR,eAAMO,KAAN,CAAYS,UAAZ,CAAuBwN,SAAvB,CAAiCkB,MAAjC,CAAwC,MAAxC;AACH,MAFD;;AAIA;;;AAGAhP,aAAQsQ,IAAR,GAAe,YAAW;;AAEtB;AACAhR,eAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;;AAEA,aAAI,CAAClV,MAAMuL,OAAN,CAAcoD,WAAnB,EAAgC;AAC5B;AACH;;AAED,aAAI0G,gBAAgBrV,MAAMO,KAAN,CAAYG,OAAZ,CAAoB4U,YAApB,IAAoCtV,MAAMU,OAAN,CAAcoU,oBAAtE;AAAA,aACIS,iBAAiBvV,MAAMuL,OAAN,CAAcoD,WAAd,CAA0B6G,SAA1B,GAAuCxV,MAAMU,OAAN,CAAcoU,oBAAd,GAAqC,CAA5E,GAAiF9U,MAAMU,OAAN,CAAcqU,aADpH;;AAGA/U,eAAMO,KAAN,CAAYG,OAAZ,CAAoB+U,KAApB,CAA0BC,SAA1B,uBAAwDC,KAAKC,KAAL,CAAWL,cAAX,CAAxD;;AAEA;AACAvV,eAAMU,OAAN,CAAcR,QAAd,CAAuB2V,iBAAvB;AAEH,MAjBD;;AAmBA,YAAOnV,OAAP;AAEH,EA/Fa,CA+FX,EA/FW,CAAd;;AAiGAA,SAAQT,IAAR;;AAEAD,OAAMU,OAAN,GAAgBA,OAAhB;AACAZ,QAAOC,OAAP,GAAiBW,OAAjB,C;;;;;;;;ACtGA,KAAIV,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIK,WAAY,UAASA,QAAT,EAAmB;;AAE/BA,cAASD,IAAT,GAAgB,YAAW;AACvBJ,SAAA,mBAAAA,CAAQ,CAAR;AACH,MAFD;;AAIAK,cAAS8U,MAAT,GAAkB,KAAlB;;AAEA9U,cAAS4V,OAAT,GAAmB,IAAnB;AACA5V,cAASW,OAAT,GAAmB,IAAnB;;AAEAX,cAASoN,KAAT,GAAiB,IAAjB;;AAEA;;;AAGApN,cAASoG,IAAT,GAAgB,UAASyP,QAAT,EAAkB;;AAE9B;;;;AAIA,aAAI,CAAC/V,MAAMG,KAAN,CAAY4V,QAAZ,CAAD,IAA0B,CAAC/V,MAAM8B,IAAN,CAAWsD,SAAX,CAAqBpF,MAAMG,KAAN,CAAY4V,QAAZ,EAAsB7V,QAA3C,CAA/B,EAAsF;;AAElFF,mBAAM8B,IAAN,CAAWc,GAAX,iBAA0BmT,QAA1B,2BAAuD,MAAvD;AACA;AAEH,UALD,MAKO;;AAEH/V,mBAAMO,KAAN,CAAYa,cAAZ,CAA2BkG,WAA3B,CAAuCtH,MAAMG,KAAN,CAAY4V,QAAZ,EAAsB7V,QAA7D;AAEH;;AAED,aAAIwS,eAAe1S,MAAMuL,OAAN,CAAcoD,WAAjC;;AAEA;AACA3O,eAAMO,KAAN,CAAYY,aAAZ,CAA0BqN,SAA1B,CAAoCgB,GAApC,CAAwC,QAAxC;AACAxP,eAAMU,OAAN,CAAcR,QAAd,CAAuBsI,kBAAvB;AACA,cAAKwM,MAAL,GAAc,IAAd;AACH,MAvBD;;AAyBA;;;AAGA9U,cAASgV,KAAT,GAAiB,YAAU;;AAEvBlV,eAAMO,KAAN,CAAYY,aAAZ,CAA0BqN,SAA1B,CAAoCkB,MAApC,CAA2C,QAA3C;AACA1P,eAAMO,KAAN,CAAYa,cAAZ,CAA2BwM,SAA3B,GAAuC,EAAvC;;AAEA,cAAKoH,MAAL,GAAc,KAAd;AAEH,MAPD;;AASA;;;AAGA9U,cAASiV,MAAT,GAAkB,UAAUY,QAAV,EAAoB;;AAElC,aAAK,CAAC,KAAKf,MAAX,EAAmB;;AAEf,kBAAK1O,IAAL,CAAUyP,QAAV;AAEH,UAJD,MAIO;;AAEH,kBAAKb,KAAL;AAEH;AAEJ,MAZD;;AAcA;;;AAGAhV,cAASsI,kBAAT,GAA8B,YAAW;;AAErC;AACA,aAAIwN,eAAJ;;AAEA;AACAhW,eAAMO,KAAN,CAAYc,eAAZ,CAA4BuM,SAA5B,GAAwC,EAAxC;;AAGA;AACAoI,2BAAkBhW,MAAMU,OAAN,CAAcR,QAAd,CAAuB+V,mBAAvB,EAAlB;;AAEA;;;;AAIA;;;;AAIAjW,eAAMO,KAAN,CAAYc,eAAZ,CAA4BiG,WAA5B,CAAwC0O,eAAxC;AAEH,MAtBD;;AAwBA;;;;;;;;;AASA9V,cAAS+V,mBAAT,GAA+B,YAAW;;AAEtC,aAAIC,sBAAsBlW,MAAMU,OAAN,CAAcR,QAAd,CAAuBgW,mBAAvB,EAA1B;AAAA,aACIJ,OADJ;AAAA,aAEI9S,IAFJ;;AAIA,aAAI,CAACkT,mBAAL,EAA0B;;AAEtBlT,oBAAO;AACH4K,4BAAY;AADT,cAAP;AAIH,UAND,MAMO;;AAEH5K,oBAAO;AACH4K,4BAAY;AADT,cAAP;AAIH;;AAEDkI,mBAAU9V,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,KAAhB,EAAuB5P,MAAMiC,EAAN,CAASsF,SAAT,CAAmBM,aAA1C,EAAyD7E,IAAzD,CAAV;AACA8S,iBAAQlM,gBAAR,CAAyB,OAAzB,EAAkC5J,MAAMU,OAAN,CAAcR,QAAd,CAAuBiW,cAAzD,EAAyE,KAAzE;;AAEA,gBAAOL,OAAP;AACH,MAxBD;;AA0BA;;;AAGA5V,cAASiW,cAAT,GAA0B,YAAW;;AAEjC,aAAIxH,cAAc3O,MAAMuL,OAAN,CAAcoD,WAAhC;;AAEAA,qBAAYH,SAAZ,CAAsB2G,MAAtB,CAA6BnV,MAAMiC,EAAN,CAASsF,SAAT,CAAmBK,kBAAhD;;AAEA5H,eAAMU,OAAN,CAAcR,QAAd,CAAuBgV,KAAvB;AACH,MAPD;;AASAhV,cAASgW,mBAAT,GAA+B,YAAW;;AAEtC,aAAIxD,eAAe1S,MAAMuL,OAAN,CAAcoD,WAAjC;;AAEA,aAAI+D,YAAJ,EAAkB;AACd,oBAAOA,aAAalE,SAAb,CAAuBC,QAAvB,CAAgCzO,MAAMiC,EAAN,CAASsF,SAAT,CAAmBK,kBAAnD,CAAP;AACH,UAFD,MAEO;AACH,oBAAO,KAAP;AACH;AACJ,MATD;;AAWA;;;AAGA1H,cAASmI,qBAAT,GAAiC,YAAW;;AAExC,aAAI+N,qBAAsBpW,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,MAAhB,EAAwB,wBAAxB,EAAkD,EAAlD,CAA1B;AAAA,aACIyG,gBAAgBrW,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,MAAhB,EAAwB,4BAAxB,EAAsD,EAAEhC,WAAY,+BAAd,EAAtD,CADpB;AAAA,aAEI0I,gBAAgBtW,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,KAAhB,EAAuB,iCAAvB,EAA0D,EAA1D,CAFpB;AAAA,aAGI2G,gBAAgBvW,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,KAAhB,EAAuB,4BAAvB,EAAqD,EAAE+B,aAAc,cAAhB,EAArD,CAHpB;AAAA,aAII6E,eAAgBxW,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,KAAhB,EAAuB,2BAAvB,EAAoD,EAAE+B,aAAc,mBAAhB,EAApD,CAJpB;;AAMA0E,uBAAczM,gBAAd,CAA+B,OAA/B,EAAwC5J,MAAMU,OAAN,CAAcR,QAAd,CAAuBuW,mBAA/D,EAAoF,KAApF;;AAEAF,uBAAc3M,gBAAd,CAA+B,OAA/B,EAAwC5J,MAAMU,OAAN,CAAcR,QAAd,CAAuBwW,sBAA/D,EAAuF,KAAvF;;AAEAF,sBAAa5M,gBAAb,CAA8B,OAA9B,EAAuC5J,MAAMU,OAAN,CAAcR,QAAd,CAAuByW,qBAA9D,EAAqF,KAArF;;AAEAL,uBAAchP,WAAd,CAA0BiP,aAA1B;AACAD,uBAAchP,WAAd,CAA0BkP,YAA1B;;AAEAJ,4BAAmB9O,WAAnB,CAA+B+O,aAA/B;AACAD,4BAAmB9O,WAAnB,CAA+BgP,aAA/B;;AAEA;AACAtW,eAAMU,OAAN,CAAcR,QAAd,CAAuB4V,OAAvB,GAAiCO,aAAjC;AACArW,eAAMU,OAAN,CAAcR,QAAd,CAAuBW,OAAvB,GAAiCyV,aAAjC;;AAEA,gBAAOF,kBAAP;AAEH,MA1BD;;AA4BAlW,cAASuW,mBAAT,GAA+B,YAAW;;AAEtC,aAAIG,SAAS5W,MAAMU,OAAN,CAAcR,QAAd,CAAuBW,OAApC;;AAEA,aAAI+V,OAAOpI,SAAP,CAAiBC,QAAjB,CAA0B,QAA1B,CAAJ,EAAyC;AACrCzO,mBAAMU,OAAN,CAAcR,QAAd,CAAuB2V,iBAAvB;AACH,UAFD,MAEO;AACH7V,mBAAMU,OAAN,CAAcR,QAAd,CAAuB2W,iBAAvB;AACH;;AAED7W,eAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;AACAlV,eAAMU,OAAN,CAAcR,QAAd,CAAuBgV,KAAvB;AAEH,MAbD;;AAeAhV,cAASyW,qBAAT,GAAiC,YAAW;;AAExC3W,eAAMU,OAAN,CAAcR,QAAd,CAAuBW,OAAvB,CAA+B2N,SAA/B,CAAyCkB,MAAzC,CAAgD,QAAhD;AACH,MAHD;;AAKAxP,cAASwW,sBAAT,GAAkC,YAAW;;AAEzC,aAAIhE,eAAe1S,MAAMuL,OAAN,CAAcoD,WAAjC;AAAA,aACImI,qBADJ;;AAGApE,sBAAahD,MAAb;;AAEAoH,iCAAwB9W,MAAMO,KAAN,CAAYgB,QAAZ,CAAqBsM,UAArB,CAAgC5B,MAAxD;;AAEA;;;AAGA,aAAI6K,0BAA0B,CAA9B,EAAiC;;AAE7B;AACA9W,mBAAMuL,OAAN,CAAcoD,WAAd,GAA4B,IAA5B;;AAEA;AACA3O,mBAAMiC,EAAN,CAASiJ,eAAT;AACH;;AAEDlL,eAAMiC,EAAN,CAASQ,UAAT;;AAEAzC,eAAMU,OAAN,CAAcwU,KAAd;AACH,MAxBD;;AA0BAhV,cAAS2W,iBAAT,GAA6B,YAAW;AACpC7W,eAAMU,OAAN,CAAcR,QAAd,CAAuBW,OAAvB,CAA+B2N,SAA/B,CAAyCgB,GAAzC,CAA6C,QAA7C;AACH,MAFD;;AAIAtP,cAAS2V,iBAAT,GAA6B,YAAW;AACpC7V,eAAMU,OAAN,CAAcR,QAAd,CAAuBW,OAAvB,CAA+B2N,SAA/B,CAAyCkB,MAAzC,CAAgD,QAAhD;AACH,MAFD;;AAIA,YAAOxP,QAAP;AAEH,EAlPc,CAkPZ,EAlPY,CAAf;;AAoPAA,UAASD,IAAT;;AAEAH,QAAOC,OAAP,GAAiBG,QAAjB,C;;;;;;;;ACxPA,KAAIF,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIiL,SAAU,UAASA,MAAT,EAAiB;;AAE3BA,YAAO7K,IAAP,GAAc,YAAW,CAExB,CAFD;;AAIA6K,YAAOiM,aAAP,GAAuB,IAAvB;AACAjM,YAAOkM,aAAP,GAAuB,IAAvB;AACAlM,YAAOmM,cAAP,GAAwB,IAAxB;;AAEA;;;;AAIAnM,YAAOoM,eAAP,GAAyB,IAAzB;;AAEA;;;;;AAKApM,YAAOC,IAAP,GAAc,YAAW;;AAErB,aAAIoM,eAAe,KAAKC,gBAAL,EAAnB;AAAA,aACI1W,UAAeV,MAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAD7C;AAAA,aAEIG,UAAeZ,MAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAF7C;;AAIA,aAAIuW,aAAalL,MAAb,GAAsB,CAA1B,EAA6B;;AAEzB;AACAjM,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBkG,IAArB;;AAEA;AACAtQ,qBAAQ8N,SAAR,CAAkBgB,GAAlB,CAAsB,QAAtB;;AAEA;AACAxP,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBuM,WAArB;AACH;AAEJ,MAzBD;;AA2BA;;;;;AAKAvM,YAAOoK,KAAP,GAAe,YAAW;AACtB,aAAIxU,UAAUV,MAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAAxC;AACAC,iBAAQ8N,SAAR,CAAkBkB,MAAlB,CAAyB,QAAzB;AACH,MAHD;;AAKA;;;;;AAKA5E,YAAOkG,IAAP,GAAc,YAAW;;AAErB,aAAI,CAAC,KAAKiG,cAAV,EAA0B;AACtB,kBAAKA,cAAL,GAAsB,KAAKK,iBAAL,EAAtB;AACH;;AAED,aAAIC,SAAkB,KAAKC,kBAAL,EAAtB;AAAA,aACIzC,gBAAkB,CADtB;AAAA,aAEIrU,UAAkBV,MAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAFhD;AAAA,aAGIgX,cAHJ;AAAA,aAIIC,cAJJ;;AAMA,aAAIhX,QAAQiX,YAAR,KAAyB,CAA7B,EAAgC;AAC5B5C,6BAAgB,EAAhB;AACH;;AAED0C,0BAAiBF,OAAOK,CAAP,GAAW,KAAKX,cAAL,CAAoBY,IAAhD;AACAH,0BAAiBH,OAAOO,CAAP,GAAWtU,OAAOuU,OAAlB,GAA4B,KAAKd,cAAL,CAAoBe,GAAhD,GAAsDjD,aAAtD,GAAsErU,QAAQiX,YAA/F;;AAEAjX,iBAAQ+U,KAAR,CAAcC,SAAd,oBAAyCC,KAAKC,KAAL,CAAW6B,cAAX,CAAzC,YAA0E9B,KAAKC,KAAL,CAAW8B,cAAX,CAA1E;;AAEA;AACA1X,eAAMU,OAAN,CAAcoK,MAAd,CAAqBmN,YAArB;AACAjY,eAAMU,OAAN,CAAcoK,MAAd,CAAqBoN,WAArB;AAEH,MAzBD;;AA2BA;;;;;;AAMApN,YAAOY,WAAP,GAAqB,UAAS1B,KAAT,EAAgB1G,IAAhB,EAAsB;;AAEvC;;;;AAIA,iBAAQA,IAAR;AACI,kBAAK,YAAL;AAAoBtD,uBAAMU,OAAN,CAAcoK,MAAd,CAAqBqN,gBAArB,CAAsCnO,KAAtC,EAA6C1G,IAA7C,EAAoD;AACxE;AAAoBtD,uBAAMU,OAAN,CAAcoK,MAAd,CAAqBsN,iBAArB,CAAuC9U,IAAvC,EAA8C;AAFtE;;AAKA;;;;AAIAtD,eAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,CAAkCiN,UAAlC,CAA6CwK,OAA7C,CAAqDrY,MAAMU,OAAN,CAAcoK,MAAd,CAAqBwN,UAA1E;AACH,MAhBD;;AAkBA;;;;;AAKAxN,YAAOwM,iBAAP,GAA2B,YAAW;;AAElC,aAAI7W,UAAUT,MAAMO,KAAN,CAAYE,OAA1B;AAAA,aACI8X,SAAU,KAAKC,SAAL,CAAe/X,OAAf,CADd;;AAGA,cAAKwW,cAAL,GAAsBsB,MAAtB;AACA,gBAAOA,MAAP;AAEH,MARD;;AAUA;;;;;;;;AAQAzN,YAAO0N,SAAP,GAAmB,UAAWnT,EAAX,EAAgB;;AAE/B,aAAIoT,KAAK,CAAT;AACA,aAAIC,KAAK,CAAT;;AAEA,gBAAOrT,MAAM,CAACsT,MAAOtT,GAAGuT,UAAV,CAAP,IAAiC,CAACD,MAAOtT,GAAGmQ,SAAV,CAAzC,EAAiE;AAC7DiD,mBAAOpT,GAAGuT,UAAH,GAAgBvT,GAAGwT,UAA1B;AACAH,mBAAOrT,GAAGmQ,SAAH,GAAenQ,GAAGyT,SAAzB;AACAzT,kBAAKA,GAAG0T,YAAR;AACH;AACD,gBAAO,EAAEf,KAAKU,EAAP,EAAWb,MAAMY,EAAjB,EAAP;AACH,MAXD;;AAaA;;;;;;AAMA3N,YAAO0M,kBAAP,GAA4B,YAAW;;AAEnC,aAAIwB,MAAM/V,SAAS6L,SAAnB;AAAA,aAA8BmK,KAA9B;AACA,aAAIrB,IAAI,CAAR;AAAA,aAAWE,IAAI,CAAf;;AAEA,aAAIkB,GAAJ,EAAS;;AAEL,iBAAIA,IAAI1V,IAAJ,IAAY,SAAhB,EAA2B;AACvB2V,yBAAQD,IAAIE,WAAJ,EAAR;AACAD,uBAAME,QAAN,CAAe,IAAf;AACAvB,qBAAIqB,MAAMG,YAAV;AACAtB,qBAAImB,MAAMI,WAAV;AACH;AAEJ,UATD,MASO,IAAI7V,OAAOuL,YAAX,EAAyB;;AAE5BiK,mBAAMxV,OAAOuL,YAAP,EAAN;;AAEA,iBAAIiK,IAAIM,UAAR,EAAoB;;AAEhBL,yBAAQD,IAAIhH,UAAJ,CAAe,CAAf,EAAkBuH,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;;;;;;AAMAhN,YAAOsM,gBAAP,GAA0B,SAASA,gBAAT,GAA2B;;AAEjD,aAAID,eAAe,EAAnB;;AAEA,aAAI3T,OAAOuL,YAAX,EAAwB;AAAE;AACtBoI,4BAAe3T,OAAOuL,YAAP,GAAsB2K,QAAtB,EAAf;AACH;;AAED,gBAAOvC,YAAP;AACH,MATD;;AAWA;AACArM,YAAOuM,WAAP,GAAqB,YAAW;;AAE5B,aAAIzW,UAAUZ,MAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAAxC;AACAA,iBAAQ4N,SAAR,CAAkBgB,GAAlB,CAAsB,QAAtB;;AAEAxP,eAAMU,OAAN,CAAcoK,MAAd,CAAqBiM,aAArB,GAAqC,IAArC;;AAEA;AACA/W,eAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,CAAkCiN,UAAlC,CAA6CwK,OAA7C,CAAqDrY,MAAMU,OAAN,CAAcoK,MAAd,CAAqBwN,UAA1E;AAEH,MAVD;;AAYA;AACAxN,YAAOmN,YAAP,GAAsB,YAAW;AAC7B,aAAIrX,UAAUZ,MAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAAxC;AACAA,iBAAQ4N,SAAR,CAAkBkB,MAAlB,CAAyB,QAAzB;;AAEA1P,eAAMU,OAAN,CAAcoK,MAAd,CAAqBiM,aAArB,GAAqC,KAArC;AACH,MALD;;AAOA;AACAjM,YAAO6O,WAAP,GAAqB,YAAW;AAC5B,aAAI/C,SAAS5W,MAAMO,KAAN,CAAYI,aAAZ,CAA0BE,OAAvC;AACA+V,gBAAOpI,SAAP,CAAiBgB,GAAjB,CAAqB,QAArB;;AAEAxP,eAAMU,OAAN,CAAcoK,MAAd,CAAqBkM,aAArB,GAAqC,IAArC;AACH,MALD;;AAOA;AACAlM,YAAOoN,WAAP,GAAqB,YAAW;AAC5B,aAAItB,SAAS5W,MAAMO,KAAN,CAAYI,aAAZ,CAA0BE,OAAvC;AACA+V,gBAAOhJ,SAAP,GAAmB,EAAnB;AACAgJ,gBAAOpI,SAAP,CAAiBkB,MAAjB,CAAwB,QAAxB;AACA1P,eAAMU,OAAN,CAAcoK,MAAd,CAAqBkM,aAArB,GAAqC,KAArC;AACH,MALD;;AAOA;AACAlM,YAAOqN,gBAAP,GAA0B,UAASnO,KAAT,EAAgB1G,IAAhB,EAAsB;;AAE5C,aAAIsW,WAAW,KAAKC,YAAL,EAAf;;AAEA,aAAIC,WAAkB9Z,MAAMuL,OAAN,CAAcoD,WAApC;AAAA,aACIuI,kBAAkBlX,MAAMU,OAAN,CAAcoK,MAAd,CAAqBoM,eAD3C;;AAGA,aAAI0C,QAAJ,EAAc;;AAEV,iBAAI9K,YAActL,OAAOuL,YAAP,EAAlB;AAAA,iBACIE,aAAcH,UAAUG,UAD5B;;AAGAiI,+BAAkBlX,MAAMU,OAAN,CAAcoK,MAAd,CAAqBiP,aAArB,CAAmCD,QAAnC,CAAlB;;AAEA;;;;;;AAMA9Z,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBkP,gBAArB,CAAsCF,QAAtC,EAAgD5C,eAAhD;;AAEAlX,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBsN,iBAArB,CAAuC,QAAvC;AAEH,UAjBD,MAiBO;;AAEH;AACA,iBAAIxB,SAAS5W,MAAMiI,IAAN,CAAWgS,YAAX,EAAb;AACAja,mBAAMO,KAAN,CAAYI,aAAZ,CAA0BE,OAA1B,CAAkCyG,WAAlC,CAA8CsP,MAA9C;;AAEA5W,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBmN,YAArB;AACAjY,mBAAMU,OAAN,CAAcoK,MAAd,CAAqB6O,WAArB;;AAEAzC,+BAAkBlX,MAAMU,OAAN,CAAcoK,MAAd,CAAqBiP,aAArB,CAAmCD,QAAnC,CAAlB;;AAEA;;;;;AAKAlD,oBAAOsD,KAAP;AACAlQ,mBAAMmQ,cAAN;;AAEA;AACAvD,oBAAOhN,gBAAP,CAAwB,SAAxB,EAAmC,UAASI,KAAT,EAAe;;AAE9C,qBAAIA,MAAMoQ,OAAN,IAAiBpa,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBG,KAArC,EAA4C;;AAExCxE,2BAAMU,OAAN,CAAcoK,MAAd,CAAqBkP,gBAArB,CAAsCF,QAAtC,EAAgD5C,eAAhD;AACAlX,2BAAMU,OAAN,CAAcoK,MAAd,CAAqBuP,SAArB,CAA+BzD,OAAO0D,KAAtC;;AAEA;;;AAGAtQ,2BAAMmQ,cAAN;AACAnQ,2BAAMuQ,wBAAN;;AAEAva,2BAAMU,OAAN,CAAcoK,MAAd,CAAqB0P,UAArB;AACH;AAEJ,cAhBD,EAgBG,KAhBH;AAiBH;AACJ,MA9DD;;AAgEA1P,YAAO+O,YAAP,GAAsB,YAAW;;AAE7B,aAAID,WAAW,KAAf;;AAEA5Z,eAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,CAAkCiN,UAAlC,CAA6CwK,OAA7C,CAAqD,UAASzP,IAAT,EAAe;AAChE,iBAAI6R,WAAW7R,KAAKsF,OAAL,CAAa5K,IAA5B;;AAEA,iBAAImX,YAAY,MAAZ,IAAsB7R,KAAK4F,SAAL,CAAeC,QAAf,CAAwB,cAAxB,CAA1B,EAAmE;AAC/DmL,4BAAW,IAAX;AACH;AACJ,UAND;;AAQA,gBAAOA,QAAP;AACH,MAbD;;AAeA;AACA9O,YAAOsN,iBAAP,GAA2B,UAAS9U,IAAT,EAAe;AACtCL,kBAASyX,WAAT,CAAqBpX,IAArB,EAA2B,KAA3B,EAAkC,IAAlC;AACH,MAFD;;AAIA;;;;;;;AAOAwH,YAAOuP,SAAP,GAAmB,UAAS7U,GAAT,EAAc;;AAE7BvC,kBAASyX,WAAT,CAAqB,YAArB,EAAmC,KAAnC,EAA0ClV,GAA1C;;AAEA;AACAxF,eAAMU,OAAN,CAAcoK,MAAd,CAAqBoN,WAArB;AACH,MAND;;AAQA;;;;;AAKApN,YAAOiP,aAAP,GAAuB,UAASY,WAAT,EAAsB;;AAEzC,aAAI1B,QAAQzV,OAAOuL,YAAP,GAAsBiD,UAAtB,CAAiC,CAAjC,CAAZ;AAAA,aACI4I,oBAAoB3B,MAAMM,UAAN,EADxB;AAAA,aAEI3X,KAFJ;;AAIAgZ,2BAAkBC,kBAAlB,CAAqCF,WAArC;AACAC,2BAAkBE,MAAlB,CAAyB7B,MAAM8B,cAA/B,EAA+C9B,MAAM+B,WAArD;;AAEApZ,iBAAQgZ,kBAAkBlB,QAAlB,GAA6BzN,MAArC;;AAEA,gBAAO;AACHrK,oBAAOA,KADJ;AAEHqZ,kBAAKrZ,QAAQqX,MAAMS,QAAN,GAAiBzN;AAF3B,UAAP;AAIH,MAfD;;AAiBA;;;;;;;;AAQAnB,YAAOkP,gBAAP,GAA0B,UAASW,WAAT,EAAsBO,QAAtB,EAAgC;;AAEtD,aAAIjC,QAAYhW,SAASiW,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,aACI/K,IADJ;AAAA,aAEI0L,aAAa,KAFjB;AAAA,aAGIC,OAAO,KAHX;AAAA,aAIIC,aAJJ;;AAMA,gBAAO,CAACD,IAAD,KAAU3L,OAAOyL,UAAUI,GAAV,EAAjB,CAAP,EAA0C;;AAEtC,iBAAI7L,KAAKtK,QAAL,IAAiB,CAArB,EAAwB;;AAEpBkW,iCAAgBL,YAAYvL,KAAK3D,MAAjC;;AAEA,qBAAI,CAACqP,UAAD,IAAeJ,SAAStZ,KAAT,IAAkBuZ,SAAjC,IAA8CD,SAAStZ,KAAT,IAAkB4Z,aAApE,EAAmF;AAC/EvC,2BAAMmC,QAAN,CAAexL,IAAf,EAAqBsL,SAAStZ,KAAT,GAAiBuZ,SAAtC;AACAG,kCAAa,IAAb;AACH;AACD,qBAAIA,cAAcJ,SAASD,GAAT,IAAgBE,SAA9B,IAA2CD,SAASD,GAAT,IAAgBO,aAA/D,EAA8E;AAC1EvC,2BAAM6B,MAAN,CAAalL,IAAb,EAAmBsL,SAASD,GAAT,GAAeE,SAAlC;AACAI,4BAAO,IAAP;AACH;AACDJ,6BAAYK,aAAZ;AACH,cAbD,MAaO;AACH,qBAAInP,IAAIuD,KAAK/B,UAAL,CAAgB5B,MAAxB;AACA,wBAAOI,GAAP,EAAY;AACRgP,+BAAU3M,IAAV,CAAekB,KAAK/B,UAAL,CAAgBxB,CAAhB,CAAf;AACH;AACJ;AACJ;;AAED,aAAI2M,MAAMxV,OAAOuL,YAAP,EAAV;AACAiK,aAAI0C,eAAJ;AACA1C,aAAI2C,QAAJ,CAAa1C,KAAb;AACH,MAxCD;;AA0CA;;;;;AAKAnO,YAAO0P,UAAP,GAAoB,YAAW;AAC3B,aAAI1L,YAAYtL,OAAOuL,YAAP,EAAhB;AACAD,mBAAU4M,eAAV;AACH,MAHD;;AAKA;;;;;AAKA5Q,YAAOwN,UAAP,GAAoB,UAAS1P,IAAT,EAAe;AAC/B,aAAI6R,WAAW7R,KAAKsF,OAAL,CAAa5K,IAA5B;;AAEA,aAAIL,SAAS2Y,iBAAT,CAA2BnB,QAA3B,CAAJ,EAA0C;AACtCza,mBAAMU,OAAN,CAAcoK,MAAd,CAAqB+Q,oBAArB,CAA0CjT,IAA1C;AACH,UAFD,MAEO;AACH5I,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBgR,sBAArB,CAA4ClT,IAA5C;AACH;;AAED;;;;AAIA,aAAIkG,YAAYtL,OAAOuL,YAAP,EAAhB;AAAA,aACIgN,MAAMjN,UAAUG,UAAV,CAAqBnL,UAD/B;;AAGA,aAAIiY,IAAIxH,OAAJ,IAAe,GAAf,IAAsBkG,YAAY,MAAtC,EAA8C;AAC1Cza,mBAAMU,OAAN,CAAcoK,MAAd,CAAqB+Q,oBAArB,CAA0CjT,IAA1C;AACH;AACJ,MAnBD;;AAqBA;;;;;AAKAkC,YAAO+Q,oBAAP,GAA8B,UAASrR,MAAT,EAAiB;AAC3CA,gBAAOgE,SAAP,CAAiBgB,GAAjB,CAAqB,cAArB;;AAEA;AACA,aAAIhF,OAAO0D,OAAP,CAAe5K,IAAf,IAAuB,MAA3B,EAAmC;AAC/B,iBAAI8F,OAAOoB,OAAOqD,UAAP,CAAkB,CAAlB,CAAX;AACAzE,kBAAKoF,SAAL,CAAekB,MAAf,CAAsB,cAAtB;AACAtG,kBAAKoF,SAAL,CAAegB,GAAf,CAAmB,gBAAnB;AACH;AACJ,MATD;;AAWA;;;;;AAKA1E,YAAOgR,sBAAP,GAAgC,UAAStR,MAAT,EAAiB;AAC7CA,gBAAOgE,SAAP,CAAiBkB,MAAjB,CAAwB,cAAxB;;AAEA;AACA,aAAIlF,OAAO0D,OAAP,CAAe5K,IAAf,IAAuB,MAA3B,EAAmC;AAC/B,iBAAI8F,OAAOoB,OAAOqD,UAAP,CAAkB,CAAlB,CAAX;AACAzE,kBAAKoF,SAAL,CAAekB,MAAf,CAAsB,gBAAtB;AACAtG,kBAAKoF,SAAL,CAAegB,GAAf,CAAmB,cAAnB;AACH;AACJ,MATD;;AAYA,YAAO1E,MAAP;AACH,EA9dY,CA8dV,EA9dU,CAAb;;AAgeAA,QAAO7K,IAAP;;AAEAH,QAAOC,OAAP,GAAiB+K,MAAjB,C;;;;;;;;ACpeA,KAAI9K,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIiB,UAAW,UAASA,OAAT,EAAkB;;AAE7BA,aAAQb,IAAR,GAAe,YAAW;AACtBJ,SAAA,mBAAAA,CAAQ,CAAR;AACH,MAFD;;AAIAiB,aAAQkU,MAAR,GAAiB,KAAjB;;AAEA;AACAlU,aAAQwF,IAAR,GAAe,YAAW;;AAEtB;AACA,aAAItG,MAAMU,OAAN,CAAcR,QAAd,CAAuB8U,MAA3B,EAAmC;AAC/BhV,mBAAMU,OAAN,CAAcR,QAAd,CAAuBgV,KAAvB;AACH;;AAED;AACAlV,eAAMO,KAAN,CAAYO,OAAZ,CAAoB0N,SAApB,CAA8BgB,GAA9B,CAAkC,QAAlC;;AAEA;AACAxP,eAAMO,KAAN,CAAYS,UAAZ,CAAuBwN,SAAvB,CAAiCgB,GAAjC,CAAqC,SAArC;;AAEA;AACAxP,eAAMU,OAAN,CAAcI,OAAd,CAAsBkU,MAAtB,GAA+B,IAA/B;AAEH,MAhBD;;AAkBA;AACAlU,aAAQoU,KAAR,GAAgB,YAAW;;AAEvB;AACAlV,eAAMO,KAAN,CAAYO,OAAZ,CAAoB0N,SAApB,CAA8BkB,MAA9B,CAAqC,QAArC;;AAEA;AACA1P,eAAMO,KAAN,CAAYS,UAAZ,CAAuBwN,SAAvB,CAAiCkB,MAAjC,CAAwC,SAAxC;;AAEA;AACA1P,eAAMU,OAAN,CAAcI,OAAd,CAAsBkU,MAAtB,GAA+B,KAA/B;AAEH,MAXD;;AAaAlU,aAAQkb,IAAR,GAAe,YAAU;;AAErB,aAAIC,cAAcjc,MAAMU,OAAN,CAAcuU,OAAhC;AAAA,aACIrM,IADJ;AAAA,aAEIzI,QAAc+b,OAAO7X,IAAP,CAAYrE,MAAMG,KAAlB,CAFlB;AAAA,aAGIgc,aAAcnc,MAAMO,KAAN,CAAYe,cAH9B;AAAA,aAII8a,aAJJ;AAAA,aAKIC,oBAAoB,CALxB;AAAA,aAMIC,YANJ;;AAQA;AACA,cAAK1T,IAAL,IAAa5I,MAAMG,KAAnB,EAA2B;AACvB,iBAAI,CAACH,MAAMG,KAAN,CAAYyI,IAAZ,EAAkBG,gBAAvB,EACIsT;AACP;;AAED,aAAK,CAACJ,WAAN,EAAoB;;AAEhB;AACA,kBAAKK,YAAL,IAAqBH,UAArB;AAAiC;AAAjC;AAEH,UALD,MAKO;;AAEHC,6BAAgBjc,MAAMoc,OAAN,CAAcN,WAAd,IAA6B,CAA7C;;AAEA,iBAAIO,sBAAsBJ,iBAAiBjc,MAAM8L,MAAN,IAAgBoQ,oBAAoB,CAApC,CAA3C;;AAEA,iBAAKG,mBAAL,EAA2B;;AAEvBJ,iCAAgB,CAAhB;;AAEA;AACA,sBAAKxT,IAAL,IAAa5I,MAAMG,KAAnB,EAA2B;;AAEvBic;;AAEA,yBAAI,CAACpc,MAAMG,KAAN,CAAYyI,IAAZ,EAAkBG,gBAAvB,EAAwC;AACpC;AACH;AACJ;AAEJ;;AAEDuT,4BAAenc,MAAMic,aAAN,CAAf;AAEH;;AAED,cAAK,IAAI5R,MAAT,IAAmB2R,UAAnB;AAA+BA,wBAAW3R,MAAX,EAAmBgE,SAAnB,CAA6BkB,MAA7B,CAAoC,UAApC;AAA/B,UACAyM,WAAWG,YAAX,EAAyB9N,SAAzB,CAAmCgB,GAAnC,CAAuC,UAAvC;AACAxP,eAAMU,OAAN,CAAcuU,OAAd,GAAwBqH,YAAxB;AAEH,MAnDD;;AAqDA;;;;AAIAxb,aAAQ4K,WAAR,GAAsB,YAAW;;AAE7B;;;AAGA,aAAI+Q,qBAAqB,CAAC,OAAD,EAAU,MAAV,EAAkB,MAAlB,EAA0B,WAA1B,EAAuC,SAAvC,CAAzB;AAAA,aACI7T,OAAqB5I,MAAMG,KAAN,CAAYH,MAAMU,OAAN,CAAcuU,OAA1B,CADzB;AAAA,aAEIvB,cAAqB1T,MAAMuL,OAAN,CAAcoD,WAFvC;AAAA,aAGI6B,oBAAqBxQ,MAAMyQ,KAAN,CAAYyB,UAHrC;AAAA,aAII7B,eAJJ;AAAA,aAKIqM,cALJ;AAAA,aAMIvP,SANJ;;AAQA;AACAkD,2BAAkBzH,KAAK1G,IAAL,EAAlB;;AAEA;AACAiL,qBAAY;AACRxC,oBAAY0F,eADJ;AAER/M,mBAAYsF,KAAKtF,IAFT;AAGRiK,wBAAY;AAHJ,UAAZ;;AAMA,aACImG,eACA+I,mBAAmBF,OAAnB,CAA2B7I,YAAYxF,OAAZ,CAAoBtF,IAA/C,MAAyD,CAAC,CAD1D,IAEA8K,YAAY/B,WAAZ,CAAwBC,IAAxB,OAAmC,EAHvC,EAIC;AACG;AACA5R,mBAAMuL,OAAN,CAAc6F,WAAd,CAA0BsC,WAA1B,EAAuCrD,eAAvC,EAAwDzH,KAAKtF,IAA7D;AAEH,UARD,MAQO;;AAEH;AACAtD,mBAAMuL,OAAN,CAAcC,WAAd,CAA0B2B,SAA1B;;AAEA;AACAqD;AAEH;;AAED;AACAkM,0BAAiB9T,KAAK8T,cAAtB;;AAEA,aAAIA,kBAAkB,OAAOA,cAAP,IAAyB,UAA/C,EAA2D;AACvDA,4BAAerW,IAAf,CAAoB2D,KAApB;AACH;;AAEDkH,oBAAW,YAAW;;AAElB;AACAlR,mBAAMyQ,KAAN,CAAYkM,UAAZ,CAAuBnM,iBAAvB;AAEH,UALD,EAKG,EALH;;AAQA;;;AAGAxQ,eAAMuL,OAAN,CAAcE,kBAAd;;AAEA;;;AAGAzL,eAAMU,OAAN,CAAcsQ,IAAd;AACH,MAjED;;AAmEA,YAAOlQ,OAAP;AAEH,EAvKa,CAuKX,EAvKW,CAAd;;AAyKAA,SAAQb,IAAR;;AAEAH,QAAOC,OAAP,GAAiBe,OAAjB,C;;;;;;;;AC7KA,KAAId,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIM,QAAS,UAASA,KAAT,EAAgB;;AAEzB,YAAOA,KAAP;AAEH,EAJW,CAIT,EAJS,CAAZ;;AAMAH,OAAMG,KAAN,GAAcA,KAAd;AACAL,QAAOC,OAAP,GAAiBI,KAAjB,C;;;;;;;;ACTA,KAAIH,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAI+c,YAAa,UAASA,SAAT,EAAoB;;AAEjCA,eAAUC,mBAAV,GAAgC,IAAhC;;AAEAD,eAAU1S,aAAV,GAA0B,UAASF,KAAT,EAAe;AACrC,iBAAQA,MAAMoQ,OAAd;AACI,kBAAKpa,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBE,GAArB;AAA6BvE,uBAAMiK,QAAN,CAAe6S,aAAf,CAA6B9S,KAA7B,EAA2C;AACxE,kBAAKhK,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBG,KAArB;AAA6BxE,uBAAMiK,QAAN,CAAe8S,eAAf,CAA+B/S,KAA/B,EAA2C;AACxE,kBAAKhK,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBO,GAArB;AAA6B5E,uBAAMiK,QAAN,CAAe+S,gBAAf,CAAgChT,KAAhC,EAA2C;AACxE;AAA+BhK,uBAAMiK,QAAN,CAAegT,iBAAf,CAAiCjT,KAAjC,EAA4C;AAJ/E;AAMH,MAPD;;AASA4S,eAAUzS,WAAV,GAAwB,UAASH,KAAT,EAAe;AACnC,iBAAQA,MAAMoQ,OAAd;AACI,kBAAKpa,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBU,EAArB;AACA,kBAAK/E,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBS,IAArB;AACA,kBAAK9E,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBY,KAArB;AACA,kBAAKjF,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBW,IAArB;AAA6BhF,uBAAMiK,QAAN,CAAeiT,eAAf,CAA+BlT,KAA/B,EAAuC;AAJxE;AAMH,MAPD;;AASA4S,eAAUE,aAAV,GAA0B,UAAS9S,KAAT,EAAe;;AAErC,aAAK,CAAChK,MAAMU,OAAN,CAAcsU,MAApB,EAA6B;AACzBhV,mBAAMU,OAAN,CAAc4F,IAAd;AACH;;AAED,aAAItG,MAAMU,OAAN,CAAcsU,MAAd,IAAwB,CAAChV,MAAMU,OAAN,CAAcI,OAAd,CAAsBkU,MAAnD,EAA2D;AACvDhV,mBAAMU,OAAN,CAAcI,OAAd,CAAsBwF,IAAtB;AACH,UAFD,MAEO;AACHtG,mBAAMU,OAAN,CAAcI,OAAd,CAAsBkb,IAAtB;AACH;;AAEDhS,eAAMmQ,cAAN;AACH,MAbD;;AAeA;;;;AAIAyC,eAAUG,eAAV,GAA4B,UAAS/S,KAAT,EAAe;;AAEvC;AACA,aAAImT,uBAAuBnd,MAAMiK,QAAN,CAAemT,4BAAf,EAA3B;;AAEA,aAAID,oBAAJ,EAA0B;AACtBnT,mBAAMmQ,cAAN;;AAEA;;;;AAIAna,mBAAMyQ,KAAN,CAAYyB,UAAZ,GAAyB,CAAC,CAA1B;;AAEAlS,mBAAMiK,QAAN,CAAeoT,mBAAf;AACA;AACH;;AAED,aAAIrT,MAAMpG,MAAN,CAAa0Z,eAAb,IAAgC,MAApC,EAA4C;;AAExC;AACAtd,mBAAMyQ,KAAN,CAAY8M,qBAAZ;AACH;;AAED,aAAI,CAACvd,MAAMuL,OAAN,CAAcoD,WAAnB,EAAgC;AAC5B;;;AAGA3O,mBAAMiK,QAAN,CAAeoT,mBAAf,CAAmCrT,KAAnC;AACA;AACH;;AAGD,aAAIwG,oBAA0BxQ,MAAMyQ,KAAN,CAAYC,oBAAZ,MAAsC,CAApE;AAAA,aACIgD,cAA0B1T,MAAMuL,OAAN,CAAcoD,WAD5C;AAAA,aAEI/F,OAA0B8K,YAAYxF,OAAZ,CAAoBtF,IAFlD;AAAA,aAGI4U,0BAA0Bxd,MAAMU,OAAN,CAAcsU,MAAd,IACtBhV,MAAMU,OAAN,CAAcuU,OADQ,IAEtBjL,MAAMpG,MAAN,IAAgB5D,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB6O,iBAAnB,CALxB;;AAOA;AACA,aAAIiN,mBAAmBzd,MAAMG,KAAN,CAAYyI,IAAZ,EAAkB6U,gBAAzC;;AAEA;AACA,aAAItK,iBAAiB,WAArB;;AAEA;;;AAGA,aAAKqK,uBAAL,EAA+B;;AAE3BxT,mBAAMmQ,cAAN;;AAEAna,mBAAMU,OAAN,CAAcI,OAAd,CAAsB4K,WAAtB,CAAkC1B,KAAlC;;AAEAhK,mBAAMU,OAAN,CAAcwU,KAAd;;AAEA;AAEH;;AAED;;;AAGA,aAAKlL,MAAM0T,QAAN,IAAkB,CAACD,gBAAxB,EAA0C;AACtCzd,mBAAMiK,QAAN,CAAeoT,mBAAf,CAAmCrd,MAAMuL,OAAN,CAAcmH,YAAjD,EAA+D1I,KAA/D;AACAA,mBAAMmQ,cAAN;AAEH,UAJD,MAIO,IAAMnQ,MAAM0T,QAAN,IAAkB,CAACD,gBAApB,IAA0C,CAACzT,MAAM0T,QAAP,IAAmBD,gBAAlE,EAAqF;AACxF;AACA;AACH;;AAED,aAAIE,iBAAiB,KAArB;AAAA,aACIC,mBAAmBpa,OAAOuL,YAAP,EADvB;AAAA,aAEI8O,sBAAsBD,iBAAiB3O,UAF3C;AAAA,aAGI6O,sBAAsB9d,MAAMyQ,KAAN,CAAYe,QAAZ,CAAqBuM,QAArB,EAH1B;AAAA,aAIIC,4CAA4C,KAJhD;;AAMA;;;;;AAKAA,qDAA4CH,uBAAuBA,oBAAoB/Z,UAApB,CAA+BwZ,eAA/B,IAAkD,MAArH;;AAEA;;;AAGA,aACIO,oBAAoBvY,QAApB,IAAgCtF,MAAM8B,IAAN,CAAWmC,SAAX,CAAqBE,IAArD,IACA,CAAC6Z,yCADD,IAEA,CAACF,mBAHL,EAIC;;AAEG9T,mBAAMmQ,cAAN;;AAEAna,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,wBAAf;;AAEA5C,mBAAMuL,OAAN,CAAc0G,UAAd,CAAyBzB,iBAAzB;;AAEA;AACA,iBAAI,CAACxQ,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB6O,oBAAoB,CAAvC,EAA0CmB,WAA1C,CAAsDC,IAAtD,EAAL,EAAmE;AAC/D5R,uBAAMU,OAAN,CAAcuQ,cAAd;AACH;AAEJ,UAjBD,MAiBO;;AAEH,iBAAK4M,uBAAuBA,oBAAoB/Z,UAAhD,EAA4D;;AAExD6Z,kCAAiB,CAACE,oBAAoB/Z,UAApB,CAA+BE,WAAjD;AAEH;;AAED,iBAAK2Z,kBAAkBG,mBAAvB,EAA6C;;AAEzC9T,uBAAMmQ,cAAN;;AAEAna,uBAAM8B,IAAN,CAAWc,GAAX,CAAe,kDAAf;;AAEA5C,uBAAMuL,OAAN,CAAcC,WAAd,CAA0B;AACtBlI,2BAAQ6P,cADc;AAEtBxI,4BAAQ3K,MAAMG,KAAN,CAAYgT,cAAZ,EAA4B9H,MAA5B;AAFc,kBAA1B,EAGG,IAHH;;AAKArL,uBAAMU,OAAN,CAAcsQ,IAAd;AACAhR,uBAAMU,OAAN,CAAc4F,IAAd;;AAEA;AACAtG,uBAAMU,OAAN,CAAcuQ,cAAd;AAEH,cAjBD,MAiBO;;AAEHjR,uBAAM8B,IAAN,CAAWc,GAAX,CAAe,yBAAf;AAEH;AAEJ;;AAED;AACA5C,eAAMiC,EAAN,CAASQ,UAAT;AAEH,MA9ID;;AAgJAma,eAAUI,gBAAV,GAA6B,UAAShT,KAAT,EAAe;;AAExC;AACAhK,eAAMU,OAAN,CAAcwU,KAAd;;AAEA;AACAlV,eAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;;AAEAlL,eAAMmQ,cAAN;AAEH,MAVD;;AAYAyC,eAAUM,eAAV,GAA4B,UAASlT,KAAT,EAAe;;AAEvChK,eAAMuL,OAAN,CAAcE,kBAAd;;AAEA;AACAzL,eAAMU,OAAN,CAAcwU,KAAd;AACAlV,eAAMU,OAAN,CAAcsQ,IAAd;AAEH,MARD;;AAUA4L,eAAUK,iBAAV,GAA8B,UAASjT,KAAT,EAAgB;;AAE1ChK,eAAMU,OAAN,CAAcwU,KAAd;;AAEA,aAAI,CAAClV,MAAMU,OAAN,CAAcoK,MAAd,CAAqBkM,aAA1B,EAAyC;AACrChX,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBoK,KAArB;AACAlV,mBAAMuL,OAAN,CAAckE,SAAd;AACH;AACJ,MARD;;AAUAmN,eAAUxS,eAAV,GAA4B,UAAUJ,KAAV,EAAiB;;AAEzChK,eAAMuL,OAAN,CAAcE,kBAAd,CAAiCzB,MAAMpG,MAAvC;;AAEA5D,eAAMiC,EAAN,CAASQ,UAAT;;AAEA,aAAI0U,eAAenX,MAAMU,OAAN,CAAcoK,MAAd,CAAqBsM,gBAArB,EAAnB;;AAEA;;;AAGA,aAAID,aAAalL,MAAb,KAAwB,CAA5B,EAA+B;AAC3BjM,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBoK,KAArB;AACH;;AAED;AACA,aAAIlL,MAAMpG,MAAN,CAAa0Z,eAAb,IAAgC,MAApC,EAA4C;;AAExCtd,mBAAMyQ,KAAN,CAAY8M,qBAAZ;AAEH;;AAED,aAAIvd,MAAMuL,OAAN,CAAcoD,WAAd,KAA8B,IAAlC,EAAwC;;AAEpC;;;AAGA,iBAAIsP,mBAAmBje,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBsK,MAAnB,GAA4B,CAA5B,GAAgCjM,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBsK,MAAnB,GAA4B,CAA5D,GAAgE,CAAvF;;AAEA;AACA,iBAAIjM,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBsK,MAAvB,EAA+B;;AAE3B;AACA,qBAAIiS,kBAAmBle,MAAMuL,OAAN,CAAcoE,kBAAd,CAAiC3P,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBsc,gBAAnB,CAAjC,CAAvB;AACH;;AAED;AACA,iBAAIje,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBsK,MAAnB,IAA6BjM,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBsc,gBAAnB,EAAqCtM,WAArC,KAAqD,EAAlF,IAAwFuM,gBAAgBhQ,OAAhB,CAAwBtF,IAAxB,IAAgC,WAA5H,EAAyI;;AAErI5I,uBAAMyQ,KAAN,CAAYkM,UAAZ,CAAuBsB,gBAAvB;AAEH,cAJD,MAIO;;AAEH;AACA,qBAAI9K,iBAAiB,WAArB;;AAEAnT,uBAAMuL,OAAN,CAAcC,WAAd,CAA0B;AACtBlI,2BAAQ6P,cADc;AAEtBxI,4BAAQ3K,MAAMG,KAAN,CAAYgT,cAAZ,EAA4B9H,MAA5B;AAFc,kBAA1B;;AAKA;AACA,qBAAIrL,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBsK,MAAnB,KAA8B,CAAlC,EAAqC;;AAEjCjM,2BAAMyQ,KAAN,CAAYkM,UAAZ,CAAuBsB,gBAAvB;AAEH,kBAJD,MAIO;;AAEH;AACAje,2BAAMyQ,KAAN,CAAYU,cAAZ,CAA2B8M,gBAA3B;AACH;AACJ;;AAED;;;AAGAje,mBAAMU,OAAN,CAAcsQ,IAAd;;AAGAhR,mBAAMU,OAAN,CAAc4F,IAAd;AAEH,UAjDD,MAiDO;;AAEH;;;AAGAtG,mBAAMU,OAAN,CAAcsQ,IAAd;;AAEAhR,mBAAMU,OAAN,CAAc4F,IAAd;;AAEA;AACAtG,mBAAMU,OAAN,CAAcR,QAAd,CAAuBgV,KAAvB;AACAlV,mBAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;AACH;;AAGD,aAAIiJ,eAAe,CAACne,MAAMuL,OAAN,CAAcoD,WAAd,CAA0BgD,WAA1B,CAAsCC,IAAtC,EAApB;;AAEA,aAAIuM,YAAJ,EAAkB;;AAEd;AACAne,mBAAMU,OAAN,CAAcuQ,cAAd;AAEH,UALD,MAKO;;AAEH;AACAjR,mBAAMU,OAAN,CAAc0U,cAAd;AAEH;;AAED,aAAIgJ,kBAAkBpe,MAAMuL,OAAN,CAAcoD,WAAd,CAA0BT,OAA1B,CAAkCtF,IAAxD;;AAEA;AACA,aAAIwV,mBAAmB,WAAnB,IAAkC,CAACD,YAAvC,EAAqD;;AAEjDne,mBAAMuL,OAAN,CAAcgE,SAAd;AAEH;AAEJ,MA7GD;;AA+GA;;;;;;;AAOAqN,eAAUQ,4BAAV,GAAyC,YAAW;;AAEhD,aAAItO,YAAatL,OAAOuL,YAAP,EAAjB;AAAA,aACIE,aAAaH,UAAUG,UAD3B;AAAA,aAEIoP,OAAO,KAFX;;AAKA,aAAIvP,UAAUwK,UAAV,IAAwB,CAA5B,EAA+B;;AAE3B,oBAAO,IAAP;AAEH,UAJD,MAIO;;AAEH,iBAAI,CAACtZ,MAAM8B,IAAN,CAAWsD,SAAX,CAAqB6J,UAArB,CAAL,EAAuC;AACnCA,8BAAaA,WAAWnL,UAAxB;AACH;;AAED;AACA,iBAAImL,WAAWqO,eAAX,IAA8B,MAAlC,EAA0C;AACtCe,wBAAO,IAAP;AACH;;AAED,oBAAOpP,WAAWqO,eAAX,IAA8B,MAArC,EAA6C;AACzCrO,8BAAaA,WAAWnL,UAAxB;;AAEA,qBAAImL,WAAWqO,eAAX,IAA8B,MAAlC,EAA0C;AACtCe,4BAAO,IAAP;AACH;;AAED,qBAAIpP,cAAchM,SAASkF,IAA3B,EAAiC;AAC7B;AACH;AACJ;;AAED;AACA,oBAAOkW,OAAO,KAAP,GAAe,IAAtB;AACH;AAEJ,MAtCD;;AAwCA;;;;AAIAzB,eAAUnS,oBAAV,GAAiC,UAAUT,KAAV,EAAiB;;AAE9C,aAAIQ,SAAS,IAAb;;AAEAxK,eAAMU,OAAN,CAAcuU,OAAd,GAAwBzK,OAAO0D,OAAP,CAAe5K,IAAvC;;AAEAtD,eAAMU,OAAN,CAAcI,OAAd,CAAsB4K,WAAtB,CAAkC1B,KAAlC;AACAhK,eAAMU,OAAN,CAAcwU,KAAd;AAEH,MATD;;AAWA0H,eAAUrS,kBAAV,GAA+B,UAAUP,KAAV,EAAiB;;AAE5C;;;AAGA,aAAI,KAAK6S,mBAAT,EAA6B;AACzByB,0BAAa,KAAKzB,mBAAlB;AACH;;AAED;;;AAGA,cAAKA,mBAAL,GAA2B3L,WAAW,YAAW;;AAE7ClR,mBAAMuL,OAAN,CAAcqD,IAAd;AAEH,UAJ0B,EAIxB,GAJwB,CAA3B;AAMH,MAlBD;;AAoBA;AACAgO,eAAUvS,iBAAV,GAA8B,YAAW;;AAErC,aAAI,CAACrK,MAAMO,KAAN,CAAYO,OAAZ,CAAoB0N,SAApB,CAA8BC,QAA9B,CAAuC,QAAvC,CAAL,EAAuD;;AAEnDzO,mBAAMU,OAAN,CAAcI,OAAd,CAAsBwF,IAAtB;AAEH,UAJD,MAIO;;AAEHtG,mBAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;AAEH;AACJ,MAXD;;AAaA;;;AAGA0H,eAAUhS,YAAV,GAAyB,UAASZ,KAAT,EAAgBW,KAAhB,EAAuB;;AAE5C,iBAAQX,MAAMoQ,OAAd;;AAEI,kBAAKpa,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBW,IAArB;AACA,kBAAKhF,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBY,KAArB;AACIjF,uBAAMiK,QAAN,CAAesU,4BAAf,CAA4C5T,KAA5C;AACA;;AAEJ,kBAAK3K,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBC,SAArB;AACItE,uBAAMiK,QAAN,CAAeuU,gBAAf,CAAgC7T,KAAhC;AACA;;AAEJ,kBAAK3K,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBU,EAArB;AACA,kBAAK/E,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBS,IAArB;AACI9E,uBAAMiK,QAAN,CAAewU,yBAAf,CAAyC9T,KAAzC;AACA;;AAdR;AAiBH,MAnBD;;AAqBA;;;AAGAiS,eAAU2B,4BAAV,GAAyC,UAAU5T,KAAV,EAAiB;;AAEtD,aAAImE,YAActL,OAAOuL,YAAP,EAAlB;AAAA,aACIpN,SAAc3B,MAAMwB,KAAN,CAAYG,MAD9B;AAAA,aAEI+c,cAAc5P,UAAUG,UAF5B;AAAA,aAGI0P,iBAHJ;;AAKA;AACA,aAAI,CAACD,WAAL,EAAiB;AACb,oBAAO,KAAP;AACH;;AAED;AACA,gBAAOA,YAAYpB,eAAZ,IAA+B,MAAtC,EAA8C;;AAE1CqB,iCAAoBD,YAAY5a,UAAhC;AACA4a,2BAAoBC,iBAApB;AACH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;AACA,gBAAOF,eAAe/c,OAAOid,oBAAP,CAAtB,EAAoD;AAChDA;AACH;;AAED;;;;AAIA,aAAI,CAACF,YAAY/M,WAAjB,EACA;AACI3R,mBAAMyQ,KAAN,CAAYU,cAAZ,CAA2ByN,oBAA3B;AACA;AACH;;AAED;;;AAGA,aAAIC,mBAAsB,KAA1B;AAAA,aACIf,sBAAsB,KAD1B;;AAGA,aAAIgB,SAAJ,EACIC,eADJ;;AAGAD,qBAAYJ,YAAY7Q,UAAZ,CAAuB6Q,YAAY7Q,UAAZ,CAAuB5B,MAAvB,GAAgC,CAAvD,CAAZ;;AAEA,aAAIjM,MAAM8B,IAAN,CAAWsD,SAAX,CAAqB0Z,SAArB,CAAJ,EAAqC;;AAEjCC,+BAAkB/e,MAAMuL,OAAN,CAAcgG,8BAAd,CAA6CuN,SAA7C,EAAwDA,UAAUjR,UAAV,CAAqB5B,MAA7E,CAAlB;AAEH,UAJD,MAIO;;AAEH8S,+BAAkBD,SAAlB;AAEH;;AAEDD,4BAAmB/P,UAAUG,UAAV,IAAwB8P,eAA3C;AACAjB,+BAAsBiB,gBAAgB9S,MAAhB,IAA0B6C,UAAUuD,YAA1D;;AAEA,aAAK,CAACwM,gBAAD,IAAsB,CAACf,mBAA5B,EAAkD;AAC9C9d,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,qDAAf;AACA,oBAAO,KAAP;AACH;;AAED5C,eAAMyQ,KAAN,CAAYU,cAAZ,CAA2ByN,oBAA3B;AAEH,MAlED;;AAoEA;;;AAGAhC,eAAU6B,yBAAV,GAAsC,UAAU9T,KAAV,EAAiB;;AAEnD,aAAImE,YAActL,OAAOuL,YAAP,EAAlB;AAAA,aACIpN,SAAc3B,MAAMwB,KAAN,CAAYG,MAD9B;AAAA,aAEI+c,cAAc5P,UAAUG,UAF5B;AAAA,aAGI0P,iBAHJ;;AAKA;AACA,aAAI,CAACD,WAAL,EAAiB;AACb,oBAAO,KAAP;AACH;;AAED;;;AAGA,aAAK5P,UAAUuD,YAAV,KAA2B,CAAhC,EAAmC;AAC/B,oBAAO,KAAP;AACH;;AAED;AACA,gBAAOqM,YAAYpB,eAAZ,IAA+B,MAAtC,EAA8C;AAC1CqB,iCAAoBD,YAAY5a,UAAhC;AACA4a,2BAAoBC,iBAApB;AACH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;AACA,gBAAOF,eAAe/c,OAAOid,oBAAP,CAAtB,EAAoD;AAChDA;AACH;;AAED;;;AAGA,aAAII,oBAAsB,KAA1B;AAAA,aACIC,sBAAsB,KAD1B;;AAGA,aAAIC,UAAJ,EACIH,eADJ;;AAGA;;;;AAIA,aAAI,CAACL,YAAY/M,WAAjB,EAA8B;AAC1B3R,mBAAMyQ,KAAN,CAAY0O,kBAAZ,CAA+BP,oBAA/B;AACA;AACH;;AAEDM,sBAAaR,YAAY7Q,UAAZ,CAAuB,CAAvB,CAAb;;AAEA,aAAI7N,MAAM8B,IAAN,CAAWsD,SAAX,CAAqB8Z,UAArB,CAAJ,EAAsC;;AAElCH,+BAAkB/e,MAAMuL,OAAN,CAAcgG,8BAAd,CAA6C2N,UAA7C,EAAyD,CAAzD,CAAlB;AAEH,UAJD,MAIO;;AAEHH,+BAAkBG,UAAlB;AAEH;;AAEDF,6BAAsBlQ,UAAUG,UAAV,IAAwB8P,eAA9C;AACAE,+BAAsBnQ,UAAUuD,YAAV,KAA2B,CAAjD;;AAEA,aAAK2M,qBAAqBC,mBAA1B,EAAgD;;AAE5Cjf,mBAAMyQ,KAAN,CAAY0O,kBAAZ,CAA+BP,oBAA/B;AAEH;AAEJ,MAtED;;AAwEA;;;AAGAhC,eAAUS,mBAAV,GAAgC,UAAUrT,KAAV,EAAiB;;AAE7C,aAAImJ,iBAAkB,WAAtB;;AAEAnT,eAAMuL,OAAN,CAAcC,WAAd,CAA0B;AACtBlI,mBAAQ6P,cADc;AAEtBxI,oBAAQ3K,MAAMG,KAAN,CAAYgT,cAAZ,EAA4B9H,MAA5B;AAFc,UAA1B,EAGG,IAHH;;AAKArL,eAAMU,OAAN,CAAcsQ,IAAd;AACAhR,eAAMU,OAAN,CAAc4F,IAAd;AAEH,MAZD;;AAcAsW,eAAU4B,gBAAV,GAA6B,UAAU7T,KAAV,EAAiB;;AAE1C,aAAI6F,oBAAoBxQ,MAAMyQ,KAAN,CAAYC,oBAAZ,EAAxB;AAAA,aACIuI,KADJ;AAAA,aAEImG,eAFJ;AAAA,aAGItI,qBAHJ;;AAKA,aAAInM,MAAMgH,WAAN,CAAkBC,IAAlB,EAAJ,EAA8B;;AAE1BqH,qBAAkBjZ,MAAMuL,OAAN,CAAcwG,QAAd,EAAlB;AACAqN,+BAAkBnG,MAAMoG,SAAN,GAAkBpG,MAAM+B,WAA1C;;AAEA,iBAAIhb,MAAMyQ,KAAN,CAAYe,QAAZ,CAAqB8N,OAArB,MAAkC,CAACF,eAAvC,EAAwD;;AAEpDpf,uBAAMuL,OAAN,CAAc6H,WAAd,CAA0B5C,iBAA1B;AAEH,cAJD,MAIO;;AAEH;AAEH;AACJ;;AAED,aAAI,CAAC4O,eAAL,EAAsB;AAClBzU,mBAAM+E,MAAN;AACH;;AAGDoH,iCAAwB9W,MAAMO,KAAN,CAAYgB,QAAZ,CAAqBsM,UAArB,CAAgC5B,MAAxD;;AAEA;;;AAGA,aAAI6K,0BAA0B,CAA9B,EAAiC;;AAE7B;AACA9W,mBAAMuL,OAAN,CAAcoD,WAAd,GAA4B,IAA5B;;AAEA;AACA3O,mBAAMiC,EAAN,CAASiJ,eAAT;;AAEA;AACAlL,mBAAMiC,EAAN,CAASQ,UAAT;;AAEA;AACAyO,wBAAW,YAAY;;AAEnBlR,uBAAMyQ,KAAN,CAAY0O,kBAAZ,CAA+B,CAA/B;AAEH,cAJD,EAIG,EAJH;AAMH,UAlBD,MAkBO;;AAEH,iBAAInf,MAAMyQ,KAAN,CAAYyB,UAAZ,KAA2B,CAA/B,EAAkC;;AAE9B;AACAlS,uBAAMyQ,KAAN,CAAY0O,kBAAZ,CAA+Bnf,MAAMyQ,KAAN,CAAYyB,UAA3C;AAEH,cALD,MAKO;;AAEH;AACAlS,uBAAMyQ,KAAN,CAAYU,cAAZ,CAA2BnR,MAAMyQ,KAAN,CAAYyB,UAAvC;AAEH;AACJ;;AAEDlS,eAAMU,OAAN,CAAcsQ,IAAd;;AAEA,aAAI,CAAChR,MAAMU,OAAN,CAAcsU,MAAnB,EAA2B;AACvBhV,mBAAMU,OAAN,CAAc4F,IAAd;AACH;;AAED;AACAtG,eAAMiC,EAAN,CAASQ,UAAT;;AAEA;AACAuH,eAAMmQ,cAAN;AAEH,MA9ED;;AAgFAyC,eAAU/R,UAAV,GAAuB,UAASb,KAAT,EAAgB;;AAEnC,aAAIwG,oBAAoBxQ,MAAMyQ,KAAN,CAAYC,oBAAZ,EAAxB;AAAA,aACId,OAAO5P,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB6O,iBAAnB,CADX;;AAGAU,oBAAW,YAAW;;AAElBlR,mBAAMuL,OAAN,CAAcqI,QAAd,CAAuBhE,IAAvB;AAEH,UAJD,EAIG,EAJH;AAMH,MAXD;;AAaAgN,eAAU2C,WAAV,GAAwB,UAASvV,KAAT,EAAgB;;AAEpC,aAAIwG,oBAAoBxQ,MAAMyQ,KAAN,CAAYC,oBAAZ,EAAxB;;AAEA;;;AAGA,aAAI8O,WAAW,IAAIC,gBAAJ,CAAqBzf,MAAMiK,QAAN,CAAeyV,iBAApC,CAAf;;AAEA;;;AAGA,aAAIC,SAAS,EAAEhL,YAAY,IAAd,EAAoBiL,WAAW,IAA/B,EAAqCC,eAAe,KAApD,EAAb;;AAEA;AACAL,kBAASM,OAAT,CAAiB9f,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB6O,iBAAnB,CAAjB,EAAwDmP,MAAxD;AACH,MAhBD;;AAkBA;;;AAGA/C,eAAU8C,iBAAV,GAA8B,UAASK,SAAT,EAAoB;AAC9CA,mBAAU1H,OAAV,CAAkBrY,MAAMuL,OAAN,CAAciI,KAAhC;AACH,MAFD;;AAIA;;;AAGAoJ,eAAUtS,yBAAV,GAAsC,YAAU;;AAE5C;;;;;;AAMA,aAAI0V,kBAAkBhgB,MAAMuL,OAAN,CAAcoD,WAAd,CAA0BT,OAA1B,CAAkCtF,IAAxD;;AAEA5I,eAAMU,OAAN,CAAcR,QAAd,CAAuBiV,MAAvB,CAA8B6K,eAA9B;;AAEA;AACAhgB,eAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;AACAlV,eAAMU,OAAN,CAAcR,QAAd,CAAuB2V,iBAAvB;AAEH,MAhBD;;AAkBA,YAAO+G,SAAP;AAEH,EAhvBe,CAgvBb,EAhvBa,CAAhB;;AAkvBA5c,OAAMiK,QAAN,GAAiB2S,SAAjB;AACA9c,QAAOC,OAAP,GAAkB6c,SAAlB,C;;;;;;;;ACrvBA,KAAI5c,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIoI,OAAQ,UAASA,IAAT,EAAe;;AAEvB;;;AAGAA,UAAKxH,OAAL,GAAe,YAAY;;AAEvB,aAAIA,UAAUwC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAxG,iBAAQ8G,SAAR,IAAqB,cAArB;;AAEA,gBAAO9G,OAAP;AAEH,MARD;;AAUA;;;AAGAwH,UAAK1G,QAAL,GAAgB,YAAY;;AAExB,aAAIA,WAAW0B,SAASgE,aAAT,CAAuB,KAAvB,CAAf;;AAEA1F,kBAASgG,SAAT,IAAsB,aAAtB;;AAEA,gBAAOhG,QAAP;AAEH,MARD;;AAUA0G,UAAKF,OAAL,GAAe,YAAW;;AAEtB,aAAI4C,QAAQ1H,SAASgE,aAAT,CAAuB,KAAvB,CAAZ;;AAEA0D,eAAMpD,SAAN,IAAmB,UAAnB;;AAEA,gBAAOoD,KAAP;AAEH,MARD;;AAUA;;;AAGA1C,UAAKvH,OAAL,GAAe,YAAY;;AAEvB,aAAIuf,MAAMhd,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEAgZ,aAAI1Y,SAAJ,IAAiB,YAAjB;;AAEA,gBAAO0Y,GAAP;AACH,MAPD;;AASAhY,UAAKH,cAAL,GAAsB,YAAW;;AAE7B,aAAIrH,UAAUwC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;AACAxG,iBAAQ+N,SAAR,CAAkBgB,GAAlB,CAAsB,qBAAtB;;AAEA,gBAAO/O,OAAP;AACH,MAND;;AAQA;;;AAGAwH,UAAKtH,aAAL,GAAqB,YAAW;;AAE5B,aAAIsf,MAAMhd,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEAgZ,aAAI1Y,SAAJ,IAAiB,mBAAjB;;AAEA,gBAAO0Y,GAAP;AAEH,MARD;;AAUA;;;AAGAhY,UAAKS,oBAAL,GAA4B,YAAW;;AAEnC,aAAIjI,UAAUwC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAxG,iBAAQ8G,SAAR,IAAqB,4BAArB;;AAEA,gBAAO9G,OAAP;AACH,MAPD;;AASA;;;AAGAwH,UAAKU,oBAAL,GAA4B,YAAW;;AAEnC,aAAIlI,UAAUwC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAxG,iBAAQ8G,SAAR,IAAqB,4BAArB;;AAEA,gBAAO9G,OAAP;AAEH,MARD;;AAUAwH,UAAKgS,YAAL,GAAoB,YAAW;;AAE3B,aAAItO,QAAQ1I,SAASgE,aAAT,CAAuB,OAAvB,CAAZ;;AAEA0E,eAAMrI,IAAN,GAAoB,OAApB;AACAqI,eAAMpE,SAAN,IAAoB,cAApB;AACAoE,eAAMuU,WAAN,GAAoB,cAApB;AACAvU,eAAML,YAAN,CAAmB,MAAnB,EAA2B,aAA3B;;AAEAK,eAAML,YAAN,CAAmB,WAAnB,EAAgC,WAAhC;;AAEA,gBAAOK,KAAP;AAEH,MAbD;;AAeA;;;AAGA1D,UAAKC,YAAL,GAAoB,YAAW;;AAE3B,aAAIyC,QAAQ1H,SAASgE,aAAT,CAAuB,KAAvB,CAAZ;;AAEA0D,eAAM6D,SAAN,CAAgBgB,GAAhB,CAAoB,wBAApB;;AAEA,gBAAO7E,KAAP;AAEH,MARD;;AAUA;;;AAGA1C,UAAKD,YAAL,GAAoB,YAAW;;AAE3B,aAAI2C,QAAQ1H,SAASgE,aAAT,CAAuB,KAAvB,CAAZ;;AAEA0D,eAAMpD,SAAN,IAAmB,qBAAnB;;AAEA,gBAAOoD,KAAP;AACH,MAPD;;AASA;;;AAGA1C,UAAK9G,aAAL,GAAqB,YAAY;;AAE7B,aAAIjB,WAAW+C,SAASgE,aAAT,CAAuB,KAAvB,CAAf;;AAEA/G,kBAASqH,SAAT,IAAsB,aAAtB;;AAEA,gBAAOrH,QAAP;AACH,MAPD;;AASA+H,UAAK5G,eAAL,GAAuB,YAAW;;AAE9B,aAAI8e,MAAMld,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEAkZ,aAAI3R,SAAJ,CAAcgB,GAAd,CAAkB,qBAAlB;;AAEA,gBAAO2Q,GAAP;AACH,MAPD,EASAlY,KAAKK,eAAL,GAAuB,YAAW;;AAE9B,aAAI6X,MAAMld,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEAkZ,aAAI3R,SAAJ,CAAcgB,GAAd,CAAkB,oBAAlB;;AAEA,gBAAO2Q,GAAP;AAEH,MAjBD;;AAmBAlY,UAAKjH,UAAL,GAAkB,YAAW;;AAEzB,aAAIwJ,SAASvH,SAASgE,aAAT,CAAuB,MAAvB,CAAb;;AAEAuD,gBAAOjD,SAAP,GAAmB,kBAAnB;AACA;;AAEA,gBAAOiD,MAAP;AACH,MARD;;AAUA;;;AAGAvC,UAAKG,cAAL,GAAsB,YAAY;;AAE9B,aAAIgY,UAAUnd,SAASgE,aAAT,CAAuB,MAAvB,CAAd;;AAEAmZ,iBAAQ7Y,SAAR,GAAoB,0BAApB;;AAEA;AACA6Y,iBAAQxS,SAAR,GAAoB,6BAApB;;AAEA,gBAAOwS,OAAP;AACH,MAVD;;AAYA;;;;AAIAnY,UAAKnH,OAAL,GAAe,YAAW;;AAEtB,aAAIL,UAAUwC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAxG,iBAAQ8G,SAAR,GAAoB,mBAApB;;AAEA,gBAAO9G,OAAP;AACH,MAPD;;AASA;;;;;;;;;AASAwH,UAAKgB,aAAL,GAAqB,UAAU3F,IAAV,EAAgB+c,SAAhB,EAA2B;;AAE5C,aAAI7V,SAAavH,SAASgE,aAAT,CAAuB,IAAvB,CAAjB;AAAA,aACIqZ,YAAard,SAASgE,aAAT,CAAuB,GAAvB,CADjB;AAAA,aAEIsZ,aAAatd,SAASgE,aAAT,CAAuB,MAAvB,CAFjB;;AAIAuD,gBAAO0D,OAAP,CAAe5K,IAAf,GAAsBA,IAAtB;AACAkH,gBAAOc,YAAP,CAAoB,OAApB,EAA6BhI,IAA7B;;AAEAgd,mBAAU9R,SAAV,CAAoBgB,GAApB,CAAwB6Q,SAAxB;AACAE,oBAAW/R,SAAX,CAAqBgB,GAArB,CAAyB,yBAAzB;;AAGAhF,gBAAOlD,WAAP,CAAmBgZ,SAAnB;AACA9V,gBAAOlD,WAAP,CAAmBiZ,UAAnB;;AAEA,gBAAO/V,MAAP;AAEH,MAlBD;;AAoBA;;;;;;;;AAQAvC,UAAKyB,mBAAL,GAA2B,UAASpG,IAAT,EAAe+c,SAAf,EAA0B;AACjD,aAAI7V,SAAavH,SAASgE,aAAT,CAAuB,QAAvB,CAAjB;AAAA,aACIqZ,YAAard,SAASgE,aAAT,CAAuB,GAAvB,CADjB;;AAGAuD,gBAAOlH,IAAP,GAAc,QAAd;AACAkH,gBAAO0D,OAAP,CAAe5K,IAAf,GAAsBA,IAAtB;AACAgd,mBAAU9R,SAAV,CAAoBgB,GAApB,CAAwB6Q,SAAxB;;AAEA7V,gBAAOlD,WAAP,CAAmBgZ,SAAnB;;AAEA,gBAAO9V,MAAP;AACH,MAXD;;AAaA;;;AAGAvC,UAAK0C,KAAL,GAAa,UAAU4J,OAAV,EAAmBhJ,OAAnB,EAA4B;;AAErC,aAAIqE,OAAO3M,SAASgE,aAAT,CAAuBsN,OAAvB,CAAX;;AAEA3E,cAAKhC,SAAL,GAAiBrC,WAAW,EAA5B;;AAEA,gBAAOqE,IAAP;AAEH,MARD;;AAUA;;;;;;AAMA3H,UAAK2H,IAAL,GAAY,UAAU2E,OAAV,EAAoBhN,SAApB,EAAgCiZ,UAAhC,EAA4C;;AAEpD,aAAInb,KAAKpC,SAASgE,aAAT,CAAwBsN,OAAxB,CAAT;;AAEA,aAAKhN,SAAL,EAAiBlC,GAAGkC,SAAH,GAAeA,SAAf;;AAEjB,aAAKiZ,UAAL,EAAkB;;AAEd,kBAAK,IAAI1X,IAAT,IAAiB0X,UAAjB,EAA4B;AACxBnb,oBAAGyD,IAAH,IAAW0X,WAAW1X,IAAX,CAAX;AACH;AACJ;;AAED,gBAAOzD,EAAP;AACH,MAdD;;AAgBA4C,UAAKwY,aAAL,GAAqB,UAASnd,IAAT,EAAeiI,OAAf,EAAwB;;AAEzC,gBAAO;AACHjI,mBAAQA,IADL;AAEHqH,oBAAQ+V,QAAQvgB,KAAR,CAAcmD,IAAd,EAAoB+H,MAApB,CAA2B;AAC/BqG,uBAAOnG;AADwB,cAA3B;AAFL,UAAP;AAMH,MARD;;AAUA,YAAOtD,IAAP;AAEH,EA9SU,CA8SR,EA9SQ,CAAX;;AAgTAjI,OAAMiI,IAAN,GAAaA,IAAb;;AAEAnI,QAAOC,OAAP,GAAiBkI,IAAjB,C;;;;;;;;ACpTA,KAAIjI,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAI4Q,QAAS,UAASA,KAAT,EAAgB;;AAEzB;;;AAGAA,WAAMyB,UAAN,GAAmB,IAAnB;;AAEA;;;AAGAzB,WAAM8H,MAAN,GAAe,IAAf;;AAEA;;;AAGA9H,WAAMkQ,gBAAN,GAAyB,IAAzB;;AAEA;;;;;;AAMAlQ,WAAMM,GAAN,GAAY,UAAU1L,EAAV,EAAe0H,KAAf,EAAsBwL,MAAtB,EAA8B;;AAEtCA,kBAASA,UAAU,KAAKA,MAAf,IAAyB,CAAlC;AACAxL,iBAASA,SAAU,KAAK4T,gBAAf,IAAmC,CAA5C;;AAEA,aAAIC,SAASvb,GAAGwI,UAAhB;AAAA,aACIgT,SADJ;;AAGA,aAAKD,OAAO3U,MAAP,KAAkB,CAAvB,EAA2B;;AAEvB4U,yBAAYxb,EAAZ;AAEH,UAJD,MAIO;;AAEHwb,yBAAYD,OAAO7T,KAAP,CAAZ;AAEH;;AAED;AACA,aAAI1H,GAAGkP,OAAH,IAAc,OAAlB,EAA2B;AACvBlP,gBAAG6U,KAAH;AACA;AACH;;AAED,aAAIla,MAAM8B,IAAN,CAAWsD,SAAX,CAAqByb,SAArB,CAAJ,EAAqC;;AAEjCA,yBAAY7gB,MAAMuL,OAAN,CAAcgG,8BAAd,CAA6CsP,SAA7C,EAAwDA,UAAUhT,UAAV,CAAqB5B,MAA7E,CAAZ;AACH;;AAED,aAAIgN,QAAYhW,SAASiW,WAAT,EAAhB;AAAA,aACIpK,YAAYtL,OAAOuL,YAAP,EADhB;;AAGAmC,oBAAW,YAAW;;AAElB+H,mBAAMmC,QAAN,CAAeyF,SAAf,EAA0BtI,MAA1B;AACAU,mBAAM6B,MAAN,CAAa+F,SAAb,EAAwBtI,MAAxB;;AAEAzJ,uBAAU4M,eAAV;AACA5M,uBAAU6M,QAAV,CAAmB1C,KAAnB;;AAEAjZ,mBAAMyQ,KAAN,CAAY8M,qBAAZ;AAEH,UAVD,EAUG,EAVH;AAWH,MA3CD;;AA6CA;;;;AAIA9M,WAAM8M,qBAAN,GAA8B,YAAY;;AAEtC;AACA,aAAIzO,YAActL,OAAOuL,YAAP,EAAlB;AAAA,aACIpN,SAAc3B,MAAMwB,KAAN,CAAYG,MAD9B;AAAA,aAEI+c,cAAc5P,UAAUG,UAF5B;AAAA,aAGI0P,iBAHJ;;AAKA,aAAI,CAACD,WAAL,EAAiB;AACb;AACH;;AAED;AACA,gBAAOA,YAAYpB,eAAZ,IAA+B,MAAtC,EAA8C;AAC1CqB,iCAAoBD,YAAY5a,UAAhC;AACA4a,2BAAoBC,iBAApB;AACH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;;AAEA,gBAAOF,eAAe/c,OAAOid,oBAAP,CAAtB,EAAoD;AAChDA;AACH;;AAED,cAAK1M,UAAL,GAAkB0M,oBAAlB;AACH,MA1BD;;AA4BA;;;AAGAnO,WAAMC,oBAAN,GAA6B,YAAW;AACpC,gBAAO,KAAKwB,UAAZ;AACH,MAFD;;AAIA;;;AAGAzB,WAAMU,cAAN,GAAuB,UAASpE,KAAT,EAAgB;;AAEnC,aAAIpL,SAAS3B,MAAMwB,KAAN,CAAYG,MAAzB;AAAA,aACImf,YAAYnf,OAAOoL,QAAQ,CAAf,CADhB;;AAGA,aAAI,CAAC+T,SAAL,EAAgB;AACZ9gB,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,wBAAf;AACA;AACH;;AAED;;;;AAIA,aAAI,CAACke,UAAUjT,UAAV,CAAqB5B,MAA1B,EAAkC;AAC9B,iBAAI8U,mBAAmB9d,SAAS6N,cAAT,CAAwB,EAAxB,CAAvB;AACAgQ,uBAAUxZ,WAAV,CAAsByZ,gBAAtB;AACH;;AAED/gB,eAAMyQ,KAAN,CAAYyB,UAAZ,GAAyBnF,QAAQ,CAAjC;AACA/M,eAAMyQ,KAAN,CAAYM,GAAZ,CAAgB+P,SAAhB,EAA2B,CAA3B,EAA8B,CAA9B;AACA9gB,eAAMuL,OAAN,CAAcE,kBAAd,CAAiCqV,SAAjC;AAEH,MAvBD;;AAyBA;;;;AAIArQ,WAAMkM,UAAN,GAAmB,UAAS5P,KAAT,EAAgB;;AAE/B,aAAIpL,SAAS3B,MAAMwB,KAAN,CAAYG,MAAzB;AAAA,aACI2R,cAAc3R,OAAOoL,KAAP,CADlB;;AAGAtJ,iBAAQud,MAAR,CAAgB1N,WAAhB,EAA8B,gDAA9B;;AAEA,aAAK,CAACA,WAAN,EAAoB;AAChB;AACH;;AAED;;;;AAIA,aAAI,CAACA,YAAYzF,UAAZ,CAAuB5B,MAA5B,EAAoC;AAChC,iBAAI8U,mBAAmB9d,SAAS6N,cAAT,CAAwB,EAAxB,CAAvB;AACAwC,yBAAYhM,WAAZ,CAAwByZ,gBAAxB;AACH;;AAED/gB,eAAMyQ,KAAN,CAAYyB,UAAZ,GAAyBnF,KAAzB;AACA/M,eAAMyQ,KAAN,CAAYM,GAAZ,CAAgBuC,WAAhB,EAA6B,CAA7B,EAAgC,CAAhC;AACAtT,eAAMuL,OAAN,CAAcE,kBAAd,CAAiC6H,WAAjC;AAEH,MAxBD;;AA0BA;;;AAGA7C,WAAM0O,kBAAN,GAA2B,UAASpS,KAAT,EAAgB;;AAEvCA,iBAAQA,SAAS,CAAjB;;AAEA,aAAIpL,SAAS3B,MAAMwB,KAAN,CAAYG,MAAzB;AAAA,aACIsf,gBAAgBtf,OAAOoL,QAAQ,CAAf,CADpB;AAAA,aAEImU,aAFJ;AAAA,aAGIC,qBAHJ;AAAA,aAIIJ,gBAJJ;;AAOA,aAAI,CAACE,aAAL,EAAoB;AAChBjhB,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,2BAAf;AACA;AACH;;AAEDse,yBAAgBlhB,MAAMuL,OAAN,CAAcgG,8BAAd,CAA6C0P,aAA7C,EAA4DA,cAAcpT,UAAd,CAAyB5B,MAArF,CAAhB;AACAkV,iCAAwBD,cAAcjV,MAAtC;;AAEA;;;;AAIA,aAAI,CAACgV,cAAcpT,UAAd,CAAyB5B,MAA9B,EAAsC;;AAElC8U,gCAAmB9d,SAAS6N,cAAT,CAAwB,EAAxB,CAAnB;AACAmQ,2BAAc3Z,WAAd,CAA0ByZ,gBAA1B;AACH;AACD/gB,eAAMyQ,KAAN,CAAYyB,UAAZ,GAAyBnF,QAAQ,CAAjC;AACA/M,eAAMyQ,KAAN,CAAYM,GAAZ,CAAgBkQ,aAAhB,EAA+BA,cAAcpT,UAAd,CAAyB5B,MAAzB,GAAkC,CAAjE,EAAoEkV,qBAApE;AACAnhB,eAAMuL,OAAN,CAAcE,kBAAd,CAAiC9J,OAAOoL,QAAQ,CAAf,CAAjC;AACH,MA/BD;;AAiCA0D,WAAMe,QAAN,GAAiB;;AAEb8N,kBAAU,mBAAW;;AAEjB,iBAAIxQ,YAAkBtL,OAAOuL,YAAP,EAAtB;AAAA,iBACIsD,eAAkBvD,UAAUuD,YADhC;AAAA,iBAEIpD,aAAkBH,UAAUG,UAFhC;AAAA,iBAGIiP,kBAAkBle,MAAMuL,OAAN,CAAcoE,kBAAd,CAAiCV,UAAjC,CAHtB;AAAA,iBAIIwR,gBAAkBvC,gBAAgBrQ,UAAhB,CAA2B,CAA3B,CAJtB;;AAMA,iBAAI,CAAC7N,MAAM8B,IAAN,CAAWsD,SAAX,CAAqB6J,UAArB,CAAL,EAAuC;AACnCA,8BAAaA,WAAWnL,UAAxB;AACH;;AAED,iBAAIsd,cAAenS,eAAewR,cAAc5S,UAAd,CAAyB,CAAzB,CAAlC;AAAA,iBACIwT,eAAehP,iBAAiB,CADpC;;AAGA,oBAAO+O,eAAeC,YAAtB;AAEH,UAnBY;;AAqBbtD,mBAAW,oBAAW;;AAElB,iBAAIjP,YAAetL,OAAOuL,YAAP,EAAnB;AAAA,iBACIsD,eAAevD,UAAUuD,YAD7B;AAAA,iBAEIpD,aAAeH,UAAUG,UAF7B;;AAIA;AACA,oBAAO,CAACA,UAAD,IAAe,CAACA,WAAWhD,MAA3B,IAAqCoG,iBAAiBpD,WAAWhD,MAAxE;AACH;AA7BY,MAAjB;;AAgCA,YAAOwE,KAAP;AAEH,EA3OW,CA2OT,EA3OS,CAAZ;;AA6OAzQ,OAAMyQ,KAAN,GAAcA,KAAd;AACA3Q,QAAOC,OAAP,GAAiB0Q,KAAjB,C;;;;;;;;AChPA,KAAIzQ,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIkB,gBAAiB,UAASA,aAAT,EAAwB;;AAEzC;;;;AAIAA,mBAAcgJ,WAAd,GAA4B,UAASF,QAAT,EAAmBG,KAAnB,EAA0B;;AAElDhK,eAAMe,aAAN,CAAoB6F,IAApB,CAAyB,wCAAzB,EAAmEoD,MAAM1G,IAAzE,EAA+E,KAA/E;AAEH,MAJD;;AAMA;;;;;;AAMAvC,mBAAc6F,IAAd,GAAqB,UAAS0a,OAAT,EAAkBhe,IAAlB,EAAwBgJ,MAAxB,EAAgC;;AAEjD,aAAIiV,eAAevhB,MAAMiI,IAAN,CAAW0C,KAAX,CAAiB,KAAjB,CAAnB;;AAEA4W,sBAAa5P,WAAb,GAA2B2P,OAA3B;AACAC,sBAAa/S,SAAb,CAAuBgB,GAAvB,CAA2B,sBAA3B,EAAmD,qBAAqBlM,IAAxE,EAA8E,SAA9E;;AAEA,aAAI,CAACgJ,MAAL,EAAa;AACTtM,mBAAMO,KAAN,CAAYQ,aAAZ,CAA0B6M,SAA1B,GAAsC,EAAtC;AACH;;AAED5N,eAAMO,KAAN,CAAYQ,aAAZ,CAA0BuG,WAA1B,CAAsCia,YAAtC;;AAEArQ,oBAAW,YAAY;AACnBqQ,0BAAa7R,MAAb;AACH,UAFD,EAEG,IAFH;AAIH,MA7BD;;AA+BA,YAAO3O,aAAP;AAEH,EAvCmB,CAuCjB,EAvCiB,CAApB;;AAyCAf,OAAMe,aAAN,GAAsBA,aAAtB;AACAjB,QAAOC,OAAP,GAAiBgB,aAAjB,C;;;;;;;;AC5CA,KAAIf,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIuP,SAAU,UAASA,MAAT,EAAiB;;AAE3BA,YAAOnP,IAAP,GAAc,YAAW,CAExB,CAFD;;AAIA;;;AAGAmP,YAAOoS,2BAAP,GAAqC,UAASjW,OAAT,EAAkB;AACnD,gBAAOA,QAAQkW,KAAR,CAAc,IAAd,CAAP;AACH,MAFD;;AAIA;AACArS,YAAOsS,mBAAP,GAA6B,UAASnW,OAAT,EAAkB;;AAE3C,aAAI7J,SAAS,KAAK8f,2BAAL,CAAiCjW,OAAjC,CAAb;AAAA,aACIc,CADJ;AAAA,aAEI6F,aAAawO,QAAQjQ,KAAR,CAAcC,oBAAd,EAFjB;AAAA,aAGIqD,QAHJ;AAAA,aAII4N,iBAJJ;;AAMA,cAAItV,IAAI,CAAR,EAAWA,IAAI3K,OAAOuK,MAAtB,EAA8BI,GAA9B,EAAmC;;AAE/B3K,oBAAO2K,CAAP,EAAUuF,IAAV;;AAEA,iBAAIlQ,OAAO2K,CAAP,CAAJ,EAAe;AACX,qBAAIrJ,OAAO0d,QAAQzY,IAAR,CAAawY,aAAb,CAA2B,WAA3B,EAAwC/e,OAAO2K,CAAP,CAAxC,CAAX;AACAqU,yBAAQnV,OAAR,CAAgBC,WAAhB,CAA4BxI,IAA5B;AACH;AACJ;AAEJ,MAlBD;;AAoBA;;;AAGAoM,YAAOwS,oBAAP,GAA8B,YAAY;;AAEtC,aAAIC,iBAAiBnB,QAAQngB,KAAR,CAAcC,QAAd,CAAuB8Z,KAA5C;;AAEA,aAAKuH,eAAejQ,IAAf,GAAsB3F,MAAtB,KAAiC,CAAtC,EAA0C,OAAO,IAAP;;AAG1CyU,iBAAQtR;;AAER;AAFA,UAGK0S,kBAHL,CAGwBD,cAHxB;;AAKI;AALJ,UAMK7f,IANL,CAMU0e,QAAQtR,MAAR,CAAe2S,qBANzB;;AAQI;AARJ,UASKrf,KATL,CASW,UAASC,KAAT,EAAgB;AACnB+d,qBAAQ5e,IAAR,CAAac,GAAb,CAAiB,iCAAjB,EAAoD,MAApD,EAA4DD,KAA5D;AACH,UAXL;AAaH,MApBD;;AAsBA;;;;;AAKAyM,YAAO0S,kBAAP,GAA4B,UAAUE,WAAV,EAAuB;;AAE/C,gBAAOnf,QAAQC,OAAR,GAAkBd,IAAlB,CAAuB,YAAW;;AAErC,iBAAIigB,gBAAgBhf,SAASgE,aAAT,CAAuB,KAAvB,CAApB;;AAEAgb,2BAAcrU,SAAd,GAA0BoU,WAA1B;;AAEA;;;;;;AAMA,oBAAOC,cAAcpU,UAArB;AAEH,UAdM,CAAP;AAeH,MAjBD;;AAmBA;;;;AAIAuB,YAAO2S,qBAAP,GAA+B,UAASxhB,KAAT,EAAgB;;AAE3C;;;;AAIA,aAAIuM,eAAejK,QAAQC,OAAR,EAAnB;;AAGA,cAAK,IAAIiK,QAAQ,CAAjB,EAAoBA,QAAQxM,MAAM0L,MAAlC,EAA2Cc,OAA3C,EAAqD;;AAEjD;AACA2T,qBAAQtR,MAAR,CAAepC,iBAAf,CAAiCF,YAAjC,EAA+CvM,KAA/C,EAAsDwM,KAAtD;AAEH;AAEJ,MAhBD;;AAkBA;;;AAGAqC,YAAOpC,iBAAP,GAA2B,UAAUF,YAAV,EAAwBvM,KAAxB,EAA+BwM,KAA/B,EAAsC;;AAE7D;AACAD;;AAEA;AAFA,UAGK9K,IAHL,CAGU,YAAW;;AAEb,oBAAO0e,QAAQtR,MAAR,CAAenC,YAAf,CAA4B1M,KAA5B,EAAoCwM,KAApC,CAAP;AAEH,UAPL;;AASI;;;;AATJ,UAaK/K,IAbL,CAaU,UAAS4N,IAAT,EAAc;;AAEhB,iBAAIjF,QAAQ+V,QAAQtR,MAAR,CAAe8S,oBAAf,CAAoCtS,IAApC,CAAZ;;AAEA,iBAAK8Q,QAAQ5e,IAAR,CAAasD,SAAb,CAAuBuF,KAAvB,CAAL,EAAqC;;AAEjCA,uBAAM2S,eAAN,GAAwB,MAAxB;;AAEA;AACA3S,uBAAM6D,SAAN,CAAgBgB,GAAhB,CAAoB,UAApB;;AAEA;AACAkR,yBAAQngB,KAAR,CAAcgB,QAAd,CAAuB+F,WAAvB,CAAmCqD,KAAnC;;AAEA;AACA+V,yBAAQlf,KAAR,CAAcE,MAAd,CAAqBgN,IAArB,CAA0B/D,KAA1B;;AAEA,wBAAOA,KAAP;AAEH;AACD,oBAAO,IAAP;AACH,UAlCL,EAoCK3I,IApCL,CAoCU0e,QAAQze,EAAR,CAAWyI,gBApCrB;;AAsCI;AAtCJ,UAuCKhI,KAvCL,CAuCW,UAASC,KAAT,EAAgB;AACnB+d,qBAAQ5e,IAAR,CAAac,GAAb,CAAiB,uCAAjB,EAA0D,MAA1D,EAAkED,KAAlE;AACH,UAzCL;AA2CH,MA9CD;;AAgDA;;;;AAIAyM,YAAOnC,YAAP,GAAsB,UAAUkV,QAAV,EAAoBpV,KAApB,EAA2B;;AAE7C,gBAAOlK,QAAQC,OAAR,GAAkBd,IAAlB,CAAuB,YAAW;;AAErC,oBAAOmgB,SAASC,IAAT,CAAcrV,KAAd,CAAP;AAEH,UAJM,CAAP;AAKH,MAPD;;AASA;;;;;;;;;AASAqC,YAAO8S,oBAAP,GAA8B,UAAUtS,IAAV,EAAgB;;AAE1C;AACA,aAAK8Q,QAAQtR,MAAR,CAAeC,iBAAf,CAAiCO,IAAjC,CAAL,EAA6C;;AAEzC;AACAA,oBAAO,KAAKyS,cAAL,CAAoBzS,IAApB,CAAP;;AAEA,oBAAOA,IAAP;AACH;;AAED;AACA,aAAI0S,WAAJ;AAAA,aACIC,cAAkB3S,KAAK+B,WAAL,CAAiBC,IAAjB,EADtB;AAAA,aAEI4Q,kBAAkB5S,KAAKtK,QAAL,IAAiBob,QAAQ5e,IAAR,CAAamC,SAAb,CAAuBC,GAF9D;;AAKA;AACA,aAAIse,mBAAmB,CAACD,YAAYtW,MAApC,EAA4C,OAAO,IAAP;;AAE5C;AACAqW,uBAAc5B,QAAQzY,IAAR,CAAa0C,KAAb,CAAmB,GAAnB,CAAd;;AAEA,aAAI6X,eAAJ,EAAoB;AAChBF,yBAAY3Q,WAAZ,GAA0B4Q,YAAY9N,OAAZ,CAAoB,UAApB,EAAgC,IAAhC,CAA1B,CADgB,CACiD;AACpE,UAFD,MAEO;AACH6N,yBAAYhb,WAAZ,CAAwBsI,IAAxB;AACH;;AAED;AACA0S,uBAAc,KAAKD,cAAL,CAAoBC,WAApB,CAAd;;AAEA,gBAAOA,WAAP;AAEH,MAlCD;;AAoCA;;;;;;;;;AASAlT,YAAOiT,cAAP,GAAwB,UAAUzS,IAAV,EAAgB;;AAEpC,iBAAQA,KAAK2E,OAAb;AACI,kBAAK,GAAL;AAAoB3E,sBAAK1B,OAAL,CAAatF,IAAb,GAAoB,WAApB,CAAiC;AACrD,kBAAK,IAAL;AACA,kBAAK,IAAL;AACA,kBAAK,IAAL;AACA,kBAAK,IAAL;AACA,kBAAK,IAAL;AACA,kBAAK,IAAL;AAAoBgH,sBAAK1B,OAAL,CAAatF,IAAb,GAAoB,QAApB,CAA8B;AAClD,kBAAK,YAAL;AAAoBgH,sBAAK1B,OAAL,CAAatF,IAAb,GAAoB,OAApB,CAA6B;AACjD,kBAAK,MAAL;AAAoBgH,sBAAK1B,OAAL,CAAatF,IAAb,GAAoB,MAApB,CAA4B;AATpD;;AAYA,gBAAOgH,IAAP;AAEH,MAhBD;;AAkBA;;;AAGAR,YAAOC,iBAAP,GAA2B,UAAUO,IAAV,EAAgB;;AAEvC,gBAAOA,KAAKtK,QAAL,IAAiBob,QAAQ5e,IAAR,CAAamC,SAAb,CAAuBC,GAAxC,IACH0L,KAAKpB,SAAL,CAAeC,QAAf,CAAwBiS,QAAQze,EAAR,CAAWsF,SAAX,CAAqBC,eAA7C,CADJ;AAGH,MALD;;AAOA,YAAO4H,MAAP;AAEH,EA7PY,CA6PV,EA7PU,CAAb;;AA+PAA,QAAOnP,IAAP;;AAEAD,OAAMoP,MAAN,GAAeA,MAAf;AACAtP,QAAOC,OAAP,GAAiBqP,MAAjB,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 3ad68690caed808ff875","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","var codex = (function(codex){\n\n var init = function() {\n\n require('./modules/core');\n require('./modules/ui');\n require('./modules/transport');\n require('./modules/renderer');\n require('./modules/saver');\n require('./modules/content');\n require('./modules/toolbar/toolbar');\n require('./modules/tools');\n require('./modules/callbacks');\n require('./modules/draw');\n require('./modules/caret');\n require('./modules/notifications');\n require('./modules/parser');\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","var codex = require('./../editor');\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\ncodex.core = core;\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","var codex = require('../editor');\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 == false) {\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\ncodex.ui = ui;\nmodule.exports = codex;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","var codex = require('../editor');\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\ncodex.transport = transport;\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","var codex = require('../editor');\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\ncodex.renderer = renderer;\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","var codex = require('../editor');\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\ncodex.saver = saver;\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","var codex = require('../editor');\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\ncodex.content = content;\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","var codex = require('../../editor');\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 this.opened = false;\n\n this.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\ncodex.toolbar = toolbar;\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var codex = require('../../editor');\n\nvar 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","var codex = require('../../editor');\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","var codex = require('../../editor');\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 tool,\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( 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 - 1);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( tool in codex.tools ) {\n\n nextToolIndex ++;\n\n if (!codex.tools[tool].displayInToolbox){\n break;\n }\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","var codex = require('../editor');\n\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\ncodex.tools = tools;\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var codex = require('../editor');\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 if (codex.caret.position.atStart() && !selectionLength) {\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\ncodex.callback = callbacks;\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","var codex = require('../editor');\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\ncodex.draw = draw;\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","var codex = require('../editor');\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\ncodex.caret = caret;\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","var codex = require('../editor');\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\ncodex.notifications = notifications;\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","var codex = require('../editor');\n\nvar parser = (function(parser) {\n\n parser.init = function() {\n\n };\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\nparser.init();\n\ncodex.parser = parser;\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file diff --git a/example.html b/example.html index a7aae2a3c..cf620c560 100644 --- a/example.html +++ b/example.html @@ -9,14 +9,164 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - diff --git a/plugins.js b/plugins.js deleted file mode 100644 index b45fb16c7..000000000 --- a/plugins.js +++ /dev/null @@ -1,2247 +0,0 @@ -var tools = -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; -/******/ -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - /** - * @author Khaydarov Murod - * murod.haydarov@gmail.com - */ - - var tools = function (tools) { - - tools.paragraph = __webpack_require__(18); - tools.header = __webpack_require__(19); - tools.code = __webpack_require__(20); - tools.link = __webpack_require__(21); - tools.list = __webpack_require__(22); - tools.quote = __webpack_require__(23); - tools.image = __webpack_require__(24); - tools.paste = __webpack_require__(25); - tools.twitter = __webpack_require__(26); - tools.instagram = __webpack_require__(27); - - return tools; - }({}); - - module.exports = tools; - -/***/ }, -/* 1 */, -/* 2 */, -/* 3 */, -/* 4 */, -/* 5 */, -/* 6 */, -/* 7 */, -/* 8 */, -/* 9 */, -/* 10 */, -/* 11 */, -/* 12 */, -/* 13 */, -/* 14 */, -/* 15 */, -/* 16 */, -/* 17 */, -/* 18 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Paragraph Plugin\ - * Creates P tag and adds content to this tag - */ - // var tools = require('./../plugins'); - - var paragraphTool = { - - /** - * Make initial header block - * @param {object} JSON with block data - * @return {Element} element to append - */ - make: function make(data) { - - var tag = document.createElement('DIV'); - - tag.classList.add('ce-paragraph'); - - if (data && data.text) { - tag.innerHTML = data.text; - } - - tag.contentEditable = true; - - /** - * if plugin need to add placeholder - * tag.setAttribute('data-placeholder', 'placehoder'); - */ - - /** - * @uses Paste tool callback. - * Function analyzes pasted data - * If pasted URL from instagram, twitter or Image - * it renders via Social widgets content or uploads image and uses Image tool to render - */ - tag.addEventListener('paste', tools.paste.callbacks.pasted, false); - - return tag; - }, - - /** - * Method to render HTML block from JSON - */ - render: function render(data) { - - return paragraphTool.make(data); - }, - - /** - * Method to extract JSON data from HTML block - */ - save: function save(blockContent) { - - var data = { - text: null, - format: "html", - introText: '<>' - }; - - data.text = blockContent.innerHTML; - - return data; - } - - }; - - /** - * Now plugin is ready. - * Add it to redactor tools - */ - module.exports = { - - type: 'paragraph', - iconClassname: 'ce-icon-paragraph', - make: paragraphTool.make, - appendCallback: null, - settings: null, - render: paragraphTool.render, - save: paragraphTool.save, - displayInToolbox: false, - enableLineBreaks: false, - allowedToPaste: true - - }; - -/***/ }, -/* 19 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Example of making plugin - * H e a d e r - */ - var headerTool = { - - /** - * Make initial header block - * @param {object} JSON with block data - * @return {Element} element to append - */ - make: function make(data) { - - var availableTypes = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'], - tag; - - if (data && data.type && availableTypes.includes(data.type)) { - - tag = document.createElement(data.type); - - /** - * Save header type in data-attr. - * We need it in save method to extract type from HTML to JSON - */ - tag.dataset.headerData = data.type; - } else { - - tag = document.createElement('H2'); - tag.dataset.headerData = 'H2'; - } - - if (data && data.text) { - tag.textContent = data.text; - } - - tag.classList.add('ce-header'); - tag.setAttribute('data-placeholder', 'Heading'); - tag.contentEditable = true; - - return tag; - }, - - /** - * Method to render HTML block from JSON - */ - render: function render(data) { - - return headerTool.make(data); - }, - - /** - * Method to extract JSON data from HTML block - */ - save: function save(blockContent) { - - var data = { - "heading-styles": blockContent.dataset.headerData, - format: "html", - text: null - - }; - - data.text = blockContent.textContent; - - return data; - }, - - /** - * Block appending callback - */ - appendCallback: function appendCallback(argument) { - - console.log('header appended...'); - }, - - /** - * Settings panel content - * - - - - - - - - - - - - - - * | настройки H1 H2 H3 | - * - - - - - - - - - - - - - - * @return {Element} element contains all settings - */ - makeSettings: function makeSettings() { - - var holder = document.createElement('DIV'), - types = { - H2: 'Заголовок раздела', - H3: 'Подзаголовок', - H4: 'Заголовок 3-его уровня' - }, - selectTypeButton; - - /** Add holder classname */ - holder.className = 'ce_plugin_header--settings'; - - /** Now add type selectors */ - for (var type in types) { - - selectTypeButton = document.createElement('SPAN'); - - selectTypeButton.textContent = types[type]; - selectTypeButton.className = 'ce_plugin_header--select_button'; - - this.addSelectTypeClickListener(selectTypeButton, type); - - holder.appendChild(selectTypeButton); - } - - return holder; - }, - - /** - * Binds click event to passed button - */ - addSelectTypeClickListener: function addSelectTypeClickListener(el, type) { - - el.addEventListener('click', function () { - - headerTool.selectTypeClicked(type); - }, false); - }, - - /** - * Replaces old header with new type - * @params {string} type - new header tagName: H1—H6 - */ - selectTypeClicked: function selectTypeClicked(type) { - - var old_header, new_header; - - /** Now current header stored as a currentNode */ - old_header = codex.content.currentNode.querySelector('[contentEditable]'); - - /** Making new header */ - new_header = document.createElement(type); - - new_header.innerHTML = old_header.innerHTML; - new_header.contentEditable = true; - new_header.setAttribute('data-placeholder', 'Heading'); - new_header.classList.add('ce-header'); - - new_header.dataset.headerData = type; - - codex.content.switchBlock(old_header, new_header, 'header'); - - /** Close settings after replacing */ - codex.toolbar.settings.close(); - } - - }; - - /** - * Now plugin is ready. - * Add it to redactor tools - */ - module.exports = { - - type: 'header', - iconClassname: 'ce-icon-header', - make: headerTool.make, - appendCallback: headerTool.appendCallback, - settings: headerTool.makeSettings(), - render: headerTool.render, - save: headerTool.save, - displayInToolbox: true, - enableLineBreaks: false - - }; - -/***/ }, -/* 20 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Code Plugin\ - * Creates code tag and adds content to this tag - */ - var codeTool = { - - baseClass: "ce-code", - - /** - * Make initial header block - * @param {object} JSON with block data - * @return {Element} element to append - */ - make: function make(data) { - - var tag = document.createElement('code'); - - tag.classList.add(codeTool.baseClass); - - if (data && data.text) { - tag.innerHTML = data.text; - } - - tag.contentEditable = true; - - return tag; - }, - - /** - * Method to render HTML block from JSON - */ - render: function render(data) { - - return codeTool.make(data); - }, - - /** - * Method to extract JSON data from HTML block - */ - save: function save(blockContent) { - - var data = { - text: null - }; - - data.text = blockContent.innerHTML; - - return data; - } - - }; - - /** - * Now plugin is ready. - * Add it to redactor tools - */ - module.exports = { - - type: 'code', - iconClassname: 'ce-icon-code', - make: codeTool.make, - appendCallback: null, - settings: null, - render: codeTool.render, - save: codeTool.save, - displayInToolbox: true, - enableLineBreaks: true - - }; - -/***/ }, -/* 21 */ -/***/ function(module, exports) { - - "use strict"; - - /** - * Created by nostr on 29.06.16. - */ - - /** - * Link tool plugin - */ - var linkTool = { - - defaultText: 'Insert link here ...', - ENTER_KEY: 13, - - currentBlock: null, - currentInput: null, - elementClasses: { - link: "tool-link-link", - image: "tool-link-image", - title: "tool-link-title", - description: "tool-link-description", - loader: "tool-link-loader", - error: "tool-link-error" - }, - - /** - * Make initial header block - * @param {object} JSON with block data - * @return {Element} element to append - */ - makeNewBlock: function makeNewBlock(data) { - - var wrapper = linkTool.ui.mainBlock(), - tag = linkTool.ui.input(); - - linkTool.currentInput = tag; - - wrapper.appendChild(tag); - - wrapper.classList.add('ce-link'); - /** - * Bind callbacks - **/ - tag.addEventListener('paste', linkTool.blockPasteCallback, false); - tag.addEventListener('keydown', linkTool.blockKeyDownCallback, false); - - return wrapper; - }, - - /** - * Method to render HTML block from JSON - */ - render: function render(json) { - - var block = linkTool.ui.mainBlock(), - tag = linkTool.ui.make(json); - - block.classList.add('ce-link'); - block.appendChild(tag); - - return block; - }, - - /** - * Method to extract JSON data from HTML block - */ - save: function save(blockContent) { - - var linkElement = linkTool.elementClasses.link; - - var data = { - url: blockContent.querySelector("." + linkElement).href, - shortLink: blockContent.querySelector("." + linkElement).textContent, - image: blockContent.querySelector("." + linkTool.elementClasses.image).src, - title: blockContent.querySelector("." + linkTool.elementClasses.title).textContent, - description: blockContent.querySelector("." + linkTool.elementClasses.description).textContent - }; - - return data; - }, - - blockPasteCallback: function blockPasteCallback(event) { - - var clipboardData = event.clipboardData || window.clipboardData, - pastedData = clipboardData.getData('Text'), - block = event.target.parentNode; - - linkTool.renderLink(pastedData, block); - - event.stopPropagation(); - }, - - blockKeyDownCallback: function blockKeyDownCallback(event) { - - var inputTag = event.target, - block = inputTag.parentNode, - url; - - if (block.classList.contains(linkTool.elementClasses.error)) { - block.classList.remove(linkTool.elementClasses.error); - } - - if (event.keyCode == linkTool.ENTER_KEY) { - - url = inputTag.value; - - linkTool.renderLink(url, block); - - event.preventDefault(); - } - }, - - /** - * @todo move request-url to accepted settings - */ - renderLink: function renderLink(url, block) { - - Promise.resolve().then(function () { - return linkTool.urlify(url); - }).then(function (url) { - - /* Show loader gif **/ - block.classList.add(linkTool.elementClasses.loader); - - return fetch('/club/linkInfo?url=' + encodeURI(url)); - }).then(function (response) { - - if (response.status == "200") { - - return response.json(); - } else { - - return Error("Invalid response status: %o", response); - } - }).then(function (json) { - console.log(json); - linkTool.composeLinkPreview(json, block); - }).catch(function (error) { - - /* Hide loader gif **/ - block.classList.remove(linkTool.elementClasses.loader); - - block.classList.add(linkTool.elementClasses.error); - - codex.core.log('Error while doing things with link paste: %o', 'error', error); - }); - }, - - urlify: function urlify(text) { - - var urlRegex = /(https?:\/\/\S+)/g; - - var links = text.match(urlRegex); - - if (links) { - return links[0]; - } - - return Promise.reject(Error("Url is not matched")); - }, - - composeLinkPreview: function composeLinkPreview(json, currentBlock) { - - if (json == {}) { - - return; - } - - var previewBlock = linkTool.ui.make(json); - - linkTool.currentInput.remove(); - - currentBlock.appendChild(previewBlock); - - currentBlock.classList.remove(linkTool.elementClasses.loader); - } - - }; - - linkTool.ui = { - - make: function make(json) { - - var wrapper = this.wrapper(), - siteImage = this.image(json.image, linkTool.elementClasses.image), - siteTitle = this.title(json.title), - siteDescription = this.description(json.description), - siteLink = this.link(json.url, json.url); - - wrapper.appendChild(siteImage); - wrapper.appendChild(siteTitle); - wrapper.appendChild(siteLink); - wrapper.appendChild(siteDescription); - - siteTitle.contentEditable = true; - siteDescription.contentEditable = true; - - return wrapper; - }, - - mainBlock: function mainBlock() { - - var wrapper = document.createElement('div'); - - wrapper.classList.add("ceditor-tool-link"); - - return wrapper; - }, - - input: function input() { - - var inputTag = document.createElement('input'); - - inputTag.classList.add("ceditor-tool-link-input"); - - inputTag.placeholder = linkTool.defaultText; - - inputTag.contentEditable = false; - - return inputTag; - }, - - wrapper: function wrapper() { - - var wrapper = document.createElement('div'); - - wrapper.className += 'tool-link-panel clearfix'; - - return wrapper; - }, - - image: function image(imageSrc, imageClass) { - - var imageTag = document.createElement('img'); - - imageTag.classList.add(imageClass); - - imageTag.setAttribute('src', imageSrc); - - return imageTag; - }, - - link: function link(linkUrl, linkText) { - - var linkTag = document.createElement('a'); - - linkTag.classList.add(linkTool.elementClasses.link); - - linkTag.href = linkUrl; - - linkTag.target = "_blank"; - - linkTag.innerText = linkText; - - return linkTag; - }, - - title: function title(titleText) { - - var titleTag = document.createElement('div'); - - titleTag.classList.add("tool-link-content", linkTool.elementClasses.title); - - titleTag.innerHTML = titleText; - - return titleTag; - }, - - description: function description(descriptionText) { - - var descriptionTag = document.createElement('div'); - - descriptionTag.classList.add("tool-link-content", linkTool.elementClasses.description); - - descriptionTag.innerHTML = descriptionText; - - return descriptionTag; - } - - }; - - module.exports = { - - type: 'link', - iconClassname: 'ce-icon-link', - make: linkTool.makeNewBlock, - appendCallback: linkTool.appendCallback, - render: linkTool.render, - save: linkTool.save, - displayInToolbox: true, - enableLineBreaks: true - - }; - -/***/ }, -/* 22 */ -/***/ function(module, exports) { - - "use strict"; - - /** - * Code Plugin\ - * Creates code tag and adds content to this tag - */ - var listTool = { - - baseClass: "tool-list", - elementClasses: { - li: "tool-list-li" - }, - - /** - * Make initial header block - * @param {object} JSON with block data - * @return {Element} element to append - */ - make: function make() { - - var tag = listTool.ui.make(), - li = listTool.ui.block("li", "tool-link-li"); - - var br = document.createElement("br"); - - li.appendChild(br); - tag.appendChild(li); - - tag.classList.add('ce-list'); - - return tag; - }, - - /** - * Method to render HTML block from JSON - */ - render: function render(data) { - - var type = data.type == 'ordered' ? 'OL' : 'UL', - tag = listTool.ui.make(type); - - tag.classList.add('ce-list'); - - data.items.forEach(function (element, index, array) { - - var newLi = listTool.ui.block("li", listTool.elementClasses.li); - - newLi.innerHTML = element; - - tag.dataset.type = data.type; - tag.appendChild(newLi); - }); - - return tag; - }, - - /** - * Method to extract JSON data from HTML block - */ - save: function save(blockContent) { - - var data = { - type: null, - items: [] - }; - - for (var index = 0; index < blockContent.childNodes.length; index++) { - data.items[index] = blockContent.childNodes[index].textContent; - }data.type = blockContent.dataset.type; - - return data; - }, - - makeSettings: function makeSettings(data) { - - var holder = document.createElement('DIV'), - selectTypeButton; - - /** Add holder classname */ - holder.className = 'ce_plugin_list--settings'; - - var orderedButton = listTool.ui.button("ordered"), - unorderedButton = listTool.ui.button("unordered"); - - orderedButton.addEventListener('click', function (event) { - listTool.changeBlockStyle(event, 'ol'); - codex.toolbar.settings.close(); - }); - - unorderedButton.addEventListener('click', function (event) { - listTool.changeBlockStyle(event, 'ul'); - codex.toolbar.settings.close(); - }); - - holder.appendChild(orderedButton); - holder.appendChild(unorderedButton); - - return holder; - }, - - changeBlockStyle: function changeBlockStyle(event, blockType) { - - var currentBlock = codex.content.currentNode, - newEditable = listTool.ui.make(blockType), - oldEditable = currentBlock.querySelector("[contenteditable]"); - - newEditable.dataset.type = blockType; - newEditable.innerHTML = oldEditable.innerHTML; - newEditable.classList.add('ce-list'); - - codex.content.switchBlock(currentBlock, newEditable, 'list'); - } - - }; - - listTool.ui = { - - make: function make(blockType) { - - var wrapper = this.block(blockType || 'UL', listTool.baseClass); - - wrapper.dataset.type = 'ul'; - wrapper.contentEditable = true; - - return wrapper; - }, - - block: function block(blockType, blockClass) { - - var block = document.createElement(blockType); - - if (blockClass) block.classList.add(blockClass); - - return block; - }, - - button: function button(buttonType) { - - var types = { - unordered: 'Обычный список', - ordered: 'Нумерованный список' - }, - button = document.createElement('SPAN'); - - button.innerHTML = types[buttonType]; - - button.className = 'ce_plugin_list--select_button'; - - return button; - } - }; - - /** - * Now plugin is ready. - * Add it to redactor tools - */ - module.exports = { - - type: 'list', - iconClassname: 'ce-icon-list-bullet', - make: listTool.make, - appendCallback: null, - settings: listTool.makeSettings(), - render: listTool.render, - save: listTool.save, - displayInToolbox: true, - enableLineBreaks: true - - }; - -/***/ }, -/* 23 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Codex Team - * @author Khaydarov Murod - */ - - var quoteTools = { - - /** Default path to redactors images */ - path: '/upload/redactor_images/', - - /** - * Default quote style - */ - defaultStyle: 'withPhoto', - - /** - * Make Quote from JSON datasets - */ - makeBlockToAppend: function makeBlockToAppend(data) { - - var tag; - - if (data && data.size) { - - data.style = 'withPhoto'; - - switch (data.style) { - case 'simple': - tag = quoteTools.makeSimpleQuote(data); - break; - case 'withCaption': - tag = quoteTools.makeQuoteWithCaption(data); - break; - case 'withPhoto': - tag = quoteTools.makeQuoteWithPhoto(data); - break; - } - } else { - - var settings = { - style: 'withPhoto', - text: '', - author: '', - job: '', - photo: '' - }; - - tag = quoteTools.makeQuoteWithPhoto(settings); - } - - return tag; - }, - - render: function render(data) { - return quoteTools.makeBlockToAppend(data); - }, - - save: function save(blockContent) { - - /** - * Extracts JSON quote data from HTML block - * @param {Text} text, {Text} author, {Object} photo - */ - var parsedblock = quoteTools.parseBlockQuote(blockContent); - data = { - style: parsedblock.style, - text: parsedblock.text, - author: parsedblock.author, - job: parsedblock.job, - photo: parsedblock.photo, - "format": "html", - "cite": parsedblock.author, - "size": "small" - }; - - return data; - }, - - makeSettings: function makeSettings(data) { - - var holder = document.createElement('DIV'), - types = { - simple: 'Простая цитата', - withCaption: 'Цитата с подписью', - withPhoto: 'Цитата с фото и ФИО' - }, - selectTypeButton; - - /** Add holder classname */ - holder.className = quoteTools.styles.settings.holder; - - /** Now add type selectors */ - for (var type in types) { - - selectTypeButton = document.createElement('SPAN'); - - selectTypeButton.textContent = types[type]; - selectTypeButton.className = quoteTools.styles.settings.buttons; - - selectTypeButton.dataset.style = type; - - if (type == quoteTools.defaultStyle) { - selectTypeButton.classList.add(quoteTools.styles.settings.selectedType); - } - - // var quoteStyle = quoteTools.selectTypeQuoteStyle(type); - - selectTypeButton.addEventListener('click', quoteTools.changeStyleClicked, false); - // quoteTools.addSelectTypeClickListener(selectTypeButton, quoteStyle); - - holder.appendChild(selectTypeButton); - } - - return holder; - }, - - changeStyleClicked: function changeStyleClicked() { - - var changeStyleButton = this, - quote = codex.content.currentNode.querySelector('.' + quoteTools.styles.ce_quote), - newStyle = changeStyleButton.dataset.style, - styleSelectors = this.parentNode.childNodes; - - quote.dataset.quoteStyle = newStyle; - - /** - * Mark selected style button - */ - for (var i = styleSelectors.length - 1; i >= 0; i--) { - styleSelectors[i].classList.remove(quoteTools.styles.settings.selectedType); - } - - this.classList.add(quoteTools.styles.settings.selectedType); - }, - - /** - * @deprecated - */ - selectTypeQuoteStyle: function selectTypeQuoteStyle(type) { - - /** - * Choose Quote style to replace - */ - switch (type) { - case 'simple': - quoteStyleFunction = quoteTools.makeSimpleQuote; - break; - case 'withCaption': - quoteStyleFunction = quoteTools.makeQuoteWithCaption; - break; - case 'withPhoto': - quoteStyleFunction = quoteTools.makeQuoteWithPhoto; - break; - } - - return quoteStyleFunction; - }, - - /** - * @deprecated - */ - addSelectTypeClickListener: function addSelectTypeClickListener(el, quoteStyle) { - - el.addEventListener('click', function () { - - /** - * Parsing currentNode to JSON. - */ - var parsedOldQuote = quoteTools.parseBlockQuote(), - newStyledQuote = quoteStyle(parsedOldQuote); - - var wrapper = codex.content.composeNewBlock(newStyledQuote, 'quote'); - wrapper.appendChild(newStyledQuote); - - codex.content.switchBlock(codex.content.currentNode, newStyledQuote, 'quote'); - - /** Close settings after replacing */ - codex.toolbar.settings.close(); - }, false); - }, - - /** - * @deprecated - */ - makeSimpleQuote: function makeSimpleQuote(data) { - - var wrapper = quoteTools.ui.makeBlock('BLOCKQUOTE', [quoteTools.styles.simple.text, quoteTools.styles.quoteText]); - - wrapper.innerHTML = data.text || ''; - - wrapper.dataset.quoteStyle = 'simple'; - wrapper.classList.add(quoteTools.styles.ce_quote); - wrapper.contentEditable = 'true'; - - return wrapper; - }, - - /** - * @deprecated - */ - makeQuoteWithCaption: function makeQuoteWithCaption(data) { - - var wrapper = quoteTools.ui.blockquote(), - text = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withCaption.blockquote, quoteTools.styles.quoteText]), - author = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withCaption.author, quoteTools.styles.quoteAuthor]); - - /* make text block ontentEditable */ - text.contentEditable = 'true'; - - text.innerHTML = data.text; - - /* make Author contentEditable */ - author.contentEditable = 'true'; - - author.textContent = data.cite; - - /* Appending created components */ - wrapper.dataset.quoteStyle = 'withCaption'; - wrapper.classList.add(quoteTools.styles.ce_quote); - - wrapper.appendChild(text); - wrapper.appendChild(author); - - return wrapper; - }, - - makeQuoteWithPhoto: function makeQuoteWithPhoto(data) { - - var wrapper = quoteTools.ui.blockquote(), - photo = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.photo]), - author = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.author, quoteTools.styles.quoteAuthor]), - job = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.job, quoteTools.styles.authorsJob]), - quote = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.quote, quoteTools.styles.quoteText]); - - /* Default Image src */ - if (!data.photo) { - - var icon = quoteTools.ui.makeBlock('SPAN', ['ce-icon-picture']); - photo.appendChild(icon); - } else { - - var authorsPhoto = quoteTools.ui.img(quoteTools.styles.authorsPhoto); - authorsPhoto.src = data.photo; - - photo.classList.add(quoteTools.styles.authorsPhotoWrapper); - photo.appendChild(authorsPhoto); - } - - photo.addEventListener('click', quoteTools.fileUploadClicked, false); - - /* make author block contentEditable */ - author.contentEditable = 'true'; - author.textContent = data.cite; - - /* Author's position and job */ - job.contentEditable = 'true'; - job.textContent = data.job; - - var authorsWrapper = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.authorHolder]); - authorsWrapper.appendChild(author); - authorsWrapper.appendChild(job); - - /* make quote text contentEditable */ - quote.contentEditable = 'true'; - quote.innerHTML = data.text; - - wrapper.classList.add(quoteTools.styles.ce_quote); - wrapper.classList.add(quoteTools.styles.withPhoto.wrapper); - wrapper.dataset.quoteStyle = 'withPhoto'; - - wrapper.appendChild(quote); - wrapper.appendChild(photo); - wrapper.appendChild(authorsWrapper); - - return wrapper; - }, - - parseBlockQuote: function parseBlockQuote(block) { - - var currentNode = block || codex.content.currentNode, - photo = currentNode.getElementsByTagName('img')[0], - author = currentNode.querySelector('.' + quoteTools.styles.quoteAuthor), - job = currentNode.querySelector('.' + quoteTools.styles.authorsJob), - quote; - - /** Simple quote text placed in Blockquote tag*/ - if (currentNode.dataset.quoteStyle == 'simple') quote = currentNode.innerHTML;else quote = currentNode.querySelector('.' + quoteTools.styles.quoteText).innerHTML; - - if (job) job = job.textContent; - - if (author) author = author.textContent; - - if (photo) photo = photo.src; - - var data = { - style: currentNode.dataset.quoteStyle, - text: quote, - author: author, - job: job, - photo: photo - }; - - return data; - }, - - fileUploadClicked: function fileUploadClicked() { - - var success = quoteTools.photoUploadingCallbacks.success, - error = quoteTools.photoUploadingCallbacks.error; - - codex.transport.selectAndUpload({ - success: success, - error: error - }); - } - - }; - - quoteTools.styles = { - - ce_quote: 'ce-quote', - quoteText: 'ce_quote--text', - quoteAuthor: 'ce_quote--author', - authorsJob: 'ce_quote--job', - authorsPhoto: 'authorsPhoto', - authorsPhotoWrapper: 'authorsPhoto-wrapper', - - simple: { - text: 'quoteStyle-simple--text' - }, - - withCaption: { - blockquote: 'quoteStyle-withCaption--blockquote', - author: 'quoteStyle-withCaption--author' - }, - - withPhoto: { - photo: 'quoteStyle-withPhoto--photo', - author: 'quoteStyle-withPhoto--author', - job: 'quoteStyle-withPhoto--job', - quote: 'quoteStyle-withPhoto--quote', - wrapper: 'quoteStyle-withPhoto--wrapper', - authorHolder: 'quoteStyle-withPhoto--authorWrapper' - }, - - settings: { - holder: 'ce_plugin_quote--settings', - caption: 'ce_plugin_quote--caption', - buttons: 'ce_plugin_quote--select_button', - selectedType: 'ce-quote-settings--selected' - } - }; - - quoteTools.ui = { - - wrapper: function wrapper($classList) { - - var el = document.createElement('DIV'); - - el.classList.add($classList); - - return el; - }, - - blockquote: function blockquote() { - - var el = document.createElement('BLOCKQUOTE'); - - return el; - }, - - img: function img(attribute) { - var imageTag = document.createElement('IMG'); - imageTag.classList.add(attribute); - - return imageTag; - }, - - makeBlock: function makeBlock(tag, classList) { - - var el = document.createElement(tag); - - if (classList) { - - for (var i = 0; i < classList.length; i++) { - el.className += ' ' + classList[i]; - } - } - return el; - } - - }; - - quoteTools.photoUploadingCallbacks = { - - /** - * Success callbacks for uploaded photo. - * Replace upload icon with uploaded photo - */ - success: function success(result) { - - var parsed = JSON.parse(result), - filename = parsed.filename, - uploadImageWrapper = codex.content.currentNode.querySelector('.' + quoteTools.styles.withPhoto.photo), - authorsPhoto = quoteTools.ui.img(quoteTools.styles.authorsPhoto); - - authorsPhoto.src = quoteTools.path + 'b_' + filename; - - /** Remove icon from image wrapper */ - uploadImageWrapper.innerHTML = ''; - - /** Appending uploaded image */ - uploadImageWrapper.classList.add(quoteTools.styles.authorsPhotoWrapper); - uploadImageWrapper.appendChild(authorsPhoto); - }, - - /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ - error: function error(result) { - - console.log('Can\'t upload an image'); - codex.notifications.errorThrown(); - } - - }; - - module.exports = { - - type: 'quote', - iconClassname: 'ce-icon-quote', - make: quoteTools.makeBlockToAppend, - appendCallback: null, - settings: quoteTools.makeSettings(), - render: quoteTools.render, - save: quoteTools.save, - displayInToolbox: true, - enableLineBreaks: true, - allowedToPaste: true - - }; - -/***/ }, -/* 24 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Image plugin for codex-editor - * @author CodeX Team - * - * @version 1.1.3 - */ - var ceImage = { - - elementClasses: { - - ce_image: 'ce-image', - loading: 'ce-plugin-image__loader', - blockStretched: 'ce-block--stretched', - uploadedImage: { - centered: 'ce-plugin-image__uploaded--centered', - stretched: 'ce-plugin-image__uploaded--stretched' - }, - imageCaption: 'ce-plugin-image__caption', - imageWrapper: 'ce-plugin-image__wrapper', - formHolder: 'ce-plugin-image__holder', - uploadButton: 'ce-plugin-image__button' - - }, - - holder: null, - - /** Default path to redactors images */ - path: '/upload/redactor_images/', - - make: function make(data) { - - var holder; - - if (data) { - - if (data.isStretch !== 'true') { - holder = ceImage.ui.makeImage(data, ceImage.elementClasses.uploadedImage.centered, 'false'); - } else { - holder = ceImage.ui.makeImage(data, ceImage.elementClasses.uploadedImage.stretched, 'true'); - } - - return holder; - } else { - - holder = ceImage.ui.makeForm(); - - return holder; - } - }, - - /** - * this tool works when tool is clicked in toolbox - */ - appendCallback: function appendCallback(event) { - - /** Upload image and call success callback*/ - ceImage.uploadButtonClicked(event); - }, - - /** - * Settings panel content - * @return {Element} element contains all settings - */ - makeSettings: function makeSettings() { - - var holder = document.createElement('DIV'), - types = { - centered: 'По центру', - stretched: 'На всю ширину' - }, - selectTypeButton; - - /** Add holder classname */ - holder.className = 'ce_plugin_image--settings'; - - /** Now add type selectors */ - for (var type in types) { - - selectTypeButton = document.createElement('SPAN'); - - selectTypeButton.textContent = types[type]; - selectTypeButton.className = 'ce_plugin_image--select_button'; - - this.addSelectTypeClickListener(selectTypeButton, type); - - holder.appendChild(selectTypeButton); - } - - return holder; - }, - - addSelectTypeClickListener: function addSelectTypeClickListener(el, type) { - - el.addEventListener('click', function () { - - ceImage.selectTypeClicked(type); - }, false); - }, - - selectTypeClicked: function selectTypeClicked(type) { - - var current = codex.content.currentNode, - blockContent = current.childNodes[0], - image = ceImage.ui.getImage(current), - wrapper = current.querySelector('.' + ceImage.elementClasses.imageWrapper); - - /** Clear classList */ - current.className = ''; - image.className = ''; - - /** Add important first-level class ce_block */ - current.classList.add(codex.ui.className.BLOCK_CLASSNAME); - - if (type === 'stretched') { - - image.classList.add(ceImage.elementClasses.uploadedImage.stretched); - - blockContent.classList.add(ceImage.elementClasses.blockStretched); - - /** Setting dataset for saver */ - wrapper.dataset.stretched = true; - } else if (type === 'centered') { - - image.classList.add(ceImage.elementClasses.uploadedImage.centered); - - blockContent.classList.remove(ceImage.elementClasses.blockStretched); - - /** Setting dataset for saver */ - wrapper.dataset.stretched = false; - } - }, - - render: function render(data) { - - return this.make(data); - }, - - save: function save(block) { - - var content = block, - image = ceImage.ui.getImage(content), - caption = content.querySelector('.' + ceImage.elementClasses.imageCaption); - - var data = { - background: false, - border: false, - isStretch: content.dataset.stretched, - file: { - url: image.src, - bigUrl: null, - width: image.width, - height: image.height, - additionalData: null - }, - caption: caption.textContent, - cover: null - }; - - return data; - }, - - uploadButtonClicked: function uploadButtonClicked(event) { - - var beforeSend = ceImage.photoUploadingCallbacks.beforeSend, - success = ceImage.photoUploadingCallbacks.success, - error = ceImage.photoUploadingCallbacks.error; - - /** Define callbacks */ - codex.transport.selectAndUpload({ - beforeSend: beforeSend, - success: success, - error: error - }); - } - - }; - - ceImage.ui = { - - holder: function holder() { - - var element = document.createElement('DIV'); - - element.classList.add(ceImage.elementClasses.formHolder); - element.classList.add(ceImage.elementClasses.ce_image); - - return element; - }, - - uploadButton: function uploadButton() { - - var button = document.createElement('SPAN'); - - button.classList.add(ceImage.elementClasses.uploadButton); - - button.innerHTML = ' '; - button.innerHTML += 'Загрузить фотографию'; - - return button; - }, - - /** - * @param {string} source - file path - * @param {string} style - css class - * @return {object} image - document IMG tag - */ - image: function image(source, style) { - - var image = document.createElement('IMG'); - - image.classList.add(style); - - image.src = source; - - return image; - }, - - wrapper: function wrapper() { - - var div = document.createElement('div'); - - div.classList.add(ceImage.elementClasses.imageWrapper); - - return div; - }, - - caption: function caption() { - - var div = document.createElement('div'); - - div.classList.add(ceImage.elementClasses.imageCaption); - div.contentEditable = true; - - return div; - }, - /** - * Draws form for image upload - */ - makeForm: function makeForm() { - - var holder = ceImage.ui.holder(), - uploadButton = ceImage.ui.uploadButton(); - - holder.appendChild(uploadButton); - - uploadButton.addEventListener('click', ceImage.uploadButtonClicked, false); - - ceImage.holder = holder; - - return holder; - }, - - /** - * wraps image and caption - * @param {object} data - image information - * @param {string} imageTypeClass - plugin's style - * @param {boolean} stretched - stretched or not - * @return wrapped block with image and caption - */ - makeImage: function makeImage(data, imageTypeClass, stretched) { - - var file = data.file.url, - text = data.caption, - type = data.type, - image = ceImage.ui.image(file, imageTypeClass), - caption = ceImage.ui.caption(), - wrapper = ceImage.ui.wrapper(); - - caption.textContent = text; - - wrapper.dataset.stretched = stretched; - /** Appeding to the wrapper */ - wrapper.appendChild(image); - wrapper.appendChild(caption); - - return wrapper; - }, - - /** - * @param {HTML} data - Rendered block with image - */ - getImage: function getImage(data) { - - var image = data.querySelector('.' + ceImage.elementClasses.uploadedImage.centered) || data.querySelector('.' + ceImage.elementClasses.uploadedImage.stretched); - - return image; - }, - - /** - * wraps image and caption - * @deprecated - * @param {object} data - image information - * @return wrapped block with image and caption - */ - centeredImage: function centeredImage(data) { - - var file = data.file.url, - text = data.caption, - type = data.type, - image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.centered), - caption = ceImage.ui.caption(), - wrapper = ceImage.ui.wrapper(); - - caption.textContent = text; - - wrapper.dataset.stretched = 'false'; - - /** Appeding to the wrapper */ - wrapper.appendChild(image); - wrapper.appendChild(caption); - - return wrapper; - }, - - /** - * wraps image and caption - * @deprecated - * @param {object} data - image information - * @return stretched image - */ - stretchedImage: function stretchedImage(data) { - - var file = data.file.url, - text = data.caption, - type = data.type, - image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.stretched), - caption = ceImage.ui.caption(), - wrapper = ceImage.ui.wrapper(); - - caption.textContent = text; - - wrapper.dataset.stretched = 'true'; - /** Appeding to the wrapper */ - wrapper.appendChild(image); - wrapper.appendChild(caption); - - return wrapper; - } - - }; - - ceImage.photoUploadingCallbacks = { - - /** Before sending ajax request */ - beforeSend: function beforeSend() { - ceImage.holder.classList.add(ceImage.elementClasses.loading); - }, - - /** Photo was uploaded successfully */ - success: function success(result) { - - var parsed = JSON.parse(result), - data, - currentBlock = codex.content.currentNode, - image; - - /** - * Preparing {Object} data to draw an image - * @uses ceImage.make method - */ - data = { - background: false, - border: false, - isStretch: false, - file: { - url: ceImage.path + 'o_' + parsed.filename, - bigUrl: null, - width: null, - height: null, - additionalData: null - }, - caption: '', - cover: null - }; - - image = ceImage.make(data); - - /** - * If current block is empty, we can replace it to uploaded image - * Or insert new block - */ - codex.content.switchBlock(ceImage.holder, image, 'image'); - }, - - /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ - error: function error(result) { - console.log('Choosen file is not an image or image is corrupted'); - codex.notifications.errorThrown(); - } - - }; - - /** - * Add plugin it to redactor tools - */ - module.exports = { - - type: 'image', - iconClassname: 'ce-icon-picture', - make: ceImage.make, - appendCallback: ceImage.appendCallback, - settings: ceImage.makeSettings(), - render: ceImage.render, - save: ceImage.save, - isStretched: true, - displayInToolbox: true, - enableLineBreaks: false - - }; - -/***/ }, -/* 25 */ -/***/ function(module, exports) { - - "use strict"; - - /** - * Paste plugin. - * - * Listens on paste event and pastes content from: - * - Instagram - * - Twitter - * - VK - * - Facebook - * - Image - * - External Link - * - */ - - /** - * @protected - * - * Main tool settings. - */ - var pasteTool = {}; - - /** - * Make elements to insert or switch - * - * @uses Core codex.draw module - */ - pasteTool.ui = { - - /** - * Upload image by URL - * - * @uses codex Image tool - * @param filename - * @returns {Element} - */ - uploadedImage: function uploadedImage(filename) { - - var data = { - background: false, - border: false, - isStretch: false, - file: { - url: "upload/redactor_images/" + filename, - bigUrl: "upload/redactor_images/" + filename, - width: null, - height: null, - additionalData: "null" - }, - caption: '', - cover: null - }; - - /** Using Image plugin make method */ - var image = codex.tools.image.make(data); - - return image; - } - - }; - - /** - * - * Callbacks - */ - pasteTool.callbacks = { - - /** - * Saves data - * @param event - */ - pasted: function pasted(event) { - - var clipBoardData = event.clipboardData || window.clipboardData, - content = clipBoardData.getData('Text'); - - pasteTool.callbacks.analize(content); - }, - - /** - * Analizes pated string and calls necessary method - */ - analize: function analize(string) { - - var regexTemplates = { - image: /(?:([^:\/?#]+):)?(?:\/\/([^\/?#]*))?([^?#]*\.(?:jpe?g|gif|png))(?:\?([^#]*))?(?:#(.*))?/i, - instagram: new RegExp("http?.+instagram.com\/p?."), - twitter: new RegExp("http?.+twitter.com?.+\/"), - facebook: /https?.+facebook.+\/\d+\?/, - vk: /https?.+vk?.com\/feed\?w=wall\d+_\d+/ - }, - image = regexTemplates.image.test(string), - instagram = regexTemplates.instagram.exec(string), - twitter = regexTemplates.twitter.exec(string), - facebook = regexTemplates.facebook.test(string), - vk = regexTemplates.vk.test(string); - - if (image) { - - pasteTool.callbacks.uploadImage(string); - } else if (instagram) { - - pasteTool.callbacks.instagramMedia(instagram); - } else if (twitter) { - - pasteTool.callbacks.twitterMedia(twitter); - } else if (facebook) { - - pasteTool.callbacks.facebookMedia(string); - } else if (vk) { - - pasteTool.callbacks.vkMedia(string); - } - }, - - /** - * Direct upload - * @param url - */ - uploadImage: function uploadImage(path) { - - var ajaxUrl = location.protocol + '//' + location.hostname + ':32769', - file, - image, - current = codex.content.currentNode, - beforeSend, - success_callback; - - /** When image is uploaded to redactors folder */ - success_callback = function success_callback(data) { - - console.log(data); - return; - var file = JSON.parse(data); - image = pasteTool.ui.uploadedImage(file.filename); - codex.content.switchBlock(current, image, 'image'); - }; - - /** Before sending XMLHTTP request */ - beforeSend = function beforeSend() { - var content = current.querySelector('.ce-block__content'); - content.classList.add('ce-plugin-image__loader'); - }; - - /** Preparing data for XMLHTTP */ - var data = { - url: '/club/fetchImage', - type: "POST", - data: { - url: path - }, - beforeSend: beforeSend, - success: success_callback - }; - - codex.core.ajax(data); - }, - - /** - * callback for instagram url's - * Using instagram Embed Widgete to render - * @uses Instagram tool - * @param url - */ - instagramMedia: function instagramMedia(url) { - - var fullUrl = url.input, - data; - - data = { - instagram_url: fullUrl - }; - - codex.tools.instagram.make(data, true); - }, - - /** - * callback for tweets - * Using Twittter Widget to render - * @uses Twitter tool - * @param url - */ - twitterMedia: function twitterMedia(url) { - - var fullUrl = url.input, - tweetId, - arr, - data; - - arr = fullUrl.split('/'); - tweetId = arr.pop(); - - /** Example */ - data = { - media: true, - conversation: false, - user: { - profile_image_url: "http:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", - profile_image_url_https: "https:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", - screen_name: "Niketas", - name: "Никита Лихачёв" - }, - id: tweetId, - text: "ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\/\/t.co\/iWyOHf4xr2", - created_at: "Tue Jun 28 14:09:12 +0000 2016", - status_url: "https:\/\/twitter.com\/Niketas\/status\/747793978511101953", - caption: "Caption" - }; - - codex.tools.twitter.make(data); - } - - }; - - module.exports = { - - type: 'paste', - iconClassname: '', - prepare: pasteTool.prepare, - make: pasteTool.make, - appendCallback: null, - settings: null, - render: null, - save: pasteTool.save, - callbacks: pasteTool.callbacks, - displayInToolbox: false, - enableLineBreaks: false, - allowedToPaste: false - - }; - -/***/ }, -/* 26 */ -/***/ function(module, exports) { - - "use strict"; - - /** - * Twitter plugin - * @version 1.0.0 - */ - - var twitterTool = { - - /** - * Prepare twitter scripts - */ - prepare: function prepare() { - - var script = "//platform.twitter.com/widgets.js"; - - /** - * Load script - */ - codex.core.importScript(script, 'twitterAPI'); - }, - - make: function make(data) { - - if (!data.id) return; - - twitterTool.content.twitter(data.id); - }, - - save: function save(blockContent) { - - var data; - - data = { - media: true, - conversation: false, - user: { - profile_image_url: "http:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", - profile_image_url_https: "https:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", - screen_name: "Niketas", - name: "Никита Лихачёв" - }, - id: blockContent.dataset.tweetId, - text: "ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\/\/t.co\/iWyOHf4xr2", - created_at: "Tue Jun 28 14:09:12 +0000 2016", - status_url: "https:\/\/twitter.com\/Niketas\/status\/747793978511101953", - caption: "Caption" - }; - - return data; - }, - - render: function render(data) { - return twitterTool.make(data); - } - - }; - - twitterTool.content = { - - /** - * Twitter render method appends content after block - * @param tweetId - */ - twitter: function twitter(tweetId) { - - var tweet = twitterTool.content.twitterBlock(); - - codex.content.switchBlock(codex.content.currentNode, tweet, 'twitter'); - - var blockContent = codex.content.currentNode.childNodes[0]; - blockContent.classList.add('twitter__loader'); - - window.twttr.widgets.createTweet(tweetId, blockContent); - - setTimeout(function () { - blockContent.classList.remove('twitter__loader'); - }, 500); - - /** Remove empty DIV */ - blockContent.childNodes[0].remove(); - }, - - twitterBlock: function twitterBlock() { - var block = codex.draw.node('DIV', '', {}); - return block; - } - }; - - module.exports = { - - type: 'twitter', - iconClassname: 'ce-icon-twitter', - prepare: twitterTool.prepare, - make: twitterTool.make, - appendCallback: null, - settings: null, - render: twitterTool.render, - save: twitterTool.save, - displayInToolbox: false, - enableLineBreaks: false, - allowedToPaste: false - - }; - -/***/ }, -/* 27 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Instagram plugin - * @version 1.0.0 - */ - var instagramTool = { - - /** - * Prepare before usage - * Load important scripts to render embed - */ - prepare: function prepare() { - - var script = "//platform.instagram.com/en_US/embeds.js"; - - /** - * Load widget - */ - codex.core.importScript(script, 'instagramAPI'); - }, - - /** - * Make instagram embed via Widgets method - */ - make: function make(data, isInternal) { - - if (!data.instagram_url) return; - - var block = instagramTool.content.instagramBlock(data.instagram_url); - - if (isInternal) { - - setTimeout(function () { - - /** Render block */ - instagramTool.content.render(block); - }, 200); - } - - return block; - - if (!isInternal) { - instagramTool.content.render(block); - } - }, - - /** - * Saving JSON output. - * Upload data via ajax - */ - save: function save(blockContent) { - - var data; - - if (!blockContent) return; - - /** Example */ - data = { - instagram_url: blockContent.src - }; - - return data; - }, - - /** - * Render data - */ - render: function render(data) { - return instagramTool.make(data); - } - - }; - - instagramTool.content = { - - render: function render(content) { - - codex.content.switchBlock(codex.content.currentNode, content, 'instagram'); - - var blockContent = codex.content.currentNode.childNodes[0]; - blockContent.classList.add('instagram__loader'); - - window.instgrm.Embeds.process(); - - setTimeout(function () { - blockContent.classList.remove('instagram__loader'); - }, 500); - }, - - /** - * Drawing html content. - * - * @param url - * @returns {Element} blockquote - HTML template for Instagram Embed JS - */ - instagramBlock: function instagramBlock(url) { - - var blockquote = codex.draw.node('BLOCKQUOTE', 'instagram-media instagram', {}), - div = codex.draw.node('DIV', '', {}), - paragraph = codex.draw.node('P', 'ce-paste__instagram--p', {}), - anchor = codex.draw.node('A', '', { href: url }); - - blockquote.dataset.instgrmVersion = 4; - - paragraph.appendChild(anchor); - div.appendChild(paragraph); - blockquote.appendChild(div); - - return blockquote; - } - - }; - - module.exports = { - - type: 'instagram', - iconClassname: 'ce-icon-instagram', - prepare: instagramTool.prepare, - make: instagramTool.make, - appendCallback: null, - settings: null, - render: instagramTool.render, - save: instagramTool.save, - displayInToolbox: false, - enableLineBreaks: false, - allowedToPaste: false - - }; - -/***/ } -/******/ ]); -//# sourceMappingURL=plugins.js.map \ No newline at end of file diff --git a/plugins.js.map b/plugins.js.map deleted file mode 100644 index 85089b6ef..000000000 --- a/plugins.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap f3b0eedf9fd882cac43c","webpack:///./plugins/plugins.js","webpack:///./plugins/paragraph/paragraph.js","webpack:///./plugins/header/header.js","webpack:///./plugins/code/code.js","webpack:///./plugins/link/link.js","webpack:///./plugins/list/list.js","webpack:///./plugins/quote/quote.js","webpack:///./plugins/image/image.js","webpack:///./plugins/paste/paste.js","webpack:///./plugins/twitter/twitter.js","webpack:///./plugins/instagram/instagram.js"],"names":["tools","paragraph","require","header","code","link","list","quote","image","paste","twitter","instagram","module","exports","paragraphTool","make","data","tag","document","createElement","classList","add","text","innerHTML","contentEditable","addEventListener","callbacks","pasted","render","save","blockContent","format","introText","type","iconClassname","appendCallback","settings","displayInToolbox","enableLineBreaks","allowedToPaste","headerTool","availableTypes","includes","dataset","headerData","textContent","setAttribute","argument","console","log","makeSettings","holder","types","H2","H3","H4","selectTypeButton","className","addSelectTypeClickListener","appendChild","el","selectTypeClicked","old_header","new_header","codex","content","currentNode","querySelector","switchBlock","toolbar","close","codeTool","baseClass","linkTool","defaultText","ENTER_KEY","currentBlock","currentInput","elementClasses","title","description","loader","error","makeNewBlock","wrapper","ui","mainBlock","input","blockPasteCallback","blockKeyDownCallback","json","block","linkElement","url","href","shortLink","src","event","clipboardData","window","pastedData","getData","target","parentNode","renderLink","stopPropagation","inputTag","contains","remove","keyCode","value","preventDefault","Promise","resolve","then","urlify","fetch","encodeURI","response","status","Error","composeLinkPreview","catch","core","urlRegex","links","match","reject","previewBlock","siteImage","siteTitle","siteDescription","siteLink","placeholder","imageSrc","imageClass","imageTag","linkUrl","linkText","linkTag","innerText","titleText","titleTag","descriptionText","descriptionTag","listTool","li","br","items","forEach","element","index","array","newLi","childNodes","length","orderedButton","button","unorderedButton","changeBlockStyle","blockType","newEditable","oldEditable","blockClass","buttonType","unordered","ordered","quoteTools","path","defaultStyle","makeBlockToAppend","size","style","makeSimpleQuote","makeQuoteWithCaption","makeQuoteWithPhoto","author","job","photo","parsedblock","parseBlockQuote","simple","withCaption","withPhoto","styles","buttons","selectedType","changeStyleClicked","changeStyleButton","ce_quote","newStyle","styleSelectors","quoteStyle","i","selectTypeQuoteStyle","quoteStyleFunction","parsedOldQuote","newStyledQuote","composeNewBlock","makeBlock","quoteText","blockquote","quoteAuthor","cite","authorsJob","icon","authorsPhoto","img","authorsPhotoWrapper","fileUploadClicked","authorsWrapper","authorHolder","getElementsByTagName","success","photoUploadingCallbacks","transport","selectAndUpload","caption","$classList","attribute","result","parsed","JSON","parse","filename","uploadImageWrapper","notifications","errorThrown","ceImage","ce_image","loading","blockStretched","uploadedImage","centered","stretched","imageCaption","imageWrapper","formHolder","uploadButton","isStretch","makeImage","makeForm","uploadButtonClicked","current","getImage","BLOCK_CLASSNAME","background","border","file","bigUrl","width","height","additionalData","cover","beforeSend","source","div","imageTypeClass","centeredImage","stretchedImage","isStretched","pasteTool","clipBoardData","analize","string","regexTemplates","RegExp","facebook","vk","test","exec","uploadImage","instagramMedia","twitterMedia","facebookMedia","vkMedia","ajaxUrl","location","protocol","hostname","success_callback","ajax","fullUrl","instagram_url","tweetId","arr","split","pop","media","conversation","user","profile_image_url","profile_image_url_https","screen_name","name","id","created_at","status_url","prepare","twitterTool","script","importScript","tweet","twitterBlock","twttr","widgets","createTweet","setTimeout","draw","node","instagramTool","isInternal","instagramBlock","instgrm","Embeds","process","anchor","instgrmVersion"],"mappings":"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","file":"plugins.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 f3b0eedf9fd882cac43c","/**\n * @author Khaydarov Murod\n * murod.haydarov@gmail.com\n */\n\nvar tools = (function(tools) {\n\n tools.paragraph = require('./paragraph/paragraph');\n tools.header = require('./header/header');\n tools.code = require('./code/code');\n tools.link = require('./link/link');\n tools.list = require('./list/list');\n tools.quote = require('./quote/quote');\n tools.image = require('./image/image');\n tools.paste = require('./paste/paste');\n tools.twitter = require('./twitter/twitter');\n tools.instagram = require('./instagram/instagram');\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/plugins.js","/**\n* Paragraph Plugin\\\n* Creates P tag and adds content to this tag\n*/\n// var tools = require('./../plugins');\n\nvar paragraphTool = {\n\n /**\n * Make initial header block\n * @param {object} JSON with block data\n * @return {Element} element to append\n */\n make : function (data) {\n\n var tag = document.createElement('DIV');\n\n tag.classList.add('ce-paragraph');\n\n if (data && data.text) {\n tag.innerHTML = data.text;\n }\n\n tag.contentEditable = true;\n\n /**\n * if plugin need to add placeholder\n * tag.setAttribute('data-placeholder', 'placehoder');\n */\n\n /**\n * @uses Paste tool callback.\n * Function analyzes pasted data\n * If pasted URL from instagram, twitter or Image\n * it renders via Social widgets content or uploads image and uses Image tool to render\n */\n tag.addEventListener('paste', tools.paste.callbacks.pasted, false);\n\n return tag;\n\n },\n\n /**\n * Method to render HTML block from JSON\n */\n render : function (data) {\n\n return paragraphTool.make(data);\n\n },\n\n /**\n * Method to extract JSON data from HTML block\n */\n save : function (blockContent){\n\n var data = {\n text : null,\n format: \"html\",\n introText: '<>'\n };\n\n data.text = blockContent.innerHTML;\n\n return data;\n\n }\n\n};\n\n/**\n* Now plugin is ready.\n* Add it to redactor tools\n*/\nmodule.exports = {\n\n type : 'paragraph',\n iconClassname : 'ce-icon-paragraph',\n make : paragraphTool.make,\n appendCallback : null,\n settings : null,\n render : paragraphTool.render,\n save : paragraphTool.save,\n displayInToolbox : false,\n enableLineBreaks : false,\n allowedToPaste : true\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/paragraph/paragraph.js","/**\n* Example of making plugin\n* H e a d e r\n*/\nvar headerTool = {\n\n /**\n * Make initial header block\n * @param {object} JSON with block data\n * @return {Element} element to append\n */\n make : function (data) {\n\n var availableTypes = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'],\n tag;\n\n if (data && data.type && availableTypes.includes(data.type)) {\n\n tag = document.createElement( data.type );\n\n /**\n * Save header type in data-attr.\n * We need it in save method to extract type from HTML to JSON\n */\n tag.dataset.headerData = data.type;\n\n } else {\n\n tag = document.createElement( 'H2' );\n tag.dataset.headerData = 'H2';\n\n }\n\n if (data && data.text) {\n tag.textContent = data.text;\n }\n\n tag.classList.add('ce-header');\n tag.setAttribute('data-placeholder', 'Heading');\n tag.contentEditable = true;\n\n return tag;\n\n },\n\n /**\n * Method to render HTML block from JSON\n */\n render : function (data) {\n\n return headerTool.make(data);\n\n },\n\n /**\n * Method to extract JSON data from HTML block\n */\n save : function (blockContent) {\n\n var data = {\n \"heading-styles\": blockContent.dataset.headerData,\n format:\"html\",\n text : null,\n\n };\n\n data.text = blockContent.textContent;\n\n return data;\n\n },\n\n /**\n * Block appending callback\n */\n appendCallback : function (argument) {\n\n console.log('header appended...');\n\n },\n\n /**\n * Settings panel content\n * - - - - - - - - - - - - -\n * | настройки H1 H2 H3 |\n * - - - - - - - - - - - - -\n * @return {Element} element contains all settings\n */\n makeSettings : function () {\n\n var holder = document.createElement('DIV'),\n types = {\n H2: 'Заголовок раздела',\n H3: 'Подзаголовок',\n H4: 'Заголовок 3-его уровня'\n },\n selectTypeButton;\n\n /** Add holder classname */\n holder.className = 'ce_plugin_header--settings';\n\n /** Now add type selectors */\n for (var type in types){\n\n selectTypeButton = document.createElement('SPAN');\n\n selectTypeButton.textContent = types[type];\n selectTypeButton.className = 'ce_plugin_header--select_button';\n\n this.addSelectTypeClickListener(selectTypeButton, type);\n\n holder.appendChild(selectTypeButton);\n\n }\n\n return holder;\n\n },\n\n /**\n * Binds click event to passed button\n */\n addSelectTypeClickListener : function (el, type) {\n\n el.addEventListener('click', function () {\n\n headerTool.selectTypeClicked(type);\n\n }, false);\n },\n\n /**\n * Replaces old header with new type\n * @params {string} type - new header tagName: H1—H6\n */\n selectTypeClicked : function (type) {\n\n var old_header, new_header;\n\n /** Now current header stored as a currentNode */\n old_header = codex.content.currentNode.querySelector('[contentEditable]');\n\n /** Making new header */\n new_header = document.createElement(type);\n\n new_header.innerHTML = old_header.innerHTML;\n new_header.contentEditable = true;\n new_header.setAttribute('data-placeholder', 'Heading');\n new_header.classList.add('ce-header');\n\n new_header.dataset.headerData = type;\n\n codex.content.switchBlock(old_header, new_header, 'header');\n\n /** Close settings after replacing */\n codex.toolbar.settings.close();\n },\n\n};\n\n/**\n* Now plugin is ready.\n* Add it to redactor tools\n*/\nmodule.exports = {\n\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};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/header/header.js","/**\n * Code Plugin\\\n * Creates code tag and adds content to this tag\n */\nvar codeTool = {\n\n baseClass : \"ce-code\",\n\n /**\n * Make initial header block\n * @param {object} JSON with block data\n * @return {Element} element to append\n */\n make : function (data) {\n\n var tag = document.createElement('code');\n\n tag.classList.add(codeTool.baseClass);\n\n if (data && data.text) {\n tag.innerHTML = data.text;\n }\n\n tag.contentEditable = true;\n\n return tag;\n\n },\n\n /**\n * Method to render HTML block from JSON\n */\n render : function (data) {\n\n return codeTool.make(data);\n\n },\n\n /**\n * Method to extract JSON data from HTML block\n */\n save : function (blockContent){\n\n var data = {\n text : null,\n };\n\n data.text = blockContent.innerHTML;\n\n return data;\n\n },\n\n};\n\n/**\n * Now plugin is ready.\n * Add it to redactor tools\n */\nmodule.exports = {\n\n type : 'code',\n iconClassname : 'ce-icon-code',\n make : codeTool.make,\n appendCallback : null,\n settings : null,\n render : codeTool.render,\n save : codeTool.save,\n displayInToolbox : true,\n enableLineBreaks : true\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/code/code.js","/**\n * Created by nostr on 29.06.16.\n */\n\n/**\n * Link tool plugin\n */\nvar linkTool = {\n\n defaultText : 'Insert link here ...',\n ENTER_KEY : 13,\n\n currentBlock : null,\n currentInput : null,\n elementClasses : {\n link : \"tool-link-link\",\n image : \"tool-link-image\",\n title : \"tool-link-title\",\n description : \"tool-link-description\",\n loader : \"tool-link-loader\",\n error : \"tool-link-error\"\n },\n\n /**\n * Make initial header block\n * @param {object} JSON with block data\n * @return {Element} element to append\n */\n makeNewBlock : function (data) {\n\n var wrapper = linkTool.ui.mainBlock(),\n tag = linkTool.ui.input();\n\n linkTool.currentInput = tag;\n\n wrapper.appendChild(tag);\n\n wrapper.classList.add('ce-link');\n /**\n * Bind callbacks\n **/\n tag.addEventListener('paste', linkTool.blockPasteCallback, false);\n tag.addEventListener('keydown', linkTool.blockKeyDownCallback, false);\n\n return wrapper;\n\n },\n\n /**\n * Method to render HTML block from JSON\n */\n render : function (json) {\n\n var block = linkTool.ui.mainBlock(),\n tag = linkTool.ui.make(json);\n\n block.classList.add('ce-link');\n block.appendChild(tag);\n\n return block;\n\n },\n\n /**\n * Method to extract JSON data from HTML block\n */\n save : function (blockContent){\n\n var linkElement = linkTool.elementClasses.link;\n\n var data = {\n url : blockContent.querySelector(\".\" + linkElement).href,\n shortLink : blockContent.querySelector(\".\" + linkElement).textContent,\n image : blockContent.querySelector(\".\" + linkTool.elementClasses.image).src,\n title : blockContent.querySelector(\".\" + linkTool.elementClasses.title).textContent,\n description : blockContent.querySelector(\".\" + linkTool.elementClasses.description).textContent\n };\n\n return data;\n\n },\n\n blockPasteCallback : function (event) {\n\n var clipboardData = event.clipboardData || window.clipboardData,\n pastedData = clipboardData.getData('Text'),\n block = event.target.parentNode;\n\n linkTool.renderLink(pastedData, block);\n\n event.stopPropagation();\n\n },\n\n blockKeyDownCallback : function (event) {\n\n var inputTag = event.target,\n block = inputTag.parentNode,\n url;\n\n if ( block.classList.contains(linkTool.elementClasses.error) )\n {\n block.classList.remove(linkTool.elementClasses.error);\n }\n\n if (event.keyCode == linkTool.ENTER_KEY) {\n\n url = inputTag.value;\n\n linkTool.renderLink(url, block);\n\n event.preventDefault();\n\n }\n\n },\n\n /**\n * @todo move request-url to accepted settings\n */\n renderLink : function (url, block) {\n\n Promise.resolve()\n\n .then(function () {\n return linkTool.urlify(url);\n })\n\n .then(function (url) {\n\n /* Show loader gif **/\n block.classList.add(linkTool.elementClasses.loader);\n\n return fetch('/club/linkInfo?url=' + encodeURI(url));\n })\n\n .then(function (response) {\n\n if (response.status == \"200\"){\n\n return response.json();\n\n } else {\n\n return Error(\"Invalid response status: %o\", response);\n\n }\n\n })\n\n .then(function (json) {\n console.log(json);\n linkTool.composeLinkPreview(json, block);\n })\n\n .catch(function(error) {\n\n /* Hide loader gif **/\n block.classList.remove(linkTool.elementClasses.loader);\n\n block.classList.add(linkTool.elementClasses.error);\n\n codex.core.log('Error while doing things with link paste: %o', 'error', error);\n });\n\n },\n\n urlify : function (text) {\n\n var urlRegex = /(https?:\\/\\/\\S+)/g;\n\n var links = text.match(urlRegex);\n\n if (links) {\n return links[0];\n }\n\n return Promise.reject(Error(\"Url is not matched\"));\n\n },\n\n composeLinkPreview : function (json, currentBlock) {\n\n if (json == {}) {\n\n return;\n\n }\n \n var previewBlock = linkTool.ui.make(json);\n\n linkTool.currentInput.remove();\n\n currentBlock.appendChild(previewBlock);\n\n currentBlock.classList.remove(linkTool.elementClasses.loader);\n\n }\n\n};\n\nlinkTool.ui = {\n\n make : function (json) {\n\n var wrapper = this.wrapper(),\n siteImage = this.image(json.image, linkTool.elementClasses.image),\n siteTitle = this.title(json.title),\n siteDescription = this.description(json.description),\n siteLink = this.link(json.url, json.url);\n\n wrapper.appendChild(siteImage);\n wrapper.appendChild(siteTitle);\n wrapper.appendChild(siteLink);\n wrapper.appendChild(siteDescription);\n\n siteTitle.contentEditable = true;\n siteDescription.contentEditable = true;\n\n return wrapper;\n\n },\n\n mainBlock : function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.classList.add(\"ceditor-tool-link\");\n\n return wrapper;\n\n },\n\n input : function () {\n\n var inputTag = document.createElement('input');\n\n inputTag.classList.add(\"ceditor-tool-link-input\");\n\n inputTag.placeholder = linkTool.defaultText;\n\n inputTag.contentEditable = false;\n\n return inputTag;\n\n },\n\n wrapper : function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'tool-link-panel clearfix';\n\n return wrapper;\n\n },\n\n image : function (imageSrc, imageClass) {\n\n var imageTag = document.createElement('img');\n\n imageTag.classList.add(imageClass);\n\n imageTag.setAttribute('src', imageSrc);\n\n return imageTag;\n\n },\n\n link : function (linkUrl, linkText) {\n\n var linkTag = document.createElement('a');\n\n linkTag.classList.add(linkTool.elementClasses.link);\n\n linkTag.href = linkUrl;\n\n linkTag.target = \"_blank\";\n\n linkTag.innerText = linkText;\n\n return linkTag;\n\n },\n\n title : function (titleText) {\n\n var titleTag = document.createElement('div');\n\n titleTag.classList.add(\"tool-link-content\", linkTool.elementClasses.title);\n\n titleTag.innerHTML = titleText;\n\n return titleTag;\n },\n\n description : function (descriptionText) {\n\n var descriptionTag = document.createElement('div');\n\n descriptionTag.classList.add(\"tool-link-content\", linkTool.elementClasses.description);\n\n descriptionTag.innerHTML = descriptionText;\n\n return descriptionTag;\n },\n\n};\n\nmodule.exports = {\n\n type : 'link',\n iconClassname : 'ce-icon-link',\n make : linkTool.makeNewBlock,\n appendCallback : linkTool.appendCallback,\n render : linkTool.render,\n save : linkTool.save,\n displayInToolbox : true,\n enableLineBreaks : true\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/link/link.js","/**\n * Code Plugin\\\n * Creates code tag and adds content to this tag\n */\nvar listTool = {\n\n baseClass : \"tool-list\",\n elementClasses : {\n li : \"tool-list-li\"\n },\n\n /**\n * Make initial header block\n * @param {object} JSON with block data\n * @return {Element} element to append\n */\n make : function () {\n\n var tag = listTool.ui.make(),\n li = listTool.ui.block(\"li\", \"tool-link-li\");\n\n var br = document.createElement(\"br\");\n\n li.appendChild(br);\n tag.appendChild(li);\n\n tag.classList.add('ce-list');\n\n return tag;\n\n },\n\n /**\n * Method to render HTML block from JSON\n */\n render : function (data) {\n\n var type = data.type == 'ordered' ? 'OL' : 'UL',\n tag = listTool.ui.make(type);\n\n tag.classList.add('ce-list');\n\n data.items.forEach(function (element, index, array) {\n\n var newLi = listTool.ui.block(\"li\", listTool.elementClasses.li);\n\n newLi.innerHTML = element;\n\n tag.dataset.type = data.type;\n tag.appendChild(newLi);\n\n });\n\n return tag;\n\n },\n\n /**\n * Method to extract JSON data from HTML block\n */\n save : function (blockContent){\n\n var data = {\n type : null,\n items : [],\n };\n\n for(var index = 0; index < blockContent.childNodes.length; index++)\n data.items[index] = blockContent.childNodes[index].textContent;\n\n data.type = blockContent.dataset.type;\n\n return data;\n\n },\n\n makeSettings : function(data) {\n\n var holder = document.createElement('DIV'),\n selectTypeButton;\n\n /** Add holder classname */\n holder.className = 'ce_plugin_list--settings';\n\n var orderedButton = listTool.ui.button(\"ordered\"),\n unorderedButton = listTool.ui.button(\"unordered\");\n\n orderedButton.addEventListener('click', function (event) {\n listTool.changeBlockStyle(event, 'ol');\n codex.toolbar.settings.close();\n });\n\n unorderedButton.addEventListener('click', function (event) {\n listTool.changeBlockStyle(event, 'ul');\n codex.toolbar.settings.close();\n });\n\n holder.appendChild(orderedButton);\n holder.appendChild(unorderedButton);\n\n return holder;\n\n },\n\n changeBlockStyle : function (event, blockType) {\n\n var currentBlock = codex.content.currentNode,\n newEditable = listTool.ui.make(blockType),\n oldEditable = currentBlock.querySelector(\"[contenteditable]\");\n\n newEditable.dataset.type = blockType;\n newEditable.innerHTML = oldEditable.innerHTML;\n newEditable.classList.add('ce-list');\n\n codex.content.switchBlock(currentBlock, newEditable, 'list');\n },\n\n};\n\nlistTool.ui = {\n\n make : function (blockType) {\n\n var wrapper = this.block(blockType || 'UL', listTool.baseClass);\n\n wrapper.dataset.type = 'ul';\n wrapper.contentEditable = true;\n\n return wrapper;\n\n },\n\n block : function (blockType, blockClass) {\n\n var block = document.createElement(blockType);\n\n if ( blockClass ) block.classList.add(blockClass);\n\n return block;\n\n },\n\n button : function (buttonType) {\n\n var types = {\n unordered : 'Обычный список',\n ordered : 'Нумерованный список'\n },\n button = document.createElement('SPAN');\n\n button.innerHTML = types[buttonType];\n\n button.className = 'ce_plugin_list--select_button';\n\n return button;\n }\n};\n\n/**\n * Now plugin is ready.\n * Add it to redactor tools\n */\nmodule.exports = {\n\n type : 'list',\n iconClassname : 'ce-icon-list-bullet',\n make : listTool.make,\n appendCallback : null,\n settings : listTool.makeSettings(),\n render : listTool.render,\n save : listTool.save,\n displayInToolbox : true,\n enableLineBreaks : true\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/list/list.js","/**\n* Codex Team\n* @author Khaydarov Murod\n*/\n\nvar quoteTools = {\n\n /** Default path to redactors images */\n path : '/upload/redactor_images/',\n\n /**\n * Default quote style\n */\n defaultStyle : 'withPhoto',\n\n /**\n * Make Quote from JSON datasets\n */\n makeBlockToAppend : function(data) {\n\n var tag;\n\n if (data && data.size) {\n\n data.style = 'withPhoto';\n \n switch (data.style) {\n case 'simple':\n tag = quoteTools.makeSimpleQuote(data);\n break;\n case 'withCaption':\n tag = quoteTools.makeQuoteWithCaption(data);\n break;\n case 'withPhoto':\n tag = quoteTools.makeQuoteWithPhoto(data);\n break;\n }\n } else {\n\n var settings = {\n style : 'withPhoto',\n text : '',\n author : '',\n job : '',\n photo : ''\n };\n\n tag = quoteTools.makeQuoteWithPhoto(settings);\n\n }\n\n return tag;\n },\n\n render : function(data) {\n return quoteTools.makeBlockToAppend(data);\n },\n\n save : function(blockContent) {\n\n /**\n * Extracts JSON quote data from HTML block\n * @param {Text} text, {Text} author, {Object} photo\n */\n var parsedblock = quoteTools.parseBlockQuote(blockContent);\n data = {\n style : parsedblock.style,\n text : parsedblock.text,\n author : parsedblock.author,\n job : parsedblock.job,\n photo : parsedblock.photo,\n \"format\":\"html\",\n \"cite\": parsedblock.author,\n \"size\": \"small\"\n };\n\n return data;\n },\n\n makeSettings : function(data) {\n\n var holder = document.createElement('DIV'),\n types = {\n simple : 'Простая цитата',\n withCaption : 'Цитата с подписью',\n withPhoto : 'Цитата с фото и ФИО'\n },\n selectTypeButton;\n\n /** Add holder classname */\n holder.className = quoteTools.styles.settings.holder;\n\n /** Now add type selectors */\n for (var type in types){\n\n selectTypeButton = document.createElement('SPAN');\n\n selectTypeButton.textContent = types[type];\n selectTypeButton.className = quoteTools.styles.settings.buttons;\n\n selectTypeButton.dataset.style = type;\n\n if ( type == quoteTools.defaultStyle ){\n selectTypeButton.classList.add(quoteTools.styles.settings.selectedType);\n }\n\n // var quoteStyle = quoteTools.selectTypeQuoteStyle(type);\n\n selectTypeButton.addEventListener('click', quoteTools.changeStyleClicked, false);\n // quoteTools.addSelectTypeClickListener(selectTypeButton, quoteStyle);\n\n holder.appendChild(selectTypeButton);\n\n }\n\n return holder;\n\n },\n\n changeStyleClicked : function() {\n\n var changeStyleButton = this,\n quote = codex.content.currentNode.querySelector('.' + quoteTools.styles.ce_quote),\n newStyle = changeStyleButton.dataset.style,\n styleSelectors = this.parentNode.childNodes;\n\n quote.dataset.quoteStyle = newStyle;\n\n /**\n * Mark selected style button\n */\n for (var i = styleSelectors.length - 1; i >= 0; i--) {\n styleSelectors[i].classList.remove(quoteTools.styles.settings.selectedType);\n }\n\n this.classList.add(quoteTools.styles.settings.selectedType);\n\n },\n\n /**\n * @deprecated\n */\n selectTypeQuoteStyle : function(type) {\n\n /**\n * Choose Quote style to replace\n */\n switch (type) {\n case 'simple':\n quoteStyleFunction = quoteTools.makeSimpleQuote;\n break;\n case 'withCaption':\n quoteStyleFunction = quoteTools.makeQuoteWithCaption;\n break;\n case 'withPhoto':\n quoteStyleFunction = quoteTools.makeQuoteWithPhoto;\n break;\n }\n\n return quoteStyleFunction;\n\n },\n\n /**\n * @deprecated\n */\n addSelectTypeClickListener : function(el, quoteStyle) {\n\n el.addEventListener('click', function () {\n\n /**\n * Parsing currentNode to JSON.\n */\n var parsedOldQuote = quoteTools.parseBlockQuote(),\n newStyledQuote = quoteStyle(parsedOldQuote);\n\n var wrapper = codex.content.composeNewBlock(newStyledQuote, 'quote');\n wrapper.appendChild(newStyledQuote);\n\n codex.content.switchBlock(codex.content.currentNode, newStyledQuote, 'quote');\n\n /** Close settings after replacing */\n codex.toolbar.settings.close();\n\n }, false);\n\n },\n\n /**\n * @deprecated\n */\n makeSimpleQuote : function(data) {\n\n var wrapper = quoteTools.ui.makeBlock('BLOCKQUOTE', [quoteTools.styles.simple.text, quoteTools.styles.quoteText]);\n\n wrapper.innerHTML = data.text || '';\n\n wrapper.dataset.quoteStyle = 'simple';\n wrapper.classList.add(quoteTools.styles.ce_quote);\n wrapper.contentEditable = 'true';\n\n return wrapper;\n },\n\n /**\n * @deprecated\n */\n makeQuoteWithCaption : function(data) {\n\n var wrapper = quoteTools.ui.blockquote(),\n text = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withCaption.blockquote, quoteTools.styles.quoteText]),\n author = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withCaption.author, quoteTools.styles.quoteAuthor]);\n\n /* make text block ontentEditable */\n text.contentEditable = 'true';\n\n text.innerHTML = data.text;\n\n /* make Author contentEditable */\n author.contentEditable = 'true';\n\n author.textContent = data.cite;\n\n /* Appending created components */\n wrapper.dataset.quoteStyle = 'withCaption';\n wrapper.classList.add(quoteTools.styles.ce_quote);\n\n wrapper.appendChild(text);\n wrapper.appendChild(author);\n\n return wrapper;\n\n },\n\n makeQuoteWithPhoto : function(data) {\n\n var wrapper = quoteTools.ui.blockquote(),\n photo = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.photo]),\n author = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.author, quoteTools.styles.quoteAuthor]),\n job = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.job, quoteTools.styles.authorsJob]),\n quote = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.quote, quoteTools.styles.quoteText]);\n\n /* Default Image src */\n if (!data.photo) {\n\n var icon = quoteTools.ui.makeBlock('SPAN', ['ce-icon-picture']);\n photo.appendChild(icon);\n\n } else {\n\n var authorsPhoto = quoteTools.ui.img(quoteTools.styles.authorsPhoto);\n authorsPhoto.src = data.photo;\n\n photo.classList.add(quoteTools.styles.authorsPhotoWrapper);\n photo.appendChild(authorsPhoto);\n }\n\n\n photo.addEventListener('click', quoteTools.fileUploadClicked, false);\n\n /* make author block contentEditable */\n author.contentEditable = 'true';\n author.textContent = data.cite;\n\n /* Author's position and job */\n job.contentEditable = 'true';\n job.textContent = data.job;\n\n var authorsWrapper = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.authorHolder]);\n authorsWrapper.appendChild(author);\n authorsWrapper.appendChild(job);\n\n /* make quote text contentEditable */\n quote.contentEditable = 'true';\n quote.innerHTML = data.text;\n\n wrapper.classList.add(quoteTools.styles.ce_quote);\n wrapper.classList.add(quoteTools.styles.withPhoto.wrapper);\n wrapper.dataset.quoteStyle = 'withPhoto';\n\n wrapper.appendChild(quote);\n wrapper.appendChild(photo);\n wrapper.appendChild(authorsWrapper);\n\n return wrapper;\n },\n\n parseBlockQuote : function(block) {\n\n var currentNode = block || codex.content.currentNode,\n photo = currentNode.getElementsByTagName('img')[0],\n author = currentNode.querySelector('.' + quoteTools.styles.quoteAuthor),\n job = currentNode.querySelector('.' + quoteTools.styles.authorsJob),\n quote ;\n\n /** Simple quote text placed in Blockquote tag*/\n if ( currentNode.dataset.quoteStyle == 'simple' )\n quote = currentNode.innerHTML;\n else\n quote = currentNode.querySelector('.' + quoteTools.styles.quoteText).innerHTML;\n\n if (job)\n job = job.textContent;\n\n if (author)\n author = author.textContent;\n\n if (photo)\n photo = photo.src;\n\n var data = {\n style : currentNode.dataset.quoteStyle,\n text : quote,\n author : author,\n job : job,\n photo : photo,\n };\n\n return data;\n },\n\n fileUploadClicked : function() {\n\n var success = quoteTools.photoUploadingCallbacks.success,\n error = quoteTools.photoUploadingCallbacks.error;\n\n codex.transport.selectAndUpload({\n success,\n error,\n });\n\n }\n\n};\n\nquoteTools.styles = {\n\n ce_quote : 'ce-quote',\n quoteText : 'ce_quote--text',\n quoteAuthor : 'ce_quote--author',\n authorsJob : 'ce_quote--job',\n authorsPhoto : 'authorsPhoto',\n authorsPhotoWrapper : 'authorsPhoto-wrapper',\n\n simple : {\n text : 'quoteStyle-simple--text',\n },\n\n withCaption : {\n blockquote : 'quoteStyle-withCaption--blockquote',\n author : 'quoteStyle-withCaption--author',\n },\n\n withPhoto : {\n photo : 'quoteStyle-withPhoto--photo',\n author : 'quoteStyle-withPhoto--author',\n job : 'quoteStyle-withPhoto--job',\n quote : 'quoteStyle-withPhoto--quote',\n wrapper : 'quoteStyle-withPhoto--wrapper',\n authorHolder : 'quoteStyle-withPhoto--authorWrapper',\n },\n\n settings : {\n holder : 'ce_plugin_quote--settings',\n caption : 'ce_plugin_quote--caption',\n buttons : 'ce_plugin_quote--select_button',\n selectedType : 'ce-quote-settings--selected'\n },\n};\n\nquoteTools.ui = {\n\n wrapper : function($classList) {\n\n var el = document.createElement('DIV');\n\n el.classList.add($classList);\n\n return el;\n\n },\n\n blockquote : function() {\n\n var el = document.createElement('BLOCKQUOTE');\n\n return el;\n\n },\n\n img : function(attribute) {\n var imageTag = document.createElement('IMG');\n imageTag.classList.add(attribute);\n\n return imageTag;\n },\n\n makeBlock : function(tag, classList) {\n\n var el = document.createElement(tag);\n\n\n if ( classList ) {\n\n for( var i = 0; i < classList.length; i++)\n el.className += ' ' + classList[i];\n\n }\n return el;\n\n }\n\n};\n\nquoteTools.photoUploadingCallbacks = {\n\n /**\n * Success callbacks for uploaded photo.\n * Replace upload icon with uploaded photo\n */\n success : function(result) {\n\n var parsed = JSON.parse(result),\n filename = parsed.filename,\n uploadImageWrapper = codex.content.currentNode.querySelector('.' + quoteTools.styles.withPhoto.photo),\n authorsPhoto = quoteTools.ui.img(quoteTools.styles.authorsPhoto);\n\n authorsPhoto.src = quoteTools.path + 'b_' + filename;\n\n /** Remove icon from image wrapper */\n uploadImageWrapper.innerHTML = '';\n\n /** Appending uploaded image */\n uploadImageWrapper.classList.add(quoteTools.styles.authorsPhotoWrapper);\n uploadImageWrapper.appendChild(authorsPhoto);\n },\n\n /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */\n error : function(result) {\n\n console.log('Can\\'t upload an image');\n codex.notifications.errorThrown();\n\n }\n\n};\n\nmodule.exports = {\n\n type : 'quote',\n iconClassname : 'ce-icon-quote',\n make : quoteTools.makeBlockToAppend,\n appendCallback : null,\n settings : quoteTools.makeSettings(),\n render : quoteTools.render,\n save : quoteTools.save,\n displayInToolbox : true,\n enableLineBreaks : true,\n allowedToPaste : true\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/quote/quote.js","/**\n* Image plugin for codex-editor\n* @author CodeX Team \n*\n* @version 1.1.3\n*/\nvar ceImage = {\n\n elementClasses : {\n\n ce_image : 'ce-image',\n loading : 'ce-plugin-image__loader',\n blockStretched: 'ce-block--stretched',\n uploadedImage : {\n centered : 'ce-plugin-image__uploaded--centered',\n stretched : 'ce-plugin-image__uploaded--stretched',\n },\n imageCaption : 'ce-plugin-image__caption',\n imageWrapper : 'ce-plugin-image__wrapper',\n formHolder : 'ce-plugin-image__holder',\n uploadButton : 'ce-plugin-image__button',\n\n },\n\n holder : null,\n\n /** Default path to redactors images */\n path : '/upload/redactor_images/',\n\n make : function ( data ) {\n\n var holder;\n\n if (data) {\n\n if ( data.isStretch !== 'true') {\n holder = ceImage.ui.makeImage(data, ceImage.elementClasses.uploadedImage.centered, 'false');\n } else {\n holder = ceImage.ui.makeImage(data, ceImage.elementClasses.uploadedImage.stretched, 'true');\n }\n\n return holder;\n\n } else {\n\n holder = ceImage.ui.makeForm();\n\n return holder;\n }\n },\n\n /**\n * this tool works when tool is clicked in toolbox\n */\n appendCallback : function(event) {\n\n /** Upload image and call success callback*/\n ceImage.uploadButtonClicked(event);\n\n },\n\n /**\n * Settings panel content\n * @return {Element} element contains all settings\n */\n makeSettings : function () {\n\n var holder = document.createElement('DIV'),\n types = {\n centered : 'По центру',\n stretched : 'На всю ширину',\n },\n selectTypeButton;\n\n /** Add holder classname */\n holder.className = 'ce_plugin_image--settings';\n\n /** Now add type selectors */\n for (var type in types){\n\n selectTypeButton = document.createElement('SPAN');\n\n selectTypeButton.textContent = types[type];\n selectTypeButton.className = 'ce_plugin_image--select_button';\n\n this.addSelectTypeClickListener(selectTypeButton, type);\n\n holder.appendChild(selectTypeButton);\n\n }\n\n return holder;\n\n },\n\n addSelectTypeClickListener : function(el, type) {\n\n el.addEventListener('click', function() {\n\n ceImage.selectTypeClicked(type);\n\n }, false);\n\n },\n\n selectTypeClicked : function(type) {\n\n var current = codex.content.currentNode,\n blockContent = current.childNodes[0],\n image = ceImage.ui.getImage(current),\n wrapper = current.querySelector('.' + ceImage.elementClasses.imageWrapper);\n\n /** Clear classList */\n current.className = '';\n image.className = '';\n\n /** Add important first-level class ce_block */\n current.classList.add(codex.ui.className.BLOCK_CLASSNAME);\n\n if (type === 'stretched') {\n\n image.classList.add(ceImage.elementClasses.uploadedImage.stretched);\n\n blockContent.classList.add(ceImage.elementClasses.blockStretched);\n\n /** Setting dataset for saver */\n wrapper.dataset.stretched = true;\n\n } else if (type === 'centered') {\n\n image.classList.add(ceImage.elementClasses.uploadedImage.centered);\n\n blockContent.classList.remove(ceImage.elementClasses.blockStretched);\n\n /** Setting dataset for saver */\n wrapper.dataset.stretched = false;\n }\n },\n\n render : function( data ) {\n\n return this.make(data);\n },\n\n save : function ( block ) {\n\n var content = block,\n image = ceImage.ui.getImage(content),\n caption = content.querySelector('.' + ceImage.elementClasses.imageCaption);\n\n var data = {\n background : false,\n border : false,\n isStretch : content.dataset.stretched,\n file : {\n url : image.src,\n bigUrl : null,\n width : image.width,\n height : image.height,\n additionalData :null,\n },\n caption : caption.textContent,\n cover : null,\n };\n\n return data;\n },\n\n uploadButtonClicked : function(event) {\n\n var beforeSend = ceImage.photoUploadingCallbacks.beforeSend,\n success = ceImage.photoUploadingCallbacks.success,\n error = ceImage.photoUploadingCallbacks.error;\n\n /** Define callbacks */\n codex.transport.selectAndUpload({\n beforeSend,\n success,\n error,\n });\n },\n\n};\n\nceImage.ui = {\n\n holder : function(){\n\n var element = document.createElement('DIV');\n\n element.classList.add(ceImage.elementClasses.formHolder);\n element.classList.add(ceImage.elementClasses.ce_image);\n\n return element;\n },\n\n uploadButton : function(){\n\n var button = document.createElement('SPAN');\n\n button.classList.add(ceImage.elementClasses.uploadButton);\n\n button.innerHTML = ' ';\n button.innerHTML += 'Загрузить фотографию';\n\n return button;\n\n },\n\n /**\n * @param {string} source - file path\n * @param {string} style - css class\n * @return {object} image - document IMG tag\n */\n image : function(source, style) {\n\n var image = document.createElement('IMG');\n\n image.classList.add(style);\n\n image.src = source;\n\n return image;\n },\n\n wrapper : function() {\n\n var div = document.createElement('div');\n\n div.classList.add(ceImage.elementClasses.imageWrapper);\n\n return div;\n },\n\n caption : function() {\n\n var div = document.createElement('div');\n\n div.classList.add(ceImage.elementClasses.imageCaption);\n div.contentEditable = true;\n\n return div;\n },\n /**\n * Draws form for image upload\n */\n makeForm : function() {\n\n var holder = ceImage.ui.holder(),\n uploadButton = ceImage.ui.uploadButton();\n\n holder.appendChild(uploadButton);\n\n uploadButton.addEventListener('click', ceImage.uploadButtonClicked, false );\n\n ceImage.holder = holder;\n\n return holder;\n },\n\n\n /**\n * wraps image and caption\n * @param {object} data - image information\n * @param {string} imageTypeClass - plugin's style\n * @param {boolean} stretched - stretched or not\n * @return wrapped block with image and caption\n */\n makeImage : function(data, imageTypeClass, stretched) {\n\n var file = data.file.url,\n text = data.caption,\n type = data.type,\n image = ceImage.ui.image(file, imageTypeClass),\n caption = ceImage.ui.caption(),\n wrapper = ceImage.ui.wrapper();\n\n caption.textContent = text;\n\n wrapper.dataset.stretched = stretched;\n /** Appeding to the wrapper */\n wrapper.appendChild(image);\n wrapper.appendChild(caption);\n\n return wrapper;\n },\n\n /**\n * @param {HTML} data - Rendered block with image\n */\n getImage : function(data) {\n\n var image = data.querySelector('.' + ceImage.elementClasses.uploadedImage.centered) ||\n data.querySelector('.' + ceImage.elementClasses.uploadedImage.stretched);\n\n return image;\n },\n\n /**\n * wraps image and caption\n * @deprecated\n * @param {object} data - image information\n * @return wrapped block with image and caption\n */\n centeredImage : function(data) {\n\n var file = data.file.url,\n text = data.caption,\n type = data.type,\n image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.centered),\n caption = ceImage.ui.caption(),\n wrapper = ceImage.ui.wrapper();\n\n caption.textContent = text;\n\n wrapper.dataset.stretched = 'false';\n\n /** Appeding to the wrapper */\n wrapper.appendChild(image);\n wrapper.appendChild(caption);\n\n return wrapper;\n },\n\n /**\n * wraps image and caption\n * @deprecated\n * @param {object} data - image information\n * @return stretched image\n */\n stretchedImage : function(data) {\n\n var file = data.file.url,\n text = data.caption,\n type = data.type,\n image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.stretched),\n caption = ceImage.ui.caption(),\n wrapper = ceImage.ui.wrapper();\n\n caption.textContent = text;\n\n wrapper.dataset.stretched = 'true';\n /** Appeding to the wrapper */\n wrapper.appendChild(image);\n wrapper.appendChild(caption);\n\n return wrapper;\n\n }\n\n};\n\nceImage.photoUploadingCallbacks = {\n\n /** Before sending ajax request */\n beforeSend : function() {\n ceImage.holder.classList.add(ceImage.elementClasses.loading);\n },\n\n /** Photo was uploaded successfully */\n success : function(result) {\n\n var parsed = JSON.parse(result),\n data,\n currentBlock = codex.content.currentNode,\n image;\n\n /**\n * Preparing {Object} data to draw an image\n * @uses ceImage.make method\n */\n data = {\n background : false,\n border : false,\n isStretch : false,\n file : {\n url : ceImage.path + 'o_' + parsed.filename,\n bigUrl : null,\n width : null,\n height : null,\n additionalData : null,\n },\n caption : '',\n cover : null,\n };\n\n image = ceImage.make(data);\n\n /**\n * If current block is empty, we can replace it to uploaded image\n * Or insert new block\n */\n codex.content.switchBlock(ceImage.holder, image, 'image');\n },\n\n /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */\n error : function(result) {\n console.log('Choosen file is not an image or image is corrupted');\n codex.notifications.errorThrown();\n }\n\n};\n\n\n/**\n* Add plugin it to redactor tools\n*/\nmodule.exports = {\n\n type : 'image',\n iconClassname : 'ce-icon-picture',\n make : ceImage.make,\n appendCallback : ceImage.appendCallback,\n settings : ceImage.makeSettings(),\n render : ceImage.render,\n save : ceImage.save,\n isStretched : true,\n displayInToolbox : true,\n enableLineBreaks : false\n\n};\n\n\n// WEBPACK FOOTER //\n// ./plugins/image/image.js","/**\n * Paste plugin.\n *\n * Listens on paste event and pastes content from:\n * - Instagram\n * - Twitter\n * - VK\n * - Facebook\n * - Image\n * - External Link\n *\n */\n\n/**\n * @protected\n *\n * Main tool settings.\n */\nvar pasteTool = {\n\n};\n\n/**\n * Make elements to insert or switch\n *\n * @uses Core codex.draw module\n */\npasteTool.ui = {\n\n /**\n * Upload image by URL\n *\n * @uses codex Image tool\n * @param filename\n * @returns {Element}\n */\n uploadedImage : function(filename) {\n\n var data = {\n background: false,\n border: false,\n isStretch: false,\n file: {\n url: \"upload/redactor_images/\" + filename,\n bigUrl: \"upload/redactor_images/\" + filename,\n width: null,\n height: null,\n additionalData: \"null\"\n },\n caption: '',\n cover: null\n };\n\n /** Using Image plugin make method */\n var image = codex.tools.image.make(data);\n\n return image;\n\n }\n\n};\n\n\n/**\n *\n * Callbacks\n */\npasteTool.callbacks = {\n\n /**\n * Saves data\n * @param event\n */\n pasted : function(event) {\n\n var clipBoardData = event.clipboardData || window.clipboardData,\n content = clipBoardData.getData('Text');\n\n pasteTool.callbacks.analize(content);\n },\n\n /**\n * Analizes pated string and calls necessary method\n */\n analize : function(string) {\n\n var regexTemplates = {\n image : /(?:([^:\\/?#]+):)?(?:\\/\\/([^\\/?#]*))?([^?#]*\\.(?:jpe?g|gif|png))(?:\\?([^#]*))?(?:#(.*))?/i,\n instagram : new RegExp(\"http?.+instagram.com\\/p?.\"),\n twitter : new RegExp(\"http?.+twitter.com?.+\\/\"),\n facebook : /https?.+facebook.+\\/\\d+\\?/,\n vk : /https?.+vk?.com\\/feed\\?w=wall\\d+_\\d+/,\n },\n\n image = regexTemplates.image.test(string),\n instagram = regexTemplates.instagram.exec(string),\n twitter = regexTemplates.twitter.exec(string),\n facebook = regexTemplates.facebook.test(string),\n vk = regexTemplates.vk.test(string);\n\n if (image) {\n\n pasteTool.callbacks.uploadImage(string);\n\n } else if (instagram) {\n\n pasteTool.callbacks.instagramMedia(instagram);\n\n } else if (twitter) {\n\n pasteTool.callbacks.twitterMedia(twitter);\n\n } else if (facebook) {\n\n pasteTool.callbacks.facebookMedia(string);\n\n } else if (vk) {\n\n pasteTool.callbacks.vkMedia(string);\n\n }\n\n },\n\n /**\n * Direct upload\n * @param url\n */\n uploadImage : function(path) {\n\n var ajaxUrl = location.protocol + '//' + location.hostname + ':32769',\n file,\n image,\n current = codex.content.currentNode,\n beforeSend,\n success_callback;\n\n /** When image is uploaded to redactors folder */\n success_callback = function(data) {\n\n console.log(data);\n return;\n var file = JSON.parse(data);\n image = pasteTool.ui.uploadedImage(file.filename);\n codex.content.switchBlock(current, image, 'image');\n\n };\n\n /** Before sending XMLHTTP request */\n beforeSend = function() {\n var content = current.querySelector('.ce-block__content');\n content.classList.add('ce-plugin-image__loader');\n };\n\n /** Preparing data for XMLHTTP */\n var data = {\n url: '/club/fetchImage',\n type: \"POST\",\n data : {\n url: path\n },\n beforeSend : beforeSend,\n success : success_callback\n };\n\n codex.core.ajax(data);\n },\n\n /**\n * callback for instagram url's\n * Using instagram Embed Widgete to render\n * @uses Instagram tool\n * @param url\n */\n instagramMedia : function(url) {\n\n var fullUrl = url.input,\n data;\n\n\n data = {\n instagram_url: fullUrl\n };\n\n codex.tools.instagram.make(data, true);\n\n },\n\n /**\n * callback for tweets\n * Using Twittter Widget to render\n * @uses Twitter tool\n * @param url\n */\n twitterMedia : function(url) {\n\n var fullUrl = url.input,\n tweetId,\n arr,\n data;\n\n arr = fullUrl.split('/');\n tweetId = arr.pop();\n\n /** Example */\n data = {\n media:true,\n conversation:false,\n user:{\n profile_image_url:\"http:\\/\\/pbs.twimg.com\\/profile_images\\/1817165982\\/nikita-likhachev-512_normal.jpg\",\n profile_image_url_https:\"https:\\/\\/pbs.twimg.com\\/profile_images\\/1817165982\\/nikita-likhachev-512_normal.jpg\",\n screen_name:\"Niketas\",\n name:\"Никита Лихачёв\"\n },\n id: tweetId,\n text:\"ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\\/\\/t.co\\/iWyOHf4xr2\",\n created_at:\"Tue Jun 28 14:09:12 +0000 2016\",\n status_url:\"https:\\/\\/twitter.com\\/Niketas\\/status\\/747793978511101953\",\n caption:\"Caption\"\n };\n\n codex.tools.twitter.make(data);\n }\n\n};\n\nmodule.exports = {\n\n type : 'paste',\n iconClassname : '',\n prepare : pasteTool.prepare,\n make : pasteTool.make,\n appendCallback : null,\n settings : null,\n render : null,\n save : pasteTool.save,\n callbacks : pasteTool.callbacks,\n displayInToolbox : false,\n enableLineBreaks : false,\n allowedToPaste : false\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/paste/paste.js","/**\n * Twitter plugin\n * @version 1.0.0\n */\n\nvar twitterTool = {\n\n /**\n * Prepare twitter scripts\n */\n prepare : function() {\n\n var script = \"//platform.twitter.com/widgets.js\";\n\n /**\n * Load script\n */\n codex.core.importScript(script, 'twitterAPI');\n\n },\n\n make : function(data) {\n\n if (!data.id)\n return;\n\n twitterTool.content.twitter(data.id);\n },\n\n save : function(blockContent) {\n\n var data;\n\n data = {\n media:true,\n conversation:false,\n user:{\n profile_image_url:\"http:\\/\\/pbs.twimg.com\\/profile_images\\/1817165982\\/nikita-likhachev-512_normal.jpg\",\n profile_image_url_https:\"https:\\/\\/pbs.twimg.com\\/profile_images\\/1817165982\\/nikita-likhachev-512_normal.jpg\",\n screen_name:\"Niketas\",\n name:\"Никита Лихачёв\"\n },\n id: blockContent.dataset.tweetId,\n text:\"ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\\/\\/t.co\\/iWyOHf4xr2\",\n created_at:\"Tue Jun 28 14:09:12 +0000 2016\",\n status_url:\"https:\\/\\/twitter.com\\/Niketas\\/status\\/747793978511101953\",\n caption:\"Caption\"\n };\n\n return data;\n\n },\n\n render : function(data) {\n return twitterTool.make(data);\n }\n\n};\n\ntwitterTool.content = {\n\n /**\n * Twitter render method appends content after block\n * @param tweetId\n */\n twitter : function(tweetId) {\n\n var tweet = twitterTool.content.twitterBlock();\n\n codex.content.switchBlock(codex.content.currentNode, tweet, 'twitter');\n\n var blockContent = codex.content.currentNode.childNodes[0];\n blockContent.classList.add('twitter__loader');\n\n window.twttr.widgets.createTweet(tweetId, blockContent);\n\n setTimeout(function() {\n blockContent.classList.remove('twitter__loader');\n }, 500);\n\n /** Remove empty DIV */\n blockContent.childNodes[0].remove();\n\n },\n\n twitterBlock : function() {\n var block = codex.draw.node('DIV', '', {});\n return block;\n }\n};\n\nmodule.exports = {\n\n type : 'twitter',\n iconClassname : 'ce-icon-twitter',\n prepare : twitterTool.prepare,\n make : twitterTool.make,\n appendCallback : null,\n settings : null,\n render : twitterTool.render,\n save : twitterTool.save,\n displayInToolbox : false,\n enableLineBreaks : false,\n allowedToPaste : false\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/twitter/twitter.js","/**\n * Instagram plugin\n * @version 1.0.0\n */\nvar instagramTool = {\n\n /**\n * Prepare before usage\n * Load important scripts to render embed\n */\n prepare : function() {\n\n var script = \"//platform.instagram.com/en_US/embeds.js\";\n\n /**\n * Load widget\n */\n codex.core.importScript(script, 'instagramAPI');\n },\n\n /**\n * Make instagram embed via Widgets method\n */\n make : function(data, isInternal) {\n\n if (!data.instagram_url)\n return;\n\n var block = instagramTool.content.instagramBlock(data.instagram_url);\n\n if (isInternal) {\n\n setTimeout(function() {\n\n /** Render block */\n instagramTool.content.render(block);\n\n }, 200);\n }\n\n\n return block;\n\n if (!isInternal) {\n instagramTool.content.render(block);\n }\n },\n\n /**\n * Saving JSON output.\n * Upload data via ajax\n */\n save : function(blockContent) {\n\n var data;\n\n if (!blockContent)\n return;\n\n /** Example */\n data = {\n instagram_url: blockContent.src\n };\n\n return data;\n\n },\n\n /**\n * Render data\n */\n render : function(data) {\n return instagramTool.make(data);\n }\n\n};\n\ninstagramTool.content = {\n\n render : function(content) {\n\n codex.content.switchBlock(codex.content.currentNode, content, 'instagram');\n\n var blockContent = codex.content.currentNode.childNodes[0];\n blockContent.classList.add('instagram__loader');\n\n window.instgrm.Embeds.process();\n\n setTimeout(function(){\n blockContent.classList.remove('instagram__loader');\n }, 500);\n },\n\n /**\n * Drawing html content.\n *\n * @param url\n * @returns {Element} blockquote - HTML template for Instagram Embed JS\n */\n instagramBlock : function(url) {\n\n var blockquote = codex.draw.node('BLOCKQUOTE', 'instagram-media instagram', {}),\n div = codex.draw.node('DIV', '', {}),\n paragraph = codex.draw.node('P', 'ce-paste__instagram--p', {}),\n anchor = codex.draw.node('A', '', { href : url });\n\n blockquote.dataset.instgrmVersion = 4;\n\n paragraph.appendChild(anchor);\n div.appendChild(paragraph);\n blockquote.appendChild(div);\n\n return blockquote;\n\n }\n\n};\n\nmodule.exports = {\n\n type : 'instagram',\n iconClassname : 'ce-icon-instagram',\n prepare : instagramTool.prepare,\n make : instagramTool.make,\n appendCallback : null,\n settings : null,\n render : instagramTool.render,\n save : instagramTool.save,\n displayInToolbox : false,\n enableLineBreaks : false,\n allowedToPaste : false\n\n};\n\n\n\n// WEBPACK FOOTER //\n// ./plugins/instagram/instagram.js"],"sourceRoot":""} \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index bb0a58746..c669b1b8b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -14,8 +14,7 @@ module.exports = { entry: { "whatwg-fetch": "whatwg-fetch", - "codex-editor": "./index", - "plugins": "./plugins/plugins" + "codex-editor": "./index" }, output: { filename: "[name].js", diff --git a/whatwg-fetch.js b/whatwg-fetch.js index 7935e5a8f..21e370bc1 100644 --- a/whatwg-fetch.js +++ b/whatwg-fetch.js @@ -1,4 +1,4 @@ -var fetch = +var codex = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; diff --git a/whatwg-fetch.js.map b/whatwg-fetch.js.map index 411b6886b..692336ebb 100644 --- a/whatwg-fetch.js.map +++ b/whatwg-fetch.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 1b4b99a4780faf88126c?8819*","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 1b4b99a4780faf88126c","(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 = 2"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 3ad68690caed808ff875?3ec4","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 3ad68690caed808ff875","(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 a26c2faa98fd80a159a332b002bf422dbb89c901 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Wed, 21 Dec 2016 23:33:31 +0300 Subject: [PATCH 05/14] plugins --- .gitignore | 3 +- plugins/code/code.css | 25 ++ plugins/code/code.js | 72 +++++ plugins/header/header.css | 41 +++ plugins/header/header.js | 177 ++++++++++++ plugins/image/image.css | 118 ++++++++ plugins/image/image.js | 421 +++++++++++++++++++++++++++++ plugins/images/images.css | 106 ++++++++ plugins/images/images.js | 463 ++++++++++++++++++++++++++++++++ plugins/instagram/instagram.css | 10 + plugins/instagram/instagram.js | 133 +++++++++ plugins/instagram/loading.gif | Bin 0 -> 329 bytes plugins/link/link.css | 86 ++++++ plugins/link/link.js | 321 ++++++++++++++++++++++ plugins/list/list.css | 37 +++ plugins/list/list.js | 175 ++++++++++++ plugins/paragraph/paragraph.css | 28 ++ plugins/paragraph/paragraph.js | 88 ++++++ plugins/paste/loading.gif | Bin 0 -> 329 bytes plugins/paste/paste.css | 17 ++ plugins/paste/paste.js | 242 +++++++++++++++++ plugins/quote/img/codex.png | Bin 0 -> 12934 bytes plugins/quote/img/upload.png | Bin 0 -> 1853 bytes plugins/quote/quote.css | 193 +++++++++++++ plugins/quote/quote.js | 461 +++++++++++++++++++++++++++++++ plugins/twitter/loading.gif | Bin 0 -> 329 bytes plugins/twitter/twitter.css | 8 + plugins/twitter/twitter.js | 106 ++++++++ 28 files changed, 3329 insertions(+), 2 deletions(-) create mode 100644 plugins/code/code.css create mode 100644 plugins/code/code.js create mode 100644 plugins/header/header.css create mode 100644 plugins/header/header.js create mode 100644 plugins/image/image.css create mode 100644 plugins/image/image.js create mode 100644 plugins/images/images.css create mode 100644 plugins/images/images.js create mode 100644 plugins/instagram/instagram.css create mode 100644 plugins/instagram/instagram.js create mode 100644 plugins/instagram/loading.gif create mode 100644 plugins/link/link.css create mode 100644 plugins/link/link.js create mode 100644 plugins/list/list.css create mode 100644 plugins/list/list.js create mode 100644 plugins/paragraph/paragraph.css create mode 100644 plugins/paragraph/paragraph.js create mode 100644 plugins/paste/loading.gif create mode 100644 plugins/paste/paste.css create mode 100644 plugins/paste/paste.js create mode 100644 plugins/quote/img/codex.png create mode 100644 plugins/quote/img/upload.png create mode 100644 plugins/quote/quote.css create mode 100644 plugins/quote/quote.js create mode 100644 plugins/twitter/loading.gif create mode 100644 plugins/twitter/twitter.css create mode 100644 plugins/twitter/twitter.js diff --git a/.gitignore b/.gitignore index 4129319de..09b6ff734 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,4 @@ Thumbs.db /*.sublime-project /*.sublime-workspace -node_modules/* -plugins/* \ No newline at end of file +node_modules/* \ No newline at end of file diff --git a/plugins/code/code.css b/plugins/code/code.css new file mode 100644 index 000000000..7ad089ba0 --- /dev/null +++ b/plugins/code/code.css @@ -0,0 +1,25 @@ +.ce-code { + display: block; + border: 1px solid #ebeef3; + border-radius: 3px; + background: #fdfdff !important; + + margin: 1em 0 !important; + padding: .5em .8em; + box-sizing: border-box; + white-space: pre-wrap; + + font-family: 'monospace', 'monaco', 'consolas', 'courier'; + line-height: 1.5em; + color: #325179; + font-size: .8em; +} + + +/** +* CodeX Editor styles overlay +* @todo change for ce-tool-wrapper__code +*/ +.ce_block[data-type="code"]{ + padding: 1em 0 !important; +} diff --git a/plugins/code/code.js b/plugins/code/code.js new file mode 100644 index 000000000..6388cee9d --- /dev/null +++ b/plugins/code/code.js @@ -0,0 +1,72 @@ +/** + * Code Plugin\ + * Creates code tag and adds content to this tag + */ +var codeTool = { + + baseClass : "ce-code", + + /** + * Make initial header block + * @param {object} JSON with block data + * @return {Element} element to append + */ + make : function (data) { + + var tag = document.createElement('code'); + + tag.classList.add(codeTool.baseClass); + + if (data && data.text) { + tag.innerHTML = data.text; + } + + tag.contentEditable = true; + + return tag; + + }, + + /** + * Method to render HTML block from JSON + */ + render : function (data) { + + return codeTool.make(data); + + }, + + /** + * Method to extract JSON data from HTML block + */ + save : function (blockContent){ + + var data = { + text : null, + }; + + data.text = blockContent.innerHTML; + + return data; + + } + +}; + +/** + * Now plugin is ready. + * Add it to redactor tools + */ +// codeTool = { +// +// type : 'code', +// iconClassname : 'ce-icon-code', +// make : codeTool.make, +// appendCallback : null, +// settings : null, +// render : codeTool.render, +// save : codeTool.save, +// displayInToolbox : true, +// enableLineBreaks : true +// +// }; diff --git a/plugins/header/header.css b/plugins/header/header.css new file mode 100644 index 000000000..42a1c0ceb --- /dev/null +++ b/plugins/header/header.css @@ -0,0 +1,41 @@ +/** +* Plugin styles +*/ +.ce-header { + padding: .7em 0; + margin: 0; + line-height: 1.4em; +} +.ce-header p, +.ce-header div{ + padding: 0 !important; + margin: 0 !important; +} + +/** H e a d e r - settings */ +.ce_plugin_header--select_button{ + display: block; + color: #306ac7; + cursor: pointer; + line-height: 1.3em; +} + .ce_plugin_header--select_button:not(:last-of-type){ + margin-bottom: 1.5em; + } + .ce_plugin_header--select_button:hover{ + color: #a1b4ec; + } + + +/** +* Empty header placeholder +*/ +.ce-header:empty::before{ + content : attr(data-placeholder); + color: #818BA1; + opacity: .7; + transition: opacity 200ms ease; +} +.ce-header:focus::before{ + opacity: .1; +} diff --git a/plugins/header/header.js b/plugins/header/header.js new file mode 100644 index 000000000..4fa43eb4d --- /dev/null +++ b/plugins/header/header.js @@ -0,0 +1,177 @@ +/** +* Example of making plugin +* H e a d e r +*/ +var headerTool = { + + /** + * Make initial header block + * @param {object} JSON with block data + * @return {Element} element to append + */ + make : function (data) { + + var availableTypes = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'], + tag; + + if (data && data.type && availableTypes.includes(data.type)) { + + tag = document.createElement( data.type ); + + /** + * Save header type in data-attr. + * We need it in save method to extract type from HTML to JSON + */ + tag.dataset.headerData = data.type; + + } else { + + tag = document.createElement( 'H2' ); + tag.dataset.headerData = 'H2'; + + } + + if (data && data.text) { + tag.textContent = data.text; + } + + tag.classList.add('ce-header'); + tag.setAttribute('data-placeholder', 'Heading'); + tag.contentEditable = true; + + return tag; + + }, + + /** + * Method to render HTML block from JSON + */ + render : function (data) { + + return headerTool.make(data); + + }, + + /** + * Method to extract JSON data from HTML block + */ + save : function (blockContent) { + + var data = { + "heading-styles": blockContent.dataset.headerData, + format:"html", + text : null, + + }; + + data.text = blockContent.textContent; + + return data; + + }, + + /** + * Block appending callback + */ + appendCallback : function (argument) { + + console.log('header appended...'); + + }, + + /** + * Settings panel content + * - - - - - - - - - - - - - + * | настройки H1 H2 H3 | + * - - - - - - - - - - - - - + * @return {Element} element contains all settings + */ + makeSettings : function () { + + var holder = document.createElement('DIV'), + types = { + H2: 'Заголовок раздела', + H3: 'Подзаголовок', + H4: 'Заголовок 3-его уровня' + }, + selectTypeButton; + + /** Add holder classname */ + holder.className = 'ce_plugin_header--settings'; + + /** Now add type selectors */ + for (var type in types){ + + selectTypeButton = document.createElement('SPAN'); + + selectTypeButton.textContent = types[type]; + selectTypeButton.className = 'ce_plugin_header--select_button'; + + this.addSelectTypeClickListener(selectTypeButton, type); + + holder.appendChild(selectTypeButton); + + } + + return holder; + + }, + + /** + * Binds click event to passed button + */ + addSelectTypeClickListener : function (el, type) { + + el.addEventListener('click', function () { + + headerTool.selectTypeClicked(type); + + }, false); + }, + + /** + * Replaces old header with new type + * @params {string} type - new header tagName: H1—H6 + */ + selectTypeClicked : function (type) { + + var old_header, new_header; + + /** Now current header stored as a currentNode */ + old_header = codex.content.currentNode.querySelector('[contentEditable]'); + + /** Making new header */ + new_header = document.createElement(type); + + new_header.innerHTML = old_header.innerHTML; + new_header.contentEditable = true; + new_header.setAttribute('data-placeholder', 'Heading'); + new_header.classList.add('ce-header'); + + new_header.dataset.headerData = type; + + codex.content.switchBlock(old_header, new_header, 'header'); + + /** Close settings after replacing */ + codex.toolbar.settings.close(); + }, + +}; + +/** +* Now plugin is ready. +* Add it to redactor tools +*/ +// headerTool = { +// +// type : 'header', +// iconClassname : 'ce-icon-header', +// make : headerTool.make, +// appendCallback : headerTool.appendCallback, +// settings : headerTool.makeSettings(), +// render : headerTool.render, +// save : headerTool.save, +// displayInToolbox : true, +// enableLineBreaks : false +// +// }; diff --git a/plugins/image/image.css b/plugins/image/image.css new file mode 100644 index 000000000..bafbd5546 --- /dev/null +++ b/plugins/image/image.css @@ -0,0 +1,118 @@ +/** +* Image plugin for codex-editor +* @author CodeX Team +* +* @version 0.0.1 +*/ +.ce-image { +} + +/** upload image form */ +.ce-plugin-image__holder{ + position: relative; + background: #FEFEFE; + border: 2px solid #edeff5; + text-align: center; + margin: 30px 0; + padding: 15px; +} + .ce-plugin-image__holder input{ + border: 0; + background: transparent; + outline: none; + -webkit-appearance: none; + font-size: 1.2em; + color: #A5ABBC; + } + /* Placeholder color for Chrome */ + .ce-plugin-image__holder input::-webkit-input-placeholder { + color: #A5ABBC; + } + /* Placeholder color for IE 10+ */ + .ce-plugin-image__holder input:-ms-input-placeholder { + color: #A5ABBC; + } + /* Placeholder color for Firefox 19+ */ + .ce-plugin-image__holder input::-moz-placeholder { + color: #A5ABBC; + opacity: 1; + } + +.ce-plugin-image__loader { + background-color: transparent; + background-image: repeating-linear-gradient(-45deg, transparent, transparent 4px, #f5f9ff 4px, #eaedef 8px) !important; + background-size: 56px 56px; + animation: loading-bar 5s infinite linear; +} +@keyframes loading-bar { + 100% { background-position: -56% 0 } +} + + + +.ce-plugin-image__button{ + cursor: pointer; + font-size: 1; + color: #8990AA; +} + .ce-plugin-image__button:hover{ + color: #393F52; + } + +/** Uploaded image */ +.ce-plugin-image__wrapper { + padding: 1em 0; +} +.ce-plugin-image__uploaded--centered { + display: block; + max-width: 600px; + margin: 0 auto; +} + +.ce-plugin-image__uploaded--stretched { + width: 100%; +} + .ce-plugin-image__firstlevel--stretch { + margin: 0 !important; + max-width: none !important; + padding: 0 !important; + } + +.ce-plugin-image__caption { + max-width: 600px; + margin: .5em auto 0; + padding: .5em; + text-align: center; + color: #898a8c; + background: #fff; + border: 1px solid #ebeef3; + border-radius: 3px; +} + + .ce-plugin-image__caption:empty::before { + content: 'Введите подпись'; + text-align: center; + font-weight: normal; + color: #a1a5b3;; + opacity: .9; + transition: opacity 200ms ease; + } + + .ce-plugin-image__caption:focus::before { + opacity: .1; + text-align: center; + } + +/** Settings */ +.ce_plugin_image--select_button{ + display: block; + color: #306ac7; + cursor: pointer; + line-height: 1.3em; +} + .ce_plugin_image--select_button:not(:last-of-type){ + margin-bottom: 1.5em; + } + .ce_plugin_image--select_button:hover{ + color: #a1b4ec; + } diff --git a/plugins/image/image.js b/plugins/image/image.js new file mode 100644 index 000000000..5e28fff4b --- /dev/null +++ b/plugins/image/image.js @@ -0,0 +1,421 @@ +/** +* Image plugin for codex-editor +* @author CodeX Team +* +* @version 1.1.3 +*/ +var ceImage = { + + elementClasses : { + + ce_image : 'ce-image', + loading : 'ce-plugin-image__loader', + blockStretched: 'ce-block--stretched', + uploadedImage : { + centered : 'ce-plugin-image__uploaded--centered', + stretched : 'ce-plugin-image__uploaded--stretched', + }, + imageCaption : 'ce-plugin-image__caption', + imageWrapper : 'ce-plugin-image__wrapper', + formHolder : 'ce-plugin-image__holder', + uploadButton : 'ce-plugin-image__button', + + }, + + holder : null, + + /** Default path to redactors images */ + path : '/upload/redactor_images/', + + make : function ( data ) { + + var holder; + + if (data) { + + if ( data.isStretch !== 'true') { + holder = ceImage.ui.makeImage(data, ceImage.elementClasses.uploadedImage.centered, 'false'); + } else { + holder = ceImage.ui.makeImage(data, ceImage.elementClasses.uploadedImage.stretched, 'true'); + } + + return holder; + + } else { + + holder = ceImage.ui.makeForm(); + + return holder; + } + }, + + /** + * this tool works when tool is clicked in toolbox + */ + appendCallback : function(event) { + + /** Upload image and call success callback*/ + ceImage.uploadButtonClicked(event); + + }, + + /** + * Settings panel content + * @return {Element} element contains all settings + */ + makeSettings : function () { + + var holder = document.createElement('DIV'), + types = { + centered : 'По центру', + stretched : 'На всю ширину', + }, + selectTypeButton; + + /** Add holder classname */ + holder.className = 'ce_plugin_image--settings'; + + /** Now add type selectors */ + for (var type in types){ + + selectTypeButton = document.createElement('SPAN'); + + selectTypeButton.textContent = types[type]; + selectTypeButton.className = 'ce_plugin_image--select_button'; + + this.addSelectTypeClickListener(selectTypeButton, type); + + holder.appendChild(selectTypeButton); + + } + + return holder; + + }, + + addSelectTypeClickListener : function(el, type) { + + el.addEventListener('click', function() { + + ceImage.selectTypeClicked(type); + + }, false); + + }, + + selectTypeClicked : function(type) { + + var current = codex.content.currentNode, + blockContent = current.childNodes[0], + image = ceImage.ui.getImage(current), + wrapper = current.querySelector('.' + ceImage.elementClasses.imageWrapper); + + /** Clear classList */ + current.className = ''; + image.className = ''; + + /** Add important first-level class ce_block */ + current.classList.add(codex.ui.className.BLOCK_CLASSNAME); + + if (type === 'stretched') { + + image.classList.add(ceImage.elementClasses.uploadedImage.stretched); + + blockContent.classList.add(ceImage.elementClasses.blockStretched); + + /** Setting dataset for saver */ + wrapper.dataset.stretched = true; + + } else if (type === 'centered') { + + image.classList.add(ceImage.elementClasses.uploadedImage.centered); + + blockContent.classList.remove(ceImage.elementClasses.blockStretched); + + /** Setting dataset for saver */ + wrapper.dataset.stretched = false; + } + }, + + render : function( data ) { + + return this.make(data); + }, + + save : function ( block ) { + + var content = block, + image = ceImage.ui.getImage(content), + caption = content.querySelector('.' + ceImage.elementClasses.imageCaption); + + var data = { + background : false, + border : false, + isStretch : content.dataset.stretched, + file : { + url : image.src, + bigUrl : null, + width : image.width, + height : image.height, + additionalData :null, + }, + caption : caption.textContent, + cover : null, + }; + + return data; + }, + + uploadButtonClicked : function(event) { + + var beforeSend = ceImage.photoUploadingCallbacks.beforeSend, + success = ceImage.photoUploadingCallbacks.success, + error = ceImage.photoUploadingCallbacks.error; + + /** Define callbacks */ + codex.transport.selectAndUpload({ + beforeSend, + success, + error, + }); + }, + +}; + +ceImage.ui = { + + holder : function(){ + + var element = document.createElement('DIV'); + + element.classList.add(ceImage.elementClasses.formHolder); + element.classList.add(ceImage.elementClasses.ce_image); + + return element; + }, + + uploadButton : function(){ + + var button = document.createElement('SPAN'); + + button.classList.add(ceImage.elementClasses.uploadButton); + + button.innerHTML = ' '; + button.innerHTML += 'Загрузить фотографию'; + + return button; + + }, + + /** + * @param {string} source - file path + * @param {string} style - css class + * @return {object} image - document IMG tag + */ + image : function(source, style) { + + var image = document.createElement('IMG'); + + image.classList.add(style); + + image.src = source; + + return image; + }, + + wrapper : function() { + + var div = document.createElement('div'); + + div.classList.add(ceImage.elementClasses.imageWrapper); + + return div; + }, + + caption : function() { + + var div = document.createElement('div'); + + div.classList.add(ceImage.elementClasses.imageCaption); + div.contentEditable = true; + + return div; + }, + /** + * Draws form for image upload + */ + makeForm : function() { + + var holder = ceImage.ui.holder(), + uploadButton = ceImage.ui.uploadButton(); + + holder.appendChild(uploadButton); + + uploadButton.addEventListener('click', ceImage.uploadButtonClicked, false ); + + ceImage.holder = holder; + + return holder; + }, + + + /** + * wraps image and caption + * @param {object} data - image information + * @param {string} imageTypeClass - plugin's style + * @param {boolean} stretched - stretched or not + * @return wrapped block with image and caption + */ + makeImage : function(data, imageTypeClass, stretched) { + + var file = data.file.url, + text = data.caption, + type = data.type, + image = ceImage.ui.image(file, imageTypeClass), + caption = ceImage.ui.caption(), + wrapper = ceImage.ui.wrapper(); + + caption.textContent = text; + + wrapper.dataset.stretched = stretched; + /** Appeding to the wrapper */ + wrapper.appendChild(image); + wrapper.appendChild(caption); + + return wrapper; + }, + + /** + * @param {HTML} data - Rendered block with image + */ + getImage : function(data) { + + var image = data.querySelector('.' + ceImage.elementClasses.uploadedImage.centered) || + data.querySelector('.' + ceImage.elementClasses.uploadedImage.stretched); + + return image; + }, + + /** + * wraps image and caption + * @deprecated + * @param {object} data - image information + * @return wrapped block with image and caption + */ + centeredImage : function(data) { + + var file = data.file.url, + text = data.caption, + type = data.type, + image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.centered), + caption = ceImage.ui.caption(), + wrapper = ceImage.ui.wrapper(); + + caption.textContent = text; + + wrapper.dataset.stretched = 'false'; + + /** Appeding to the wrapper */ + wrapper.appendChild(image); + wrapper.appendChild(caption); + + return wrapper; + }, + + /** + * wraps image and caption + * @deprecated + * @param {object} data - image information + * @return stretched image + */ + stretchedImage : function(data) { + + var file = data.file.url, + text = data.caption, + type = data.type, + image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.stretched), + caption = ceImage.ui.caption(), + wrapper = ceImage.ui.wrapper(); + + caption.textContent = text; + + wrapper.dataset.stretched = 'true'; + /** Appeding to the wrapper */ + wrapper.appendChild(image); + wrapper.appendChild(caption); + + return wrapper; + + } + +}; + +ceImage.photoUploadingCallbacks = { + + /** Before sending ajax request */ + beforeSend : function() { + ceImage.holder.classList.add(ceImage.elementClasses.loading); + }, + + /** Photo was uploaded successfully */ + success : function(result) { + + var parsed = JSON.parse(result), + data, + currentBlock = codex.content.currentNode, + image; + + /** + * Preparing {Object} data to draw an image + * @uses ceImage.make method + */ + data = { + background : false, + border : false, + isStretch : false, + file : { + url : ceImage.path + 'o_' + parsed.filename, + bigUrl : null, + width : null, + height : null, + additionalData : null, + }, + caption : '', + cover : null, + }; + + image = ceImage.make(data); + + /** + * If current block is empty, we can replace it to uploaded image + * Or insert new block + */ + codex.content.switchBlock(ceImage.holder, image, 'image'); + }, + + /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ + error : function(result) { + console.log('Choosen file is not an image or image is corrupted'); + codex.notifications.errorThrown(); + } + +}; + + +/** +* Add plugin it to redactor tools +*/ +// ceImage = { +// +// type : 'image', +// iconClassname : 'ce-icon-picture', +// make : ceImage.make, +// appendCallback : ceImage.appendCallback, +// settings : ceImage.makeSettings(), +// render : ceImage.render, +// save : ceImage.save, +// isStretched : true, +// displayInToolbox : true, +// enableLineBreaks : false +// +// }; \ No newline at end of file diff --git a/plugins/images/images.css b/plugins/images/images.css new file mode 100644 index 000000000..b382f6bd9 --- /dev/null +++ b/plugins/images/images.css @@ -0,0 +1,106 @@ +/** +* Image plugin for codex-editor +* @author CodeX Team +* +* @version 0.0.1 +*/ +.ce-image { + max-width: 700px; + margin: 20px auto !important; +} + +.ce-plugin-image__holder{ + position: relative; + background: #FEFEFE; + border: 2px dashed #E8EBF5; + border-radius: 55px; + margin: 30px 0; + padding: 30px 110px 30px 40px; +} + .ce-plugin-image__holder input{ + border: 0; + background: transparent; + outline: none; + -webkit-appearance: none; + font-size: 1.2em; + color: #A5ABBC; + } + /* Placeholder color for Chrome */ + .ce-plugin-image__holder input::-webkit-input-placeholder { + color: #A5ABBC; + } + /* Placeholder color for IE 10+ */ + .ce-plugin-image__holder input:-ms-input-placeholder { + color: #A5ABBC; + } + /* Placeholder color for Firefox 19+ */ + .ce-plugin-image__holder input::-moz-placeholder { + color: #A5ABBC; + opacity: 1; + } +.ce-plugin-image__button{ + position: absolute; + z-index: 2; + right: 40px; + cursor: pointer; + font-family: "codex_editor"; + font-size: 1.5em; + color: #8990AA; +} + .ce-plugin-image__button:hover{ + color: #393F52; + } + +.ce-plugin-image__wrapper { + margin : 3em 0; +} +.ce-plugin-image__uploaded--centered { + max-width: 700px; + display:block; + margin: 0 auto; +} + +.ce-plugin-image__uploaded--stretched { + width: 100%; +} + .ce-plugin-image__firstlevel--stretch { + margin: 0 !important; + max-width: none !important; + padding: 0 !important; + } + +.ce-plugin-image__caption { + max-width: 700px; + margin: 1em auto; + text-align: center; + color: #898a8c; +} + + .ce-plugin-image__caption:empty::before { + content: 'Введите подпись'; + text-align: center; + font-weight: normal; + color: #a1a5b3;; + opacity: .9; + transition: opacity 200ms ease; + } + + .ce-plugin-image__caption:focus::before { + opacity: .1; + text-align: center; + } + +/** Settings */ +.ce_plugin_image--settings{ + white-space: nowrap; + /*padding-right: 10px; */ +} +.ce_plugin_image--select_button{ + display: inline-block; + margin-left: 15px; + color: #70a1ff; + cursor: pointer; +} + .ce_plugin_image--select_button:hover{ + color: #8da8dc; + } diff --git a/plugins/images/images.js b/plugins/images/images.js new file mode 100644 index 000000000..44ff77906 --- /dev/null +++ b/plugins/images/images.js @@ -0,0 +1,463 @@ +/** +* Image plugin for codex-editor +* @author CodeX Team +* +* @version 0.0.2 +*/ +var ceImage = { + + elementClasses : { + + ce_image : 'ce-image', + uploadedImage : { + centered : 'ce-plugin-image__uploaded--centered', + stretched : 'ce-plugin-image__uploaded--stretched', + }, + stretch : 'ce_block--stretched', + imageCaption : 'ce-plugin-image__caption', + imageWrapper : 'ce-plugin-image__wrapper', + formHolder : 'ce-plugin-image__holder', + uploadButton : 'ce-plugin-image__button', + + }, + + /** Default path to redactors images */ + path : '/upload/redactor_images/', + + make : function ( data ) { + + /** + * If we can't find image or we've got some problems with image path, we show plugin uploader + */ + if (!data || !data.file.url) { + + holder = ceImage.ui.formView(); + holder.classList.add(ceImage.elementClasses.ce_image); + + } else { + + if ( data.isStretch !== 'true') { + holder = ceImage.ui.imageView(data, ceImage.elementClasses.uploadedImage.centered, 'false'); + } else { + holder = ceImage.ui.imageView(data, ceImage.elementClasses.uploadedImage.stretched, 'true'); + } + } + + return holder; + }, + + /** + * Settings panel content + * @return {Element} element contains all settings + */ + makeSettings : function () { + + var holder = document.createElement('DIV'), + caption = document.createElement('SPAN'), + types = { + centered : 'По центру', + stretched : 'На всю ширину', + }, + selectTypeButton; + + /** Add holder classname */ + holder.className = 'ce_plugin_image--settings'; + + /** Add settings helper caption */ + caption.textContent = 'Настройки плагина'; + caption.className = 'ce_plugin_image--caption'; + + holder.appendChild(caption); + + /** Now add type selectors */ + for (var type in types){ + + selectTypeButton = document.createElement('SPAN'); + + selectTypeButton.textContent = types[type]; + selectTypeButton.className = 'ce_plugin_image--select_button'; + + this.addSelectTypeClickListener(selectTypeButton, type); + + holder.appendChild(selectTypeButton); + + } + + return holder; + + }, + + addSelectTypeClickListener : function(el, type) { + + el.addEventListener('click', function() { + + ceImage.selectTypeClicked(type); + + }, false); + + }, + + selectTypeClicked : function(type) { + + var current = cEditor.content.currentNode, + image = ceImage.ui.getImage(current), + wrapper = current.querySelector('.' + ceImage.elementClasses.imageWrapper); + + /** Clear classList */ + current.className = ''; + image.className = ''; + + /** Add important first-level class ce_block */ + current.classList.add(cEditor.ui.className.BLOCK_CLASSNAME); + + if (type === 'stretched') { + + image.classList.add(ceImage.elementClasses.uploadedImage.stretched); + current.classList.add(ceImage.elementClasses.stretch); + + /** Setting dataset for saver */ + wrapper.dataset.stretched = true; + + } else if (type === 'centered') { + + image.classList.add(ceImage.elementClasses.uploadedImage.centered); + + /** Setting dataset for saver */ + wrapper.dataset.stretched = false; + } + }, + + render : function( data ) { + + return this.make(data); + + }, + + save : function ( block ) { + + var data = block[0], + image = ceImage.ui.getImage(data), + caption = data.querySelector('.' + ceImage.elementClasses.imageCaption); + + var json = { + type : 'image', + data : { + background : false, + border : false, + isStretch : data.dataset.stretched, + file : { + url : image.src, + bigUrl : null, + width : image.width, + height : image.height, + additionalData :null, + }, + caption : caption.textContent, + cover : null, + } + }; + + return json; + }, + + uploadButtonClicked : function(event) { + + var success = ceImage.photoUploadingCallbacks.success, + error = ceImage.photoUploadingCallbacks.error; + + /** Define callbacks */ + cEditor.transport.selectAndUpload({ + success, + error, + }); + }, + + pastedImageURL : function(event) { + + var clipboardData = event.clipboardData || window.clipboardData, + pastedData = clipboardData.getData('Text'), + block = event.target.parentNode; + + ceImage.renderURL(pastedData, block); + + event.stopPropagation(); + }, + + renderURL : function(pastedData, block) { + + Promise.resolve() + + .then(function() { + return pastedData; + }) + + .then(ceImage.urlify) + + .then(function(url) { + + /* Show loader gif **/ + // block.classList.add(linkTool.elementClasses.loader); + + return fetch('/editor/transport?files=' + encodeURI(url)) + }) + + .then(function(response) { + console.log(response); + }); + + }, + + urlify : function (text) { + + var urlRegex = /(https?:\/\/\S+)/g; + + var links = text.match(urlRegex); + + if (links) { + console.log(links[0]); + return links[0]; + } + + return Promise.reject(Error("Url is not matched")); + + }, +}; + +ceImage.ui = { + + holder : function(){ + + var element = document.createElement('DIV'); + + element.classList.add(ceImage.elementClasses.formHolder); + + return element; + }, + + input : function(){ + + var input = document.createElement('INPUT'); + + return input; + + }, + + uploadButton : function(){ + + var button = document.createElement('SPAN'); + + button.classList.add(ceImage.elementClasses.uploadButton); + + button.innerHTML = ''; + + return button; + + }, + + /** + * @param {string} source - file path + * @param {string} style - css class + * @return {object} image - document IMG tag + */ + image : function(source, style) { + + var image = document.createElement('IMG'); + + image.classList.add(style); + + image.src = source; + + return image; + }, + + wrapper : function() { + + var div = document.createElement('div'); + + div.classList.add(ceImage.elementClasses.imageWrapper); + + return div; + }, + + caption : function() { + + var div = document.createElement('div'); + + div.classList.add(ceImage.elementClasses.imageCaption); + div.contentEditable = true; + + return div; + }, + + /** + * Draws form for image upload + */ + formView : function() { + + var holder = ceImage.ui.holder(), + uploadButton = ceImage.ui.uploadButton(), + input = ceImage.ui.input(); + + input.placeholder = 'Paste image URL or file'; + + holder.appendChild(uploadButton); + holder.appendChild(input); + + input.addEventListener('paste', ceImage.pastedImageURL, false); + + uploadButton.addEventListener('click', ceImage.uploadButtonClicked, false ); + + return holder; + }, + + /** + * wraps image and caption + * @param {object} data - image information + * @param {string} imageTypeClass - plugin's style + * @param {boolean} stretched - stretched or not + * @return wrapped block with image and caption + */ + imageView : function(data, imageTypeClass, stretched) { + + var file = data.file.url, + text = data.caption, + type = data.type, + image = ceImage.ui.image(file, imageTypeClass), + caption = ceImage.ui.caption(), + wrapper = ceImage.ui.wrapper(); + + caption.textContent = text; + + wrapper.dataset.stretched = stretched, + /** Appeding to the wrapper */ + wrapper.appendChild(image); + wrapper.appendChild(caption); + + return wrapper; + }, + + /** + * @param {HTML} data - Rendered block with image + */ + getImage : function(data) { + + var image = data.querySelector('.' + ceImage.elementClasses.uploadedImage.centered) || + data.querySelector('.' + ceImage.elementClasses.uploadedImage.stretched); + + return image; + }, + + /** + * wraps image and caption + * @deprecated + * @param {object} data - image information + * @return wrapped block with image and caption + */ + centeredImage : function(data) { + + var file = data.file.url, + text = data.caption, + type = data.type, + image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.centered), + caption = ceImage.ui.caption(), + wrapper = ceImage.ui.wrapper(); + + caption.textContent = text; + + wrapper.dataset.stretched = 'false', + /** Appeding to the wrapper */ + wrapper.appendChild(image); + wrapper.appendChild(caption); + + return wrapper; + }, + + /** + * wraps image and caption + * @deprecated + * @param {object} data - image information + * @return stretched image + */ + stretchedImage : function(data) { + + var file = data.file.url, + text = data.caption, + type = data.type, + image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.stretched), + caption = ceImage.ui.caption(), + wrapper = ceImage.ui.wrapper(); + + caption.textContent = text; + + wrapper.dataset.stretched = 'true', + /** Appeding to the wrapper */ + wrapper.appendChild(image); + wrapper.appendChild(caption); + + return wrapper; + + } + +}; + +ceImage.photoUploadingCallbacks = { + + /** Photo was uploaded successfully */ + success : function(result) { + + var parsed = JSON.parse(result), + data, + image; + + /** + * Preparing {Object} data to draw an image + * @uses ceImage.make method + */ + data = { + background : false, + border : false, + isStrech : false, + file : { + url : ceImage.path + 'o_' + parsed.filename, + bigUrl : null, + width : null, + height : null, + additionalData : null, + }, + caption : '', + cover : null, + }; + + image = ceImage.make(data); + + /** Replace form to image */ + var form = cEditor.content.currentNode.querySelector('.' + ceImage.elementClasses.formHolder); + + cEditor.content.switchBlock(form, image, 'image'); + + }, + + /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ + error : function(result) { + console.log('Choosen file is not an image or image is corrupted'); + cEditor.notifications.errorThrown(); + }, + +} + + +/** +* Add plugin it to redactor tools +*/ +cEditor.tools.image = { + + type : 'image', + iconClassname : 'ce-icon-picture', + make : ceImage.make, + settings : ceImage.makeSettings(), + render : ceImage.render, + save : ceImage.save, + isStretched : true, + enableLineBreaks : false + +}; diff --git a/plugins/instagram/instagram.css b/plugins/instagram/instagram.css new file mode 100644 index 000000000..5d4f265f9 --- /dev/null +++ b/plugins/instagram/instagram.css @@ -0,0 +1,10 @@ +.ce-redactor .instagram { + width: 100%; + max-width: 650px; + margin: 10px auto; +} + +.instagram__loader { + background: url("loading.gif") !important; + opacity: 0.1; +} \ No newline at end of file diff --git a/plugins/instagram/instagram.js b/plugins/instagram/instagram.js new file mode 100644 index 000000000..9599166d6 --- /dev/null +++ b/plugins/instagram/instagram.js @@ -0,0 +1,133 @@ +/** + * Instagram plugin + * @version 1.0.0 + */ +var instagramTool = { + + /** + * Prepare before usage + * Load important scripts to render embed + */ + prepare : function() { + + var script = "//platform.instagram.com/en_US/embeds.js"; + + /** + * Load widget + */ + codex.core.importScript(script, 'instagramAPI'); + }, + + /** + * Make instagram embed via Widgets method + */ + make : function(data, isInternal) { + + if (!data.instagram_url) + return; + + var block = instagramTool.content.instagramBlock(data.instagram_url); + + if (isInternal) { + + setTimeout(function() { + + /** Render block */ + instagramTool.content.render(block); + + }, 200); + } + + + return block; + + if (!isInternal) { + instagramTool.content.render(block); + } + }, + + /** + * Saving JSON output. + * Upload data via ajax + */ + save : function(blockContent) { + + var data; + + if (!blockContent) + return; + + /** Example */ + data = { + instagram_url: blockContent.src + }; + + return data; + + }, + + /** + * Render data + */ + render : function(data) { + return instagramTool.make(data); + } + +}; + +instagramTool.content = { + + render : function(content) { + + codex.content.switchBlock(codex.content.currentNode, content, 'instagram'); + + var blockContent = codex.content.currentNode.childNodes[0]; + blockContent.classList.add('instagram__loader'); + + window.instgrm.Embeds.process(); + + setTimeout(function(){ + blockContent.classList.remove('instagram__loader'); + }, 500); + }, + + /** + * Drawing html content. + * + * @param url + * @returns {Element} blockquote - HTML template for Instagram Embed JS + */ + instagramBlock : function(url) { + + var blockquote = codex.draw.node('BLOCKQUOTE', 'instagram-media instagram', {}), + div = codex.draw.node('DIV', '', {}), + paragraph = codex.draw.node('P', 'ce-paste__instagram--p', {}), + anchor = codex.draw.node('A', '', { href : url }); + + blockquote.dataset.instgrmVersion = 4; + + paragraph.appendChild(anchor); + div.appendChild(paragraph); + blockquote.appendChild(div); + + return blockquote; + + } + +}; + +// instagramTool = { +// +// type : 'instagram', +// iconClassname : 'ce-icon-instagram', +// prepare : instagramTool.prepare, +// make : instagramTool.make, +// appendCallback : null, +// settings : null, +// render : instagramTool.render, +// save : instagramTool.save, +// displayInToolbox : false, +// enableLineBreaks : false, +// allowedToPaste : false +// +// }; diff --git a/plugins/instagram/loading.gif b/plugins/instagram/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..72ea7ccb5321d5384d70437cfaac73011237901e GIT binary patch literal 329 zcmZ?wbhEHb9b#5NV>2k zBC~b@b~P=nNfWAe-b%_i6tS^-1y(h@EsB~1TqDA_h@fkxG$bHgvj}VxE1JLgr!*!^ ILUxTc0Q$^Q5C8xG literal 0 HcmV?d00001 diff --git a/plugins/link/link.css b/plugins/link/link.css new file mode 100644 index 000000000..24f1c3b2d --- /dev/null +++ b/plugins/link/link.css @@ -0,0 +1,86 @@ +.ce-link { + padding: 0.7em 0 !important; + border-radius: 3px; +} + +.clearfix:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; +} + +.ceditor-tool-link-input { + outline: none; + border: 0; + width: 100%; + background: transparent; + font-size: 1em; + padding: 8px 25px; + transition: background 200ms; + border-left: 3px solid #65d8b3; +} + +.tool-link-panel { + position: relative; + margin: 5px 0; + background: #f8f7ef; + border: 1px solid transparent; + padding: 25px 30px; +} + +.tool-link-image { + float:right; + width: 75px; + border-radius: 3px; +} + +.tool-link-title { + display: block; + width: 340px; + margin-bottom: 4px; + line-height: 1.2em; + font-size: 20px; + font-weight: 700; + color: #000; +} + +.tool-link-description { + display: block; + margin-top: 10px; + font-size: 14px; + color: #000; +} + +.tool-link-link { + width: 360px; + font-size: 10px; + margin-bottom: 4px; + letter-spacing: 1px; + overflow: hidden; + text-transform: uppercase; + text-decoration: none; + color: rgba(165,156,86,.8); +} + +.tool-link-loader { + background-color: transparent; + background-image: repeating-linear-gradient(-45deg, transparent, transparent 4px, #f5f9ff 4px, #eaedef 8px) !important; + background-size: 56px 56px; + animation: loading-bar 5s infinite linear; +} +@keyframes loading-bar { + 100% { background-position: -56% 0 } +} + + + +.tool-link-error { + background: rgb(255, 241, 241); + color: #bf4747; +} +.tool-link-error .ceditor-tool-link-input { + border-left-color: #d86b6b +} diff --git a/plugins/link/link.js b/plugins/link/link.js new file mode 100644 index 000000000..463119756 --- /dev/null +++ b/plugins/link/link.js @@ -0,0 +1,321 @@ +/** + * Created by nostr on 29.06.16. + */ + +/** + * Link tool plugin + */ +var linkTool = { + + defaultText : 'Insert link here ...', + ENTER_KEY : 13, + + currentBlock : null, + currentInput : null, + elementClasses : { + link : "tool-link-link", + image : "tool-link-image", + title : "tool-link-title", + description : "tool-link-description", + loader : "tool-link-loader", + error : "tool-link-error" + }, + + /** + * Make initial header block + * @param {object} JSON with block data + * @return {Element} element to append + */ + makeNewBlock : function (data) { + + var wrapper = linkTool.ui.mainBlock(), + tag = linkTool.ui.input(); + + linkTool.currentInput = tag; + + wrapper.appendChild(tag); + + wrapper.classList.add('ce-link'); + /** + * Bind callbacks + **/ + tag.addEventListener('paste', linkTool.blockPasteCallback, false); + tag.addEventListener('keydown', linkTool.blockKeyDownCallback, false); + + return wrapper; + + }, + + /** + * Method to render HTML block from JSON + */ + render : function (json) { + + var block = linkTool.ui.mainBlock(), + tag = linkTool.ui.make(json); + + block.classList.add('ce-link'); + block.appendChild(tag); + + return block; + + }, + + /** + * Method to extract JSON data from HTML block + */ + save : function (blockContent){ + + var linkElement = linkTool.elementClasses.link; + + var data = { + url : blockContent.querySelector("." + linkElement).href, + shortLink : blockContent.querySelector("." + linkElement).textContent, + image : blockContent.querySelector("." + linkTool.elementClasses.image).src, + title : blockContent.querySelector("." + linkTool.elementClasses.title).textContent, + description : blockContent.querySelector("." + linkTool.elementClasses.description).textContent + }; + + return data; + + }, + + blockPasteCallback : function (event) { + + var clipboardData = event.clipboardData || window.clipboardData, + pastedData = clipboardData.getData('Text'), + block = event.target.parentNode; + + linkTool.renderLink(pastedData, block); + + event.stopPropagation(); + + }, + + blockKeyDownCallback : function (event) { + + var inputTag = event.target, + block = inputTag.parentNode, + url; + + if ( block.classList.contains(linkTool.elementClasses.error) ) + { + block.classList.remove(linkTool.elementClasses.error); + } + + if (event.keyCode == linkTool.ENTER_KEY) { + + url = inputTag.value; + + linkTool.renderLink(url, block); + + event.preventDefault(); + + } + + }, + + /** + * @todo move request-url to accepted settings + */ + renderLink : function (url, block) { + + Promise.resolve() + + .then(function () { + return linkTool.urlify(url); + }) + + .then(function (url) { + + /* Show loader gif **/ + block.classList.add(linkTool.elementClasses.loader); + + return fetch('/club/linkInfo?url=' + encodeURI(url)); + }) + + .then(function (response) { + + if (response.status == "200"){ + + return response.json(); + + } else { + + return Error("Invalid response status: %o", response); + + } + + }) + + .then(function (json) { + console.log(json); + linkTool.composeLinkPreview(json, block); + }) + + .catch(function(error) { + + /* Hide loader gif **/ + block.classList.remove(linkTool.elementClasses.loader); + + block.classList.add(linkTool.elementClasses.error); + + codex.core.log('Error while doing things with link paste: %o', 'error', error); + }); + + }, + + urlify : function (text) { + + var urlRegex = /(https?:\/\/\S+)/g; + + var links = text.match(urlRegex); + + if (links) { + return links[0]; + } + + return Promise.reject(Error("Url is not matched")); + + }, + + composeLinkPreview : function (json, currentBlock) { + + if (json == {}) { + + return; + + } + + var previewBlock = linkTool.ui.make(json); + + linkTool.currentInput.remove(); + + currentBlock.appendChild(previewBlock); + + currentBlock.classList.remove(linkTool.elementClasses.loader); + + } + +}; + +linkTool.ui = { + + make : function (json) { + + var wrapper = this.wrapper(), + siteImage = this.image(json.image, linkTool.elementClasses.image), + siteTitle = this.title(json.title), + siteDescription = this.description(json.description), + siteLink = this.link(json.url, json.url); + + wrapper.appendChild(siteImage); + wrapper.appendChild(siteTitle); + wrapper.appendChild(siteLink); + wrapper.appendChild(siteDescription); + + siteTitle.contentEditable = true; + siteDescription.contentEditable = true; + + return wrapper; + + }, + + mainBlock : function () { + + var wrapper = document.createElement('div'); + + wrapper.classList.add("ceditor-tool-link"); + + return wrapper; + + }, + + input : function () { + + var inputTag = document.createElement('input'); + + inputTag.classList.add("ceditor-tool-link-input"); + + inputTag.placeholder = linkTool.defaultText; + + inputTag.contentEditable = false; + + return inputTag; + + }, + + wrapper : function () { + + var wrapper = document.createElement('div'); + + wrapper.className += 'tool-link-panel clearfix'; + + return wrapper; + + }, + + image : function (imageSrc, imageClass) { + + var imageTag = document.createElement('img'); + + imageTag.classList.add(imageClass); + + imageTag.setAttribute('src', imageSrc); + + return imageTag; + + }, + + link : function (linkUrl, linkText) { + + var linkTag = document.createElement('a'); + + linkTag.classList.add(linkTool.elementClasses.link); + + linkTag.href = linkUrl; + + linkTag.target = "_blank"; + + linkTag.innerText = linkText; + + return linkTag; + + }, + + title : function (titleText) { + + var titleTag = document.createElement('div'); + + titleTag.classList.add("tool-link-content", linkTool.elementClasses.title); + + titleTag.innerHTML = titleText; + + return titleTag; + }, + + description : function (descriptionText) { + + var descriptionTag = document.createElement('div'); + + descriptionTag.classList.add("tool-link-content", linkTool.elementClasses.description); + + descriptionTag.innerHTML = descriptionText; + + return descriptionTag; + } + +}; + +// linkTool = { +// +// type : 'link', +// iconClassname : 'ce-icon-link', +// make : linkTool.makeNewBlock, +// appendCallback : linkTool.appendCallback, +// render : linkTool.render, +// save : linkTool.save, +// displayInToolbox : true, +// enableLineBreaks : true +// +// }; diff --git a/plugins/list/list.css b/plugins/list/list.css new file mode 100644 index 000000000..b0cbbd3f4 --- /dev/null +++ b/plugins/list/list.css @@ -0,0 +1,37 @@ +.ce-list { + margin: 0; + padding: .5em 0; +} + +.ce_plugin_list--settings{ + white-space: nowrap; +} + +.ce_plugin_list--select_button{ + display: block; + color: #306ac7; + cursor: pointer; + line-height: 1.3em; +} + .ce_plugin_list--select_button:not(:last-of-type){ + margin-bottom: 0.9em; + } + .ce_plugin_list--select_button:hover{ + color: #a1b4ec; + } +/** +* List style settigns icons +*/ +.ce_plugin_list--select_button i{ + margin-right: 1.3em; +} + +.ce-list li{ + background: #fff; + border: 1px solid #ebeef3; + border-radius: 3px; + margin: .5em; + padding: .5em; + list-style-position: outside; + margin-left: 1.1em; +} \ No newline at end of file diff --git a/plugins/list/list.js b/plugins/list/list.js new file mode 100644 index 000000000..ab4036327 --- /dev/null +++ b/plugins/list/list.js @@ -0,0 +1,175 @@ +/** + * Code Plugin\ + * Creates code tag and adds content to this tag + */ +var listTool = { + + baseClass : "tool-list", + elementClasses : { + li : "tool-list-li" + }, + + /** + * Make initial header block + * @param {object} JSON with block data + * @return {Element} element to append + */ + make : function () { + + var tag = listTool.ui.make(), + li = listTool.ui.block("li", "tool-link-li"); + + var br = document.createElement("br"); + + li.appendChild(br); + tag.appendChild(li); + + tag.classList.add('ce-list'); + + return tag; + + }, + + /** + * Method to render HTML block from JSON + */ + render : function (data) { + + var type = data.type == 'ordered' ? 'OL' : 'UL', + tag = listTool.ui.make(type); + + tag.classList.add('ce-list'); + + data.items.forEach(function (element, index, array) { + + var newLi = listTool.ui.block("li", listTool.elementClasses.li); + + newLi.innerHTML = element; + + tag.dataset.type = data.type; + tag.appendChild(newLi); + + }); + + return tag; + + }, + + /** + * Method to extract JSON data from HTML block + */ + save : function (blockContent){ + + var data = { + type : null, + items : [], + }; + + for(var index = 0; index < blockContent.childNodes.length; index++) + data.items[index] = blockContent.childNodes[index].textContent; + + data.type = blockContent.dataset.type; + + return data; + + }, + + makeSettings : function(data) { + + var holder = document.createElement('DIV'), + selectTypeButton; + + /** Add holder classname */ + holder.className = 'ce_plugin_list--settings'; + + var orderedButton = listTool.ui.button("ordered"), + unorderedButton = listTool.ui.button("unordered"); + + orderedButton.addEventListener('click', function (event) { + listTool.changeBlockStyle(event, 'ol'); + codex.toolbar.settings.close(); + }); + + unorderedButton.addEventListener('click', function (event) { + listTool.changeBlockStyle(event, 'ul'); + codex.toolbar.settings.close(); + }); + + holder.appendChild(orderedButton); + holder.appendChild(unorderedButton); + + return holder; + + }, + + changeBlockStyle : function (event, blockType) { + + var currentBlock = codex.content.currentNode, + newEditable = listTool.ui.make(blockType), + oldEditable = currentBlock.querySelector("[contenteditable]"); + + newEditable.dataset.type = blockType; + newEditable.innerHTML = oldEditable.innerHTML; + newEditable.classList.add('ce-list'); + + codex.content.switchBlock(currentBlock, newEditable, 'list'); + }, + +}; + +listTool.ui = { + + make : function (blockType) { + + var wrapper = this.block(blockType || 'UL', listTool.baseClass); + + wrapper.dataset.type = 'ul'; + wrapper.contentEditable = true; + + return wrapper; + + }, + + block : function (blockType, blockClass) { + + var block = document.createElement(blockType); + + if ( blockClass ) block.classList.add(blockClass); + + return block; + + }, + + button : function (buttonType) { + + var types = { + unordered : 'Обычный список', + ordered : 'Нумерованный список' + }, + button = document.createElement('SPAN'); + + button.innerHTML = types[buttonType]; + + button.className = 'ce_plugin_list--select_button'; + + return button; + } +}; + +/** + * Now plugin is ready. + * Add it to redactor tools +// */ +// module.exports = { +// +// type : 'list', +// iconClassname : 'ce-icon-list-bullet', +// make : listTool.make, +// appendCallback : null, +// settings : listTool.makeSettings(), +// render : listTool.render, +// save : listTool.save, +// displayInToolbox : true, +// enableLineBreaks : true +// +// }; diff --git a/plugins/paragraph/paragraph.css b/plugins/paragraph/paragraph.css new file mode 100644 index 000000000..11bf8abbb --- /dev/null +++ b/plugins/paragraph/paragraph.css @@ -0,0 +1,28 @@ +/** +* Empty paragraph placeholder +*/ + +.ce-paragraph { + padding: 0.7em 0 !important; + line-height: 1.7em; +} +.ce-paragraph:empty::before{ + content : attr(data-placeholder); + color: #818BA1; + opacity: .7; + transition: opacity 200ms ease; +} +.ce-paragraph:focus::before{ + opacity: .1; +} + + +.ce-paragraph p { + margin: 1.2em 0; +} +.ce-paragraph p:first-of-type{ + margin-top: 0; +} +.ce-paragraph p:last-of-type{ + margin-bottom: 0; +} \ No newline at end of file diff --git a/plugins/paragraph/paragraph.js b/plugins/paragraph/paragraph.js new file mode 100644 index 000000000..d3b4f9f4c --- /dev/null +++ b/plugins/paragraph/paragraph.js @@ -0,0 +1,88 @@ +/** +* Paragraph Plugin\ +* Creates P tag and adds content to this tag +*/ +// var tools = require('./../plugins'); + +var paragraphTool = { + + /** + * Make initial header block + * @param {object} JSON with block data + * @return {Element} element to append + */ + make : function (data) { + + var tag = document.createElement('DIV'); + + tag.classList.add('ce-paragraph'); + + if (data && data.text) { + tag.innerHTML = data.text; + } + + tag.contentEditable = true; + + /** + * if plugin need to add placeholder + * tag.setAttribute('data-placeholder', 'placehoder'); + */ + + /** + * @uses Paste tool callback. + * Function analyzes pasted data + * If pasted URL from instagram, twitter or Image + * it renders via Social widgets content or uploads image and uses Image tool to render + */ + tag.addEventListener('paste', codex.tools.paste.callbacks.pasted, false); + + return tag; + + }, + + /** + * Method to render HTML block from JSON + */ + render : function (data) { + + return paragraphTool.make(data); + + }, + + /** + * Method to extract JSON data from HTML block + */ + save : function (blockContent){ + + var data = { + text : null, + format: "html", + introText: '<>' + }; + + data.text = blockContent.innerHTML; + + return data; + + } + +}; + +/** +* Now plugin is ready. +* Add it to redactor tools +*/ +// module.exports = { +// +// type : 'paragraph', +// iconClassname : 'ce-icon-paragraph', +// make : paragraphTool.make, +// appendCallback : null, +// settings : null, +// render : paragraphTool.render, +// save : paragraphTool.save, +// displayInToolbox : false, +// enableLineBreaks : false, +// allowedToPaste : true +// +// }; diff --git a/plugins/paste/loading.gif b/plugins/paste/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..72ea7ccb5321d5384d70437cfaac73011237901e GIT binary patch literal 329 zcmZ?wbhEHb9b#5NV>2k zBC~b@b~P=nNfWAe-b%_i6tS^-1y(h@EsB~1TqDA_h@fkxG$bHgvj}VxE1JLgr!*!^ ILUxTc0Q$^Q5C8xG literal 0 HcmV?d00001 diff --git a/plugins/paste/paste.css b/plugins/paste/paste.css new file mode 100644 index 000000000..354166ecd --- /dev/null +++ b/plugins/paste/paste.css @@ -0,0 +1,17 @@ +.ce-paste { + padding: 10px; + border: 1px solid #55818c; +} + .ce-paste:empty::before { + content : attr(data-placeholder); + color: #5e6475; + } + + .ce-paste:focus::before{ + opacity: .1; + } + +.ce-paste-plugin__loader { + background: url("loading.gif") !important; + opacity: 0.1; +} \ No newline at end of file diff --git a/plugins/paste/paste.js b/plugins/paste/paste.js new file mode 100644 index 000000000..fc498b54c --- /dev/null +++ b/plugins/paste/paste.js @@ -0,0 +1,242 @@ +/** + * Paste plugin. + * + * Listens on paste event and pastes content from: + * - Instagram + * - Twitter + * - VK + * - Facebook + * - Image + * - External Link + * + */ + +/** + * @protected + * + * Main tool settings. + */ +var pasteTool = { + +}; + +/** + * Make elements to insert or switch + * + * @uses Core codex.draw module + */ +pasteTool.ui = { + + /** + * Upload image by URL + * + * @uses codex Image tool + * @param filename + * @returns {Element} + */ + uploadedImage : function(filename) { + + var data = { + background: false, + border: false, + isStretch: false, + file: { + url: "upload/redactor_images/" + filename, + bigUrl: "upload/redactor_images/" + filename, + width: null, + height: null, + additionalData: "null" + }, + caption: '', + cover: null + }; + + /** Using Image plugin make method */ + var image = codex.tools.image.make(data); + + return image; + + } + +}; + + +/** + * + * Callbacks + */ +pasteTool.callbacks = { + + /** + * Saves data + * @param event + */ + pasted : function(event) { + + var clipBoardData = event.clipboardData || window.clipboardData, + content = clipBoardData.getData('Text'); + + pasteTool.callbacks.analize(content); + }, + + /** + * Analizes pated string and calls necessary method + */ + analize : function(string) { + + var regexTemplates = { + image : /(?:([^:\/?#]+):)?(?:\/\/([^\/?#]*))?([^?#]*\.(?:jpe?g|gif|png))(?:\?([^#]*))?(?:#(.*))?/i, + instagram : new RegExp("http?.+instagram.com\/p?."), + twitter : new RegExp("http?.+twitter.com?.+\/"), + facebook : /https?.+facebook.+\/\d+\?/, + vk : /https?.+vk?.com\/feed\?w=wall\d+_\d+/, + }, + + image = regexTemplates.image.test(string), + instagram = regexTemplates.instagram.exec(string), + twitter = regexTemplates.twitter.exec(string), + facebook = regexTemplates.facebook.test(string), + vk = regexTemplates.vk.test(string); + + if (image) { + + pasteTool.callbacks.uploadImage(string); + + } else if (instagram) { + + pasteTool.callbacks.instagramMedia(instagram); + + } else if (twitter) { + + pasteTool.callbacks.twitterMedia(twitter); + + } else if (facebook) { + + pasteTool.callbacks.facebookMedia(string); + + } else if (vk) { + + pasteTool.callbacks.vkMedia(string); + + } + + }, + + /** + * Direct upload + * @param url + */ + uploadImage : function(path) { + + var ajaxUrl = location.protocol + '//' + location.hostname + ':32769', + file, + image, + current = codex.content.currentNode, + beforeSend, + success_callback; + + /** When image is uploaded to redactors folder */ + success_callback = function(data) { + + console.log(data); + return; + var file = JSON.parse(data); + image = pasteTool.ui.uploadedImage(file.filename); + codex.content.switchBlock(current, image, 'image'); + + }; + + /** Before sending XMLHTTP request */ + beforeSend = function() { + var content = current.querySelector('.ce-block__content'); + content.classList.add('ce-plugin-image__loader'); + }; + + /** Preparing data for XMLHTTP */ + var data = { + url: '/club/fetchImage', + type: "POST", + data : { + url: path + }, + beforeSend : beforeSend, + success : success_callback + }; + + codex.core.ajax(data); + }, + + /** + * callback for instagram url's + * Using instagram Embed Widgete to render + * @uses Instagram tool + * @param url + */ + instagramMedia : function(url) { + + var fullUrl = url.input, + data; + + + data = { + instagram_url: fullUrl + }; + + codex.tools.instagram.make(data, true); + + }, + + /** + * callback for tweets + * Using Twittter Widget to render + * @uses Twitter tool + * @param url + */ + twitterMedia : function(url) { + + var fullUrl = url.input, + tweetId, + arr, + data; + + arr = fullUrl.split('/'); + tweetId = arr.pop(); + + /** Example */ + data = { + media:true, + conversation:false, + user:{ + profile_image_url:"http:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", + profile_image_url_https:"https:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", + screen_name:"Niketas", + name:"Никита Лихачёв" + }, + id: tweetId, + text:"ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\/\/t.co\/iWyOHf4xr2", + created_at:"Tue Jun 28 14:09:12 +0000 2016", + status_url:"https:\/\/twitter.com\/Niketas\/status\/747793978511101953", + caption:"Caption" + }; + + codex.tools.twitter.make(data); + } + +}; + +// module.exports = { +// +// type : 'paste', +// iconClassname : '', +// prepare : pasteTool.prepare, +// make : pasteTool.make, +// appendCallback : null, +// settings : null, +// render : null, +// save : pasteTool.save, +// callbacks : pasteTool.callbacks, +// displayInToolbox : false, +// enableLineBreaks : false, +// allowedToPaste : false +// +// }; diff --git a/plugins/quote/img/codex.png b/plugins/quote/img/codex.png new file mode 100644 index 0000000000000000000000000000000000000000..68f53217316e3193c2d4248cb2653aa3a7e90110 GIT binary patch literal 12934 zcmbtbQ+Qonv`u5HC$`PTwrw;vPplI(cG8%QZL4A9q_J%~jd{=idLQpy-?#UESr6-B z?J>t3W6VeuC215yd_)Kc2ozZv2{rIH^}h!m68vs7J8Xu4U{{ot5Y_O?J~x07Nt*cF z!maC*iVMS-jS8W)V4#O@30jVfEWOHLrd=*GPNJ9bM3HhZEBx5HnBk>^ zvwvE9J?hV%a-F)!`Te@?w|AKXk{}=;P~AYcjCi|1b}MW=E>St2QOut%%o59&<_;B$ zcSH;&-T)v9cF+NQ+|+6B{_h(kK0RRhU|gJUmIelzlIQ>ajY-_yy^V?*tDt`>m^(qH zZp_aQ>@#*EH>=mdz`&?#YYPbpiHT`yN=~kdi77}-REj5lfrS-R^cls#`Y_eyLvC_n zf>Dxx{t)8h6Jq`V$;o*rp@yn$diZkS$M)}R=arNk##5yvB`r`UAm809PAF8{JGkGY zJf#9f#o%fG%E*J>j%UIjuX?Dcu&}XQje_Eei^}qd(cp+iq)(7FGdcNg?*Q}t(qk_m?oUyzQ7s%?kJmFh4L2GB1`f`Zjk&d>37hq` z@o&*!3CVzCVA;*GaxObN`z?4OA&!{4xO1kcUj;xn!P3z|Cdg>0Yf>f1Ca_Wk(gLzalKntB~-yrJr$dLz$U%r~cl1GRps{s_uGrx}e_*r15`_ zGM9}KIbIt!O@DWSqoEm?rlq6zeRvxEecWn;ccQz(yRfj}I|UmkGCfOqa&~gx*nrRV z$52%l29mCLzYg@6D;V%_;>zfvewpzd=65EC7d%E`$q|V3x}&A$!nTH@NE$Zh4MRo^m#qJb2OGs*7zV{^6gVk# zh)qE#g;L)NS5daG@F*rGMk4S;NDzJ}U(or6YgH;ao=R^1iS?$4_-$?u?PBfo=|p{6 z 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 CQBCOp literal 0 HcmV?d00001 diff --git a/plugins/quote/img/upload.png b/plugins/quote/img/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..7d28e986b4e1a20ea2ae1d5ecc8ba1ffe7b1ef52 GIT binary patch literal 1853 zcmV-D2g3M?P)b~pr;iA)S z_WAR(+lk5Ltl;m^sMdG6-ICAfwdV5K3WN+(0000HbW%=J5I|snkH63V0C1lmP~WdG z@1TYjO#lD}S4l)cRCoc@&uy05APh!f5iGp}5)-=r&Gv7<66^+ybT@F%LtiVR^vDOZ z;J1YN$d9yW`8ByzDq|4Wk~~B7Q3a=y`cQ`uvf6ODR*gJCv@rfVF6sk9Met!#XgkEd zF{N+Y3DMjzt(J8Y$tsc(;;+VO9#z`s9;l~Ga=Tot#0!m8C%PQ!Mg2L3j2#gqGRu-WCSX|hA2X%FCi77s;?jk!AdV6j9~G< zAqnA1|Aa8Y#s7jNtnbH9Zq5TcRv3n&PVdDSWWZoZm_GYoUwSg_%>U0a8gg=Xa4FBi zmPp=^xh3jAHzYA>M&H=HC|$p|WF_(-cps{icCkf$5zoVp$hDY;v9t$obZ={kl3vvJ zXnbLf?rC{fvQ?JL=s)CbJBMW1@0PiL8b#F|ayjO;jRj^9KgUy+h_$%%{Rza(!W=hAPr{Ihlb zAtJt9JUxj&Tkj%A(gp5w*F8(;*3qSkD73UEfYG??#v{UT>~c$8UJE~1lkSa)@Jn)i zsUj*yO90dEgQ@J|e)c9J`zbq`bsx+|vfo#iO36m=y!&DuBD{|U`u%9f<1Js3lgW$cUitl820Rcon5ikT0DMioFL*S8WMn2#I2#mILiq!^O z1Oet= 0; i--) { + styleSelectors[i].classList.remove(quoteTools.styles.settings.selectedType); + } + + this.classList.add(quoteTools.styles.settings.selectedType); + + }, + + /** + * @deprecated + */ + selectTypeQuoteStyle : function(type) { + + /** + * Choose Quote style to replace + */ + switch (type) { + case 'simple': + quoteStyleFunction = quoteTools.makeSimpleQuote; + break; + case 'withCaption': + quoteStyleFunction = quoteTools.makeQuoteWithCaption; + break; + case 'withPhoto': + quoteStyleFunction = quoteTools.makeQuoteWithPhoto; + break; + } + + return quoteStyleFunction; + + }, + + /** + * @deprecated + */ + addSelectTypeClickListener : function(el, quoteStyle) { + + el.addEventListener('click', function () { + + /** + * Parsing currentNode to JSON. + */ + var parsedOldQuote = quoteTools.parseBlockQuote(), + newStyledQuote = quoteStyle(parsedOldQuote); + + var wrapper = codex.content.composeNewBlock(newStyledQuote, 'quote'); + wrapper.appendChild(newStyledQuote); + + codex.content.switchBlock(codex.content.currentNode, newStyledQuote, 'quote'); + + /** Close settings after replacing */ + codex.toolbar.settings.close(); + + }, false); + + }, + + /** + * @deprecated + */ + makeSimpleQuote : function(data) { + + var wrapper = quoteTools.ui.makeBlock('BLOCKQUOTE', [quoteTools.styles.simple.text, quoteTools.styles.quoteText]); + + wrapper.innerHTML = data.text || ''; + + wrapper.dataset.quoteStyle = 'simple'; + wrapper.classList.add(quoteTools.styles.ce_quote); + wrapper.contentEditable = 'true'; + + return wrapper; + }, + + /** + * @deprecated + */ + makeQuoteWithCaption : function(data) { + + var wrapper = quoteTools.ui.blockquote(), + text = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withCaption.blockquote, quoteTools.styles.quoteText]), + author = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withCaption.author, quoteTools.styles.quoteAuthor]); + + /* make text block ontentEditable */ + text.contentEditable = 'true'; + + text.innerHTML = data.text; + + /* make Author contentEditable */ + author.contentEditable = 'true'; + + author.textContent = data.cite; + + /* Appending created components */ + wrapper.dataset.quoteStyle = 'withCaption'; + wrapper.classList.add(quoteTools.styles.ce_quote); + + wrapper.appendChild(text); + wrapper.appendChild(author); + + return wrapper; + + }, + + makeQuoteWithPhoto : function(data) { + + var wrapper = quoteTools.ui.blockquote(), + photo = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.photo]), + author = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.author, quoteTools.styles.quoteAuthor]), + job = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.job, quoteTools.styles.authorsJob]), + quote = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.quote, quoteTools.styles.quoteText]); + + /* Default Image src */ + if (!data.photo) { + + var icon = quoteTools.ui.makeBlock('SPAN', ['ce-icon-picture']); + photo.appendChild(icon); + + } else { + + var authorsPhoto = quoteTools.ui.img(quoteTools.styles.authorsPhoto); + authorsPhoto.src = data.photo; + + photo.classList.add(quoteTools.styles.authorsPhotoWrapper); + photo.appendChild(authorsPhoto); + } + + + photo.addEventListener('click', quoteTools.fileUploadClicked, false); + + /* make author block contentEditable */ + author.contentEditable = 'true'; + author.textContent = data.cite; + + /* Author's position and job */ + job.contentEditable = 'true'; + job.textContent = data.job; + + var authorsWrapper = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.authorHolder]); + authorsWrapper.appendChild(author); + authorsWrapper.appendChild(job); + + /* make quote text contentEditable */ + quote.contentEditable = 'true'; + quote.innerHTML = data.text; + + wrapper.classList.add(quoteTools.styles.ce_quote); + wrapper.classList.add(quoteTools.styles.withPhoto.wrapper); + wrapper.dataset.quoteStyle = 'withPhoto'; + + wrapper.appendChild(quote); + wrapper.appendChild(photo); + wrapper.appendChild(authorsWrapper); + + return wrapper; + }, + + parseBlockQuote : function(block) { + + var currentNode = block || codex.content.currentNode, + photo = currentNode.getElementsByTagName('img')[0], + author = currentNode.querySelector('.' + quoteTools.styles.quoteAuthor), + job = currentNode.querySelector('.' + quoteTools.styles.authorsJob), + quote ; + + /** Simple quote text placed in Blockquote tag*/ + if ( currentNode.dataset.quoteStyle == 'simple' ) + quote = currentNode.innerHTML; + else + quote = currentNode.querySelector('.' + quoteTools.styles.quoteText).innerHTML; + + if (job) + job = job.textContent; + + if (author) + author = author.textContent; + + if (photo) + photo = photo.src; + + var data = { + style : currentNode.dataset.quoteStyle, + text : quote, + author : author, + job : job, + photo : photo, + }; + + return data; + }, + + fileUploadClicked : function() { + + var success = quoteTools.photoUploadingCallbacks.success, + error = quoteTools.photoUploadingCallbacks.error; + + codex.transport.selectAndUpload({ + success, + error, + }); + + } + +}; + +quoteTools.styles = { + + ce_quote : 'ce-quote', + quoteText : 'ce_quote--text', + quoteAuthor : 'ce_quote--author', + authorsJob : 'ce_quote--job', + authorsPhoto : 'authorsPhoto', + authorsPhotoWrapper : 'authorsPhoto-wrapper', + + simple : { + text : 'quoteStyle-simple--text' + }, + + withCaption : { + blockquote : 'quoteStyle-withCaption--blockquote', + author : 'quoteStyle-withCaption--author' + }, + + withPhoto : { + photo : 'quoteStyle-withPhoto--photo', + author : 'quoteStyle-withPhoto--author', + job : 'quoteStyle-withPhoto--job', + quote : 'quoteStyle-withPhoto--quote', + wrapper : 'quoteStyle-withPhoto--wrapper', + authorHolder : 'quoteStyle-withPhoto--authorWrapper' + }, + + settings : { + holder : 'ce_plugin_quote--settings', + caption : 'ce_plugin_quote--caption', + buttons : 'ce_plugin_quote--select_button', + selectedType : 'ce-quote-settings--selected' + } +}; + +quoteTools.ui = { + + wrapper : function($classList) { + + var el = document.createElement('DIV'); + + el.classList.add($classList); + + return el; + + }, + + blockquote : function() { + + var el = document.createElement('BLOCKQUOTE'); + + return el; + + }, + + img : function(attribute) { + var imageTag = document.createElement('IMG'); + imageTag.classList.add(attribute); + + return imageTag; + }, + + makeBlock : function(tag, classList) { + + var el = document.createElement(tag); + + + if ( classList ) { + + for( var i = 0; i < classList.length; i++) + el.className += ' ' + classList[i]; + + } + return el; + + } + +}; + +quoteTools.photoUploadingCallbacks = { + + /** + * Success callbacks for uploaded photo. + * Replace upload icon with uploaded photo + */ + success : function(result) { + + var parsed = JSON.parse(result), + filename = parsed.filename, + uploadImageWrapper = codex.content.currentNode.querySelector('.' + quoteTools.styles.withPhoto.photo), + authorsPhoto = quoteTools.ui.img(quoteTools.styles.authorsPhoto); + + authorsPhoto.src = quoteTools.path + 'b_' + filename; + + /** Remove icon from image wrapper */ + uploadImageWrapper.innerHTML = ''; + + /** Appending uploaded image */ + uploadImageWrapper.classList.add(quoteTools.styles.authorsPhotoWrapper); + uploadImageWrapper.appendChild(authorsPhoto); + }, + + /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ + error : function(result) { + + console.log('Can\'t upload an image'); + codex.notifications.errorThrown(); + + } + +}; + +// module.exports = { +// +// type : 'quote', +// iconClassname : 'ce-icon-quote', +// make : quoteTools.makeBlockToAppend, +// appendCallback : null, +// settings : quoteTools.makeSettings(), +// render : quoteTools.render, +// save : quoteTools.save, +// displayInToolbox : true, +// enableLineBreaks : true, +// allowedToPaste : true +// +// }; diff --git a/plugins/twitter/loading.gif b/plugins/twitter/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..72ea7ccb5321d5384d70437cfaac73011237901e GIT binary patch literal 329 zcmZ?wbhEHb9b#5NV>2k zBC~b@b~P=nNfWAe-b%_i6tS^-1y(h@EsB~1TqDA_h@fkxG$bHgvj}VxE1JLgr!*!^ ILUxTc0Q$^Q5C8xG literal 0 HcmV?d00001 diff --git a/plugins/twitter/twitter.css b/plugins/twitter/twitter.css new file mode 100644 index 000000000..9bc652650 --- /dev/null +++ b/plugins/twitter/twitter.css @@ -0,0 +1,8 @@ +.ce-redactor .twitter-tweet { + margin: 0 auto; +} + +.twitter__loader { + background: url("loading.gif") !important; + opacity: 0.1; +} \ No newline at end of file diff --git a/plugins/twitter/twitter.js b/plugins/twitter/twitter.js new file mode 100644 index 000000000..38b568bf5 --- /dev/null +++ b/plugins/twitter/twitter.js @@ -0,0 +1,106 @@ +/** + * Twitter plugin + * @version 1.0.0 + */ + +var twitterTool = { + + /** + * Prepare twitter scripts + */ + prepare : function() { + + var script = "//platform.twitter.com/widgets.js"; + + /** + * Load script + */ + codex.core.importScript(script, 'twitterAPI'); + + }, + + make : function(data) { + + if (!data.id) + return; + + twitterTool.content.twitter(data.id); + }, + + save : function(blockContent) { + + var data; + + data = { + media:true, + conversation:false, + user:{ + profile_image_url:"http:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", + profile_image_url_https:"https:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", + screen_name:"Niketas", + name:"Никита Лихачёв" + }, + id: blockContent.dataset.tweetId, + text:"ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\/\/t.co\/iWyOHf4xr2", + created_at:"Tue Jun 28 14:09:12 +0000 2016", + status_url:"https:\/\/twitter.com\/Niketas\/status\/747793978511101953", + caption:"Caption" + }; + + return data; + + }, + + render : function(data) { + return twitterTool.make(data); + } + +}; + +twitterTool.content = { + + /** + * Twitter render method appends content after block + * @param tweetId + */ + twitter : function(tweetId) { + + var tweet = twitterTool.content.twitterBlock(); + + codex.content.switchBlock(codex.content.currentNode, tweet, 'twitter'); + + var blockContent = codex.content.currentNode.childNodes[0]; + blockContent.classList.add('twitter__loader'); + + window.twttr.widgets.createTweet(tweetId, blockContent); + + setTimeout(function() { + blockContent.classList.remove('twitter__loader'); + }, 500); + + /** Remove empty DIV */ + blockContent.childNodes[0].remove(); + + }, + + twitterBlock : function() { + var block = codex.draw.node('DIV', '', {}); + return block; + } +}; + +// module.exports = { +// +// type : 'twitter', +// iconClassname : 'ce-icon-twitter', +// prepare : twitterTool.prepare, +// make : twitterTool.make, +// appendCallback : null, +// settings : null, +// render : twitterTool.render, +// save : twitterTool.save, +// displayInToolbox : false, +// enableLineBreaks : false, +// allowedToPaste : false +// +// }; From 586afdbee5544c1fe912127d9e36efe7a689deca Mon Sep 17 00:00:00 2001 From: khaydarov Date: Wed, 21 Dec 2016 23:36:32 +0300 Subject: [PATCH 06/14] plugins ready --- plugins/code/code.js | 18 ------------------ plugins/header/header.js | 19 +------------------ plugins/image/image.js | 21 +-------------------- plugins/images/images.js | 19 +------------------ plugins/instagram/instagram.js | 16 ---------------- plugins/link/link.js | 13 ------------- plugins/list/list.js | 18 ------------------ plugins/paragraph/paragraph.js | 19 ------------------- plugins/paste/paste.js | 17 ----------------- plugins/quote/quote.js | 15 --------------- plugins/twitter/twitter.js | 16 ---------------- 11 files changed, 3 insertions(+), 188 deletions(-) diff --git a/plugins/code/code.js b/plugins/code/code.js index 6388cee9d..3feabcde8 100644 --- a/plugins/code/code.js +++ b/plugins/code/code.js @@ -52,21 +52,3 @@ var codeTool = { } }; - -/** - * Now plugin is ready. - * Add it to redactor tools - */ -// codeTool = { -// -// type : 'code', -// iconClassname : 'ce-icon-code', -// make : codeTool.make, -// appendCallback : null, -// settings : null, -// render : codeTool.render, -// save : codeTool.save, -// displayInToolbox : true, -// enableLineBreaks : true -// -// }; diff --git a/plugins/header/header.js b/plugins/header/header.js index 4fa43eb4d..1a3fef791 100644 --- a/plugins/header/header.js +++ b/plugins/header/header.js @@ -154,24 +154,7 @@ var headerTool = { /** Close settings after replacing */ codex.toolbar.settings.close(); - }, + } }; -/** -* Now plugin is ready. -* Add it to redactor tools -*/ -// headerTool = { -// -// type : 'header', -// iconClassname : 'ce-icon-header', -// make : headerTool.make, -// appendCallback : headerTool.appendCallback, -// settings : headerTool.makeSettings(), -// render : headerTool.render, -// save : headerTool.save, -// displayInToolbox : true, -// enableLineBreaks : false -// -// }; diff --git a/plugins/image/image.js b/plugins/image/image.js index 5e28fff4b..a7d4cfb56 100644 --- a/plugins/image/image.js +++ b/plugins/image/image.js @@ -399,23 +399,4 @@ ceImage.photoUploadingCallbacks = { codex.notifications.errorThrown(); } -}; - - -/** -* Add plugin it to redactor tools -*/ -// ceImage = { -// -// type : 'image', -// iconClassname : 'ce-icon-picture', -// make : ceImage.make, -// appendCallback : ceImage.appendCallback, -// settings : ceImage.makeSettings(), -// render : ceImage.render, -// save : ceImage.save, -// isStretched : true, -// displayInToolbox : true, -// enableLineBreaks : false -// -// }; \ No newline at end of file +}; \ No newline at end of file diff --git a/plugins/images/images.js b/plugins/images/images.js index 44ff77906..ae6196294 100644 --- a/plugins/images/images.js +++ b/plugins/images/images.js @@ -441,23 +441,6 @@ ceImage.photoUploadingCallbacks = { error : function(result) { console.log('Choosen file is not an image or image is corrupted'); cEditor.notifications.errorThrown(); - }, - -} - - -/** -* Add plugin it to redactor tools -*/ -cEditor.tools.image = { - - type : 'image', - iconClassname : 'ce-icon-picture', - make : ceImage.make, - settings : ceImage.makeSettings(), - render : ceImage.render, - save : ceImage.save, - isStretched : true, - enableLineBreaks : false + } }; diff --git a/plugins/instagram/instagram.js b/plugins/instagram/instagram.js index 9599166d6..8acb162d1 100644 --- a/plugins/instagram/instagram.js +++ b/plugins/instagram/instagram.js @@ -115,19 +115,3 @@ instagramTool.content = { } }; - -// instagramTool = { -// -// type : 'instagram', -// iconClassname : 'ce-icon-instagram', -// prepare : instagramTool.prepare, -// make : instagramTool.make, -// appendCallback : null, -// settings : null, -// render : instagramTool.render, -// save : instagramTool.save, -// displayInToolbox : false, -// enableLineBreaks : false, -// allowedToPaste : false -// -// }; diff --git a/plugins/link/link.js b/plugins/link/link.js index 463119756..14c2ba42a 100644 --- a/plugins/link/link.js +++ b/plugins/link/link.js @@ -306,16 +306,3 @@ linkTool.ui = { } }; - -// linkTool = { -// -// type : 'link', -// iconClassname : 'ce-icon-link', -// make : linkTool.makeNewBlock, -// appendCallback : linkTool.appendCallback, -// render : linkTool.render, -// save : linkTool.save, -// displayInToolbox : true, -// enableLineBreaks : true -// -// }; diff --git a/plugins/list/list.js b/plugins/list/list.js index ab4036327..d563ea626 100644 --- a/plugins/list/list.js +++ b/plugins/list/list.js @@ -155,21 +155,3 @@ listTool.ui = { return button; } }; - -/** - * Now plugin is ready. - * Add it to redactor tools -// */ -// module.exports = { -// -// type : 'list', -// iconClassname : 'ce-icon-list-bullet', -// make : listTool.make, -// appendCallback : null, -// settings : listTool.makeSettings(), -// render : listTool.render, -// save : listTool.save, -// displayInToolbox : true, -// enableLineBreaks : true -// -// }; diff --git a/plugins/paragraph/paragraph.js b/plugins/paragraph/paragraph.js index d3b4f9f4c..ab5ce5b9e 100644 --- a/plugins/paragraph/paragraph.js +++ b/plugins/paragraph/paragraph.js @@ -67,22 +67,3 @@ var paragraphTool = { } }; - -/** -* Now plugin is ready. -* Add it to redactor tools -*/ -// module.exports = { -// -// type : 'paragraph', -// iconClassname : 'ce-icon-paragraph', -// make : paragraphTool.make, -// appendCallback : null, -// settings : null, -// render : paragraphTool.render, -// save : paragraphTool.save, -// displayInToolbox : false, -// enableLineBreaks : false, -// allowedToPaste : true -// -// }; diff --git a/plugins/paste/paste.js b/plugins/paste/paste.js index fc498b54c..73e3d1f7a 100644 --- a/plugins/paste/paste.js +++ b/plugins/paste/paste.js @@ -223,20 +223,3 @@ pasteTool.callbacks = { } }; - -// module.exports = { -// -// type : 'paste', -// iconClassname : '', -// prepare : pasteTool.prepare, -// make : pasteTool.make, -// appendCallback : null, -// settings : null, -// render : null, -// save : pasteTool.save, -// callbacks : pasteTool.callbacks, -// displayInToolbox : false, -// enableLineBreaks : false, -// allowedToPaste : false -// -// }; diff --git a/plugins/quote/quote.js b/plugins/quote/quote.js index 1604fa051..772e8c498 100644 --- a/plugins/quote/quote.js +++ b/plugins/quote/quote.js @@ -444,18 +444,3 @@ quoteTools.photoUploadingCallbacks = { } }; - -// module.exports = { -// -// type : 'quote', -// iconClassname : 'ce-icon-quote', -// make : quoteTools.makeBlockToAppend, -// appendCallback : null, -// settings : quoteTools.makeSettings(), -// render : quoteTools.render, -// save : quoteTools.save, -// displayInToolbox : true, -// enableLineBreaks : true, -// allowedToPaste : true -// -// }; diff --git a/plugins/twitter/twitter.js b/plugins/twitter/twitter.js index 38b568bf5..0d4cbb336 100644 --- a/plugins/twitter/twitter.js +++ b/plugins/twitter/twitter.js @@ -88,19 +88,3 @@ twitterTool.content = { return block; } }; - -// module.exports = { -// -// type : 'twitter', -// iconClassname : 'ce-icon-twitter', -// prepare : twitterTool.prepare, -// make : twitterTool.make, -// appendCallback : null, -// settings : null, -// render : twitterTool.render, -// save : twitterTool.save, -// displayInToolbox : false, -// enableLineBreaks : false, -// allowedToPaste : false -// -// }; From c3d16cd8ea1f978fe369a7728be34a73a6688c5c Mon Sep 17 00:00:00 2001 From: khaydarov Date: Fri, 23 Dec 2016 12:50:15 +0300 Subject: [PATCH 07/14] code improved --- codex-editor.css | 1 + codex-editor.js | 20 ++++++++++++-------- codex-editor.js.map | 2 +- editor.js | 5 +++++ example.html | 9 ++++----- modules/toolbar/toolbox.js | 13 ++++++------- modules/ui.js | 2 +- 7 files changed, 30 insertions(+), 22 deletions(-) diff --git a/codex-editor.css b/codex-editor.css index 987309bc3..a15933fee 100644 --- a/codex-editor.css +++ b/codex-editor.css @@ -60,6 +60,7 @@ * Plus button */ .ce-toolbar__plus{ + position: absolute; background-image: url('fonts/codex_editor/icon-plus.svg'); background-position: center center; background-repeat: no-repeat; diff --git a/codex-editor.js b/codex-editor.js index d746b276b..b21f7b941 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -60,6 +60,11 @@ var codex = 'use strict'; + /** + * @author Codex Team + * @version 1.0.5 + */ + var codex = function (codex) { var init = function init() { @@ -521,7 +526,7 @@ var codex = tool = codex.tools[name]; - if (tool.displayInToolbox == false) { + if (!tool.displayInToolbox) { continue; } @@ -2585,7 +2590,6 @@ var codex = toolbox.leaf = function () { var currentTool = codex.toolbar.current, - tool, tools = Object.keys(codex.tools), barButtons = codex.nodes.toolbarButtons, nextToolIndex, @@ -2593,7 +2597,7 @@ var codex = toolToSelect; /** Count toolbox hidden tools */ - for (tool in codex.tools) { + for (var tool in codex.tools) { if (!codex.tools[tool].displayInToolbox) hiddenToolsAmount++; } @@ -2607,20 +2611,20 @@ var codex = nextToolIndex = tools.indexOf(currentTool) + 1; - var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 1); + var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2); if (toolIsLastInToolbox) { nextToolIndex = 0; /** getting first displayed tool */ - for (tool in codex.tools) { + for (var tool in codex.tools) { - nextToolIndex++; - - if (!codex.tools[tool].displayInToolbox) { + if (codex.tools[tool].displayInToolbox) { break; } + + nextToolIndex++; } } diff --git a/codex-editor.js.map b/codex-editor.js.map index 77e75cd91..758c7a3c3 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 3ad68690caed808ff875","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","settings","tools","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","toolbar","inlineToolbar","buttons","actions","toolbox","notifications","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","core","prepare","then","ui","make","addTools","bindEvents","preparePlugins","transport","renderer","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","draw","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","callback","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","content","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","saver","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","parser","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","caret","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 3ad68690caed808ff875","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","var codex = (function(codex){\n\n var init = function() {\n\n require('./modules/core');\n require('./modules/ui');\n require('./modules/transport');\n require('./modules/renderer');\n require('./modules/saver');\n require('./modules/content');\n require('./modules/toolbar/toolbar');\n require('./modules/tools');\n require('./modules/callbacks');\n require('./modules/draw');\n require('./modules/caret');\n require('./modules/notifications');\n require('./modules/parser');\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","var codex = require('./../editor');\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\ncodex.core = core;\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","var codex = require('../editor');\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 == false) {\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\ncodex.ui = ui;\nmodule.exports = codex;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","var codex = require('../editor');\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\ncodex.transport = transport;\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","var codex = require('../editor');\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\ncodex.renderer = renderer;\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","var codex = require('../editor');\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\ncodex.saver = saver;\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","var codex = require('../editor');\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\ncodex.content = content;\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","var codex = require('../../editor');\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 this.opened = false;\n\n this.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\ncodex.toolbar = toolbar;\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var codex = require('../../editor');\n\nvar 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","var codex = require('../../editor');\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","var codex = require('../../editor');\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 tool,\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( 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 - 1);\n\n if ( toolIsLastInToolbox ) {\n\n nextToolIndex = 0;\n\n /** getting first displayed tool */\n for( tool in codex.tools ) {\n\n nextToolIndex ++;\n\n if (!codex.tools[tool].displayInToolbox){\n break;\n }\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","var codex = require('../editor');\n\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\ncodex.tools = tools;\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var codex = require('../editor');\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 if (codex.caret.position.atStart() && !selectionLength) {\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\ncodex.callback = callbacks;\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","var codex = require('../editor');\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\ncodex.draw = draw;\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","var codex = require('../editor');\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\ncodex.caret = caret;\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","var codex = require('../editor');\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\ncodex.notifications = notifications;\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","var codex = require('../editor');\n\nvar parser = (function(parser) {\n\n parser.init = function() {\n\n };\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\nparser.init();\n\ncodex.parser = parser;\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 6bfae73c752324687bee","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","settings","tools","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","toolbar","inlineToolbar","buttons","actions","toolbox","notifications","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","core","prepare","then","ui","make","addTools","bindEvents","preparePlugins","transport","renderer","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","draw","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","callback","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","content","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","saver","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","parser","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","caret","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 6bfae73c752324687bee","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n * @author Codex Team\n * @version 1.0.5\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n\n require('./modules/core');\n require('./modules/ui');\n require('./modules/transport');\n require('./modules/renderer');\n require('./modules/saver');\n require('./modules/content');\n require('./modules/toolbar/toolbar');\n require('./modules/tools');\n require('./modules/callbacks');\n require('./modules/draw');\n require('./modules/caret');\n require('./modules/notifications');\n require('./modules/parser');\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","var codex = require('./../editor');\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\ncodex.core = core;\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","var codex = require('../editor');\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\ncodex.ui = ui;\nmodule.exports = codex;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","var codex = require('../editor');\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\ncodex.transport = transport;\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","var codex = require('../editor');\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\ncodex.renderer = renderer;\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","var codex = require('../editor');\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\ncodex.saver = saver;\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","var codex = require('../editor');\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\ncodex.content = content;\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","var codex = require('../../editor');\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 this.opened = false;\n\n this.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\ncodex.toolbar = toolbar;\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var codex = require('../../editor');\n\nvar 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","var codex = require('../../editor');\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","var codex = require('../../editor');\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","var codex = require('../editor');\n\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\ncodex.tools = tools;\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var codex = require('../editor');\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 if (codex.caret.position.atStart() && !selectionLength) {\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\ncodex.callback = callbacks;\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","var codex = require('../editor');\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\ncodex.draw = draw;\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","var codex = require('../editor');\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\ncodex.caret = caret;\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","var codex = require('../editor');\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\ncodex.notifications = notifications;\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","var codex = require('../editor');\n\nvar parser = (function(parser) {\n\n parser.init = function() {\n\n };\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\nparser.init();\n\ncodex.parser = parser;\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 995bff893..137beb91c 100644 --- a/editor.js +++ b/editor.js @@ -1,3 +1,8 @@ +/** + * @author Codex Team + * @version 1.0.5 + */ + var codex = (function(codex){ var init = function() { diff --git a/example.html b/example.html index cf620c560..33902c0ba 100644 --- a/example.html +++ b/example.html @@ -10,8 +10,8 @@ - - + + @@ -57,7 +57,6 @@ settings: null, render: paragraphTool.render, save: paragraphTool.save, - displayInToolbox: false, enableLineBreaks: false, allowedToPaste: true }, @@ -70,7 +69,6 @@ settings: null, render: null, save: pasteTool.save, - displayInToolbox: false, enableLineBreaks: false, callbacks: pasteTool.callbacks, allowedToPaste: false @@ -82,7 +80,8 @@ appendCallback: headerTool.appendCallback, settings: headerTool.makeSettings(), render: headerTool.render, - save: headerTool.save + save: headerTool.save, + displayInToolbox: true }, code: { type: 'code', diff --git a/modules/toolbar/toolbox.js b/modules/toolbar/toolbox.js index a89815c7f..be1fe5f12 100644 --- a/modules/toolbar/toolbox.js +++ b/modules/toolbar/toolbox.js @@ -44,7 +44,6 @@ var toolbox = (function(toolbox) { toolbox.leaf = function(){ var currentTool = codex.toolbar.current, - tool, tools = Object.keys(codex.tools), barButtons = codex.nodes.toolbarButtons, nextToolIndex, @@ -52,7 +51,7 @@ var toolbox = (function(toolbox) { toolToSelect; /** Count toolbox hidden tools */ - for( tool in codex.tools ) { + for( var tool in codex.tools ) { if (!codex.tools[tool].displayInToolbox) hiddenToolsAmount ++; } @@ -66,20 +65,20 @@ var toolbox = (function(toolbox) { nextToolIndex = tools.indexOf(currentTool) + 1; - var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 1); + var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2); if ( toolIsLastInToolbox ) { nextToolIndex = 0; /** getting first displayed tool */ - for( tool in codex.tools ) { + for( var tool in codex.tools ) { - nextToolIndex ++; - - if (!codex.tools[tool].displayInToolbox){ + if (codex.tools[tool].displayInToolbox){ break; } + + nextToolIndex ++; } } diff --git a/modules/ui.js b/modules/ui.js index 6f899de6a..1af77fbb8 100644 --- a/modules/ui.js +++ b/modules/ui.js @@ -169,7 +169,7 @@ var ui = (function(ui){ tool = codex.tools[name]; - if (tool.displayInToolbox == false) { + if (!tool.displayInToolbox) { continue; } From fac0a66e3c76b2e3e1fde8cb6a9911b49bad4756 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Fri, 23 Dec 2016 13:06:24 +0300 Subject: [PATCH 08/14] fixed bug with backspace --- codex-editor.js | 4 ++-- codex-editor.js.map | 2 +- editor.js | 2 +- modules/callbacks.js | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/codex-editor.js b/codex-editor.js index b21f7b941..dee47ce6a 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -62,7 +62,7 @@ var codex = /** * @author Codex Team - * @version 1.0.5 + * @version 1.0.6 */ var codex = function (codex) { @@ -3313,7 +3313,7 @@ var codex = range = codex.content.getRange(); selectionLength = range.endOffset - range.startOffset; - if (codex.caret.position.atStart() && !selectionLength) { + if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) { codex.content.mergeBlocks(currentInputIndex); } else { diff --git a/codex-editor.js.map b/codex-editor.js.map index 758c7a3c3..c02969e95 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 6bfae73c752324687bee","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","settings","tools","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","toolbar","inlineToolbar","buttons","actions","toolbox","notifications","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","core","prepare","then","ui","make","addTools","bindEvents","preparePlugins","transport","renderer","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","draw","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","callback","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","content","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","saver","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","parser","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","caret","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 6bfae73c752324687bee","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n * @author Codex Team\n * @version 1.0.5\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n\n require('./modules/core');\n require('./modules/ui');\n require('./modules/transport');\n require('./modules/renderer');\n require('./modules/saver');\n require('./modules/content');\n require('./modules/toolbar/toolbar');\n require('./modules/tools');\n require('./modules/callbacks');\n require('./modules/draw');\n require('./modules/caret');\n require('./modules/notifications');\n require('./modules/parser');\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","var codex = require('./../editor');\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\ncodex.core = core;\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","var codex = require('../editor');\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\ncodex.ui = ui;\nmodule.exports = codex;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","var codex = require('../editor');\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\ncodex.transport = transport;\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","var codex = require('../editor');\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\ncodex.renderer = renderer;\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","var codex = require('../editor');\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\ncodex.saver = saver;\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","var codex = require('../editor');\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\ncodex.content = content;\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","var codex = require('../../editor');\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 this.opened = false;\n\n this.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\ncodex.toolbar = toolbar;\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var codex = require('../../editor');\n\nvar 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","var codex = require('../../editor');\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","var codex = require('../../editor');\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","var codex = require('../editor');\n\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\ncodex.tools = tools;\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var codex = require('../editor');\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 if (codex.caret.position.atStart() && !selectionLength) {\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\ncodex.callback = callbacks;\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","var codex = require('../editor');\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\ncodex.draw = draw;\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","var codex = require('../editor');\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\ncodex.caret = caret;\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","var codex = require('../editor');\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\ncodex.notifications = notifications;\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","var codex = require('../editor');\n\nvar parser = (function(parser) {\n\n parser.init = function() {\n\n };\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\nparser.init();\n\ncodex.parser = parser;\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 58b0601f4dee5f40c007","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","settings","tools","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","toolbar","inlineToolbar","buttons","actions","toolbox","notifications","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","core","prepare","then","ui","make","addTools","bindEvents","preparePlugins","transport","renderer","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","draw","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","callback","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","content","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","saver","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","parser","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","caret","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 58b0601f4dee5f40c007","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n * @author Codex Team\n * @version 1.0.6\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n\n require('./modules/core');\n require('./modules/ui');\n require('./modules/transport');\n require('./modules/renderer');\n require('./modules/saver');\n require('./modules/content');\n require('./modules/toolbar/toolbar');\n require('./modules/tools');\n require('./modules/callbacks');\n require('./modules/draw');\n require('./modules/caret');\n require('./modules/notifications');\n require('./modules/parser');\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","var codex = require('./../editor');\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\ncodex.core = core;\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","var codex = require('../editor');\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\ncodex.ui = ui;\nmodule.exports = codex;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","var codex = require('../editor');\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\ncodex.transport = transport;\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","var codex = require('../editor');\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\ncodex.renderer = renderer;\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","var codex = require('../editor');\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\ncodex.saver = saver;\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","var codex = require('../editor');\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\ncodex.content = content;\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","var codex = require('../../editor');\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 this.opened = false;\n\n this.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\ncodex.toolbar = toolbar;\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var codex = require('../../editor');\n\nvar 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","var codex = require('../../editor');\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","var codex = require('../../editor');\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","var codex = require('../editor');\n\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\ncodex.tools = tools;\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var codex = require('../editor');\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\ncodex.callback = callbacks;\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","var codex = require('../editor');\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\ncodex.draw = draw;\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","var codex = require('../editor');\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\ncodex.caret = caret;\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","var codex = require('../editor');\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\ncodex.notifications = notifications;\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","var codex = require('../editor');\n\nvar parser = (function(parser) {\n\n parser.init = function() {\n\n };\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\nparser.init();\n\ncodex.parser = parser;\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 137beb91c..5283d5eba 100644 --- a/editor.js +++ b/editor.js @@ -1,6 +1,6 @@ /** * @author Codex Team - * @version 1.0.5 + * @version 1.0.6 */ var codex = (function(codex){ diff --git a/modules/callbacks.js b/modules/callbacks.js index 70f9d729a..c27d3cd22 100644 --- a/modules/callbacks.js +++ b/modules/callbacks.js @@ -623,7 +623,8 @@ var callbacks = (function(callbacks) { range = codex.content.getRange(); selectionLength = range.endOffset - range.startOffset; - if (codex.caret.position.atStart() && !selectionLength) { + + if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) { codex.content.mergeBlocks(currentInputIndex); From 1c1e647866852568c916e0788451a12752309829 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Fri, 23 Dec 2016 13:23:32 +0300 Subject: [PATCH 09/14] improved architecture --- codex-editor.js | 119 ++++++++++++------------------------ codex-editor.js.map | 2 +- editor.js | 26 ++++---- modules/callbacks.js | 3 - modules/caret.js | 3 - modules/content.js | 5 +- modules/core.js | 4 -- modules/draw.js | 4 -- modules/notifications.js | 5 +- modules/parser.js | 9 --- modules/renderer.js | 3 - modules/saver.js | 3 - modules/toolbar/inline.js | 2 - modules/toolbar/settings.js | 2 - modules/toolbar/toolbar.js | 7 +-- modules/toolbar/toolbox.js | 2 - modules/tools.js | 3 - modules/transport.js | 9 ++- modules/ui.js | 5 +- 19 files changed, 64 insertions(+), 152 deletions(-) diff --git a/codex-editor.js b/codex-editor.js index dee47ce6a..674aebee3 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -69,19 +69,19 @@ var codex = var init = function init() { - __webpack_require__(2); - __webpack_require__(3); - __webpack_require__(4); - __webpack_require__(5); - __webpack_require__(6); - __webpack_require__(7); - __webpack_require__(8); - __webpack_require__(12); - __webpack_require__(13); - __webpack_require__(14); - __webpack_require__(15); - __webpack_require__(16); - __webpack_require__(17); + codex.core = __webpack_require__(2); + codex.ui = __webpack_require__(3); + codex.transport = __webpack_require__(4); + 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); }; /** @@ -185,14 +185,12 @@ var codex = /***/ }, /* 2 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { '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; }; - var codex = __webpack_require__(1); - var core = function (core) { /** @@ -358,18 +356,14 @@ var codex = return core; }({}); - codex.core = core; - module.exports = core; /***/ }, /* 3 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { 'use strict'; - var codex = __webpack_require__(1); - var ui = function (ui) { /** @@ -723,16 +717,21 @@ var codex = return ui; }({}); - codex.ui = ui; - module.exports = codex; + module.exports = ui; /***/ }, /* 4 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { 'use strict'; - var codex = __webpack_require__(1); + /** + * + * Codex.Editor Transport Module + * + * @author Codex Team + * @version 1.0.0 + */ var transport = function (transport) { @@ -827,17 +826,14 @@ var codex = return transport; }({}); - codex.transport = transport; module.exports = transport; /***/ }, /* 5 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { 'use strict'; - var codex = __webpack_require__(1); - var renderer = function (renderer) { /** @@ -994,17 +990,14 @@ var codex = return renderer; }({}); - codex.renderer = renderer; module.exports = renderer; /***/ }, /* 6 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { 'use strict'; - var codex = __webpack_require__(1); - var saver = function (saver) { /** @@ -1096,17 +1089,14 @@ var codex = return saver; }({}); - codex.saver = saver; module.exports = saver; /***/ }, /* 7 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { 'use strict'; - var codex = __webpack_require__(1); - var content = function (content) { content.currentNode = null; @@ -1705,7 +1695,6 @@ var codex = return content; }({}); - codex.content = content; module.exports = content; /***/ }, @@ -1714,8 +1703,6 @@ var codex = 'use strict'; - var codex = __webpack_require__(1); - var toolbar = function (toolbar) { toolbar.init = function () { @@ -1750,9 +1737,9 @@ var codex = toolbar.close = function () { codex.nodes.toolbar.classList.remove('opened'); - this.opened = false; - this.current = null; + toolbar.opened = false; + toolbar.current = null; for (var button in codex.nodes.toolbarButtons) { codex.nodes.toolbarButtons[button].classList.remove('selected'); @@ -1808,7 +1795,6 @@ var codex = toolbar.init(); - codex.toolbar = toolbar; module.exports = toolbar; /***/ }, @@ -1817,8 +1803,6 @@ var codex = 'use strict'; - var codex = __webpack_require__(1); - var settings = function (settings) { settings.init = function () { @@ -2056,12 +2040,10 @@ var codex = /***/ }, /* 10 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { 'use strict'; - var codex = __webpack_require__(1); - var inline = function (inline) { inline.init = function () {}; @@ -2546,8 +2528,6 @@ var codex = 'use strict'; - var codex = __webpack_require__(1); - var toolbox = function (toolbox) { toolbox.init = function () { @@ -2709,28 +2689,23 @@ var codex = /***/ }, /* 12 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { - 'use strict'; - - var codex = __webpack_require__(1); + "use strict"; var tools = function (tools) { return tools; }({}); - codex.tools = tools; module.exports = tools; /***/ }, /* 13 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { 'use strict'; - var codex = __webpack_require__(1); - var callbacks = function (callbacks) { callbacks.redactorSyncTimeout = null; @@ -3432,17 +3407,14 @@ var codex = return callbacks; }({}); - codex.callback = callbacks; module.exports = callbacks; /***/ }, /* 14 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { 'use strict'; - var codex = __webpack_require__(1); - var draw = function (draw) { /** @@ -3733,18 +3705,14 @@ var codex = return draw; }({}); - codex.draw = draw; - module.exports = draw; /***/ }, /* 15 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { 'use strict'; - var codex = __webpack_require__(1); - var caret = function (caret) { /** @@ -3974,17 +3942,14 @@ var codex = return caret; }({}); - codex.caret = caret; module.exports = caret; /***/ }, /* 16 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { 'use strict'; - var codex = __webpack_require__(1); - var notifications = function (notifications) { /** @@ -3994,7 +3959,7 @@ var codex = notifications.errorThrown = function (errorMsg, event) { codex.notifications.send('This action is not available currently', event.type, false); - }, + }; /** * Appends notification with different types @@ -4023,21 +3988,16 @@ var codex = return notifications; }({}); - codex.notifications = notifications; module.exports = notifications; /***/ }, /* 17 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { 'use strict'; - var codex = __webpack_require__(1); - var parser = function (parser) { - parser.init = function () {}; - /** * Splits content by `\n` and returns blocks */ @@ -4272,9 +4232,6 @@ var codex = return parser; }({}); - parser.init(); - - codex.parser = parser; module.exports = parser; /***/ } diff --git a/codex-editor.js.map b/codex-editor.js.map index c02969e95..3806063ce 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 58b0601f4dee5f40c007","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","settings","tools","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","toolbar","inlineToolbar","buttons","actions","toolbox","notifications","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","core","prepare","then","ui","make","addTools","bindEvents","preparePlugins","transport","renderer","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","draw","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","callback","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","content","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","saver","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","parser","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","caret","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 58b0601f4dee5f40c007","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\n * @author Codex Team\n * @version 1.0.6\n */\n\nvar codex = (function(codex){\n\n var init = function() {\n\n require('./modules/core');\n require('./modules/ui');\n require('./modules/transport');\n require('./modules/renderer');\n require('./modules/saver');\n require('./modules/content');\n require('./modules/toolbar/toolbar');\n require('./modules/tools');\n require('./modules/callbacks');\n require('./modules/draw');\n require('./modules/caret');\n require('./modules/notifications');\n require('./modules/parser');\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","var codex = require('./../editor');\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\ncodex.core = core;\n\nmodule.exports = core;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","var codex = require('../editor');\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\ncodex.ui = ui;\nmodule.exports = codex;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","var codex = require('../editor');\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\ncodex.transport = transport;\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","var codex = require('../editor');\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\ncodex.renderer = renderer;\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","var codex = require('../editor');\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\ncodex.saver = saver;\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","var codex = require('../editor');\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\ncodex.content = content;\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","var codex = require('../../editor');\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 this.opened = false;\n\n this.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\ncodex.toolbar = toolbar;\nmodule.exports = toolbar;\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var codex = require('../../editor');\n\nvar 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","var codex = require('../../editor');\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","var codex = require('../../editor');\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","var codex = require('../editor');\n\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\ncodex.tools = tools;\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var codex = require('../editor');\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\ncodex.callback = callbacks;\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","var codex = require('../editor');\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\ncodex.draw = draw;\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","var codex = require('../editor');\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\ncodex.caret = caret;\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","var codex = require('../editor');\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\ncodex.notifications = notifications;\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","var codex = require('../editor');\n\nvar parser = (function(parser) {\n\n parser.init = function() {\n\n };\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\nparser.init();\n\ncodex.parser = parser;\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 b0d9b144b41a8e5bb0ba","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","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 b0d9b144b41a8e5bb0ba","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\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 /**\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","var 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","var 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.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","var 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","var 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","var 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","var 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","var 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","var 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","var tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var 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","var 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","var 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","var 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","var 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 diff --git a/editor.js b/editor.js index 5283d5eba..f2a26cf6f 100644 --- a/editor.js +++ b/editor.js @@ -7,19 +7,19 @@ var codex = (function(codex){ var init = function() { - require('./modules/core'); - require('./modules/ui'); - require('./modules/transport'); - require('./modules/renderer'); - require('./modules/saver'); - require('./modules/content'); - require('./modules/toolbar/toolbar'); - require('./modules/tools'); - require('./modules/callbacks'); - require('./modules/draw'); - require('./modules/caret'); - require('./modules/notifications'); - require('./modules/parser'); + codex.core = require('./modules/core'); + codex.ui = require('./modules/ui'); + codex.transport = require('./modules/transport'); + codex.renderer = require('./modules/renderer'); + codex.saver = require('./modules/saver'); + codex.content = require('./modules/content'); + codex.toolbar = require('./modules/toolbar/toolbar'); + codex.tools = require('./modules/tools'); + codex.callback = require('./modules/callbacks'); + codex.draw = require('./modules/draw'); + codex.caret = require('./modules/caret'); + codex.notifications = require('./modules/notifications'); + codex.parser = require('./modules/parser'); }; /** diff --git a/modules/callbacks.js b/modules/callbacks.js index c27d3cd22..9909f1cab 100644 --- a/modules/callbacks.js +++ b/modules/callbacks.js @@ -1,5 +1,3 @@ -var codex = require('../editor'); - var callbacks = (function(callbacks) { callbacks.redactorSyncTimeout = null; @@ -755,5 +753,4 @@ var callbacks = (function(callbacks) { })({}); -codex.callback = callbacks; module.exports = callbacks; diff --git a/modules/caret.js b/modules/caret.js index 743f06e11..e303dffa9 100644 --- a/modules/caret.js +++ b/modules/caret.js @@ -1,5 +1,3 @@ -var codex = require('../editor'); - var caret = (function(caret) { /** @@ -237,5 +235,4 @@ var caret = (function(caret) { })({}); -codex.caret = caret; module.exports = caret; \ No newline at end of file diff --git a/modules/content.js b/modules/content.js index fe3c4e258..d04060be9 100644 --- a/modules/content.js +++ b/modules/content.js @@ -1,5 +1,3 @@ -var codex = require('../editor'); - var content = (function(content) { content.currentNode = null; @@ -466,7 +464,7 @@ var content = (function(content) { codex.content.insertBlock({ type : NEW_BLOCK_TYPE, block : codex.tools[NEW_BLOCK_TYPE].render({ - text : newNode, + text : newNode }) }, true ); @@ -632,5 +630,4 @@ var content = (function(content) { })({}); -codex.content = content; module.exports = content; \ No newline at end of file diff --git a/modules/core.js b/modules/core.js index 9bbfeecb6..2bc31242e 100644 --- a/modules/core.js +++ b/modules/core.js @@ -1,5 +1,3 @@ -var codex = require('./../editor'); - var core = (function(core) { /** @@ -174,8 +172,6 @@ var core = (function(core) { })({}); -codex.core = core; - module.exports = core; diff --git a/modules/draw.js b/modules/draw.js index 83612b07e..e39d58c07 100644 --- a/modules/draw.js +++ b/modules/draw.js @@ -1,5 +1,3 @@ -var codex = require('../editor'); - var draw = (function(draw) { /** @@ -304,8 +302,6 @@ var draw = (function(draw) { })({}); -codex.draw = draw; - module.exports = draw; diff --git a/modules/notifications.js b/modules/notifications.js index d860e5101..afd6094ca 100644 --- a/modules/notifications.js +++ b/modules/notifications.js @@ -1,5 +1,3 @@ -var codex = require('../editor'); - var notifications = (function(notifications) { /** @@ -10,7 +8,7 @@ var notifications = (function(notifications) { codex.notifications.send('This action is not available currently', event.type, false); - }, + }; /** * Appends notification with different types @@ -41,5 +39,4 @@ var notifications = (function(notifications) { })({}); -codex.notifications = notifications; module.exports = notifications; \ No newline at end of file diff --git a/modules/parser.js b/modules/parser.js index 64c67de20..7e7bd3dd0 100644 --- a/modules/parser.js +++ b/modules/parser.js @@ -1,11 +1,5 @@ -var codex = require('../editor'); - var parser = (function(parser) { - parser.init = function() { - - }; - /** * Splits content by `\n` and returns blocks */ @@ -255,7 +249,4 @@ var parser = (function(parser) { })({}); -parser.init(); - -codex.parser = parser; module.exports = parser; diff --git a/modules/renderer.js b/modules/renderer.js index de26162bc..4c19c4cce 100644 --- a/modules/renderer.js +++ b/modules/renderer.js @@ -1,5 +1,3 @@ -var codex = require('../editor'); - var renderer = (function(renderer) { /** @@ -166,5 +164,4 @@ var renderer = (function(renderer) { })({}); -codex.renderer = renderer; module.exports = renderer; \ No newline at end of file diff --git a/modules/saver.js b/modules/saver.js index 9c28e8bd1..20839f439 100644 --- a/modules/saver.js +++ b/modules/saver.js @@ -1,5 +1,3 @@ -var codex = require('../editor'); - var saver = (function(saver) { /** @@ -107,5 +105,4 @@ var saver = (function(saver) { })({}); -codex.saver = saver; module.exports = saver; \ No newline at end of file diff --git a/modules/toolbar/inline.js b/modules/toolbar/inline.js index 650ac5eaa..00182722f 100644 --- a/modules/toolbar/inline.js +++ b/modules/toolbar/inline.js @@ -1,5 +1,3 @@ -var codex = require('../../editor'); - var inline = (function(inline) { inline.init = function() { diff --git a/modules/toolbar/settings.js b/modules/toolbar/settings.js index 1fb7d2b60..5b9a3c6c2 100644 --- a/modules/toolbar/settings.js +++ b/modules/toolbar/settings.js @@ -1,5 +1,3 @@ -var codex = require('../../editor'); - var settings = (function(settings) { settings.init = function() { diff --git a/modules/toolbar/toolbar.js b/modules/toolbar/toolbar.js index a897232ae..d41979612 100644 --- a/modules/toolbar/toolbar.js +++ b/modules/toolbar/toolbar.js @@ -1,5 +1,3 @@ -var codex = require('../../editor'); - var toolbar = (function(toolbar) { toolbar.init = function() { @@ -35,9 +33,9 @@ var toolbar = (function(toolbar) { toolbar.close = function(){ codex.nodes.toolbar.classList.remove('opened'); - this.opened = false; - this.current = null; + toolbar.opened = false; + toolbar.current = null; for (var button in codex.nodes.toolbarButtons){ codex.nodes.toolbarButtons[button].classList.remove('selected'); @@ -99,6 +97,5 @@ var toolbar = (function(toolbar) { toolbar.init(); -codex.toolbar = toolbar; module.exports = toolbar; diff --git a/modules/toolbar/toolbox.js b/modules/toolbar/toolbox.js index be1fe5f12..c4c5a7bb1 100644 --- a/modules/toolbar/toolbox.js +++ b/modules/toolbar/toolbox.js @@ -1,5 +1,3 @@ -var codex = require('../../editor'); - var toolbox = (function(toolbox) { toolbox.init = function() { diff --git a/modules/tools.js b/modules/tools.js index 6f5048eab..6990913ad 100644 --- a/modules/tools.js +++ b/modules/tools.js @@ -1,10 +1,7 @@ -var codex = require('../editor'); - var tools = (function(tools) { return tools; })({}); -codex.tools = tools; module.exports = tools; diff --git a/modules/transport.js b/modules/transport.js index ae016d0f8..6f1145334 100644 --- a/modules/transport.js +++ b/modules/transport.js @@ -1,4 +1,10 @@ -var codex = require('../editor'); +/** + * + * Codex.Editor Transport Module + * + * @author Codex Team + * @version 1.0.0 + */ var transport = (function(transport){ @@ -97,5 +103,4 @@ var transport = (function(transport){ })({}); -codex.transport = transport; module.exports = transport; \ No newline at end of file diff --git a/modules/ui.js b/modules/ui.js index 1af77fbb8..a8a7fbc3e 100644 --- a/modules/ui.js +++ b/modules/ui.js @@ -1,5 +1,3 @@ -var codex = require('../editor'); - var ui = (function(ui){ /** @@ -379,5 +377,4 @@ var ui = (function(ui){ })({}); -codex.ui = ui; -module.exports = codex; \ No newline at end of file +module.exports = ui; \ No newline at end of file From f0545b6c5850a422c6d0173f5757c183d6714118 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Tue, 10 Jan 2017 20:59:11 +0300 Subject: [PATCH 10/14] Versioning (#102) * start versioning * codex.version * eslint settings * versioning improved * cover restoring and fetch function fixed (#101) * cover restoring fixed * upd * fetch fixed in safari * updated * plugins * plugins ready * code improved * fixed bug with backspace * improved architecture * new sanitize method (#103) * new sanitize method Need to fix caret position * removed console logs * version updated * eslint style * caret position * big fixed on sanitize method * sanitize improved, using observers * sanitize: using html-janitor * fixes * last fixes, code improved after review * updated * new bundle * webpack config improved * upd * upd * upd --- .eslintrc | 49 +++ codex-editor.css | 4 + codex-editor.js | 880 +++++++++++++++++++++++-------------- codex-editor.js.map | 2 +- editor.js | 8 +- example.html | 14 +- modules/callbacks.js | 96 ++-- modules/caret.js | 7 + modules/content.js | 185 ++++---- modules/core.js | 15 + modules/draw.js | 9 +- modules/notifications.js | 7 + modules/parser.js | 240 +--------- modules/renderer.js | 7 + modules/saver.js | 7 + modules/toolbar/inline.js | 9 + modules/toolbar/toolbar.js | 11 + modules/toolbar/toolbox.js | 27 +- modules/tools.js | 7 + modules/transport.js | 2 +- modules/ui.js | 72 ++- package.json | 6 +- plugins/header/header.js | 4 + webpack.config.js | 32 +- whatwg-fetch.js.map | 2 +- 25 files changed, 984 insertions(+), 718 deletions(-) create mode 100644 .eslintrc diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..816d1887b --- /dev/null +++ b/.eslintrc @@ -0,0 +1,49 @@ +{ + "rules": { + + "arrow-spacing": [2, { "before": true, "after": true }], + + /** Variables */ + "no-catch-shadow": 2, + "no-delete-var": 2, + "no-label-var": 2, + "no-shadow-restricted-names": 2, + "no-shadow": 2, + "no-undef-init": 2, + "no-undef": 2, + "no-unused-vars": 2, + + /** Style */ + "array-bracket-spacing": [2, "never", { + "singleValue": true, + "objectsInArrays": true, + "arraysInArrays": true + }], + "quotes": [2, "single", "avoid-escape"], + "eqeqeq": 0, + "brace-style": [2, "stroustrup"], + "comma-spacing": [2, { "before": false, "after": true }], + "comma-style": [2, "last"], + "eol-last": 0, + "no-nested-ternary": 1, + "no-trailing-spaces": 2, + "no-mixed-spaces-and-tabs": 2, + "padded-blocks": [2, "never"], + "space-before-blocks": 2, + "space-before-function-paren": [2, { "anonymous": "always", "named": "never" }], + "spaced-comment": [2, "always", { + "exceptions": ["-", "+"], + "markers": ["=", "!"] + }], + "semi": [2, "always"], + "indent": [2, 4, { "SwitchCase": 1 }], + "camelcase": [2, { "properties": "always" }], + "newline-after-var": [1, "always"] + }, + "globals":{ + "document": true, + "require": true, + "module": true, + "codex": true + } +} \ No newline at end of file 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 674aebee3..ac49e7567 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -61,29 +61,33 @@ var codex = 'use strict'; /** + * + * Codex Editor + * * @author Codex Team - * @version 1.0.6 + * @version 1.2.5 */ var codex = function (codex) { var init = function init() { - codex.core = __webpack_require__(2); codex.ui = __webpack_require__(3); codex.transport = __webpack_require__(4); 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__(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.8"); + /** * @public * @@ -191,6 +195,13 @@ var codex = 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; }; + /** + * Codex Editor Core + * + * @author Codex Team + * @version 1.1.2 + */ + var core = function (core) { /** @@ -212,6 +223,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) { @@ -364,6 +383,13 @@ var codex = 'use strict'; + /** + * Codex Editor UI module + * + * @author Codex Team + * @version 1.1 + */ + var ui = function (ui) { /** @@ -605,7 +631,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); @@ -648,7 +677,9 @@ var codex = codex.tools[tool].prepare(); } - }, ui.addBlockHandlers = function (block) { + }; + + ui.addBlockHandlers = function (block) { if (!block) return; @@ -661,9 +692,25 @@ 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 + * This method is deprecated + * 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.blockPasteViaSanitize(event) + * + * @uses html-janitor + * @example codex.callback.blockPasteViaSanitize(event), the second method. + * */ block.addEventListener('paste', function (event) { - codex.callback.blockPaste(event); + codex.callback.blockPasteProcessing(event); }, false); block.addEventListener('mouseup', function () { @@ -730,7 +777,7 @@ var codex = * Codex.Editor Transport Module * * @author Codex Team - * @version 1.0.0 + * @version 1.0 */ var transport = function (transport) { @@ -834,6 +881,13 @@ var codex = 'use strict'; + /** + * Codex Editor Renderer Module + * + * @author Codex Team + * @version 1.0 + */ + var renderer = function (renderer) { /** @@ -998,6 +1052,13 @@ var codex = 'use strict'; + /** + * Codex Editor Saver + * + * @author Codex Team + * @version 1.0 + */ + var saver = function (saver) { /** @@ -1093,14 +1154,55 @@ var codex = /***/ }, /* 7 */ -/***/ function(module, exports) { +/***/ function(module, exports, __webpack_require__) { 'use strict'; + /** + * Codex Editor Content Module + * Works with DOM + * + * @author Codex Team + * @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: 'nofollow' + }, + i: {}, + b: {}, + strong: {}, + em: {}, + span: {} + } + }; + var content = function (content) { + /** + * Links to current active block + * @type {null | Element} + */ content.currentNode = null; + /** + * clicked in redactor area + * @type {null | Boolean} + */ + content.editorAreaHightlighted = null; + /** * Synchronizes redactor with original textarea */ @@ -1332,6 +1434,12 @@ var codex = }, 10); } } + + /** + * Block is inserted, wait for new click that defined focusing on editors area + * @type {boolean} + */ + content.editorAreaHightlighted = false; }; /** @@ -1531,7 +1639,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 @@ -1581,7 +1689,7 @@ var codex = tool = workingNode.dataset.tool; if (codex.tools[tool].allowedToPaste) { - codex.content.sanitize(mutation.addedNodes); + codex.content.sanitize.call(this, mutation.addedNodes); } else { codex.content.pasteTextContent(mutation.addedNodes); } @@ -1596,7 +1704,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); @@ -1608,7 +1726,7 @@ var codex = * * Sanitizes HTML content * @param {Element} target - inserted element - * @uses DFS function for deep searching + * @uses Sanitize library html-janitor */ content.sanitize = function (target) { @@ -1616,80 +1734,59 @@ 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) { + var node = target[0]; - 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'); + if (!node) { + return; } - /** Remove all tags */ - while (target.attributes.length > 0) { - target.removeAttribute(target.attributes[0].name); - } + /** + * Disconnect Observer + * hierarchy of function calls inherits context of observer + */ + this.disconnect(); - /** return href */ - if (href) { - target.setAttribute('href', href); + /** + * Don't sanitize text node + */ + if (node.nodeType == codex.core.nodeTypes.TEXT) { + return; } - 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]); - } + /** + * Clear dirty content + */ + var sanitizer = new janitor(Config), + clear = sanitizer.clean(node.outerHTML); + + var div = codex.draw.node('DIV', [], { innerHTML: clear }); + node.replaceWith(div.childNodes[0]); + + // 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); + // } + // + // } }; return content; @@ -1699,16 +1796,218 @@ 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'; + /** + * Codex Editor toolbar module + * + * Contains: + * - Inline toolbox + * - Toolbox within plus button + * - Settings section + * + * @author Codex Team + * @version 1.0 + */ 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); }; /** @@ -1798,7 +2097,7 @@ var codex = module.exports = toolbar; /***/ }, -/* 9 */ +/* 10 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -2039,11 +2338,20 @@ var codex = module.exports = settings; /***/ }, -/* 10 */ +/* 11 */ /***/ function(module, exports) { 'use strict'; + /** + * Inline toolbar + * + * Contains from tools: + * Bold, Italic, Underline and Anchor + * + * @author Codex Team + * @version 1.0 + */ var inline = function (inline) { inline.init = function () {}; @@ -2523,15 +2831,24 @@ var codex = module.exports = inline; /***/ }, -/* 11 */ +/* 12 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; + /** + * Codex Editor toolbox + * + * All tools be able to appended here + * + * @author Codex Team + * @version 1.0 + */ var toolbox = function (toolbox) { toolbox.init = function () { - __webpack_require__(8); + + __webpack_require__(9); }; toolbox.opened = false; @@ -2541,6 +2858,7 @@ var codex = /** Close setting if toolbox is opened */ if (codex.toolbar.settings.opened) { + codex.toolbar.settings.close(); } @@ -2578,7 +2896,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) { @@ -2601,6 +2923,7 @@ var codex = for (var tool in codex.tools) { if (codex.tools[tool].displayInToolbox) { + break; } @@ -2645,6 +2968,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 { @@ -2660,6 +2984,7 @@ var codex = appendCallback = tool.appendCallback; if (appendCallback && typeof appendCallback == 'function') { + appendCallback.call(event); } @@ -2688,34 +3013,55 @@ var codex = module.exports = toolbox; /***/ }, -/* 12 */ +/* 13 */ /***/ function(module, exports) { "use strict"; + /** + * Codex Editor tools + * This tools will be appended in toolbox + * + * @author Codex Team + * @version 1.0 + */ var tools = function (tools) { - return tools; + return tools; }({}); module.exports = tools; /***/ }, -/* 13 */ +/* 14 */ /***/ function(module, exports) { 'use strict'; + /** + * Codex Editor callbacks module + * + * @author Codex Team + * @version 1.2.5 + */ + var callbacks = function (callbacks) { 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: @@ -2748,17 +3094,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.editorAreaHightlighted) { /** * it means that we lose input index, saved index before is not correct @@ -2767,8 +3105,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') { @@ -2793,7 +3137,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 @@ -2806,6 +3150,12 @@ var codex = codex.toolbar.close(); + /** + * Stop other listeners callback executions + */ + event.stopPropagation(); + event.stopImmediatePropagation(); + return; } @@ -2913,6 +3263,8 @@ var codex = callbacks.redactorClicked = function (event) { + callbacks.detectWhenClickedOnFirstLevelBlockArea(); + codex.content.workingNodeChanged(event.target); codex.ui.saveInputs(); @@ -2947,13 +3299,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, @@ -3006,7 +3358,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(); } @@ -3019,7 +3371,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.detectWhenClickedOnFirstLevelBlockArea = function () { var selection = window.getSelection(), anchorNode = selection.anchorNode, @@ -3027,7 +3379,7 @@ var codex = if (selection.rangeCount == 0) { - return true; + codex.content.editorAreaHightlighted = true; } else { if (!codex.core.isDomNode(anchorNode)) { @@ -3052,7 +3404,7 @@ var codex = } /** If editable element founded, flag is "TRUE", Therefore we return "FALSE" */ - return flag ? false : true; + codex.content.editorAreaHightlighted = flag ? false : true; } }; @@ -3265,7 +3617,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, @@ -3348,6 +3700,11 @@ var codex = event.preventDefault(); }; + /** + * @deprecated + * + * @param event + */ callbacks.blockPaste = function (event) { var currentInputIndex = codex.caret.getCurrentInputIndex(), @@ -3356,10 +3713,14 @@ var codex = setTimeout(function () { codex.content.sanitize(node); + + event.preventDefault(); }, 10); + + event.stopImmediatePropagation(); }; - callbacks._blockPaste = function (event) { + callbacks.blockPasteProcessing = function (event) { var currentInputIndex = codex.caret.getCurrentInputIndex(); @@ -3371,7 +3732,12 @@ 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); @@ -3381,7 +3747,19 @@ var codex = * Sends all mutations to paste handler */ callbacks.handlePasteEvents = function (mutations) { - mutations.forEach(codex.content.paste); + + var self = this; + + /** + * 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. + */ + mutations.forEach(function (mutation) { + codex.content.paste.call(self, mutation); + }); }; /** @@ -3410,11 +3788,18 @@ var codex = module.exports = callbacks; /***/ }, -/* 14 */ +/* 15 */ /***/ function(module, exports) { 'use strict'; + /** + * Codex Editor Draw module + * + * @author Codex Team + * @version 1.0. + */ + var draw = function (draw) { /** @@ -3563,7 +3948,9 @@ var codex = div.classList.add('ce-settings_default'); return div; - }, draw.pluginsSettings = function () { + }; + + draw.pluginsSettings = function () { var div = document.createElement('div'); @@ -3708,11 +4095,18 @@ var codex = module.exports = draw; /***/ }, -/* 15 */ +/* 16 */ /***/ function(module, exports) { 'use strict'; + /** + * Codex Editor Caret Module + * + * @author Codex Team + * @version 1.0 + */ + var caret = function (caret) { /** @@ -3945,11 +4339,18 @@ var codex = module.exports = caret; /***/ }, -/* 16 */ +/* 17 */ /***/ function(module, exports) { 'use strict'; + /** + * Codex Editor Notification Module + * + * @author Codex Team + * @version 1.0 + */ + var notifications = function (notifications) { /** @@ -3991,236 +4392,31 @@ var codex = module.exports = notifications; /***/ }, -/* 17 */ +/* 18 */ /***/ function(module, exports) { - 'use strict'; + "use strict"; - var parser = function (parser) { + /** + * Codex Editor Parser Module + * + * @author Codex Team + * @version 1.1 + */ - /** - * Splits content by `\n` and returns blocks - */ - parser.getSeparatedTextFromContent = function (content) { - return content.split('\n'); - }; + var parser = function (parser) { /** 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; + parser.insertPastedContent = function (blockType, tag) { - /** - * 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"; - - /** 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 */ diff --git a/codex-editor.js.map b/codex-editor.js.map index 3806063ce..53027e6fc 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap b0d9b144b41a8e5bb0ba","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","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 b0d9b144b41a8e5bb0ba","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\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 /**\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","var 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","var 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.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","var 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","var 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","var 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","var 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","var 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","var 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","var tools = (function(tools) {\n\n return tools;\n\n})({});\n\nmodule.exports = tools;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","var 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","var 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","var 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","var 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","var 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 20e0c39c9b1c7910d07e","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","blockPasteProcessing","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","detectWhenClickedOnFirstLevelBlockArea","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 20e0c39c9b1c7910d07e","/**\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.blockPasteProcessing(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.detectWhenClickedOnFirstLevelBlockArea();\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.detectWhenClickedOnFirstLevelBlockArea = 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.blockPasteProcessing = 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/editor.js b/editor.js index f2a26cf6f..a3d2d67b4 100644 --- a/editor.js +++ b/editor.js @@ -1,12 +1,14 @@ /** + * + * Codex Editor + * * @author Codex Team - * @version 1.0.6 + * @version 1.2.5 */ var codex = (function(codex){ var init = function() { - codex.core = require('./modules/core'); codex.ui = require('./modules/ui'); codex.transport = require('./modules/transport'); @@ -22,6 +24,8 @@ var codex = (function(codex){ codex.parser = require('./modules/parser'); }; + codex.version = VERSION; + /** * @public * diff --git a/example.html b/example.html index 33902c0ba..ac179f807 100644 --- a/example.html +++ b/example.html @@ -10,8 +10,8 @@ - - + + @@ -48,6 +48,8 @@ -======= - - ->>>>>>> master From 7ee9bcc94c9200687d7a6546d8841a83229d8fec Mon Sep 17 00:00:00 2001 From: khaydarov Date: Tue, 10 Jan 2017 21:14:17 +0300 Subject: [PATCH 13/14] upd --- example.html | 1 - 1 file changed, 1 deletion(-) diff --git a/example.html b/example.html index 428bb45d4..ea06e93c7 100644 --- a/example.html +++ b/example.html @@ -49,7 +49,6 @@ codex.start({ textareaId : "codex_area", initialBlockPlugin : 'paragraph', - uploadImagesUrl : '/hull', tools : { paragraph: { type: 'paragraph', From 60e8c9adcff51f4eec5b9b677505b42a4778b117 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Tue, 10 Jan 2017 21:21:57 +0300 Subject: [PATCH 14/14] upd --- codex-editor.js | 10 ++++------ codex-editor.js.map | 2 +- modules/callbacks.js | 6 +++--- modules/ui.js | 4 +--- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/codex-editor.js b/codex-editor.js index c2ed846e6..2b5c57e6c 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -710,9 +710,7 @@ var codex = * @example codex.callback.blockPasteViaSanitize(event), the second method. * */ - block.addEventListener('paste', function (event) { - codex.callback.blockPasteProcessing(event); - }, false); + block.addEventListener('paste', codex.callback.blockPasteCallback, false); block.addEventListener('mouseup', function () { codex.toolbar.inline.show(); @@ -3723,14 +3721,14 @@ var codex = event.stopImmediatePropagation(); }; - callbacks.blockPasteProcessing = function (event) { + callbacks.blockPasteCallback = function (event) { var currentInputIndex = codex.caret.getCurrentInputIndex(); /** * create an observer instance */ - var observer = new MutationObserver(codex.callback.handlePasteEvents); + var observer = new MutationObserver(codex.callback.handleMutationsOnPaste); /** * configuration of the observer: @@ -3749,7 +3747,7 @@ var codex = /** * Sends all mutations to paste handler */ - callbacks.handlePasteEvents = function (mutations) { + callbacks.handleMutationsOnPaste = function (mutations) { var self = this; diff --git a/codex-editor.js.map b/codex-editor.js.map index 3b7b5dc65..69fff6e1f 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 1d22ee1cfc06b40600a4","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","blockPasteProcessing","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","detectWhenClickedOnFirstLevelBlockArea","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 1d22ee1cfc06b40600a4","/**\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\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.blockPasteProcessing(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 */\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 */\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.detectWhenClickedOnFirstLevelBlockArea();\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.detectWhenClickedOnFirstLevelBlockArea = 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.blockPasteProcessing = 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 3de357d4c1bce3e41a9a","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","blockPasteCallback","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","detectWhenClickedOnFirstLevelBlockArea","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","handleMutationsOnPaste","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 3de357d4c1bce3e41a9a","/**\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\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', codex.callback.blockPasteCallback, 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 */\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 */\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.detectWhenClickedOnFirstLevelBlockArea();\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.detectWhenClickedOnFirstLevelBlockArea = 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.blockPasteCallback = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handleMutationsOnPaste);\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.handleMutationsOnPaste = 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 5e8fef9b6..0dd3c3b08 100644 --- a/modules/callbacks.js +++ b/modules/callbacks.js @@ -730,14 +730,14 @@ var callbacks = (function(callbacks) { }; - callbacks.blockPasteProcessing = function(event) { + callbacks.blockPasteCallback = function(event) { var currentInputIndex = codex.caret.getCurrentInputIndex(); /** * create an observer instance */ - var observer = new MutationObserver(codex.callback.handlePasteEvents); + var observer = new MutationObserver(codex.callback.handleMutationsOnPaste); /** * configuration of the observer: @@ -756,7 +756,7 @@ var callbacks = (function(callbacks) { /** * Sends all mutations to paste handler */ - callbacks.handlePasteEvents = function(mutations) { + callbacks.handleMutationsOnPaste = function(mutations) { var self = this; diff --git a/modules/ui.js b/modules/ui.js index 74d088c08..d9db016de 100644 --- a/modules/ui.js +++ b/modules/ui.js @@ -344,9 +344,7 @@ var ui = (function(ui){ * @example codex.callback.blockPasteViaSanitize(event), the second method. * */ - block.addEventListener('paste', function (event) { - codex.callback.blockPasteProcessing(event); - }, false); + block.addEventListener('paste', codex.callback.blockPasteCallback, false); block.addEventListener('mouseup', function(){ codex.toolbar.inline.show();