diff --git a/build/codex-editor.js b/build/codex-editor.js index 6a63aeb9..79913494 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -224,6 +224,14 @@ module.exports = function () { return el.querySelectorAll(selector); } + + /** + * Check if object is DOM node + * + * @param {Object} node + * @returns {boolean} + */ + }, { key: 'isNode', value: function isNode(node) { @@ -747,6 +755,23 @@ var BlockManager = function () { this._blocks[++this._currentBlockIndex] = block; } + /** + * Replace current working block + * + * @param {String} toolName — plugin name + * @param {Object} data — plugin data + */ + + }, { + key: 'replace', + value: function replace(toolName, data) { + + var toolInstance = this.Editor.Tools.construct(toolName, data), + block = new _block2.default(toolInstance); + + this._blocks.insert(this._currentBlockIndex, block, true); + } + /** * Get Block instance by html element * @@ -831,13 +856,7 @@ var BlockManager = function () { }]); return BlockManager; -}(); /** - * @class BlockManager - * @classdesc Manage editor`s blocks storage and appearance - */ - -BlockManager.displayName = 'BlockManager'; -; +}(); /** * @class Blocks @@ -848,6 +867,12 @@ BlockManager.displayName = 'BlockManager'; * @property {HTMLElement} workingArea — editor`s working node * */ +/** + * @class BlockManager + * @classdesc Manage editor`s blocks storage and appearance + */ + +BlockManager.displayName = 'BlockManager'; var Blocks = function () { @@ -883,11 +908,14 @@ var Blocks = function () { * * @param {Number} index — index to insert Block * @param {Block} block — Block to insert + * @param {Boolean} replace — it true, replace block on given index */ }, { key: 'insert', value: function insert(index, block) { + var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + if (!this.length) { @@ -897,11 +925,17 @@ var Blocks = function () { if (index > this.length) { - // @todo decide how to handle this case - return; + index = this.length; } - this._blocks[index] = block; + if (replace) { + + this._blocks[index].html.remove(); + } + + var deleteCount = replace ? 1 : 0; + + this._blocks.splice(index, deleteCount, block); if (index > 0) { @@ -1062,15 +1096,21 @@ module.exports = BlockManager; /***/ (function(module, exports, __webpack_require__) { "use strict"; - +/* WEBPACK VAR INJECTION */(function($) { Object.defineProperty(exports, "__esModule", { value: true }); -var _dom = __webpack_require__(1); - -var _dom2 = __webpack_require__(0).interopRequireDefault(_dom); +/** + * + * @class Block + * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool + * + * @property {Tool} tool — current block tool (Paragraph, for example) + * @property {Object} CSS — block`s css classes + * + */ var Block = function () { @@ -1104,8 +1144,8 @@ var Block = function () { key: 'compose', value: function compose() { - var wrapper = _dom2.default.make('div', this.CSS.wrapper), - content = _dom2.default.make('div', this.CSS.content); + var wrapper = $.make('div', this.CSS.wrapper), + content = $.make('div', this.CSS.content); content.appendChild(this.tool.html); wrapper.appendChild(content); @@ -1128,18 +1168,11 @@ var Block = function () { }]); return Block; -}(); /** - * - * @class Block - * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool - * - * @property {Tool} tool — current block tool (Paragraph, for example) - * @property {Object} CSS — block`s css classes - * - */ +}(); Block.displayName = 'Block'; exports.default = Block; +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1))) /***/ }), /* 6 */ @@ -1255,7 +1288,7 @@ module.exports = Events; * Codex Editor Renderer Module * * @author Codex Team - * @version 1.0 + * @version 2.0.0 */ var Renderer = function () { @@ -1298,7 +1331,7 @@ var Renderer = function () { chainData.push({ function: function _function() { - return _this.makeBlock(items[i]); + return _this.insertBlock(items[i]); } }); }; @@ -1321,8 +1354,8 @@ var Renderer = function () { */ }, { - key: "makeBlock", - value: function makeBlock(item) { + key: "insertBlock", + value: function insertBlock(item) { var tool = item.type, data = item.data; diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 453545df..7502c949 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 5e0342f7c0c8f751e9ca","webpack:///./build/__tmp_babel_helpers.js","webpack:///./src/components/dom.js","webpack:///./src/codex.js","webpack:///./src/components/modules nonrecursive [^_](blockManager.js|events.js|renderer.js|toolbar.js|tools.js|ui.js)$","webpack:///./src/components/modules/blockManager.js","webpack:///./src/components/block.js","webpack:///./src/components/modules/events.js","webpack:///./src/components/modules/renderer.js","webpack:///./src/components/modules/toolbar.js","webpack:///./src/components/modules/tools.js","webpack:///./src/components/utils.js","webpack:///./src/components/modules/ui.js","webpack:///./src/styles/main.css","webpack:///./node_modules/css-loader/lib/css-base.js"],"names":["exports","createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","Constructor","protoProps","staticProps","prototype","classCallCheck","instance","TypeError","module","tagName","classNames","attributes","el","document","createElement","Array","isArray","classList","add","attrName","parent","elements","forEach","appendChild","selector","querySelector","querySelectorAll","node","nodeType","Node","ELEMENT_NODE","modules","editorModules","map","config","moduleInstances","Promise","resolve","then","configuration","init","start","console","log","catch","error","constructModules","configureModules","Module","displayName","e","name","state","getModulesDiff","diff","moduleName","prepareDecorator","prepare","UI","Tools","BlockManager","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Editor","_blocks","_currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","toolName","data","toolInstance","construct","block","element","index","indexOf","array","workingArea","push","html","previousBlock","insertAdjacentElement","nextBlock","targetBlock","newBlock","insert","_","children","isNaN","Number","Block","tool","CSS","wrapper","content","_html","compose","make","Events","subscribers","eventName","callback","reduce","previousData","currentHandler","newData","Renderer","items","chainData","function","makeBlock","sequence","item","type","Toolbar","actions","plusButton","toolbox","settingsToggler","removeBlockButton","settings","pluginSettings","defaultSettings","toolbar","$","append","makeRemoveBlockButton","makeBlockSettingsPanel","toolsAvailable","toolsUnavailable","iconClassName","displayInToolbox","enableLineBreaks","toolClasses","hasOwnProperty","reject","sequenceData","getListOfPrepareFunctions","success","fallback","toolPreparationList","toolClass","toolInstances","plugin","chains","previousValue","currentValue","iteration","waitNextBlock","successCallback","fallbackCallback","collection","slice","call","editorWrapper","editorZone","holder","getElementById","Error","loadStyles","styles","require","tag","textContent","toString","head"],"mappings":"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EH;AA1EL;;AAAA;AAAA;;AAiMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,U;;;;;;AClXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sB;;;;;;;;;ACjBA;;;;IAEM0B,Y;;AAEF;;;;;AAKA,gCAAwB;AAAA,YAAV1B,MAAU,QAAVA,MAAU;;AAAA;;AAEpB,aAAKA,MAAL,GAAcA,MAAd;AACA,aAAKoC,MAAL,GAAc,IAAd;AACA,aAAKC,OAAL,GAAe,IAAf;AACA,aAAKC,kBAAL,GAA0B,CAAC,CAA3B;AAEH;;AAED;;;;;;;;;;;AAWA;;;;;;kCAMU;AAAA;;AAEN,mBAAO,IAAIpC,OAAJ,CAAY,mBAAW;;AAE1B,oBAAIqC,SAAS,IAAIC,MAAJ,CAAW,MAAKJ,MAAL,CAAYZ,EAAZ,CAAeiB,KAAf,CAAqBC,QAAhC,CAAb;;AAEA;;;;;;;;;;;;;;AAcA,sBAAKL,OAAL,GAAe,IAAIM,KAAJ,CAAUJ,MAAV,EAAkB;AAC7BK,yBAAKJ,OAAOI,GADiB;AAE7BC,yBAAKL,OAAOK;AAFiB,iBAAlB,CAAf;;AAKA1C;AAE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AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,U;;;;;;;;;;AChRA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkDMQ,O;;AAEF;;;AAGA,qBAAc;AAAA;;AAEV,SAAKxD,MAAL,GAAc,IAAd;;AAEA,SAAKK,KAAL,GAAa;AACT8B,eAAU,IADD;AAETC,eAAU,IAFD;AAGTqB,eAAU,IAHD;;AAKT;AACAC,kBAAa,IANJ;AAOTC,eAAU,IAPD;;AAST;AACAC,uBAAkB,IAVT;AAWTC,yBAAmB,IAXV;AAYTC,gBAAU,IAZD;;AAcT;AACAC,sBAAgB,IAfP;AAgBTC,uBAAiB;AAhBR,KAAb;;AAmBA,SAAK9B,GAAL,GAAW;AACP+B,eAAS,YADF;AAEP7B,eAAS,qBAFF;AAGPqB,eAAS,qBAHF;;AAKP;AACAE,eAAS,qBANF;AAOPD,kBAAY,kBAPL;;AASP;AACAE,uBAAiB,0BAVV;A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;AAsCP;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAnDO,OAqDFO,KArDE,CAqDI,aAAK;;AAERF,gBAAQG,KAAR,CAAcK,CAAd;;AAEJ;AAEC,OA3DE,CAAP;AA6DH;;;iCAEY;;AAET;;;AAGA,UAAI0H,SAAS,mBAAAC,CAAQ,EAAR,CAAb;;AAEA;;;AAGA,UAAIC,MAAMtC,EAAE3B,IAAF,CAAO,OAAP,EAAgB,IAAhB,EAAsB;AAC5BkE,qBAAaH,OAAOI,QAAP;AADe,OAAtB,CAAV;;AAIA;;;AAGAxC,QAAEC,MAAF,CAAS5H,SAASoK,IAAlB,EAAwBH,GAAxB;AAEH;;;sBA/FSxG,M,EAAQ;;AAEd,WAAKA,MAAL,GAAcA,MAAd;AAEH;;;;;;;;;AA+FL9D,OAAOrB,OAAP,GAAiBuE,EAAjB;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,U;;;;;;;AC3bA;AACA;;;AAGA;AACA,gCAAiC,iDAAiD,2CAA2C,yBAAyB,6BAA6B,oBAAoB,GAAG,uBAAuB,wBAAwB,OAAO;;AAEhQ;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD,IAAI;AACJ;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;;AAElE;AACA","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 5e0342f7c0c8f751e9ca","exports.createClass=function(){function defineProperties(target,props){for(var i=0;i parent.appendChild(el) );\n\n } else {\n\n parent.appendChild(elements);\n\n }\n\n }\n\n /**\n * Selector Decorator\n *\n * Returns first match\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n *\n * @returns {Element}\n */\n static find(el = document, selector) {\n\n return el.querySelector(selector);\n\n }\n\n /**\n * Selector Decorator.\n *\n * Returns all matches\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n * @returns {NodeList}\n */\n static findAll(el = document, selector) {\n\n return el.querySelectorAll(selector);\n\n }\n\n static isNode(node) {\n\n return node && typeof node === 'object' && node.nodeType && node.nodeType === Node.ELEMENT_NODE;\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.js","/**\n * Codex Editor\n *\n * Short Description (눈_눈;)\n * @version 2.0.0\n *\n * How to start?\n * Example:\n * new CodexEditor({\n * holderId : 'codex-editor',\n * initialBlock : 'paragraph',\n * placeholder : 'Write your story....',\n * tools: {\n * quote: Quote,\n * anotherTool : AnotherTool\n * },\n * toolsConfig: {\n * quote: {\n * iconClassname : 'quote-icon',\n * displayInToolbox : true,\n * enableLineBreaks : true\n * },\n * anotherTool: {\n * iconClassname : 'tool-icon'\n * }\n * }\n * });\n *\n * - tools is an object: {\n * pluginName: PluginClass,\n * .....\n * }\n * - toolsConfig is an additional configuration that uses Codex Editor API\n * iconClassname - CSS classname of toolbox icon\n * displayInToolbox - if you want to see your Tool in toolbox hided in \"plus\" button, than set \"True\". By default : \"False\"\n * enableLineBreaks - by default enter creates new block that set as initialblock, but if you set this property \"True\", enter will break the lines in current block\n *\n * @author CodeX-Team \n *\n */\n\n/**\n * @typedef {CodexEditor} CodexEditor - editor class\n */\n\n/**\n * @typedef {Object} EditorConfig\n * @property {String} holderId - Element to append Editor\n * ...\n */\n\n'use strict';\n\n/**\n * Require Editor modules places in components/modules dir\n */\n// eslint-disable-next-line\nlet modules = editorModules.map( module => require('./components/modules/' + module ));\n\n/**\n * @class\n *\n * @classdesc CodeX Editor base class\n *\n * @property this.config - all settings\n * @property this.moduleInstances - constructed editor components\n *\n * @type {CodexEditor}\n */\nmodule.exports = class CodexEditor {\n\n /** Editor version */\n static get version() {\n\n return VERSION;\n\n }\n\n /**\n * @param {EditorConfig} config - user configuration\n *\n */\n constructor(config) {\n\n /**\n * Configuration object\n */\n this.config = {};\n\n /**\n * Editor Components\n */\n this.moduleInstances = {};\n\n Promise.resolve()\n .then(() => {\n\n this.configuration = config;\n\n })\n .then(() => this.init())\n .then(() => this.start())\n .then(() => {\n\n console.log('CodeX Editor is ready');\n\n })\n .catch(error => {\n\n console.log('CodeX Editor does not ready beecause of %o', error);\n\n });\n\n }\n\n /**\n * Setting for configuration\n * @param {Object} config\n */\n set configuration(config = {}) {\n\n this.config.holderId = config.holderId;\n this.config.placeholder = config.placeholder || 'write your story...';\n this.config.sanitizer = config.sanitizer || {\n p: true,\n b: true,\n a: true\n };\n\n this.config.hideToolbar = config.hideToolbar ? config.hideToolbar : false;\n this.config.tools = config.tools || {};\n this.config.toolsConfig = config.toolsConfig || {};\n\n }\n\n /**\n * Returns private property\n * @returns {{}|*}\n */\n get configuration() {\n\n return this.config;\n\n }\n\n /**\n * Initializes modules:\n * - make and save instances\n * - configure\n */\n init() {\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n this.constructModules();\n\n /**\n * Modules configuration\n */\n this.configureModules();\n\n }\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n constructModules() {\n\n modules.forEach( Module => {\n\n try {\n\n /**\n * We use class name provided by displayName property\n *\n * On build, Babel will transform all Classes to the Functions so, name will always be 'Function'\n * To prevent this, we use 'babel-plugin-class-display-name' plugin\n * @see https://www.npmjs.com/package/babel-plugin-class-display-name\n */\n\n this.moduleInstances[Module.displayName] = new Module({\n config : this.configuration\n });\n\n } catch ( e ) {\n\n console.log('Module %o skipped because %o', Module, e);\n\n }\n\n });\n\n }\n\n /**\n * Modules instances configuration:\n * - pass other modules to the 'state' property\n * - ...\n */\n configureModules() {\n\n for(let name in this.moduleInstances) {\n\n /**\n * Module does not need self-instance\n */\n this.moduleInstances[name].state = this.getModulesDiff( name );\n\n }\n\n }\n\n /**\n * Return modules without passed name\n */\n getModulesDiff( name ) {\n\n let diff = {};\n\n for(let moduleName in this.moduleInstances) {\n\n /**\n * Skip module with passed name\n */\n if (moduleName === name) {\n\n continue;\n\n }\n diff[moduleName] = this.moduleInstances[moduleName];\n\n }\n\n return diff;\n\n }\n\n /**\n * Start Editor!\n *\n * @return {Promise}\n */\n start() {\n\n let prepareDecorator = module => module.prepare();\n\n return Promise.resolve()\n .then(prepareDecorator(this.moduleInstances.UI))\n .then(prepareDecorator(this.moduleInstances.Tools))\n .then(prepareDecorator(this.moduleInstances.BlockManager))\n\n .catch(function (error) {\n\n console.log('Error occured', error);\n\n });\n\n }\n\n};\n\n// module.exports = (function (editor) {\n//\n// 'use strict';\n//\n// editor.version = VERSION;\n// editor.scriptPrefix = 'cdx-script-';\n//\n// var init = function () {\n//\n// editor.core = require('./modules/core');\n// editor.tools = require('./modules/tools');\n// editor.ui = require('./modules/ui');\n// editor.transport = require('./modules/transport');\n// editor.renderer = require('./modules/renderer');\n// editor.saver = require('./modules/saver');\n// editor.content = require('./modules/content');\n// editor.toolbar = require('./modules/toolbar/toolbar');\n// editor.callback = require('./modules/callbacks');\n// editor.draw = require('./modules/draw');\n// editor.caret = require('./modules/caret');\n// editor.notifications = require('./modules/notifications');\n// editor.parser = require('./modules/parser');\n// editor.sanitizer = require('./modules/sanitizer');\n// editor.listeners = require('./modules/listeners');\n// editor.destroyer = require('./modules/destroyer');\n// editor.paste = require('./modules/paste');\n//\n// };\n//\n// /**\n// * @public\n// * holds initial settings\n// */\n// editor.settings = {\n// tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n// holderId : 'codex-editor',\n//\n// // Type of block showing on empty editor\n// initialBlockPlugin: 'paragraph'\n// };\n//\n// /**\n// * public\n// *\n// * Static nodes\n// */\n// editor.nodes = {\n// holder : null,\n// wrapper : null,\n// toolbar : null,\n// inlineToolbar : {\n// wrapper : null,\n// buttons : null,\n// actions : null\n// },\n// toolbox : null,\n// notifications : null,\n// plusButton : null,\n// showSettingsButton: null,\n// showTrashButton : null,\n// blockSettings : null,\n// pluginSettings : null,\n// defaultSettings : null,\n// toolbarButtons : {}, // { type : DomEl, ... }\n// redactor : null\n// };\n//\n// /**\n// * @public\n// *\n// * Output state\n// */\n// editor.state = {\n// jsonOutput : [],\n// blocks : [],\n// inputs : []\n// };\n//\n// /**\n// * @public\n// * Editor plugins\n// */\n// editor.tools = {};\n//\n// editor.start = function (userSettings) {\n//\n// init();\n//\n// editor.core.prepare(userSettings)\n//\n// // If all ok, make UI, bind events and parse initial-content\n// .then(editor.ui.prepare)\n// .then(editor.tools.prepare)\n// .then(editor.sanitizer.prepare)\n// .then(editor.paste.prepare)\n// .then(editor.transport.prepare)\n// .then(editor.renderer.makeBlocksFromData)\n// .then(editor.ui.saveInputs)\n// .catch(function (error) {\n//\n// editor.core.log('Initialization failed with error: %o', 'warn', error);\n//\n// });\n//\n// };\n//\n// return editor;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/codex.js","var map = {\n\t\"./blockManager.js\": 4,\n\t\"./events.js\": 6,\n\t\"./renderer.js\": 7,\n\t\"./toolbar.js\": 8,\n\t\"./tools.js\": 9,\n\t\"./ui.js\": 11\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 3;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/modules nonrecursive [^_](blockManager.js|events.js|renderer.js|toolbar.js|tools.js|ui.js)$\n// module id = 3\n// module chunks = 0","/**\n * @class BlockManager\n * @classdesc Manage editor`s blocks storage and appearance\n */\n\nimport Block from '../block';\n\nclass BlockManager {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({ config }) {\n\n this.config = config;\n this.Editor = null;\n this._blocks = null;\n this._currentBlockIndex = -1;\n\n }\n\n /**\n * Editor modules setting\n *\n * @param Editor\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n * Should be called after Editor.UI preparation\n * Define this._blocks property\n *\n * @returns {Promise}\n */\n prepare() {\n\n return new Promise(resolve => {\n\n let blocks = new Blocks(this.Editor.UI.nodes.redactor);\n\n /**\n * We need to use Proxy to overload set/get [] operator.\n * So we can use array-like syntax to access blocks\n *\n * @example\n * this._blocks[0] = new Block(...);\n *\n * block = this._blocks[0];\n *\n * @todo proxy the enumerate method\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = new Proxy(blocks, {\n set: Blocks.set,\n get: Blocks.get\n });\n\n resolve();\n\n });\n\n }\n\n /**\n * Insert new block into _blocks\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n insert(toolName, data) {\n\n let toolInstance = this.Editor.Tools.construct(toolName, data),\n block = new Block(toolInstance);\n\n this._blocks[++this._currentBlockIndex] = block;\n\n }\n\n /**\n * Get Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\n\n if (index >= 0) {\n\n return this._blocks[index];\n\n }\n\n }\n\n /**\n * Get current Block instance\n *\n * @return {Block}\n */\n get currentBlock() {\n\n return this._blocks[this._currentBlockIndex];\n\n }\n\n /**\n * Get working html element\n *\n * @return {HTMLElement}\n */\n get currentNode() {\n\n return this._blocks.nodes[this._currentBlockIndex];\n\n }\n\n /**\n * Set _currentBlockIndex to passed block\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n this._currentBlockIndex = nodes.indexOf(element);\n\n }\n\n /**\n * Get array of Block instances\n *\n * @returns {Block[]} {@link Blocks#array}\n */\n get blocks() {\n\n return this._blocks.array;\n\n }\n\n};\n\n/**\n * @class Blocks\n * @classdesc Class to work with Block instances array\n *\n * @private\n *\n * @property {HTMLElement} workingArea — editor`s working node\n *\n */\nclass Blocks {\n\n /**\n * @constructor\n *\n * @param {HTMLElement} workingArea — editor`s working node\n */\n constructor(workingArea) {\n\n this._blocks = [];\n this.workingArea = workingArea;\n\n }\n\n /**\n * Push back new Block\n *\n * @param {Block} block\n */\n push(block) {\n\n this._blocks.push(block);\n this.workingArea.appendChild(block.html);\n\n }\n\n /**\n * Insert new Block at passed index\n *\n * @param {Number} index — index to insert Block\n * @param {Block} block — Block to insert\n */\n insert(index, block) {\n\n if (!this.length) {\n\n this.push(block);\n return;\n\n }\n\n if (index > this.length) {\n\n // @todo decide how to handle this case\n return;\n\n }\n\n this._blocks[index] = block;\n\n if (index > 0) {\n\n let previousBlock = this._blocks[index - 1];\n\n previousBlock.html.insertAdjacentElement('afterend', block.html);\n\n } else {\n\n let nextBlock = this._blocks[index + 1];\n\n nextBlock.html.insertAdjacentElement('beforebegin', block.html);\n\n }\n\n }\n\n /**\n * Insert Block after passed target\n *\n * @todo decide if this method is necessary\n *\n * @param {Block} targetBlock — target after wich Block should be inserted\n * @param {Block} newBlock — Block to insert\n */\n insertAfter(targetBlock, newBlock) {\n\n let index = this._blocks.indexOf(targetBlock);\n\n this.insert(index + 1, newBlock);\n\n }\n\n /**\n * Get Block by index\n *\n * @param {Number} index — Block index\n * @returns {Block}\n */\n get(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Return index of passed Block\n *\n * @param {Block} block\n * @returns {Number}\n */\n indexOf(block) {\n\n return this._blocks.indexOf(block);\n\n }\n\n /**\n * Get length of Block instances array\n *\n * @returns {Number}\n */\n get length() {\n\n return this._blocks.length;\n\n }\n\n /**\n * Get Block instances array\n *\n * @returns {Block[]}\n */\n get array() {\n\n return this._blocks;\n\n }\n\n /**\n * Get blocks html elements array\n *\n * @returns {HTMLElement[]}\n */\n get nodes() {\n\n return _.array(this.workingArea.children);\n\n }\n\n /**\n * Proxy trap to implement array-like setter\n *\n * @example\n * blocks[0] = new Block(...)\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — block index\n * @param {Block} block — Block to set\n * @returns {Boolean}\n */\n static set(instance, index, block) {\n\n if (isNaN(Number(index))) {\n\n return false;\n\n }\n\n instance.insert(index, block);\n\n return true;\n\n }\n\n /**\n * Proxy trap to implement array-like getter\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — Block index\n * @returns {Block|*}\n */\n static get(instance, index) {\n\n if (isNaN(Number(index))) {\n\n return instance[index];\n\n }\n\n return instance.get(index);\n\n }\n\n}\n\nmodule.exports = BlockManager;\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/blockManager.js","/**\n *\n * @class Block\n * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool\n *\n * @property {Tool} tool — current block tool (Paragraph, for example)\n * @property {Object} CSS — block`s css classes\n *\n */\n\n\nimport $ from './dom';\n\nexport default class Block {\n\n /**\n * @constructor\n *\n * @param {Object} tool — current block plugin`s instance\n */\n constructor(tool) {\n\n this.tool = tool;\n\n this.CSS = {\n wrapper: 'ce-block',\n content: 'ce-block__content'\n };\n\n this._html = this.compose();\n\n }\n\n /**\n * Make default block wrappers and put tool`s content there\n *\n * @returns {HTMLDivElement}\n * @private\n */\n compose() {\n\n let wrapper = $.make('div', this.CSS.wrapper),\n content = $.make('div', this.CSS.content);\n\n content.appendChild(this.tool.html);\n wrapper.appendChild(content);\n\n return wrapper;\n\n }\n\n /**\n * Get block`s HTML\n *\n * @returns {HTMLDivElement}\n */\n get html() {\n\n return this._html;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/block.js","/**\n * @module eventDispatcher\n *\n * Has two important methods:\n * - {Function} on - appends subscriber to the event. If event doesn't exist - creates new one\n * - {Function} emit - fires all subscribers with data\n *\n * @version 1.0.0\n */\nclass Events {\n\n /**\n * @param Editor\n * @param Editor.modules {@link CodexEditor#moduleInstances}\n * @param Editor.config {@link CodexEditor#configuration}\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n * @constructor\n *\n * @property {Object} subscribers - all subscribers grouped by event name\n */\n constructor() {\n\n this.subscribers = {};\n this.Editor = null;\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Function} callback - subscriber\n */\n on(eventName, callback) {\n\n if (!(eventName in this.subscribers)) {\n\n this.subscribers[eventName] = [];\n\n }\n\n // group by events\n this.subscribers[eventName].push(callback);\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Object} data - subscribers get this data when they were fired\n */\n emit(eventName, data) {\n\n this.subscribers[eventName].reduce(function (previousData, currentHandler) {\n\n let newData = currentHandler(previousData);\n\n return newData ? newData : previousData;\n\n }, data);\n\n }\n\n /**\n * Destroyer\n */\n destroy() {\n\n this.Editor = null;\n this.subscribers = null;\n\n }\n\n}\n\nmodule.exports = Events;\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/events.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nclass Renderer {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor(config) {\n\n this.config = config;\n this.Editor = null;\n\n }\n\n /**\n * Editor modules setter\n *\n * @param {Object} Editor\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n *\n * Make plugin blocks from array of plugin`s data\n *\n * @param {Object[]} items\n */\n render(items) {\n\n let chainData = [];\n\n for (let i = 0; i < items.length; i++) {\n\n chainData.push({\n function: () => this.makeBlock(items[i])\n });\n\n }\n\n _.sequence(chainData);\n\n }\n\n /**\n * Get plugin instance\n * Add plugin instance to BlockManager\n * Insert block to working zone\n *\n * @param {Object} item\n * @returns {Promise.}\n * @private\n */\n makeBlock(item) {\n\n let tool = item.type,\n data = item.data;\n\n this.Editor.BlockManager.insert(tool, data);\n\n return Promise.resolve();\n\n }\n}\n\nmodule.exports = Renderer;\n\n// module.exports = (function (renderer) {\n//\n// let editor = codex.editor;\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 (editor.core.isEmpty(editor.state.blocks) || !editor.state.blocks.items.length) {\n//\n// editor.ui.addInitialBlock();\n// return;\n//\n// }\n//\n// Promise.resolve()\n//\n// /** First, get JSON from state */\n// .then(function () {\n//\n// return editor.state.blocks;\n//\n// })\n//\n// /** Then, start to iterate they */\n// .then(editor.renderer.appendBlocks)\n//\n// /** Write log if something goes wrong */\n// .catch(function (error) {\n//\n// editor.core.log('Error while parsing JSON: %o', 'error', error);\n//\n// });\n//\n// };\n//\n// /**\n// * Parses JSON to blocks\n// * @param {object} data\n// * @return Promise -> 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// editor.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 editor.renderer.getNodeAsync(blocks, index);\n//\n// })\n//\n// /**\n// * second, compose editor-block from JSON object\n// */\n// .then(editor.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// editor.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//\n// editor.core.log('Node skipped while parsing because %o', 'error', error);\n//\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 {\n// tool : blocksList[index],\n// position : index\n// };\n//\n// });\n//\n// };\n//\n// /**\n// * Creates editor block by JSON-data\n// *\n// * @uses render method of each plugin\n// *\n// * @param {Object} toolData.tool\n// * { header : {\n// * text: '',\n// * type: 'H3', ...\n// * }\n// * }\n// * @param {Number} toolData.position - index in input-blocks array\n// * @return {Object} with type and Element\n// */\n// renderer.createBlockFromData = function ( toolData ) {\n//\n// /** New parser */\n// var block,\n// tool = toolData.tool,\n// pluginName = tool.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 (!editor.tools[pluginName]) {\n//\n// throw Error(`Plugin «${pluginName}» not found`);\n//\n// }\n//\n// /** Check for plugin having render method */\n// if (typeof editor.tools[pluginName].render != 'function') {\n//\n// throw Error(`Plugin «${pluginName}» must have «render» method`);\n//\n// }\n//\n// if ( editor.tools[pluginName].available === false ) {\n//\n// block = editor.draw.unavailableBlock();\n//\n// block.innerHTML = editor.tools[pluginName].loadingMessage;\n//\n// /**\n// * Saver will extract data from initial block data by position in array\n// */\n// block.dataset.inputPosition = toolData.position;\n//\n// } else {\n//\n// /** New Parser */\n// block = editor.tools[pluginName].render(tool.data);\n//\n// }\n//\n// /** is first-level block stretched */\n// var stretched = editor.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\n\n// WEBPACK FOOTER //\n// ./src/components/modules/renderer.js","/**\n *\n * «Toolbar» is the node that moves up/down over current block\n *\n * ______________________________________ Toolbar ____________________________________________\n * | |\n * | ..................... Content .................... ......... Block Actions .......... |\n * | . . . . |\n * | . . . [Open Settings] [Remove Block] . |\n * | . [Plus Button] [Toolbox: {Tool1}, {Tool2}] . . . |\n * | . . . [Settings Panel] . |\n * | .................................................. .................................. |\n * | |\n * |___________________________________________________________________________________________|\n *\n *\n * Toolbox — its an Element contains tools buttons. Can be shown by Plus Button.\n *\n * _______________ Toolbox _______________\n * | |\n * | [Header] [Image] [List] [Quote] ... |\n * |_______________________________________|\n *\n *\n * Settings Panel — is an Element with block settings:\n *\n * ____ Settings Panel ____\n * | ...................... |\n * | . Tool Settings . |\n * | ...................... |\n * | . Default Settings . |\n * | ...................... |\n * |________________________|\n *\n *\n * @class\n * @classdesc Toolbar module\n *\n * @property {Object} nodes\n * @property {Element} nodes.wrapper - Toolbar main element\n * @property {Element} nodes.content - Zone with Plus button and toolbox.\n * @property {Element} nodes.actions - Zone with Block Settings and Remove Button\n * @property {Element} nodes.plusButton - Button that opens or closes Toolbox\n * @property {Element} nodes.toolbox - Container for tools\n * @property {Element} nodes.settingsToggler - open/close Settings Panel button\n * @property {Element} nodes.removeBlockButton - Remove Block button\n * @property {Element} nodes.settings - Settings Panel\n * @property {Element} nodes.pluginSettings - Plugin Settings section of Settings Panel\n * @property {Element} nodes.defaultSettings - Default Settings section of Settings Panel\n */\nclass Toolbar {\n\n /**\n * @constructor\n */\n constructor() {\n\n this.Editor = null;\n\n this.nodes = {\n wrapper : null,\n content : null,\n actions : null,\n\n // Content Zone\n plusButton : null,\n toolbox : null,\n\n // Actions Zone\n settingsToggler : null,\n removeBlockButton: null,\n settings: null,\n\n // Settings Zone: Plugin Settings and Default Settings\n pluginSettings: null,\n defaultSettings: null,\n };\n\n this.CSS = {\n toolbar: 'ce-toolbar',\n content: 'ce-toolbar__content',\n actions: 'ce-toolbar__actions',\n\n // Content Zone\n toolbox: 'ce-toolbar__toolbox',\n plusButton: 'ce-toolbar__plus',\n\n // Actions Zone\n settingsToggler: 'ce-toolbar__settings-btn',\n removeBlockButton: 'ce-toolbar__remove-btn',\n\n // Settings Panel\n settings: 'ce-settings',\n defaultSettings: 'ce-settings_default',\n pluginSettings: 'ce-settings_plugin',\n };\n\n }\n\n /**\n * Editor modules setter\n * @param {object} Editor - available editor modules\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n * Makes toolbar\n */\n make() {\n\n this.nodes.wrapper = $.make('div', this.CSS.toolbar);\n\n /**\n * Make Content Zone and Actions Zone\n */\n ['content', 'actions'].forEach( el => {\n\n this.nodes[el] = $.make('div', this.CSS[el]);\n $.append(this.nodes.wrapper, this.nodes[el]);\n\n });\n\n\n /**\n * Fill Content Zone:\n * - Plus Button\n * - Toolbox\n */\n ['plusButton', 'toolbox'].forEach( el => {\n\n this.nodes[el] = $.make('div', this.CSS[el]);\n $.append(this.nodes.content, this.nodes[el]);\n\n });\n\n /**\n * Fill Actions Zone:\n * - Settings Toggler\n * - Remove Block Button\n * - Settings Panel\n */\n this.nodes.settingsToggler = $.make('span', this.CSS.settingsToggler);\n this.nodes.removeBlockButton = this.makeRemoveBlockButton();\n\n $.append(this.nodes.actions, [this.nodes.settingsToggler, this.nodes.removeBlockButton]);\n\n /**\n * Make and append Settings Panel\n */\n this.makeBlockSettingsPanel();\n\n /**\n * Append toolbar to the Editor\n */\n $.append(this.Editor.UI.nodes.wrapper, this.nodes.wrapper);\n\n }\n\n /**\n * Panel with block settings with 2 sections:\n *\n * @return {Element}\n */\n makeBlockSettingsPanel() {\n\n this.nodes.settings = $.make('div', this.CSS.settings);\n\n this.nodes.pluginSettings = $.make('div', this.CSS.pluginSettings);\n this.nodes.defaultSettings = $.make('div', this.CSS.defaultSettings);\n\n $.append(this.nodes.settings, [this.nodes.pluginSettings, this.nodes.defaultSettings]);\n $.append(this.nodes.actions, this.nodes.settings);\n\n }\n\n /**\n * Makes Remove Block button, and confirmation panel\n * @return {Element} wrapper with button and panel\n */\n makeRemoveBlockButton() {\n\n /**\n * @todo add confirmation panel and handlers\n * @see {@link settings#makeRemoveBlockButton}\n */\n return $.make('span', this.CSS.removeBlockButton);\n\n }\n\n}\n\nmodule.exports = Toolbar;\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar.js","/**\n * @module Codex Editor Tools Submodule\n *\n * Creates Instances from Plugins and binds external config to the instances\n */\n\n/**\n * Load user defined tools\n * Tools must contain the following important objects:\n *\n * @typedef {Object} ToolsConfig\n * @property {String} iconClassname - this a icon in toolbar\n * @property {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @property {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n */\n\n/**\n * @todo update according to current API\n *\n * @typedef {Object} Tool\n * @property render\n * @property save\n * @property settings\n * @property validate\n */\n\n/**\n * Class properties:\n *\n * @property {String} name - name of this module\n * @property {Object[]} toolInstances - list of tool instances\n * @property {Tools[]} available - available Tools\n * @property {Tools[]} unavailable - unavailable Tools\n * @property {Object} toolsClasses - all classes\n * @property {EditorConfig} config - Editor config\n */\n\nclass Tools {\n\n /**\n * Returns available Tools\n * @return {Tool[]}\n */\n get available() {\n\n return this.toolsAvailable;\n\n }\n\n /**\n * Returns unavailable Tools\n * @return {Tool[]}\n */\n get unavailable() {\n\n return this.toolsUnavailable;\n\n }\n\n /**\n * @param Editor\n * @param Editor.modules {@link CodexEditor#moduleInstances}\n * @param Editor.config {@link CodexEditor#configuration}\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n * If config wasn't passed by user\n * @return {ToolsConfig}\n */\n get defaultConfig() {\n\n return {\n iconClassName : 'default-icon',\n displayInToolbox : false,\n enableLineBreaks : false\n };\n\n }\n\n /**\n * @constructor\n *\n * @param {ToolsConfig} config\n */\n constructor({ config }) {\n\n this.config = config;\n\n this.toolClasses = {};\n this.toolsAvailable = {};\n this.toolsUnavailable = {};\n\n }\n\n /**\n * Creates instances via passed or default configuration\n * @return {boolean}\n */\n prepare() {\n\n if (!this.config.hasOwnProperty('tools')) {\n\n return Promise.reject(\"Can't start without tools\");\n\n }\n\n for(let toolName in this.config.tools) {\n\n this.toolClasses[toolName] = this.config.tools[toolName];\n\n }\n\n /**\n * getting classes that has prepare method\n */\n let sequenceData = this.getListOfPrepareFunctions();\n\n /**\n * if sequence data contains nothing then resolve current chain and run other module prepare\n */\n if (sequenceData.length === 0) {\n\n return Promise.resolve();\n\n }\n\n /**\n * to see how it works {@link Util#sequence}\n */\n return _.sequence(sequenceData, (data) => {\n\n this.success(data);\n\n }, (data) => {\n\n this.fallback(data);\n\n });\n\n }\n\n /**\n * Binds prepare function of plugins with user or default config\n * @return {Array} list of functions that needs to be fired sequently\n */\n getListOfPrepareFunctions() {\n\n let toolPreparationList = [];\n\n for(let toolName in this.toolClasses) {\n\n let toolClass = this.toolClasses[toolName];\n\n if (typeof toolClass.prepare === 'function') {\n\n toolPreparationList.push({\n function : toolClass.prepare,\n data : {\n toolName\n }\n });\n\n }\n\n }\n\n return toolPreparationList;\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to available list\n */\n success(data) {\n\n this.toolsAvailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to unavailable list\n */\n fallback(data) {\n\n this.toolsUnavailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * Returns all tools\n * @return {Array}\n */\n getTools() {\n\n return this.toolInstances;\n\n }\n\n /**\n * Return tool`a instance\n *\n * @param {String} tool — tool name\n * @param {Object} data — initial data\n *\n * @todo throw exceptions if tool doesnt exist\n *\n */\n construct(tool, data) {\n\n let plugin = this.toolClasses[tool],\n config = this.config.toolsConfig[tool];\n\n let instance = new plugin(data, config);\n\n return instance;\n\n }\n\n}\n\nmodule.exports = Tools;\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/tools.js","/**\n * Codex Editor Util\n */\nmodule.exports = class Util {\n\n /**\n * @typedef {Object} ChainData\n * @property {Object} data - data that will be passed to the success or fallback\n * @property {Function} function - function's that must be called asynchronically\n */\n\n /**\n * Fires a promise sequence asyncronically\n *\n * @param {Object[]} chains - list or ChainData's\n * @param {Function} success - success callback\n * @param {Function} fallback - callback that fires in case of errors\n *\n * @return {Promise}\n */\n static sequence(chains, success = () => {}, fallback = () => {}) {\n\n return new Promise(function (resolve) {\n\n /**\n * pluck each element from queue\n * First, send resolved Promise as previous value\n * Each plugins \"prepare\" method returns a Promise, that's why\n * reduce current element will not be able to continue while can't get\n * a resolved Promise\n */\n chains.reduce(function (previousValue, currentValue, iteration) {\n\n return previousValue\n .then(() => waitNextBlock(currentValue, success, fallback))\n .then(() => {\n\n // finished\n if (iteration === chains.length - 1) {\n\n resolve();\n\n }\n\n });\n\n }, Promise.resolve());\n\n });\n\n /**\n * Decorator\n *\n * @param {ChainData} chainData\n *\n * @param {Function} successCallback\n * @param {Function} fallbackCallback\n *\n * @return {Promise}\n */\n function waitNextBlock(chainData, successCallback, fallbackCallback) {\n\n return new Promise(function (resolve) {\n\n chainData.function()\n .then(() => {\n\n successCallback(chainData.data);\n\n })\n .then(resolve)\n .catch(function () {\n\n fallbackCallback(chainData.data);\n\n // anyway, go ahead even it falls\n resolve();\n\n });\n\n });\n\n }\n\n }\n\n /**\n * Make array from array-like collection\n *\n * @param {*} collection\n *\n * @return {Array}\n */\n static array(collection) {\n\n return Array.prototype.slice.call(collection);\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/utils.js","/**\n * Module UI\n *\n * @type {UI}\n */\n// let className = {\n\n/**\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\n */\n// BLOCK_CLASSNAME : 'ce-block',\n\n/**\n * @const {String} wrapper for plugins content\n */\n// BLOCK_CONTENT : 'ce-block__content',\n\n/**\n * @const {String} BLOCK_STRETCHED - makes block stretched\n */\n// BLOCK_STRETCHED : 'ce-block--stretched',\n\n/**\n * @const {String} BLOCK_HIGHLIGHTED - adds background\n */\n// BLOCK_HIGHLIGHTED : 'ce-block--focused',\n\n/**\n * @const {String} - for all default settings\n */\n// SETTINGS_ITEM : 'ce-settings__item'\n// };\n\nlet CSS = {\n editorWrapper : 'codex-editor',\n editorZone : 'ce-redactor'\n};\n\n/**\n * @class\n *\n * @classdesc Makes CodeX Editor UI:\n * \n * \n * \n * \n * \n *\n * @property {EditorConfig} config - editor configuration {@link CodexEditor#configuration}\n * @property {Object} Editor - available editor modules {@link CodexEditor#moduleInstances}\n * @property {Object} nodes -\n * @property {Element} nodes.wrapper - element where we need to append redactor\n * @property {Element} nodes.wrapper - \n * @property {Element} nodes.redactor - \n */\nclass UI {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({ config }) {\n\n this.config = config;\n this.Editor = null;\n\n this.nodes = {\n holder: null,\n wrapper: null,\n redactor: null\n };\n\n }\n\n\n /**\n * Editor modules setter\n * @param {object} Editor - available editor modules\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n * @protected\n *\n * Making main interface\n */\n prepare() {\n\n return new Promise( (resolve, reject) => {\n\n /**\n * Element where we need to append CodeX Editor\n * @type {Element}\n */\n this.nodes.holder = document.getElementById(this.config.holderId);\n\n if (!this.nodes.holder) {\n\n reject(Error(\"Holder wasn't found by ID: #\" + this.config.holderId));\n return;\n\n }\n\n /**\n * Create and save main UI elements\n */\n this.nodes.wrapper = $.make('div', CSS.editorWrapper);\n this.nodes.redactor = $.make('div', CSS.editorZone);\n\n this.nodes.wrapper.appendChild(this.nodes.redactor);\n this.nodes.holder.appendChild(this.nodes.wrapper);\n\n /**\n * Make toolbar\n */\n this.Editor.Toolbar.make();\n\n /**\n * Load and append CSS\n */\n this.loadStyles();\n\n resolve();\n\n })\n\n /** Add toolbox tools */\n // .then(addTools_)\n\n /** Make container for inline toolbar */\n // .then(makeInlineToolbar_)\n\n /** Add inline toolbar tools */\n // .then(addInlineToolbarTools_)\n\n /** Draw wrapper for notifications */\n // .then(makeNotificationHolder_)\n\n /** Add eventlisteners to redactor elements */\n // .then(bindEvents_)\n\n .catch(e => {\n\n console.error(e);\n\n // editor.core.log(\"Can't draw editor interface\");\n\n });\n\n }\n\n loadStyles() {\n\n /**\n * Load CSS\n */\n let styles = require('../../styles/main.css');\n\n /**\n * Make tag\n */\n let tag = $.make('style', null, {\n textContent: styles.toString()\n });\n\n /**\n * Append styles\n */\n $.append(document.head, tag);\n\n }\n\n}\n\nmodule.exports = UI;\n\n\n// /**\n// * Codex Editor UI module\n// *\n// * @author Codex Team\n// * @version 1.2.0\n// */\n//\n// module.exports = (function (ui) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * Basic editor classnames\n// */\n// ui.prepare = function () {\n//\n\n//\n// };\n//\n// /** Draw notifications holder */\n// var makeNotificationHolder_ = function () {\n//\n// /** Append block with notifications to the document */\n// editor.nodes.notifications = editor.notifications.createHolder();\n//\n// };\n//\n// /**\n// * @private\n// * Append tools passed in editor.tools\n// */\n// var addTools_ = function () {\n//\n// var tool,\n// toolName,\n// toolButton;\n//\n// for ( toolName in editor.settings.tools ) {\n//\n// tool = editor.settings.tools[toolName];\n//\n// editor.tools[toolName] = tool;\n//\n// if (!tool.iconClassname && tool.displayInToolbox) {\n//\n// editor.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', toolName);\n// continue;\n//\n// }\n//\n// if (typeof tool.render != 'function') {\n//\n// editor.core.log('render method missed. Tool %o skipped', 'warn', toolName);\n// continue;\n//\n// }\n//\n// if (!tool.displayInToolbox) {\n//\n// continue;\n//\n// } else {\n//\n// /** if tools is for toolbox */\n// toolButton = editor.draw.toolbarButton(toolName, tool.iconClassname);\n//\n// editor.nodes.toolbox.appendChild(toolButton);\n//\n// editor.nodes.toolbarButtons[toolName] = toolButton;\n//\n// }\n//\n// }\n//\n// };\n//\n// var addInlineToolbarTools_ = function () {\n//\n// var tools = {\n//\n// bold: {\n// icon : 'ce-icon-bold',\n// command : 'bold'\n// },\n//\n// italic: {\n// icon : 'ce-icon-italic',\n// command : 'italic'\n// },\n//\n// link: {\n// icon : 'ce-icon-link',\n// command : 'createLink'\n// }\n// };\n//\n// var toolButton,\n// tool;\n//\n// for(var name in tools) {\n//\n// tool = tools[name];\n//\n// toolButton = editor.draw.toolbarButtonInline(name, tool.icon);\n//\n// editor.nodes.inlineToolbar.buttons.appendChild(toolButton);\n// /**\n// * Add callbacks to this buttons\n// */\n// editor.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n//\n// }\n//\n// };\n//\n// /**\n// * @private\n// * Bind editor UI events\n// */\n// var bindEvents_ = function () {\n//\n// editor.core.log('ui.bindEvents fired', 'info');\n//\n// // window.addEventListener('error', function (errorMsg, url, lineNumber) {\n// // editor.notifications.errorThrown(errorMsg, event);\n// // }, false );\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keydown', editor.callback.globalKeydown, false);\n//\n// /** All keydowns on Redactor zone */\n// editor.listeners.add(editor.nodes.redactor, 'keydown', editor.callback.redactorKeyDown, false);\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keyup', editor.callback.globalKeyup, false );\n//\n// /**\n// * Mouse click to radactor\n// */\n// editor.listeners.add(editor.nodes.redactor, 'click', editor.callback.redactorClicked, false );\n//\n// /**\n// * Clicks to the Plus button\n// */\n// editor.listeners.add(editor.nodes.plusButton, 'click', editor.callback.plusButtonClicked, false);\n//\n// /**\n// * Clicks to SETTINGS button in toolbar\n// */\n// editor.listeners.add(editor.nodes.showSettingsButton, 'click', editor.callback.showSettingsButtonClicked, false );\n//\n// /** Bind click listeners on toolbar buttons */\n// for (var button in editor.nodes.toolbarButtons) {\n//\n// editor.listeners.add(editor.nodes.toolbarButtons[button], 'click', editor.callback.toolbarButtonClicked, false);\n//\n// }\n//\n// };\n//\n// ui.addBlockHandlers = function (block) {\n//\n// if (!block) return;\n//\n// /**\n// * Block keydowns\n// */\n// editor.listeners.add(block, 'keydown', editor.callback.blockKeydown, false);\n//\n// /**\n// * Pasting content from another source\n// * We have two type of sanitization\n// * First - uses deep-first search algorithm to get sub nodes,\n// * sanitizes whole Block_content and replaces cleared nodes\n// * This method is deprecated\n// * Method is used in editor.callback.blockPaste(event)\n// *\n// * Secont - uses Mutation observer.\n// * Observer \"observe\" DOM changes and send changings to callback.\n// * Callback gets changed node, not whole Block_content.\n// * Inserted or changed node, which we've gotten have been cleared and replaced with diry node\n// *\n// * Method is used in editor.callback.blockPasteViaSanitize(event)\n// *\n// * @uses html-janitor\n// * @example editor.callback.blockPasteViaSanitize(event), the second method.\n// *\n// */\n// editor.listeners.add(block, 'paste', editor.paste.blockPasteCallback, false);\n//\n// /**\n// * Show inline toolbar for selected text\n// */\n// editor.listeners.add(block, 'mouseup', editor.toolbar.inline.show, false);\n// editor.listeners.add(block, 'keyup', editor.toolbar.inline.show, false);\n//\n// };\n//\n// /** getting all contenteditable elements */\n// ui.saveInputs = function () {\n//\n// var redactor = editor.nodes.redactor;\n//\n// editor.state.inputs = [];\n//\n// /** Save all inputs in global variable state */\n// var inputs = redactor.querySelectorAll('[contenteditable], input, textarea');\n//\n// Array.prototype.map.call(inputs, function (current) {\n//\n// if (!current.type || current.type == 'text' || current.type == 'textarea') {\n//\n// editor.state.inputs.push(current);\n//\n// }\n//\n// });\n//\n// };\n//\n// /**\n// * Adds first initial block on empty redactor\n// */\n// ui.addInitialBlock = function () {\n//\n// var initialBlockType = editor.settings.initialBlockPlugin,\n// initialBlock;\n//\n// if ( !editor.tools[initialBlockType] ) {\n//\n// editor.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n// return;\n//\n// }\n//\n// initialBlock = editor.tools[initialBlockType].render();\n//\n// initialBlock.setAttribute('data-placeholder', editor.settings.placeholder);\n//\n// editor.content.insertBlock({\n// type : initialBlockType,\n// block : initialBlock\n// });\n//\n// editor.content.workingNodeChanged(initialBlock);\n//\n// };\n//\n// ui.setInlineToolbarButtonBehaviour = function (button, type) {\n//\n// editor.listeners.add(button, 'mousedown', function (event) {\n//\n// editor.toolbar.inline.toolClicked(event, type);\n//\n// }, false);\n//\n// };\n//\n// return ui;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/ui.js","exports = module.exports = require(\"../../node_modules/css-loader/lib/css-base.js\")(undefined);\n// imports\n\n\n// module\nexports.push([module.id, \":root {\\n\\n /**\\n * Toolbar buttons\\n */\\n\\n}\\n/**\\n* Editor wrapper\\n*/\\n.codex-editor{\\n position: relative;\\n border: 1px solid #ccc;\\n padding: 10px;\\n}\\n.codex-editor .hide {\\n display: none;\\n }\\n\", \"\"]);\n\n// exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/styles/main.css\n// module id = 12\n// module chunks = 0","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t// when a module is imported multiple times with different media queries.\n\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/css-loader/lib/css-base.js\n// module id = 13\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 4b70d37e2201b10fa8cb","webpack:///./build/__tmp_babel_helpers.js","webpack:///./src/components/dom.js","webpack:///./src/codex.js","webpack:///./src/components/modules nonrecursive [^_](blockManager.js|events.js|renderer.js|toolbar.js|tools.js|ui.js)$","webpack:///./src/components/modules/blockManager.js","webpack:///./src/components/block.js","webpack:///./src/components/modules/events.js","webpack:///./src/components/modules/renderer.js","webpack:///./src/components/modules/toolbar.js","webpack:///./src/components/modules/tools.js","webpack:///./src/components/utils.js","webpack:///./src/components/modules/ui.js","webpack:///./src/styles/main.css","webpack:///./node_modules/css-loader/lib/css-base.js"],"names":["exports","createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","Constructor","protoProps","staticProps","prototype","classCallCheck","instance","TypeError","module","tagName","classNames","attributes","el","document","createElement","Array","isArray","classList","add","attrName","parent","elements","forEach","appendChild","selector","querySelector","querySelectorAll","node","nodeType","Node","ELEMENT_NODE","modules","editorModules","map","config","moduleInstances","Promise","resolve","then","configuration","init","start","console","log","catch","error","constructModules","configureModules","Module","displayName","e","name","state","getModulesDiff","diff","moduleName","prepareDecorator","prepare","UI","Tools","BlockManager","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","Editor","_blocks","_currentBlockIndex","blocks","Blocks","nodes","redactor","Proxy","set","get","toolName","data","toolInstance","construct","block","insert","element","index","indexOf","array","workingArea","push","html","replace","remove","deleteCount","splice","previousBlock","insertAdjacentElement","nextBlock","targetBlock","newBlock","_","children","isNaN","Number","Block","tool","CSS","wrapper","content","_html","compose","$","make","Events","subscribers","eventName","callback","reduce","previousData","currentHandler","newData","Renderer","items","chainData","function","insertBlock","sequence","item","type","Toolbar","actions","plusButton","toolbox","settingsToggler","removeBlockButton","settings","pluginSettings","defaultSettings","toolbar","append","makeRemoveBlockButton","makeBlockSettingsPanel","toolsAvailable","toolsUnavailable","iconClassName","displayInToolbox","enableLineBreaks","toolClasses","hasOwnProperty","reject","sequenceData","getListOfPrepareFunctions","success","fallback","toolPreparationList","toolClass","toolInstances","plugin","chains","previousValue","currentValue","iteration","waitNextBlock","successCallback","fallbackCallback","collection","slice","call","editorWrapper","editorZone","holder","getElementById","Error","loadStyles","styles","require","tag","textContent","toString","head"],"mappings":"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AKnC,MAAZ;AAEH;AA1EL;;AAAA;AAAA;;AAiMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,U;;;;;;AClXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sB;;;;;;;;;ACjBA;;;;IAEM0B,Y;;AAEF;;;;;AAKA,gCAAwB;AAAA,YAAV1B,MAAU,QAAVA,MAAU;;AAAA;;AAEpB,aAAKA,MAAL,GAAcA,MAAd;AACA,aAAKoC,MAAL,GAAc,IAAd;AACA,aAAKC,OAAL,GAAe,IAAf;AACA,aAAKC,kBAAL,GAA0B,CAAC,CAA3B;AAEH;;AAED;;;;;;;;;;;AAWA;;;;;;kCAMU;AAAA;;AAEN,mBAAO,IAAIpC,OAAJ,CAAY,mBAAW;;AAE1B,oBAAIqC,SAAS,IAAIC,MAAJ,CAAW,MAAKJ,MAAL,CAAYZ,EAAZ,CAAeiB,KAAf,CAAqBC,QAAhC,CAAb;;AAEA;;;;;;;;;;;;;;AAcA,sBAAKL,OAAL,GAAe,IAAIM,KAAJ,CAAUJ,MAAV,EAAkB;AAC7BK,yBAAKJ,OAAOI,GADiB;AAE7BC,yBAAKL,OAAOK;AAFiB,iBAAlB,CAAf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AL,CAAYV,YAAZ,CAAyByB,MAAzB,CAAgCsB,IAAhC,EAAsC1B,IAAtC;;AAEA,mBAAO7C,QAAQC,OAAR,EAAP;AAEH;;;0BA9CSiC,M,EAAQ;;AAEd,iBAAKA,MAAL,GAAcA,MAAd;AAEH;;;;;;;;;AA8CL9D,OAAOrB,OAAP,GAAiBwI,QAAjB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,U;;;;;;;;;;ACjRA;;;;;;;;;;;;;;;;;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,U;;;;;;;AC3bA;AACA;;;AAGA;AACA,gCAAiC,iDAAiD,2CAA2C,yBAAyB,6BAA6B,oBAAoB,GAAG,uBAAuB,wBAAwB,OAAO;;AAEhQ;;;;;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mCAAmC,gBAAgB;AACnD,IAAI;AACJ;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB,iBAAiB;AACjC;AACA;AACA;AACA;AACA,YAAY,oBAAoB;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;;AAEH;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,oDAAoD,cAAc;;AAElE;AACA","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4b70d37e2201b10fa8cb","exports.createClass=function(){function defineProperties(target,props){for(var i=0;i parent.appendChild(el) );\n\n } else {\n\n parent.appendChild(elements);\n\n }\n\n }\n\n /**\n * Selector Decorator\n *\n * Returns first match\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n *\n * @returns {Element}\n */\n static find(el = document, selector) {\n\n return el.querySelector(selector);\n\n }\n\n /**\n * Selector Decorator.\n *\n * Returns all matches\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n * @returns {NodeList}\n */\n static findAll(el = document, selector) {\n\n return el.querySelectorAll(selector);\n\n }\n\n /**\n * Check if object is DOM node\n *\n * @param {Object} node\n * @returns {boolean}\n */\n static isNode(node) {\n\n return node && typeof node === 'object' && node.nodeType && node.nodeType === Node.ELEMENT_NODE;\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.js","/**\n * Codex Editor\n *\n * Short Description (눈_눈;)\n * @version 2.0.0\n *\n * How to start?\n * Example:\n * new CodexEditor({\n * holderId : 'codex-editor',\n * initialBlock : 'paragraph',\n * placeholder : 'Write your story....',\n * tools: {\n * quote: Quote,\n * anotherTool : AnotherTool\n * },\n * toolsConfig: {\n * quote: {\n * iconClassname : 'quote-icon',\n * displayInToolbox : true,\n * enableLineBreaks : true\n * },\n * anotherTool: {\n * iconClassname : 'tool-icon'\n * }\n * }\n * });\n *\n * - tools is an object: {\n * pluginName: PluginClass,\n * .....\n * }\n * - toolsConfig is an additional configuration that uses Codex Editor API\n * iconClassname - CSS classname of toolbox icon\n * displayInToolbox - if you want to see your Tool in toolbox hided in \"plus\" button, than set \"True\". By default : \"False\"\n * enableLineBreaks - by default enter creates new block that set as initialblock, but if you set this property \"True\", enter will break the lines in current block\n *\n * @author CodeX-Team \n *\n */\n\n/**\n * @typedef {CodexEditor} CodexEditor - editor class\n */\n\n/**\n * @typedef {Object} EditorConfig\n * @property {String} holderId - Element to append Editor\n * ...\n */\n\n'use strict';\n\n/**\n * Require Editor modules places in components/modules dir\n */\n// eslint-disable-next-line\nlet modules = editorModules.map( module => require('./components/modules/' + module ));\n\n/**\n * @class\n *\n * @classdesc CodeX Editor base class\n *\n * @property this.config - all settings\n * @property this.moduleInstances - constructed editor components\n *\n * @type {CodexEditor}\n */\nmodule.exports = class CodexEditor {\n\n /** Editor version */\n static get version() {\n\n return VERSION;\n\n }\n\n /**\n * @param {EditorConfig} config - user configuration\n *\n */\n constructor(config) {\n\n /**\n * Configuration object\n */\n this.config = {};\n\n /**\n * Editor Components\n */\n this.moduleInstances = {};\n\n Promise.resolve()\n .then(() => {\n\n this.configuration = config;\n\n })\n .then(() => this.init())\n .then(() => this.start())\n .then(() => {\n\n console.log('CodeX Editor is ready');\n\n })\n .catch(error => {\n\n console.log('CodeX Editor does not ready beecause of %o', error);\n\n });\n\n }\n\n /**\n * Setting for configuration\n * @param {Object} config\n */\n set configuration(config = {}) {\n\n this.config.holderId = config.holderId;\n this.config.placeholder = config.placeholder || 'write your story...';\n this.config.sanitizer = config.sanitizer || {\n p: true,\n b: true,\n a: true\n };\n\n this.config.hideToolbar = config.hideToolbar ? config.hideToolbar : false;\n this.config.tools = config.tools || {};\n this.config.toolsConfig = config.toolsConfig || {};\n\n }\n\n /**\n * Returns private property\n * @returns {{}|*}\n */\n get configuration() {\n\n return this.config;\n\n }\n\n /**\n * Initializes modules:\n * - make and save instances\n * - configure\n */\n init() {\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n this.constructModules();\n\n /**\n * Modules configuration\n */\n this.configureModules();\n\n }\n\n /**\n * Make modules instances and save it to the @property this.moduleInstances\n */\n constructModules() {\n\n modules.forEach( Module => {\n\n try {\n\n /**\n * We use class name provided by displayName property\n *\n * On build, Babel will transform all Classes to the Functions so, name will always be 'Function'\n * To prevent this, we use 'babel-plugin-class-display-name' plugin\n * @see https://www.npmjs.com/package/babel-plugin-class-display-name\n */\n\n this.moduleInstances[Module.displayName] = new Module({\n config : this.configuration\n });\n\n } catch ( e ) {\n\n console.log('Module %o skipped because %o', Module, e);\n\n }\n\n });\n\n }\n\n /**\n * Modules instances configuration:\n * - pass other modules to the 'state' property\n * - ...\n */\n configureModules() {\n\n for(let name in this.moduleInstances) {\n\n /**\n * Module does not need self-instance\n */\n this.moduleInstances[name].state = this.getModulesDiff( name );\n\n }\n\n }\n\n /**\n * Return modules without passed name\n */\n getModulesDiff( name ) {\n\n let diff = {};\n\n for(let moduleName in this.moduleInstances) {\n\n /**\n * Skip module with passed name\n */\n if (moduleName === name) {\n\n continue;\n\n }\n diff[moduleName] = this.moduleInstances[moduleName];\n\n }\n\n return diff;\n\n }\n\n /**\n * Start Editor!\n *\n * @return {Promise}\n */\n start() {\n\n let prepareDecorator = module => module.prepare();\n\n return Promise.resolve()\n .then(prepareDecorator(this.moduleInstances.UI))\n .then(prepareDecorator(this.moduleInstances.Tools))\n .then(prepareDecorator(this.moduleInstances.BlockManager))\n\n .catch(function (error) {\n\n console.log('Error occured', error);\n\n });\n\n }\n\n};\n\n// module.exports = (function (editor) {\n//\n// 'use strict';\n//\n// editor.version = VERSION;\n// editor.scriptPrefix = 'cdx-script-';\n//\n// var init = function () {\n//\n// editor.core = require('./modules/core');\n// editor.tools = require('./modules/tools');\n// editor.ui = require('./modules/ui');\n// editor.transport = require('./modules/transport');\n// editor.renderer = require('./modules/renderer');\n// editor.saver = require('./modules/saver');\n// editor.content = require('./modules/content');\n// editor.toolbar = require('./modules/toolbar/toolbar');\n// editor.callback = require('./modules/callbacks');\n// editor.draw = require('./modules/draw');\n// editor.caret = require('./modules/caret');\n// editor.notifications = require('./modules/notifications');\n// editor.parser = require('./modules/parser');\n// editor.sanitizer = require('./modules/sanitizer');\n// editor.listeners = require('./modules/listeners');\n// editor.destroyer = require('./modules/destroyer');\n// editor.paste = require('./modules/paste');\n//\n// };\n//\n// /**\n// * @public\n// * holds initial settings\n// */\n// editor.settings = {\n// tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n// holderId : 'codex-editor',\n//\n// // Type of block showing on empty editor\n// initialBlockPlugin: 'paragraph'\n// };\n//\n// /**\n// * public\n// *\n// * Static nodes\n// */\n// editor.nodes = {\n// holder : null,\n// wrapper : null,\n// toolbar : null,\n// inlineToolbar : {\n// wrapper : null,\n// buttons : null,\n// actions : null\n// },\n// toolbox : null,\n// notifications : null,\n// plusButton : null,\n// showSettingsButton: null,\n// showTrashButton : null,\n// blockSettings : null,\n// pluginSettings : null,\n// defaultSettings : null,\n// toolbarButtons : {}, // { type : DomEl, ... }\n// redactor : null\n// };\n//\n// /**\n// * @public\n// *\n// * Output state\n// */\n// editor.state = {\n// jsonOutput : [],\n// blocks : [],\n// inputs : []\n// };\n//\n// /**\n// * @public\n// * Editor plugins\n// */\n// editor.tools = {};\n//\n// editor.start = function (userSettings) {\n//\n// init();\n//\n// editor.core.prepare(userSettings)\n//\n// // If all ok, make UI, bind events and parse initial-content\n// .then(editor.ui.prepare)\n// .then(editor.tools.prepare)\n// .then(editor.sanitizer.prepare)\n// .then(editor.paste.prepare)\n// .then(editor.transport.prepare)\n// .then(editor.renderer.makeBlocksFromData)\n// .then(editor.ui.saveInputs)\n// .catch(function (error) {\n//\n// editor.core.log('Initialization failed with error: %o', 'warn', error);\n//\n// });\n//\n// };\n//\n// return editor;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/codex.js","var map = {\n\t\"./blockManager.js\": 4,\n\t\"./events.js\": 6,\n\t\"./renderer.js\": 7,\n\t\"./toolbar.js\": 8,\n\t\"./tools.js\": 9,\n\t\"./ui.js\": 11\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 3;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/modules nonrecursive [^_](blockManager.js|events.js|renderer.js|toolbar.js|tools.js|ui.js)$\n// module id = 3\n// module chunks = 0","/**\n * @class BlockManager\n * @classdesc Manage editor`s blocks storage and appearance\n */\n\nimport Block from '../block';\n\nclass BlockManager {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({ config }) {\n\n this.config = config;\n this.Editor = null;\n this._blocks = null;\n this._currentBlockIndex = -1;\n\n }\n\n /**\n * Editor modules setting\n *\n * @param Editor\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n * Should be called after Editor.UI preparation\n * Define this._blocks property\n *\n * @returns {Promise}\n */\n prepare() {\n\n return new Promise(resolve => {\n\n let blocks = new Blocks(this.Editor.UI.nodes.redactor);\n\n /**\n * We need to use Proxy to overload set/get [] operator.\n * So we can use array-like syntax to access blocks\n *\n * @example\n * this._blocks[0] = new Block(...);\n *\n * block = this._blocks[0];\n *\n * @todo proxy the enumerate method\n *\n * @type {Proxy}\n * @private\n */\n this._blocks = new Proxy(blocks, {\n set: Blocks.set,\n get: Blocks.get\n });\n\n resolve();\n\n });\n\n }\n\n /**\n * Insert new block into _blocks\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n insert(toolName, data) {\n\n let toolInstance = this.Editor.Tools.construct(toolName, data),\n block = new Block(toolInstance);\n\n this._blocks[++this._currentBlockIndex] = block;\n\n }\n\n /**\n * Replace current working block\n *\n * @param {String} toolName — plugin name\n * @param {Object} data — plugin data\n */\n replace(toolName, data) {\n\n let toolInstance = this.Editor.Tools.construct(toolName, data),\n block = new Block(toolInstance);\n\n this._blocks.insert(this._currentBlockIndex, block, true);\n\n }\n\n /**\n * Get Block instance by html element\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n * @returns {Block}\n */\n getBlock(element) {\n\n let nodes = this._blocks.nodes,\n index = nodes.indexOf(element);\n\n if (index >= 0) {\n\n return this._blocks[index];\n\n }\n\n }\n\n /**\n * Get current Block instance\n *\n * @return {Block}\n */\n get currentBlock() {\n\n return this._blocks[this._currentBlockIndex];\n\n }\n\n /**\n * Get working html element\n *\n * @return {HTMLElement}\n */\n get currentNode() {\n\n return this._blocks.nodes[this._currentBlockIndex];\n\n }\n\n /**\n * Set _currentBlockIndex to passed block\n *\n * @todo get first level block before searching\n *\n * @param {HTMLElement} element\n */\n set currentNode(element) {\n\n let nodes = this._blocks.nodes;\n\n this._currentBlockIndex = nodes.indexOf(element);\n\n }\n\n /**\n * Get array of Block instances\n *\n * @returns {Block[]} {@link Blocks#array}\n */\n get blocks() {\n\n return this._blocks.array;\n\n }\n\n}\n\n/**\n * @class Blocks\n * @classdesc Class to work with Block instances array\n *\n * @private\n *\n * @property {HTMLElement} workingArea — editor`s working node\n *\n */\nclass Blocks {\n\n /**\n * @constructor\n *\n * @param {HTMLElement} workingArea — editor`s working node\n */\n constructor(workingArea) {\n\n this._blocks = [];\n this.workingArea = workingArea;\n\n }\n\n /**\n * Push back new Block\n *\n * @param {Block} block\n */\n push(block) {\n\n this._blocks.push(block);\n this.workingArea.appendChild(block.html);\n\n }\n\n /**\n * Insert new Block at passed index\n *\n * @param {Number} index — index to insert Block\n * @param {Block} block — Block to insert\n * @param {Boolean} replace — it true, replace block on given index\n */\n insert(index, block, replace = false) {\n\n if (!this.length) {\n\n this.push(block);\n return;\n\n }\n\n if (index > this.length) {\n\n index = this.length;\n\n }\n\n if (replace) {\n\n this._blocks[index].html.remove();\n\n }\n\n let deleteCount = replace ? 1 : 0;\n\n this._blocks.splice(index, deleteCount, block);\n\n if (index > 0) {\n\n let previousBlock = this._blocks[index - 1];\n\n previousBlock.html.insertAdjacentElement('afterend', block.html);\n\n } else {\n\n let nextBlock = this._blocks[index + 1];\n\n nextBlock.html.insertAdjacentElement('beforebegin', block.html);\n\n }\n\n }\n\n /**\n * Insert Block after passed target\n *\n * @todo decide if this method is necessary\n *\n * @param {Block} targetBlock — target after wich Block should be inserted\n * @param {Block} newBlock — Block to insert\n */\n insertAfter(targetBlock, newBlock) {\n\n let index = this._blocks.indexOf(targetBlock);\n\n this.insert(index + 1, newBlock);\n\n }\n\n /**\n * Get Block by index\n *\n * @param {Number} index — Block index\n * @returns {Block}\n */\n get(index) {\n\n return this._blocks[index];\n\n }\n\n /**\n * Return index of passed Block\n *\n * @param {Block} block\n * @returns {Number}\n */\n indexOf(block) {\n\n return this._blocks.indexOf(block);\n\n }\n\n /**\n * Get length of Block instances array\n *\n * @returns {Number}\n */\n get length() {\n\n return this._blocks.length;\n\n }\n\n /**\n * Get Block instances array\n *\n * @returns {Block[]}\n */\n get array() {\n\n return this._blocks;\n\n }\n\n /**\n * Get blocks html elements array\n *\n * @returns {HTMLElement[]}\n */\n get nodes() {\n\n return _.array(this.workingArea.children);\n\n }\n\n /**\n * Proxy trap to implement array-like setter\n *\n * @example\n * blocks[0] = new Block(...)\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — block index\n * @param {Block} block — Block to set\n * @returns {Boolean}\n */\n static set(instance, index, block) {\n\n if (isNaN(Number(index))) {\n\n return false;\n\n }\n\n instance.insert(index, block);\n\n return true;\n\n }\n\n /**\n * Proxy trap to implement array-like getter\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — Block index\n * @returns {Block|*}\n */\n static get(instance, index) {\n\n if (isNaN(Number(index))) {\n\n return instance[index];\n\n }\n\n return instance.get(index);\n\n }\n\n}\n\nmodule.exports = BlockManager;\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/blockManager.js","/**\n *\n * @class Block\n * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool\n *\n * @property {Tool} tool — current block tool (Paragraph, for example)\n * @property {Object} CSS — block`s css classes\n *\n */\n\n\nexport default class Block {\n\n /**\n * @constructor\n *\n * @param {Object} tool — current block plugin`s instance\n */\n constructor(tool) {\n\n this.tool = tool;\n\n this.CSS = {\n wrapper: 'ce-block',\n content: 'ce-block__content'\n };\n\n this._html = this.compose();\n\n }\n\n /**\n * Make default block wrappers and put tool`s content there\n *\n * @returns {HTMLDivElement}\n * @private\n */\n compose() {\n\n let wrapper = $.make('div', this.CSS.wrapper),\n content = $.make('div', this.CSS.content);\n\n content.appendChild(this.tool.html);\n wrapper.appendChild(content);\n\n return wrapper;\n\n }\n\n /**\n * Get block`s HTML\n *\n * @returns {HTMLDivElement}\n */\n get html() {\n\n return this._html;\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/block.js","/**\n * @module eventDispatcher\n *\n * Has two important methods:\n * - {Function} on - appends subscriber to the event. If event doesn't exist - creates new one\n * - {Function} emit - fires all subscribers with data\n *\n * @version 1.0.0\n */\nclass Events {\n\n /**\n * @param Editor\n * @param Editor.modules {@link CodexEditor#moduleInstances}\n * @param Editor.config {@link CodexEditor#configuration}\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n * @constructor\n *\n * @property {Object} subscribers - all subscribers grouped by event name\n */\n constructor() {\n\n this.subscribers = {};\n this.Editor = null;\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Function} callback - subscriber\n */\n on(eventName, callback) {\n\n if (!(eventName in this.subscribers)) {\n\n this.subscribers[eventName] = [];\n\n }\n\n // group by events\n this.subscribers[eventName].push(callback);\n\n }\n\n /**\n * @param {String} eventName - event name\n * @param {Object} data - subscribers get this data when they were fired\n */\n emit(eventName, data) {\n\n this.subscribers[eventName].reduce(function (previousData, currentHandler) {\n\n let newData = currentHandler(previousData);\n\n return newData ? newData : previousData;\n\n }, data);\n\n }\n\n /**\n * Destroyer\n */\n destroy() {\n\n this.Editor = null;\n this.subscribers = null;\n\n }\n\n}\n\nmodule.exports = Events;\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/events.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 2.0.0\n */\n\nclass Renderer {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor(config) {\n\n this.config = config;\n this.Editor = null;\n\n }\n\n /**\n * Editor modules setter\n *\n * @param {Object} Editor\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n *\n * Make plugin blocks from array of plugin`s data\n *\n * @param {Object[]} items\n */\n render(items) {\n\n let chainData = [];\n\n for (let i = 0; i < items.length; i++) {\n\n chainData.push({\n function: () => this.insertBlock(items[i])\n });\n\n }\n\n _.sequence(chainData);\n\n }\n\n /**\n * Get plugin instance\n * Add plugin instance to BlockManager\n * Insert block to working zone\n *\n * @param {Object} item\n * @returns {Promise.}\n * @private\n */\n insertBlock(item) {\n\n let tool = item.type,\n data = item.data;\n\n this.Editor.BlockManager.insert(tool, data);\n\n return Promise.resolve();\n\n }\n\n}\n\nmodule.exports = Renderer;\n\n// module.exports = (function (renderer) {\n//\n// let editor = codex.editor;\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 (editor.core.isEmpty(editor.state.blocks) || !editor.state.blocks.items.length) {\n//\n// editor.ui.addInitialBlock();\n// return;\n//\n// }\n//\n// Promise.resolve()\n//\n// /** First, get JSON from state */\n// .then(function () {\n//\n// return editor.state.blocks;\n//\n// })\n//\n// /** Then, start to iterate they */\n// .then(editor.renderer.appendBlocks)\n//\n// /** Write log if something goes wrong */\n// .catch(function (error) {\n//\n// editor.core.log('Error while parsing JSON: %o', 'error', error);\n//\n// });\n//\n// };\n//\n// /**\n// * Parses JSON to blocks\n// * @param {object} data\n// * @return Promise -> 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// editor.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 editor.renderer.getNodeAsync(blocks, index);\n//\n// })\n//\n// /**\n// * second, compose editor-block from JSON object\n// */\n// .then(editor.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// editor.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//\n// editor.core.log('Node skipped while parsing because %o', 'error', error);\n//\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 {\n// tool : blocksList[index],\n// position : index\n// };\n//\n// });\n//\n// };\n//\n// /**\n// * Creates editor block by JSON-data\n// *\n// * @uses render method of each plugin\n// *\n// * @param {Object} toolData.tool\n// * { header : {\n// * text: '',\n// * type: 'H3', ...\n// * }\n// * }\n// * @param {Number} toolData.position - index in input-blocks array\n// * @return {Object} with type and Element\n// */\n// renderer.createBlockFromData = function ( toolData ) {\n//\n// /** New parser */\n// var block,\n// tool = toolData.tool,\n// pluginName = tool.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 (!editor.tools[pluginName]) {\n//\n// throw Error(`Plugin «${pluginName}» not found`);\n//\n// }\n//\n// /** Check for plugin having render method */\n// if (typeof editor.tools[pluginName].render != 'function') {\n//\n// throw Error(`Plugin «${pluginName}» must have «render» method`);\n//\n// }\n//\n// if ( editor.tools[pluginName].available === false ) {\n//\n// block = editor.draw.unavailableBlock();\n//\n// block.innerHTML = editor.tools[pluginName].loadingMessage;\n//\n// /**\n// * Saver will extract data from initial block data by position in array\n// */\n// block.dataset.inputPosition = toolData.position;\n//\n// } else {\n//\n// /** New Parser */\n// block = editor.tools[pluginName].render(tool.data);\n//\n// }\n//\n// /** is first-level block stretched */\n// var stretched = editor.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\n\n// WEBPACK FOOTER //\n// ./src/components/modules/renderer.js","/**\n *\n * «Toolbar» is the node that moves up/down over current block\n *\n * ______________________________________ Toolbar ____________________________________________\n * | |\n * | ..................... Content .................... ......... Block Actions .......... |\n * | . . . . |\n * | . . . [Open Settings] [Remove Block] . |\n * | . [Plus Button] [Toolbox: {Tool1}, {Tool2}] . . . |\n * | . . . [Settings Panel] . |\n * | .................................................. .................................. |\n * | |\n * |___________________________________________________________________________________________|\n *\n *\n * Toolbox — its an Element contains tools buttons. Can be shown by Plus Button.\n *\n * _______________ Toolbox _______________\n * | |\n * | [Header] [Image] [List] [Quote] ... |\n * |_______________________________________|\n *\n *\n * Settings Panel — is an Element with block settings:\n *\n * ____ Settings Panel ____\n * | ...................... |\n * | . Tool Settings . |\n * | ...................... |\n * | . Default Settings . |\n * | ...................... |\n * |________________________|\n *\n *\n * @class\n * @classdesc Toolbar module\n *\n * @property {Object} nodes\n * @property {Element} nodes.wrapper - Toolbar main element\n * @property {Element} nodes.content - Zone with Plus button and toolbox.\n * @property {Element} nodes.actions - Zone with Block Settings and Remove Button\n * @property {Element} nodes.plusButton - Button that opens or closes Toolbox\n * @property {Element} nodes.toolbox - Container for tools\n * @property {Element} nodes.settingsToggler - open/close Settings Panel button\n * @property {Element} nodes.removeBlockButton - Remove Block button\n * @property {Element} nodes.settings - Settings Panel\n * @property {Element} nodes.pluginSettings - Plugin Settings section of Settings Panel\n * @property {Element} nodes.defaultSettings - Default Settings section of Settings Panel\n */\nclass Toolbar {\n\n /**\n * @constructor\n */\n constructor() {\n\n this.Editor = null;\n\n this.nodes = {\n wrapper : null,\n content : null,\n actions : null,\n\n // Content Zone\n plusButton : null,\n toolbox : null,\n\n // Actions Zone\n settingsToggler : null,\n removeBlockButton: null,\n settings: null,\n\n // Settings Zone: Plugin Settings and Default Settings\n pluginSettings: null,\n defaultSettings: null,\n };\n\n this.CSS = {\n toolbar: 'ce-toolbar',\n content: 'ce-toolbar__content',\n actions: 'ce-toolbar__actions',\n\n // Content Zone\n toolbox: 'ce-toolbar__toolbox',\n plusButton: 'ce-toolbar__plus',\n\n // Actions Zone\n settingsToggler: 'ce-toolbar__settings-btn',\n removeBlockButton: 'ce-toolbar__remove-btn',\n\n // Settings Panel\n settings: 'ce-settings',\n defaultSettings: 'ce-settings_default',\n pluginSettings: 'ce-settings_plugin',\n };\n\n }\n\n /**\n * Editor modules setter\n * @param {object} Editor - available editor modules\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n * Makes toolbar\n */\n make() {\n\n this.nodes.wrapper = $.make('div', this.CSS.toolbar);\n\n /**\n * Make Content Zone and Actions Zone\n */\n ['content', 'actions'].forEach( el => {\n\n this.nodes[el] = $.make('div', this.CSS[el]);\n $.append(this.nodes.wrapper, this.nodes[el]);\n\n });\n\n\n /**\n * Fill Content Zone:\n * - Plus Button\n * - Toolbox\n */\n ['plusButton', 'toolbox'].forEach( el => {\n\n this.nodes[el] = $.make('div', this.CSS[el]);\n $.append(this.nodes.content, this.nodes[el]);\n\n });\n\n /**\n * Fill Actions Zone:\n * - Settings Toggler\n * - Remove Block Button\n * - Settings Panel\n */\n this.nodes.settingsToggler = $.make('span', this.CSS.settingsToggler);\n this.nodes.removeBlockButton = this.makeRemoveBlockButton();\n\n $.append(this.nodes.actions, [this.nodes.settingsToggler, this.nodes.removeBlockButton]);\n\n /**\n * Make and append Settings Panel\n */\n this.makeBlockSettingsPanel();\n\n /**\n * Append toolbar to the Editor\n */\n $.append(this.Editor.UI.nodes.wrapper, this.nodes.wrapper);\n\n }\n\n /**\n * Panel with block settings with 2 sections:\n *\n * @return {Element}\n */\n makeBlockSettingsPanel() {\n\n this.nodes.settings = $.make('div', this.CSS.settings);\n\n this.nodes.pluginSettings = $.make('div', this.CSS.pluginSettings);\n this.nodes.defaultSettings = $.make('div', this.CSS.defaultSettings);\n\n $.append(this.nodes.settings, [this.nodes.pluginSettings, this.nodes.defaultSettings]);\n $.append(this.nodes.actions, this.nodes.settings);\n\n }\n\n /**\n * Makes Remove Block button, and confirmation panel\n * @return {Element} wrapper with button and panel\n */\n makeRemoveBlockButton() {\n\n /**\n * @todo add confirmation panel and handlers\n * @see {@link settings#makeRemoveBlockButton}\n */\n return $.make('span', this.CSS.removeBlockButton);\n\n }\n\n}\n\nmodule.exports = Toolbar;\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar.js","/**\n * @module Codex Editor Tools Submodule\n *\n * Creates Instances from Plugins and binds external config to the instances\n */\n\n/**\n * Load user defined tools\n * Tools must contain the following important objects:\n *\n * @typedef {Object} ToolsConfig\n * @property {String} iconClassname - this a icon in toolbar\n * @property {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @property {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n */\n\n/**\n * @todo update according to current API\n *\n * @typedef {Object} Tool\n * @property render\n * @property save\n * @property settings\n * @property validate\n */\n\n/**\n * Class properties:\n *\n * @property {String} name - name of this module\n * @property {Object[]} toolInstances - list of tool instances\n * @property {Tools[]} available - available Tools\n * @property {Tools[]} unavailable - unavailable Tools\n * @property {Object} toolsClasses - all classes\n * @property {EditorConfig} config - Editor config\n */\n\nclass Tools {\n\n /**\n * Returns available Tools\n * @return {Tool[]}\n */\n get available() {\n\n return this.toolsAvailable;\n\n }\n\n /**\n * Returns unavailable Tools\n * @return {Tool[]}\n */\n get unavailable() {\n\n return this.toolsUnavailable;\n\n }\n\n /**\n * @param Editor\n * @param Editor.modules {@link CodexEditor#moduleInstances}\n * @param Editor.config {@link CodexEditor#configuration}\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n * If config wasn't passed by user\n * @return {ToolsConfig}\n */\n get defaultConfig() {\n\n return {\n iconClassName : 'default-icon',\n displayInToolbox : false,\n enableLineBreaks : false\n };\n\n }\n\n /**\n * @constructor\n *\n * @param {ToolsConfig} config\n */\n constructor({ config }) {\n\n this.config = config;\n\n this.toolClasses = {};\n this.toolsAvailable = {};\n this.toolsUnavailable = {};\n\n }\n\n /**\n * Creates instances via passed or default configuration\n * @return {boolean}\n */\n prepare() {\n\n if (!this.config.hasOwnProperty('tools')) {\n\n return Promise.reject(\"Can't start without tools\");\n\n }\n\n for(let toolName in this.config.tools) {\n\n this.toolClasses[toolName] = this.config.tools[toolName];\n\n }\n\n /**\n * getting classes that has prepare method\n */\n let sequenceData = this.getListOfPrepareFunctions();\n\n /**\n * if sequence data contains nothing then resolve current chain and run other module prepare\n */\n if (sequenceData.length === 0) {\n\n return Promise.resolve();\n\n }\n\n /**\n * to see how it works {@link Util#sequence}\n */\n return _.sequence(sequenceData, (data) => {\n\n this.success(data);\n\n }, (data) => {\n\n this.fallback(data);\n\n });\n\n }\n\n /**\n * Binds prepare function of plugins with user or default config\n * @return {Array} list of functions that needs to be fired sequently\n */\n getListOfPrepareFunctions() {\n\n let toolPreparationList = [];\n\n for(let toolName in this.toolClasses) {\n\n let toolClass = this.toolClasses[toolName];\n\n if (typeof toolClass.prepare === 'function') {\n\n toolPreparationList.push({\n function : toolClass.prepare,\n data : {\n toolName\n }\n });\n\n }\n\n }\n\n return toolPreparationList;\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to available list\n */\n success(data) {\n\n this.toolsAvailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * @param {ChainData.data} data - append tool to unavailable list\n */\n fallback(data) {\n\n this.toolsUnavailable[data.toolName] = this.toolClasses[data.toolName];\n\n }\n\n /**\n * Returns all tools\n * @return {Array}\n */\n getTools() {\n\n return this.toolInstances;\n\n }\n\n /**\n * Return tool`a instance\n *\n * @param {String} tool — tool name\n * @param {Object} data — initial data\n *\n * @todo throw exceptions if tool doesnt exist\n *\n */\n construct(tool, data) {\n\n let plugin = this.toolClasses[tool],\n config = this.config.toolsConfig[tool];\n\n let instance = new plugin(data, config);\n\n return instance;\n\n }\n\n}\n\nmodule.exports = Tools;\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/tools.js","/**\n * Codex Editor Util\n */\nmodule.exports = class Util {\n\n /**\n * @typedef {Object} ChainData\n * @property {Object} data - data that will be passed to the success or fallback\n * @property {Function} function - function's that must be called asynchronically\n */\n\n /**\n * Fires a promise sequence asyncronically\n *\n * @param {Object[]} chains - list or ChainData's\n * @param {Function} success - success callback\n * @param {Function} fallback - callback that fires in case of errors\n *\n * @return {Promise}\n */\n static sequence(chains, success = () => {}, fallback = () => {}) {\n\n return new Promise(function (resolve) {\n\n /**\n * pluck each element from queue\n * First, send resolved Promise as previous value\n * Each plugins \"prepare\" method returns a Promise, that's why\n * reduce current element will not be able to continue while can't get\n * a resolved Promise\n */\n chains.reduce(function (previousValue, currentValue, iteration) {\n\n return previousValue\n .then(() => waitNextBlock(currentValue, success, fallback))\n .then(() => {\n\n // finished\n if (iteration === chains.length - 1) {\n\n resolve();\n\n }\n\n });\n\n }, Promise.resolve());\n\n });\n\n /**\n * Decorator\n *\n * @param {ChainData} chainData\n *\n * @param {Function} successCallback\n * @param {Function} fallbackCallback\n *\n * @return {Promise}\n */\n function waitNextBlock(chainData, successCallback, fallbackCallback) {\n\n return new Promise(function (resolve) {\n\n chainData.function()\n .then(() => {\n\n successCallback(chainData.data);\n\n })\n .then(resolve)\n .catch(function () {\n\n fallbackCallback(chainData.data);\n\n // anyway, go ahead even it falls\n resolve();\n\n });\n\n });\n\n }\n\n }\n\n /**\n * Make array from array-like collection\n *\n * @param {*} collection\n *\n * @return {Array}\n */\n static array(collection) {\n\n return Array.prototype.slice.call(collection);\n\n }\n\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/utils.js","/**\n * Module UI\n *\n * @type {UI}\n */\n// let className = {\n\n/**\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\n */\n// BLOCK_CLASSNAME : 'ce-block',\n\n/**\n * @const {String} wrapper for plugins content\n */\n// BLOCK_CONTENT : 'ce-block__content',\n\n/**\n * @const {String} BLOCK_STRETCHED - makes block stretched\n */\n// BLOCK_STRETCHED : 'ce-block--stretched',\n\n/**\n * @const {String} BLOCK_HIGHLIGHTED - adds background\n */\n// BLOCK_HIGHLIGHTED : 'ce-block--focused',\n\n/**\n * @const {String} - for all default settings\n */\n// SETTINGS_ITEM : 'ce-settings__item'\n// };\n\nlet CSS = {\n editorWrapper : 'codex-editor',\n editorZone : 'ce-redactor'\n};\n\n/**\n * @class\n *\n * @classdesc Makes CodeX Editor UI:\n * \n * \n * \n * \n * \n *\n * @property {EditorConfig} config - editor configuration {@link CodexEditor#configuration}\n * @property {Object} Editor - available editor modules {@link CodexEditor#moduleInstances}\n * @property {Object} nodes -\n * @property {Element} nodes.wrapper - element where we need to append redactor\n * @property {Element} nodes.wrapper - \n * @property {Element} nodes.redactor - \n */\nclass UI {\n\n /**\n * @constructor\n *\n * @param {EditorConfig} config\n */\n constructor({ config }) {\n\n this.config = config;\n this.Editor = null;\n\n this.nodes = {\n holder: null,\n wrapper: null,\n redactor: null\n };\n\n }\n\n\n /**\n * Editor modules setter\n * @param {object} Editor - available editor modules\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n * @protected\n *\n * Making main interface\n */\n prepare() {\n\n return new Promise( (resolve, reject) => {\n\n /**\n * Element where we need to append CodeX Editor\n * @type {Element}\n */\n this.nodes.holder = document.getElementById(this.config.holderId);\n\n if (!this.nodes.holder) {\n\n reject(Error(\"Holder wasn't found by ID: #\" + this.config.holderId));\n return;\n\n }\n\n /**\n * Create and save main UI elements\n */\n this.nodes.wrapper = $.make('div', CSS.editorWrapper);\n this.nodes.redactor = $.make('div', CSS.editorZone);\n\n this.nodes.wrapper.appendChild(this.nodes.redactor);\n this.nodes.holder.appendChild(this.nodes.wrapper);\n\n /**\n * Make toolbar\n */\n this.Editor.Toolbar.make();\n\n /**\n * Load and append CSS\n */\n this.loadStyles();\n\n resolve();\n\n })\n\n /** Add toolbox tools */\n // .then(addTools_)\n\n /** Make container for inline toolbar */\n // .then(makeInlineToolbar_)\n\n /** Add inline toolbar tools */\n // .then(addInlineToolbarTools_)\n\n /** Draw wrapper for notifications */\n // .then(makeNotificationHolder_)\n\n /** Add eventlisteners to redactor elements */\n // .then(bindEvents_)\n\n .catch(e => {\n\n console.error(e);\n\n // editor.core.log(\"Can't draw editor interface\");\n\n });\n\n }\n\n loadStyles() {\n\n /**\n * Load CSS\n */\n let styles = require('../../styles/main.css');\n\n /**\n * Make tag\n */\n let tag = $.make('style', null, {\n textContent: styles.toString()\n });\n\n /**\n * Append styles\n */\n $.append(document.head, tag);\n\n }\n\n}\n\nmodule.exports = UI;\n\n\n// /**\n// * Codex Editor UI module\n// *\n// * @author Codex Team\n// * @version 1.2.0\n// */\n//\n// module.exports = (function (ui) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * Basic editor classnames\n// */\n// ui.prepare = function () {\n//\n\n//\n// };\n//\n// /** Draw notifications holder */\n// var makeNotificationHolder_ = function () {\n//\n// /** Append block with notifications to the document */\n// editor.nodes.notifications = editor.notifications.createHolder();\n//\n// };\n//\n// /**\n// * @private\n// * Append tools passed in editor.tools\n// */\n// var addTools_ = function () {\n//\n// var tool,\n// toolName,\n// toolButton;\n//\n// for ( toolName in editor.settings.tools ) {\n//\n// tool = editor.settings.tools[toolName];\n//\n// editor.tools[toolName] = tool;\n//\n// if (!tool.iconClassname && tool.displayInToolbox) {\n//\n// editor.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', toolName);\n// continue;\n//\n// }\n//\n// if (typeof tool.render != 'function') {\n//\n// editor.core.log('render method missed. Tool %o skipped', 'warn', toolName);\n// continue;\n//\n// }\n//\n// if (!tool.displayInToolbox) {\n//\n// continue;\n//\n// } else {\n//\n// /** if tools is for toolbox */\n// toolButton = editor.draw.toolbarButton(toolName, tool.iconClassname);\n//\n// editor.nodes.toolbox.appendChild(toolButton);\n//\n// editor.nodes.toolbarButtons[toolName] = toolButton;\n//\n// }\n//\n// }\n//\n// };\n//\n// var addInlineToolbarTools_ = function () {\n//\n// var tools = {\n//\n// bold: {\n// icon : 'ce-icon-bold',\n// command : 'bold'\n// },\n//\n// italic: {\n// icon : 'ce-icon-italic',\n// command : 'italic'\n// },\n//\n// link: {\n// icon : 'ce-icon-link',\n// command : 'createLink'\n// }\n// };\n//\n// var toolButton,\n// tool;\n//\n// for(var name in tools) {\n//\n// tool = tools[name];\n//\n// toolButton = editor.draw.toolbarButtonInline(name, tool.icon);\n//\n// editor.nodes.inlineToolbar.buttons.appendChild(toolButton);\n// /**\n// * Add callbacks to this buttons\n// */\n// editor.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n//\n// }\n//\n// };\n//\n// /**\n// * @private\n// * Bind editor UI events\n// */\n// var bindEvents_ = function () {\n//\n// editor.core.log('ui.bindEvents fired', 'info');\n//\n// // window.addEventListener('error', function (errorMsg, url, lineNumber) {\n// // editor.notifications.errorThrown(errorMsg, event);\n// // }, false );\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keydown', editor.callback.globalKeydown, false);\n//\n// /** All keydowns on Redactor zone */\n// editor.listeners.add(editor.nodes.redactor, 'keydown', editor.callback.redactorKeyDown, false);\n//\n// /** All keydowns on Document */\n// editor.listeners.add(document, 'keyup', editor.callback.globalKeyup, false );\n//\n// /**\n// * Mouse click to radactor\n// */\n// editor.listeners.add(editor.nodes.redactor, 'click', editor.callback.redactorClicked, false );\n//\n// /**\n// * Clicks to the Plus button\n// */\n// editor.listeners.add(editor.nodes.plusButton, 'click', editor.callback.plusButtonClicked, false);\n//\n// /**\n// * Clicks to SETTINGS button in toolbar\n// */\n// editor.listeners.add(editor.nodes.showSettingsButton, 'click', editor.callback.showSettingsButtonClicked, false );\n//\n// /** Bind click listeners on toolbar buttons */\n// for (var button in editor.nodes.toolbarButtons) {\n//\n// editor.listeners.add(editor.nodes.toolbarButtons[button], 'click', editor.callback.toolbarButtonClicked, false);\n//\n// }\n//\n// };\n//\n// ui.addBlockHandlers = function (block) {\n//\n// if (!block) return;\n//\n// /**\n// * Block keydowns\n// */\n// editor.listeners.add(block, 'keydown', editor.callback.blockKeydown, false);\n//\n// /**\n// * Pasting content from another source\n// * We have two type of sanitization\n// * First - uses deep-first search algorithm to get sub nodes,\n// * sanitizes whole Block_content and replaces cleared nodes\n// * This method is deprecated\n// * Method is used in editor.callback.blockPaste(event)\n// *\n// * Secont - uses Mutation observer.\n// * Observer \"observe\" DOM changes and send changings to callback.\n// * Callback gets changed node, not whole Block_content.\n// * Inserted or changed node, which we've gotten have been cleared and replaced with diry node\n// *\n// * Method is used in editor.callback.blockPasteViaSanitize(event)\n// *\n// * @uses html-janitor\n// * @example editor.callback.blockPasteViaSanitize(event), the second method.\n// *\n// */\n// editor.listeners.add(block, 'paste', editor.paste.blockPasteCallback, false);\n//\n// /**\n// * Show inline toolbar for selected text\n// */\n// editor.listeners.add(block, 'mouseup', editor.toolbar.inline.show, false);\n// editor.listeners.add(block, 'keyup', editor.toolbar.inline.show, false);\n//\n// };\n//\n// /** getting all contenteditable elements */\n// ui.saveInputs = function () {\n//\n// var redactor = editor.nodes.redactor;\n//\n// editor.state.inputs = [];\n//\n// /** Save all inputs in global variable state */\n// var inputs = redactor.querySelectorAll('[contenteditable], input, textarea');\n//\n// Array.prototype.map.call(inputs, function (current) {\n//\n// if (!current.type || current.type == 'text' || current.type == 'textarea') {\n//\n// editor.state.inputs.push(current);\n//\n// }\n//\n// });\n//\n// };\n//\n// /**\n// * Adds first initial block on empty redactor\n// */\n// ui.addInitialBlock = function () {\n//\n// var initialBlockType = editor.settings.initialBlockPlugin,\n// initialBlock;\n//\n// if ( !editor.tools[initialBlockType] ) {\n//\n// editor.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n// return;\n//\n// }\n//\n// initialBlock = editor.tools[initialBlockType].render();\n//\n// initialBlock.setAttribute('data-placeholder', editor.settings.placeholder);\n//\n// editor.content.insertBlock({\n// type : initialBlockType,\n// block : initialBlock\n// });\n//\n// editor.content.workingNodeChanged(initialBlock);\n//\n// };\n//\n// ui.setInlineToolbarButtonBehaviour = function (button, type) {\n//\n// editor.listeners.add(button, 'mousedown', function (event) {\n//\n// editor.toolbar.inline.toolClicked(event, type);\n//\n// }, false);\n//\n// };\n//\n// return ui;\n//\n// })({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/ui.js","exports = module.exports = require(\"../../node_modules/css-loader/lib/css-base.js\")(undefined);\n// imports\n\n\n// module\nexports.push([module.id, \":root {\\n\\n /**\\n * Toolbar buttons\\n */\\n\\n}\\n/**\\n* Editor wrapper\\n*/\\n.codex-editor{\\n position: relative;\\n border: 1px solid #ccc;\\n padding: 10px;\\n}\\n.codex-editor .hide {\\n display: none;\\n }\\n\", \"\"]);\n\n// exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/styles/main.css\n// module id = 12\n// module chunks = 0","/*\n\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\nmodule.exports = function(useSourceMap) {\n\tvar list = [];\n\n\t// return the list of modules as css string\n\tlist.toString = function toString() {\n\t\treturn this.map(function (item) {\n\t\t\tvar content = cssWithMappingToString(item, useSourceMap);\n\t\t\tif(item[2]) {\n\t\t\t\treturn \"@media \" + item[2] + \"{\" + content + \"}\";\n\t\t\t} else {\n\t\t\t\treturn content;\n\t\t\t}\n\t\t}).join(\"\");\n\t};\n\n\t// import a list of modules into the list\n\tlist.i = function(modules, mediaQuery) {\n\t\tif(typeof modules === \"string\")\n\t\t\tmodules = [[null, modules, \"\"]];\n\t\tvar alreadyImportedModules = {};\n\t\tfor(var i = 0; i < this.length; i++) {\n\t\t\tvar id = this[i][0];\n\t\t\tif(typeof id === \"number\")\n\t\t\t\talreadyImportedModules[id] = true;\n\t\t}\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar item = modules[i];\n\t\t\t// skip already imported module\n\t\t\t// this implementation is not 100% perfect for weird media query combinations\n\t\t\t// when a module is imported multiple times with different media queries.\n\t\t\t// I hope this will never occur (Hey this way we have smaller bundles)\n\t\t\tif(typeof item[0] !== \"number\" || !alreadyImportedModules[item[0]]) {\n\t\t\t\tif(mediaQuery && !item[2]) {\n\t\t\t\t\titem[2] = mediaQuery;\n\t\t\t\t} else if(mediaQuery) {\n\t\t\t\t\titem[2] = \"(\" + item[2] + \") and (\" + mediaQuery + \")\";\n\t\t\t\t}\n\t\t\t\tlist.push(item);\n\t\t\t}\n\t\t}\n\t};\n\treturn list;\n};\n\nfunction cssWithMappingToString(item, useSourceMap) {\n\tvar content = item[1] || '';\n\tvar cssMapping = item[3];\n\tif (!cssMapping) {\n\t\treturn content;\n\t}\n\n\tif (useSourceMap && typeof btoa === 'function') {\n\t\tvar sourceMapping = toComment(cssMapping);\n\t\tvar sourceURLs = cssMapping.sources.map(function (source) {\n\t\t\treturn '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'\n\t\t});\n\n\t\treturn [content].concat(sourceURLs).concat([sourceMapping]).join('\\n');\n\t}\n\n\treturn [content].join('\\n');\n}\n\n// Adapted from convert-source-map (MIT)\nfunction toComment(sourceMap) {\n\t// eslint-disable-next-line no-undef\n\tvar base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));\n\tvar data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;\n\n\treturn '/*# ' + data + ' */';\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/css-loader/lib/css-base.js\n// module id = 13\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/src/components/block.js b/src/components/block.js index 62518d1f..c00e0946 100644 --- a/src/components/block.js +++ b/src/components/block.js @@ -9,8 +9,6 @@ */ -import $ from './dom'; - export default class Block { /** diff --git a/src/components/dom.js b/src/components/dom.js index d7d2c188..1fd2c3a8 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -86,6 +86,12 @@ module.exports = class Dom { } + /** + * Check if object is DOM node + * + * @param {Object} node + * @returns {boolean} + */ static isNode(node) { return node && typeof node === 'object' && node.nodeType && node.nodeType === Node.ELEMENT_NODE; diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index 5ba979fb..dd714625 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -84,6 +84,21 @@ class BlockManager { } + /** + * Replace current working block + * + * @param {String} toolName — plugin name + * @param {Object} data — plugin data + */ + replace(toolName, data) { + + let toolInstance = this.Editor.Tools.construct(toolName, data), + block = new Block(toolInstance); + + this._blocks.insert(this._currentBlockIndex, block, true); + + } + /** * Get Block instance by html element * @@ -153,7 +168,7 @@ class BlockManager { } -}; +} /** * @class Blocks @@ -195,8 +210,9 @@ class Blocks { * * @param {Number} index — index to insert Block * @param {Block} block — Block to insert + * @param {Boolean} replace — it true, replace block on given index */ - insert(index, block) { + insert(index, block, replace = false) { if (!this.length) { @@ -207,12 +223,19 @@ class Blocks { if (index > this.length) { - // @todo decide how to handle this case - return; + index = this.length; } - this._blocks[index] = block; + if (replace) { + + this._blocks[index].html.remove(); + + } + + let deleteCount = replace ? 1 : 0; + + this._blocks.splice(index, deleteCount, block); if (index > 0) { diff --git a/src/components/modules/renderer.js b/src/components/modules/renderer.js index 7fd2e005..33b661dc 100644 --- a/src/components/modules/renderer.js +++ b/src/components/modules/renderer.js @@ -2,7 +2,7 @@ * Codex Editor Renderer Module * * @author Codex Team - * @version 1.0 + * @version 2.0.0 */ class Renderer { @@ -43,7 +43,7 @@ class Renderer { for (let i = 0; i < items.length; i++) { chainData.push({ - function: () => this.makeBlock(items[i]) + function: () => this.insertBlock(items[i]) }); } @@ -61,7 +61,7 @@ class Renderer { * @returns {Promise.} * @private */ - makeBlock(item) { + insertBlock(item) { let tool = item.type, data = item.data;