From ee7dac2dcb911e2ea8f62fafbec54d69178846f7 Mon Sep 17 00:00:00 2001 From: George Berezhnoy Date: Thu, 30 Nov 2017 18:55:39 +0300 Subject: [PATCH] Update --- build/codex-editor.js | 23 ++++++++++++----------- build/codex-editor.js.map | 2 +- src/components/block.js | 4 ++-- src/components/modules/blockManager.js | 11 ++++++----- src/components/modules/renderer.js | 4 ++-- 5 files changed, 23 insertions(+), 21 deletions(-) diff --git a/build/codex-editor.js b/build/codex-editor.js index 583e2d54..95b8bfb4 100644 --- a/build/codex-editor.js +++ b/build/codex-editor.js @@ -4191,7 +4191,7 @@ var CodexEditor = this.config = config; this.Editor = null; this._blocks = null; - this._currentBlcokIndex = -1; + this._currentBloсkIndex = -1; } /** @@ -4255,7 +4255,7 @@ var CodexEditor = var toolInstance = this.Editor.Tools.construct(toolName, data), block = new _block2.default(toolInstance); - this._blocks[++this._currentBlcokIndex] = block; + this._blocks[++this._currentBloсkIndex] = block; } /** @@ -4296,7 +4296,7 @@ var CodexEditor = key: 'currentBlock', get: function get() { - return this._blocks[this._currentBlcokIndex]; + return this._blocks[this._currentBloсkIndex]; } /** @@ -4309,7 +4309,7 @@ var CodexEditor = key: 'currentNode', get: function get() { - return this._blocks.nodes[this._currentBlcokIndex]; + return this._blocks.nodes[this._currentBloсkIndex]; } /** @@ -4324,7 +4324,7 @@ var CodexEditor = var nodes = this._blocks.nodes; - this._currentBlcokIndex = nodes.indexOf(element); + this._currentBloсkIndex = nodes.indexOf(element); } /** @@ -4402,6 +4402,7 @@ var CodexEditor = if (index > this.length) { + // @todo decide how to handle this case return; } @@ -4600,7 +4601,7 @@ var CodexEditor = content: 'ce-block__content' }; - this._html = this._compose(); + this._html = this.compose(); } /** @@ -4612,8 +4613,8 @@ var CodexEditor = _createClass(Block, [{ - key: '_compose', - value: function _compose() { + key: 'compose', + value: function compose() { var wrapper = _dom2.default.make('div', this.CSS.wrapper), content = _dom2.default.make('div', this.CSS.content); @@ -4817,7 +4818,7 @@ var CodexEditor = chainData.push({ function: function _function() { - return _this._makeBlock(items[i]); + return _this.makeBlock(items[i]); } }); }; @@ -4840,8 +4841,8 @@ var CodexEditor = */ }, { - key: '_makeBlock', - value: function _makeBlock(item) { + key: 'makeBlock', + value: function makeBlock(item) { var tool = item.type, data = item.data; diff --git a/build/codex-editor.js.map b/build/codex-editor.js.map index 465af68e..31a75c24 100644 --- a/build/codex-editor.js.map +++ b/build/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 4cabd30a2732cc381e19","webpack:///./src/codex.js","webpack:///./src/components/modules ^\\.\\/.*$","webpack:///./src/components/modules/_anchors.js","webpack:///./src/components/modules/_callbacks.js","webpack:///./src/components/modules/_caret.js","webpack:///./src/components/modules/_content.js","webpack:///./src/components/dom.js","webpack:///./src/components/modules/_destroyer.js","webpack:///./src/components/modules/_listeners.js","webpack:///./src/components/modules/_notifications.js","webpack:///./src/components/modules/_parser.js","webpack:///./src/components/modules/_paste.js","webpack:///./src/components/modules/_sanitizer.js","webpack:///./~/html-janitor/src/html-janitor.js","webpack:///./src/components/modules/_saver.js","webpack:///./src/components/modules/_transport.js","webpack:///./src/components/modules/blockManager.js","webpack:///./src/components/block.js","webpack:///./src/components/modules/eventDispatcher.js","webpack:///./src/components/modules/renderer.js","webpack:///./src/components/util.js","webpack:///./src/components/modules/toolbar.js","webpack:///./src/components/modules/toolbar/inline.js","webpack:///./src/components/modules/toolbar/settings.js","webpack:///./src/components/modules/toolbar/toolbar.js","webpack:///./src/components/modules/toolbar/toolbox.js","webpack:///./src/components/modules/tools.js","webpack:///./src/components/modules/ui.js"],"names":["modules","editorModules","map","module","exports","config","moduleInstances","Promise","resolve","then","configuration","init","start","console","log","catch","error","constructModules","configureModules","forEach","Module","name","e","state","getModulesDiff","moduleName","prepareDecorator","prepare","ui","Tools","BlockManager","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","anchors","editor","codex","input","currentNode","settingsOpened","currentBlock","value","dataset","anchor","anchorChanged","newAnchor","target","rusToTranslit","trim","classList","add","className","BLOCK_WITH_ANCHOR","remove","keyDownOnAnchorInput","keyCode","core","keys","ENTER","preventDefault","stopPropagation","blur","toolbar","settings","close","keyUpOnAnchorInput","LEFT","DOWN","string","ru","en","i","length","split","join","toLowerCase","replace","callbacks","globalKeydown","event","enterKeyPressed_","redactorKeyDown","TAB","tabKeyPressedOnRedactorsZone_","enterKeyPressedOnRedactorsZone_","ESC","escapeKeyPressedOnRedactorsZone_","defaultKeyPressedOnRedactorsZone_","globalKeyup","UP","RIGHT","arrowKeyPressed_","isBlockEmpty","content","opened","open","toolbox","leaf","editorAreaHightlighted","caret","inputIndex","enterPressedOnBlock_","NEW_BLOCK_TYPE","initialBlockPlugin","insertBlock","type","block","render","move","contentEditable","saveCurrentInputIndex","currentInputIndex","getCurrentInputIndex","workingNode","tool","isEnterPressedOnToolbar","current","inputs","enableLineBreaks","toolClicked","stopImmediatePropagation","shiftKey","currentSelection","window","getSelection","currentSelectedNode","anchorNode","caretAtTheEndOfText","position","atTheEnd","isTextNodeHasParentBetweenContenteditable","callback","enterPressedOnBlock","parentNode","nodeType","nodeTypes","TEXT","splitBlock","textContent","showPlusButton","islastNode","isLastNode","saveInputs","workingNodeChanged","inline","actionsOpened","clearMark","redactorClicked","detectWhenClickedOnFirstLevelBlockArea_","selectedText","getSelectionText","firstLevelBlock","indexOfLastInput","getFirstLevelBlock","setToBlock","setToNextBlock","inputIsEmpty","currentNodeType","isInitialType","hidePlusButton","markBlock","selection","flag","rangeCount","isDomNode","document","body","toolbarButtonClicked","button","plusButtonClicked","nodes","contains","blockKeydown","blockRightOrDownArrowPressed_","BACKSPACE","backspacePressed_","blockLeftOrUpArrowPressed_","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","childNodes","getDeepestTextNodeFromPosition","anchorOffset","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","range","selectionLength","firstLevelBlocksCount","isNativeInput","getRange","endOffset","startOffset","atStart","mergeBlocks","redactor","addInitialBlock","setTimeout","showSettingsButtonClicked","currentToolType","toggle","hideRemoveActions","offset","focusedNodeIndex","set","el","index","childs","nodeToSet","focus","createRange","setStart","setEnd","removeAllRanges","addRange","nextInput","emptyTextElement","createTextNode","appendChild","targetInput","previousInput","lastChildNode","lengthOfLastChildNode","pluginsRender","isFirstNode","isOffsetZero","insertNode","node","lastNode","DOCUMENT_FRAGMENT","getRangeAt","deleteContents","setStartAfter","collapse","Editor","CSS","stretched","highlighted","_currentNode","_currentIndex","pluginHTML","isStretched","make","blockContent","toolId","isNode","newBlock","composeBlock_","insertAdjacentElement","Dom","tagName","classNames","attributes","createElement","Array","isArray","attrName","parent","elements","selector","querySelector","querySelectorAll","Node","ELEMENT_NODE","destroyer","removeNodes","wrapper","notifications","destroyPlugins","destroy","destroyScripts","scripts","getElementsByTagName","id","indexOf","scriptPrefix","listeners","removeAll","plugins","allListeners","search","byElement","element","context","listenersOnElement","listener","push","byType","eventType","listenersWithType","byHandler","handler","listenersWithHandler","one","result","all","isCapture","addEventListener","data","alreadyAddedListener","removeEventListener","existingListeners","splice","get","queue","addToQueue","createHolder","holder","draw","errorThrown","errorMsg","notification","message","constructorSettings","cancel","confirm","inputField","confirmHandler","cancelHandler","create","time","okBtn","cancelBtn","okMsg","cancelMsg","send","clear","innerHTML","parser","insertPastedContent","blockType","tag","text","isFirstLevelBlock","TAG","BLOCK_CLASSNAME","paste","patterns","renderOnPastePatterns","pattern","pasted","clipBoardData","clipboardData","getData","analize","plugin","execArray","regex","exec","match","pasteToNewBlock_","blockPasteCallback","needsToHandlePasteEvent","htmlData","plainData","paragraphs","cleanData","wrappedData","clean","wrapTextWithParagraphs","emulateUserAgentBehaviour","insertPastedParagraphs","editableParent","getEditableParent","paragraph","newNode","childElementCount","createDocumentFragment","cloneNode","janitor","require","isEmpty","Config","CUSTOM","BASIC","tags","href","rel","init_","userCustomConfig","dirtyString","customConfig","janitorInstance","saver","save","html","jsonOutput","saveBlocks","blocks","getBlockData","makeOutput","saveBlockData","validateBlockData","pluginName","pluginsContent","inputPosition","available","items","Object","validate","savedData","filter","blockData","Date","version","transport","currentRequest","arguments","fileSelected","clearInput","files","formData","FormData","multiple","append","ajax","url","beforeSend","success","progress","selectAndUpload","args","setAttribute","accept","click","abort","_blocks","_currentBlcokIndex","Blocks","Proxy","toolName","toolInstance","construct","array","workingArea","previousBlock","nextBlock","targetBlock","insert","children","instance","isNaN","Number","Block","_html","_compose","subscribers","eventName","reduce","previousData","currentHandler","newData","chainData","function","_makeBlock","sequence","item","chains","fallback","reject","previousValue","currentValue","iteration","waitNextBlock","collection","prototype","slice","call","Toolbar","actions","plusButton","settingsToggler","removeBlockButton","pluginSettings","defaultSettings","makeRemoveBlockButton","makeBlockSettingsPanel","buttonsOpened","wrappersOffset","storedSelection","show","showInlineToolbar","inlineToolbar","showButtons","getWrappersOffset","coords","getSelectionCoords","defaultOffset","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","style","transform","Math","floor","closeButtons","closeAction","createLinkAction","defaultToolAction","buttons","hightlight","getOffset","_x","_y","offsetLeft","offsetTop","clientLeft","clientTop","offsetParent","sel","boundingLeft","boundingTop","cloneRange","getClientRects","rect","toString","showActions","action","inlineToolbarAnchorInputKeydown_","editable","restoreSelection","setAnchor","clearRange","isActive","isLinkActive","saveSelection","inputForLink","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","startContainer","end","savedSel","charIndex","nodeStack","foundStart","stop","nextCharIndex","pop","queryCommandState","setButtonHighlighted","removeButtonsHighLight","icon","setting","toolType","makeSettings","settingsBlock","blockSettings","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","showRemoveActions","defaultToolbarHeight","showSettingsButton","toolbarButtons","newYCoordinate","openedOnBlock","currentTool","barButtons","nextToolIndex","toolToSelect","visibleTool","displayInToolbox","UNREPLACEBLE_TOOLS","newBlockContent","appendCallback","switchBlock","util","toolsAvailable","toolsUnavailable","iconClassName","toolClasses","self","hasOwnProperty","sequenceData","getListOfPrepareFunctions","toolPreparationList","toolClass","toolInstances","editorWrapper","editorZone","getElementById","Error"],"mappings":"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C;;AAMA,kBAAK/B,MAAL,CAAYgC,WAAZ,GAA0BhC,OAAOgC,WAAP,GAAqBhC,OAAOgC,WAA5B,GAA0C,KAApE;AACA,kBAAKhC,MAAL,CAAYiC,KAAZ,GAAoBjC,OAAOiC,KAAP,IAAgB,EAApC;AACA,kBAAKjC,MAAL,CAAYkC,WAAZ,GAA0BlC,OAAOkC,WAAP,IAAsB,EAAhD;AAEH;;AAED;;;;AAlEJ;AAAA,6BAsEwB;;AAEhB,oBAAO,KAAKlC,MAAZ;AAEH;AA1EL;;AAAA;AAAA;;AAyLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,W;;;;;;AC7WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC,uDAAuD;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzDA;;;;;;;AAOAF,QAAOC,OAAP,GAAiB,UAAUoC,OAAV,EAAmB;;AAEhC,SAAIC,SAASC,MAAMD,MAAnB;;AAEAD,aAAQG,KAAR,GAAsB,IAAtB;AACAH,aAAQI,WAAR,GAAsB,IAAtB;;AAEAJ,aAAQK,cAAR,GAAyB,UAAUC,YAAV,EAAwB;;AAE7CN,iBAAQI,WAAR,GAAsBE,YAAtB;AACAN,iBAAQG,KAAR,CAAcI,KAAd,GAAsBP,QAAQI,WAAR,CAAoBI,OAApB,CAA4BC,MAA5B,IAAsC,EAA5D;AAEH,MALD;;AAOAT,aAAQU,aAAR,GAAwB,UAAU5B,CAAV,EAAa;;AAEjC,aAAI6B,YAAY7B,EAAE8B,MAAF,CAASL,KAAT,GAAiBP,QAAQa,aAAR,CAAsB/B,EAAE8B,MAAF,CAASL,KAA/B,CAAjC;;AAEAP,iBAAQI,WAAR,CAAoBI,OAApB,CAA4BC,MAA5B,GAAqCE,SAArC;;AAEA,aAAIA,UAAUG,IAAV,OAAqB,EAAzB,EAA6B;;AAEzBd,qBAAQI,WAAR,CAAoBW,SAApB,CAA8BC,GAA9B,CAAkCf,OAAOb,EAAP,CAAU6B,SAAV,CAAoBC,iBAAtD;AAEH,UAJD,MAIO;;AAEHlB,qBAAQI,WAAR,CAAoBW,SAApB,CAA8BI,MAA9B,CAAqClB,OAAOb,EAAP,CAAU6B,SAAV,CAAoBC,iBAAzD;AAEH;AAEJ,MAhBD;;AAkBAlB,aAAQoB,oBAAR,GAA+B,UAAUtC,CAAV,EAAa;;AAExC,aAAIA,EAAEuC,OAAF,IAAapB,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBC,KAAlC,EAAyC;;AAErC1C,eAAE2C,cAAF;AACA3C,eAAE4C,eAAF;;AAEA5C,eAAE8B,MAAF,CAASe,IAAT;AACA1B,oBAAO2B,OAAP,CAAeC,QAAf,CAAwBC,KAAxB;AAEH;AAEJ,MAZD;;AAcA9B,aAAQ+B,kBAAR,GAA6B,UAAUjD,CAAV,EAAa;;AAEtC,aAAIA,EAAEuC,OAAF,IAAapB,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBS,IAA9B,IAAsClD,EAAEuC,OAAF,IAAapB,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBU,IAAxE,EAA8E;;AAE1EnD,eAAE4C,eAAF;AAEH;AAEJ,MARD;;AAUA1B,aAAQa,aAAR,GAAwB,UAAUqB,MAAV,EAAkB;;AAEtC,aAAIC,KAAK,CACD,GADC,EACI,GADJ,EACS,GADT,EACc,GADd,EACmB,GADnB,EACwB,GADxB,EAC6B,GAD7B,EACkC,GADlC,EACuC,GADvC,EAC4C,GAD5C,EACiD,GADjD,EAED,GAFC,EAEI,GAFJ,EAES,GAFT,EAEc,GAFd,EAEmB,GAFnB,EAEwB,GAFxB,EAE6B,GAF7B,EAEkC,GAFlC,EAEuC,GAFvC,EAE4C,GAF5C,EAEiD,GAFjD,EAGD,GAHC,EAGI,GAHJ,EAGS,GAHT,EAGc,GAHd,EAGmB,GAHnB,EAGwB,GAHxB,EAG6B,GAH7B,EAGkC,GAHlC,EAGuC,GAHvC,EAG4C,GAH5C,EAGiD,GAHjD,CAAT;AAAA,aAKIC,KAAK,CACD,GADC,EACI,GADJ,EACS,GADT,EACc,GADd,EACmB,GADnB,EACwB,GADxB,EAC6B,GAD7B,EACkC,IADlC,EACwC,GADxC,EAC6C,GAD7C,EACkD,GADlD,EAED,GAFC,EAEI,GAFJ,EAES,GAFT,EAEc,GAFd,EAEmB,GAFnB,EAEwB,GAFxB,EAE6B,GAF7B,EAEkC,GAFlC,EAEuC,GAFvC,EAE4C,GAF5C,EAEiD,GAFjD,EAGD,GAHC,EAGI,GAHJ,EAGS,IAHT,EAGe,IAHf,EAGqB,KAHrB,EAG4B,EAH5B,EAGgC,GAHhC,EAGqC,EAHrC,EAGyC,GAHzC,EAG8C,IAH9C,EAGoD,IAHpD,CALT;;AAWA,cAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAIF,GAAGG,MAAvB,EAA+BD,GAA/B,EAAoC;;AAEhCH,sBAASA,OAAOK,KAAP,CAAaJ,GAAGE,CAAH,CAAb,EAAoBG,IAApB,CAAyBJ,GAAGC,CAAH,CAAzB,CAAT;AACAH,sBAASA,OAAOK,KAAP,CAAaJ,GAAGE,CAAH,EAAMI,WAAN,EAAb,EAAkCD,IAAlC,CAAuCJ,GAAGC,CAAH,EAAMI,WAAN,EAAvC,CAAT;AAEH;;AAEDP,kBAASA,OAAOQ,OAAP,CAAe,iBAAf,EAAkC,GAAlC,CAAT;;AAEA,gBAAOR,MAAP;AAEH,MAxBD;;AA0BA,YAAOlC,OAAP;AAEH,EApFgB,CAoFf,EApFe,CAAjB,C;;;;;;;;ACPA;;;;;;;;AAQArC,QAAOC,OAAP,GAAkB,UAAU+E,SAAV,EAAqB;;AAEnC,SAAI1C,SAASC,MAAMD,MAAnB;;AAEA;;;;;AAKA0C,eAAUC,aAAV,GAA0B,UAAUC,KAAV,EAAiB;;AAEvC,iBAAQA,MAAMxB,OAAd;AACI,kBAAKpB,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBC,KAAtB;AAA8BsB,kCAAiBD,KAAjB,EAA6B;AAD/D;AAIH,MAND;;AAQA;;;;;AAKAF,eAAUI,eAAV,GAA4B,UAAUF,KAAV,EAAiB;;AAEzC,iBAAQA,MAAMxB,OAAd;AACI,kBAAKpB,OAAOqB,IAAP,CAAYC,IAAZ,CAAiByB,GAAtB;AAA8BC,+CAA8BJ,KAA9B,EAA0D;AACxF,kBAAK5C,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBC,KAAtB;AAA8B0B,iDAAgCL,KAAhC,EAA0D;AACxF,kBAAK5C,OAAOqB,IAAP,CAAYC,IAAZ,CAAiB4B,GAAtB;AAA8BC,kDAAiCP,KAAjC,EAA0D;AACxF;AAA8BQ,mDAAkCR,KAAlC,EAA0D;AAJ5F;AAOH,MATD;;AAWA;;;;;AAKAF,eAAUW,WAAV,GAAwB,UAAUT,KAAV,EAAiB;;AAErC,iBAAQA,MAAMxB,OAAd;AACI,kBAAKpB,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBgC,EAAtB;AACA,kBAAKtD,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBS,IAAtB;AACA,kBAAK/B,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBiC,KAAtB;AACA,kBAAKvD,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBU,IAAtB;AAA8BwB,kCAAiBZ,KAAjB,EAAyB;AAJ3D;AAOH,MATD;;AAWA;;;;;;;;AAQA,SAAII,gCAAgC,SAAhCA,6BAAgC,CAAUJ,KAAV,EAAiB;;AAEjD;;;;AAIAA,eAAMpB,cAAN;;AAGA,aAAI,CAACxB,OAAOqB,IAAP,CAAYoC,YAAZ,CAAyBzD,OAAO0D,OAAP,CAAevD,WAAxC,CAAL,EAA2D;;AAEvD;AAEH;;AAED,aAAK,CAACH,OAAO2B,OAAP,CAAegC,MAArB,EAA+B;;AAE3B3D,oBAAO2B,OAAP,CAAeiC,IAAf;AAEH;;AAED,aAAI5D,OAAO2B,OAAP,CAAegC,MAAf,IAAyB,CAAC3D,OAAO2B,OAAP,CAAekC,OAAf,CAAuBF,MAArD,EAA6D;;AAEzD3D,oBAAO2B,OAAP,CAAekC,OAAf,CAAuBD,IAAvB;AAEH,UAJD,MAIO;;AAEH5D,oBAAO2B,OAAP,CAAekC,OAAf,CAAuBC,IAAvB;AAEH;AAEJ,MA/BD;;AAiCA;;;;;AAKA,SAAIjB,mBAAmB,SAAnBA,gBAAmB,GAAY;;AAE/B,aAAI7C,OAAO0D,OAAP,CAAeK,sBAAnB,EAA2C;;AAEvC;;;;AAIA/D,oBAAOgE,KAAP,CAAaC,UAAb,GAA0B,CAAC,CAA3B;;AAEAC;AAEH;AAEJ,MAdD;;AAgBA;;;;;;;;AAQA,SAAIA,uBAAuB,SAAvBA,oBAAuB,GAAY;;AAEnC,aAAIC,iBAAkBnE,OAAO4B,QAAP,CAAgBwC,kBAAtC;;AAEApE,gBAAO0D,OAAP,CAAeW,WAAf,CAA2B;AACvBC,mBAAQH,cADe;AAEvBI,oBAAQvE,OAAOH,KAAP,CAAasE,cAAb,EAA6BK,MAA7B;AAFe,UAA3B,EAGG,IAHH;;AAKAxE,gBAAO2B,OAAP,CAAe8C,IAAf;AACAzE,gBAAO2B,OAAP,CAAeiC,IAAf;AAEH,MAZD;;AAeA;;;;;;;;AAQA,SAAIX,kCAAkC,SAAlCA,+BAAkC,CAAUL,KAAV,EAAiB;;AAEnD,aAAIA,MAAMjC,MAAN,CAAa+D,eAAb,IAAgC,MAApC,EAA4C;;AAExC;AACA1E,oBAAOgE,KAAP,CAAaW,qBAAb;AAEH;;AAED,aAAIC,oBAA0B5E,OAAOgE,KAAP,CAAaa,oBAAb,MAAuC,CAArE;AAAA,aACIC,cAA0B9E,OAAO0D,OAAP,CAAevD,WAD7C;AAAA,aAEI4E,OAA0BD,YAAYvE,OAAZ,CAAoBwE,IAFlD;AAAA,aAGIC,0BAA0BhF,OAAO2B,OAAP,CAAegC,MAAf,IACE3D,OAAO2B,OAAP,CAAesD,OADjB,IAEErC,MAAMjC,MAAN,IAAgBX,OAAOlB,KAAP,CAAaoG,MAAb,CAAoBN,iBAApB,CALhD;;AAOA;AACA,aAAIO,mBAAmBnF,OAAOH,KAAP,CAAakF,IAAb,EAAmBI,gBAA1C;;AAEA;AACA,aAAIhB,iBAAiBnE,OAAO4B,QAAP,CAAgBwC,kBAArC;;AAEA;;;AAGA,aAAKY,uBAAL,EAA+B;;AAE3BpC,mBAAMpB,cAAN;;AAEAxB,oBAAO2B,OAAP,CAAekC,OAAf,CAAuBuB,WAAvB,CAAmCxC,KAAnC;;AAEA5C,oBAAO2B,OAAP,CAAeE,KAAf;;AAEA;;;AAGAe,mBAAMnB,eAAN;AACAmB,mBAAMyC,wBAAN;;AAEA;AAEH;;AAED;;;;AAIA,aAAKzC,MAAM0C,QAAN,IAAkBH,gBAAvB,EAA0C;;AAEtCvC,mBAAMnB,eAAN;AACAmB,mBAAMyC,wBAAN;AACA;AAEH;;AAED,aAAIE,mBAAmBC,OAAOC,YAAP,EAAvB;AAAA,aACIC,sBAAsBH,iBAAiBI,UAD3C;AAAA,aAEIC,sBAAsB5F,OAAOgE,KAAP,CAAa6B,QAAb,CAAsBC,QAAtB,EAF1B;AAAA,aAGIC,4CAA4C,KAHhD;;AAKA;;;AAGA,aAAKnD,MAAM0C,QAAN,IAAkB,CAACH,gBAAxB,EAA2C;;AAEvCnF,oBAAOgG,QAAP,CAAgBC,mBAAhB,CAAoCjG,OAAO0D,OAAP,CAAerD,YAAnD,EAAiEuC,KAAjE;AACAA,mBAAMpB,cAAN;AACA;AAEH;;AAED;;;;;AAKAuE,qDAA4CL,uBAAuBA,oBAAoBQ,UAApB,CAA+BxB,eAA/B,IAAkD,MAArH;;AAEA;;;AAGA,aACIgB,oBAAoBS,QAApB,IAAgCnG,OAAOqB,IAAP,CAAY+E,SAAZ,CAAsBC,IAAtD,IACA,CAACN,yCADD,IAEA,CAACH,mBAHL,EAIE;;AAEEhD,mBAAMpB,cAAN;;AAEAxB,oBAAOqB,IAAP,CAAYhD,GAAZ,CAAgB,wBAAhB;;AAEA2B,oBAAO0D,OAAP,CAAe4C,UAAf,CAA0B1B,iBAA1B;;AAEA;AACA,iBAAI,CAAC5E,OAAOlB,KAAP,CAAaoG,MAAb,CAAoBN,oBAAoB,CAAxC,EAA2C2B,WAA3C,CAAuD1F,IAAvD,EAAL,EAAoE;;AAEhEb,wBAAO2B,OAAP,CAAe6E,cAAf;AAEH;AAEJ,UAnBD,MAmBO;;AAEH,iBAAIC,aAAazG,OAAO0D,OAAP,CAAegD,UAAf,CAA0BhB,mBAA1B,CAAjB;;AAEA,iBAAKe,cAAcb,mBAAnB,EAAyC;;AAErChD,uBAAMpB,cAAN;AACAoB,uBAAMnB,eAAN;AACAmB,uBAAMyC,wBAAN;;AAEArF,wBAAOqB,IAAP,CAAYhD,GAAZ,CAAgB,kDAAhB;;AAEA2B,wBAAO0D,OAAP,CAAeW,WAAf,CAA2B;AACvBC,2BAAMH,cADiB;AAEvBI,4BAAOvE,OAAOH,KAAP,CAAasE,cAAb,EAA6BK,MAA7B;AAFgB,kBAA3B,EAGG,IAHH;;AAKAxE,wBAAO2B,OAAP,CAAe8C,IAAf;AACAzE,wBAAO2B,OAAP,CAAeiC,IAAf;;AAEA;AACA5D,wBAAO2B,OAAP,CAAe6E,cAAf;AAEH;AAEJ;;AAED;AACAxG,gBAAOb,EAAP,CAAUwH,UAAV;AAEH,MAlID;;AAoIA;;;;;;;AAOA,SAAIxD,mCAAmC,SAAnCA,gCAAmC,CAAUP,KAAV,EAAiB;;AAEpD;AACA5C,gBAAO2B,OAAP,CAAeE,KAAf;;AAEA;AACA7B,gBAAO2B,OAAP,CAAekC,OAAf,CAAuBhC,KAAvB;;AAEAe,eAAMpB,cAAN;AAEH,MAVD;;AAYA;;;;;;AAMA,SAAIgC,mBAAmB,SAAnBA,gBAAmB,CAAUZ,KAAV,EAAiB;;AAEpC5C,gBAAO0D,OAAP,CAAekD,kBAAf;;AAEA;AACA5G,gBAAO2B,OAAP,CAAeE,KAAf;AACA7B,gBAAO2B,OAAP,CAAe8C,IAAf;AAEH,MARD;;AAUA;;;;;;;AAOA,SAAIrB,oCAAoC,SAApCA,iCAAoC,GAAY;;AAEhDpD,gBAAO2B,OAAP,CAAeE,KAAf;;AAEA,aAAI,CAAC7B,OAAO2B,OAAP,CAAekF,MAAf,CAAsBC,aAA3B,EAA0C;;AAEtC9G,oBAAO2B,OAAP,CAAekF,MAAf,CAAsBhF,KAAtB;AACA7B,oBAAO0D,OAAP,CAAeqD,SAAf;AAEH;AAEJ,MAXD;;AAaA;;;;;;;;;;;;;AAaArE,eAAUsE,eAAV,GAA4B,UAAUpE,KAAV,EAAiB;;AAEzCqE;;AAEAjH,gBAAO0D,OAAP,CAAekD,kBAAf,CAAkChE,MAAMjC,MAAxC;AACAX,gBAAOb,EAAP,CAAUwH,UAAV;;AAEA,aAAIO,eAAelH,OAAO2B,OAAP,CAAekF,MAAf,CAAsBM,gBAAtB,EAAnB;AAAA,aACIC,eADJ;;AAGA;AACA,aAAIF,aAAa7E,MAAb,KAAwB,CAA5B,EAA+B;;AAE3BrC,oBAAO2B,OAAP,CAAekF,MAAf,CAAsBhF,KAAtB;AAEH;;AAED;AACA,aAAIe,MAAMjC,MAAN,CAAa+D,eAAb,IAAgC,MAApC,EAA4C;;AAExC1E,oBAAOgE,KAAP,CAAaW,qBAAb;AAEH;;AAED,aAAI3E,OAAO0D,OAAP,CAAevD,WAAf,KAA+B,IAAnC,EAAyC;;AAErC;;;AAGA,iBAAIkH,mBAAmBrH,OAAOlB,KAAP,CAAaoG,MAAb,CAAoB7C,MAApB,GAA6B,CAA7B,GAAiCrC,OAAOlB,KAAP,CAAaoG,MAAb,CAAoB7C,MAApB,GAA6B,CAA9D,GAAkE,CAAzF;;AAEA;AACA,iBAAIrC,OAAOlB,KAAP,CAAaoG,MAAb,CAAoB7C,MAAxB,EAAgC;;AAE5B;AACA+E,mCAAkBpH,OAAO0D,OAAP,CAAe4D,kBAAf,CAAkCtH,OAAOlB,KAAP,CAAaoG,MAAb,CAAoBmC,gBAApB,CAAlC,CAAlB;AAEH;;AAED;AACA,iBAAIrH,OAAOlB,KAAP,CAAaoG,MAAb,CAAoB7C,MAApB,IAA8BrC,OAAOlB,KAAP,CAAaoG,MAAb,CAAoBmC,gBAApB,EAAsCd,WAAtC,KAAsD,EAApF,IAA0Fa,gBAAgB7G,OAAhB,CAAwBwE,IAAxB,IAAgC/E,OAAO4B,QAAP,CAAgBwC,kBAA9I,EAAkK;;AAE9JpE,wBAAOgE,KAAP,CAAauD,UAAb,CAAwBF,gBAAxB;AAEH,cAJD,MAIO;;AAEH;AACA,qBAAIlD,iBAAiBnE,OAAO4B,QAAP,CAAgBwC,kBAArC;;AAEApE,wBAAO0D,OAAP,CAAeW,WAAf,CAA2B;AACvBC,2BAAQH,cADe;AAEvBI,4BAAQvE,OAAOH,KAAP,CAAasE,cAAb,EAA6BK,MAA7B;AAFe,kBAA3B;;AAKA;AACA,qBAAIxE,OAAOlB,KAAP,CAAaoG,MAAb,CAAoB7C,MAApB,KAA+B,CAAnC,EAAsC;;AAElCrC,4BAAOgE,KAAP,CAAauD,UAAb,CAAwBF,gBAAxB;AAEH,kBAJD,MAIO;;AAEH;AACArH,4BAAOgE,KAAP,CAAawD,cAAb,CAA4BH,gBAA5B;AAEH;AAEJ;AAEJ,UA5CD,MA4CO;;AAEH;AACArH,oBAAO2B,OAAP,CAAeC,QAAf,CAAwBC,KAAxB;AACA7B,oBAAO2B,OAAP,CAAekC,OAAf,CAAuBhC,KAAvB;AAEH;;AAED;;;AAGA7B,gBAAO2B,OAAP,CAAe8C,IAAf;AACAzE,gBAAO2B,OAAP,CAAeiC,IAAf;;AAEA,aAAI6D,eAAe,CAACzH,OAAO0D,OAAP,CAAevD,WAAf,CAA2BoG,WAA3B,CAAuC1F,IAAvC,EAApB;AAAA,aACI6G,kBAAkB1H,OAAO0D,OAAP,CAAevD,WAAf,CAA2BI,OAA3B,CAAmCwE,IADzD;AAAA,aAEI4C,gBAAgBD,mBAAmB1H,OAAO4B,QAAP,CAAgBwC,kBAFvD;;AAKA;AACApE,gBAAO2B,OAAP,CAAeiG,cAAf;;AAEA,aAAI,CAACH,YAAL,EAAmB;;AAEf;AACAzH,oBAAO0D,OAAP,CAAemE,SAAf;AAEH;;AAED,aAAKF,iBAAiBF,YAAtB,EAAqC;;AAEjC;AACAzH,oBAAO2B,OAAP,CAAe6E,cAAf;AAEH;AAGJ,MAzGD;;AA2GA;;;;;;;;;;AAUA,SAAIS,0CAA0C,SAA1CA,uCAA0C,GAAY;;AAEtD,aAAIa,YAAatC,OAAOC,YAAP,EAAjB;AAAA,aACIE,aAAamC,UAAUnC,UAD3B;AAAA,aAEIoC,OAAO,KAFX;;AAIA,aAAID,UAAUE,UAAV,KAAyB,CAA7B,EAAgC;;AAE5BhI,oBAAO0D,OAAP,CAAeK,sBAAf,GAAwC,IAAxC;AAEH,UAJD,MAIO;;AAEH,iBAAI,CAAC/D,OAAOqB,IAAP,CAAY4G,SAAZ,CAAsBtC,UAAtB,CAAL,EAAwC;;AAEpCA,8BAAaA,WAAWO,UAAxB;AAEH;;AAED;AACA,iBAAIP,WAAWjB,eAAX,IAA8B,MAAlC,EAA0C;;AAEtCqD,wBAAO,IAAP;AAEH;;AAED,oBAAOpC,WAAWjB,eAAX,IAA8B,MAArC,EAA6C;;AAEzCiB,8BAAaA,WAAWO,UAAxB;;AAEA,qBAAIP,WAAWjB,eAAX,IAA8B,MAAlC,EAA0C;;AAEtCqD,4BAAO,IAAP;AAEH;;AAED,qBAAIpC,cAAcuC,SAASC,IAA3B,EAAiC;;AAE7B;AAEH;AAEJ;;AAED;AACAnI,oBAAO0D,OAAP,CAAeK,sBAAf,GAAwC,CAACgE,IAAzC;AAEH;AAEJ,MAhDD;;AAkDA;;;;;;;;AAQArF,eAAU0F,oBAAV,GAAiC,UAAUxF,KAAV,EAAiB;;AAE9C,aAAIyF,SAAS,IAAb;;AAEArI,gBAAO2B,OAAP,CAAesD,OAAf,GAAyBoD,OAAO9H,OAAP,CAAe+D,IAAxC;;AAEAtE,gBAAO2B,OAAP,CAAekC,OAAf,CAAuBuB,WAAvB,CAAmCxC,KAAnC;AACA5C,gBAAO2B,OAAP,CAAeE,KAAf;AAEH,MATD;;AAWA;;;AAGAa,eAAU4F,iBAAV,GAA8B,YAAY;;AAEtC,aAAI,CAACtI,OAAOuI,KAAP,CAAa1E,OAAb,CAAqB/C,SAArB,CAA+B0H,QAA/B,CAAwC,QAAxC,CAAL,EAAwD;;AAEpDxI,oBAAO2B,OAAP,CAAekC,OAAf,CAAuBD,IAAvB;AAEH,UAJD,MAIO;;AAEH5D,oBAAO2B,OAAP,CAAekC,OAAf,CAAuBhC,KAAvB;AAEH;AAEJ,MAZD;;AAcA;;;;;;;;;;;AAWAa,eAAU+F,YAAV,GAAyB,UAAU7F,KAAV,EAAiB;;AAEtC,aAAI2B,QAAQ3B,MAAMjC,MAAlB,CAFsC,CAEZ;;AAE1B,iBAAQiC,MAAMxB,OAAd;;AAEI,kBAAKpB,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBU,IAAtB;AACA,kBAAKhC,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBiC,KAAtB;AACImF,+CAA8B9F,KAA9B;AACA;;AAEJ,kBAAK5C,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBqH,SAAtB;AACIC,mCAAkBrE,KAAlB,EAAyB3B,KAAzB;AACA;;AAEJ,kBAAK5C,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBgC,EAAtB;AACA,kBAAKtD,OAAOqB,IAAP,CAAYC,IAAZ,CAAiBS,IAAtB;AACI8G,4CAA2BjG,KAA3B;AACA;;AAdR;AAkBH,MAtBD;;AAwBA;;;;;;;;;;AAUA,SAAI8F,gCAAgC,SAAhCA,6BAAgC,CAAU9F,KAAV,EAAiB;;AAEjD,aAAIkF,YAActC,OAAOC,YAAP,EAAlB;AAAA,aACIP,SAAclF,OAAOlB,KAAP,CAAaoG,MAD/B;AAAA,aAEI4D,cAAchB,UAAUnC,UAF5B;AAAA,aAGIoD,iBAHJ;;AAKA;AACA,aAAI,CAACD,WAAL,EAAkB;;AAEd,oBAAO,KAAP;AAEH;;AAED;AACA,gBAAOA,YAAYpE,eAAZ,IAA+B,MAAtC,EAA8C;;AAE1CqE,iCAAoBD,YAAY5C,UAAhC;AACA4C,2BAAoBC,iBAApB;AAEH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;;AAEA,gBAAOF,eAAe5D,OAAO8D,oBAAP,CAAtB,EAAoD;;AAEhDA;AAEH;;AAED;;;;AAIA,aAAI,CAACF,YAAYvC,WAAjB,EAA8B;;AAE1BvG,oBAAOgE,KAAP,CAAawD,cAAb,CAA4BwB,oBAA5B;AACA;AAEH;;AAED;;;AAGA,aAAIC,mBAAsB,KAA1B;AAAA,aACIrD,sBAAsB,KAD1B;;AAGA,aAAIsD,SAAJ,EACIC,eADJ;;AAGAD,qBAAYJ,YAAYM,UAAZ,CAAuBN,YAAYM,UAAZ,CAAuB/G,MAAvB,GAAgC,CAAvD,CAAZ;;AAEA,aAAIrC,OAAOqB,IAAP,CAAY4G,SAAZ,CAAsBiB,SAAtB,CAAJ,EAAsC;;AAElCC,+BAAkBnJ,OAAO0D,OAAP,CAAe2F,8BAAf,CAA8CH,SAA9C,EAAyDA,UAAUE,UAAV,CAAqB/G,MAA9E,CAAlB;AAEH,UAJD,MAIO;;AAEH8G,+BAAkBD,SAAlB;AAEH;;AAEDD,4BAAmBnB,UAAUnC,UAAV,IAAwBwD,eAA3C;AACAvD,+BAAsBuD,gBAAgB9G,MAAhB,IAA0ByF,UAAUwB,YAA1D;;AAEA,aAAK,CAACL,gBAAD,IAAsB,CAACrD,mBAA5B,EAAkD;;AAE9C5F,oBAAOqB,IAAP,CAAYhD,GAAZ,CAAgB,qDAAhB;AACA,oBAAO,KAAP;AAEH;;AAED2B,gBAAOgE,KAAP,CAAawD,cAAb,CAA4BwB,oBAA5B;AAEH,MA3ED;;AA6EA;;;;;;;;;;;AAWA,SAAIH,6BAA6B,SAA7BA,0BAA6B,CAAUjG,KAAV,EAAiB;;AAE9C,aAAIkF,YAActC,OAAOC,YAAP,EAAlB;AAAA,aACIP,SAAclF,OAAOlB,KAAP,CAAaoG,MAD/B;AAAA,aAEI4D,cAAchB,UAAUnC,UAF5B;AAAA,aAGIoD,iBAHJ;;AAKA;AACA,aAAI,CAACD,WAAL,EAAkB;;AAEd,oBAAO,KAAP;AAEH;;AAED;;;AAGA,aAAKhB,UAAUwB,YAAV,KAA2B,CAAhC,EAAmC;;AAE/B,oBAAO,KAAP;AAEH;;AAED;AACA,gBAAOR,YAAYpE,eAAZ,IAA+B,MAAtC,EAA8C;;AAE1CqE,iCAAoBD,YAAY5C,UAAhC;AACA4C,2BAAoBC,iBAApB;AAEH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;;AAEA,gBAAOF,eAAe5D,OAAO8D,oBAAP,CAAtB,EAAoD;;AAEhDA;AAEH;;AAED;;;AAGA,aAAIO,oBAAsB,KAA1B;AAAA,aACIC,sBAAsB,KAD1B;;AAGA,aAAIC,UAAJ,EACIN,eADJ;;AAGA;;;;AAIA,aAAI,CAACL,YAAYvC,WAAjB,EAA8B;;AAE1BvG,oBAAOgE,KAAP,CAAa0F,kBAAb,CAAgCV,oBAAhC;AACA;AAEH;;AAEDS,sBAAaX,YAAYM,UAAZ,CAAuB,CAAvB,CAAb;;AAEA,aAAIpJ,OAAOqB,IAAP,CAAY4G,SAAZ,CAAsBwB,UAAtB,CAAJ,EAAuC;;AAEnCN,+BAAkBnJ,OAAO0D,OAAP,CAAe2F,8BAAf,CAA8CI,UAA9C,EAA0D,CAA1D,CAAlB;AAEH,UAJD,MAIO;;AAEHN,+BAAkBM,UAAlB;AAEH;;AAEDF,6BAAsBzB,UAAUnC,UAAV,IAAwBwD,eAA9C;AACAK,+BAAsB1B,UAAUwB,YAAV,KAA2B,CAAjD;;AAEA,aAAKC,qBAAqBC,mBAA1B,EAAgD;;AAE5CxJ,oBAAOgE,KAAP,CAAa0F,kBAAb,CAAgCV,oBAAhC;AAEH;AAEJ,MAjFD;;AAmFA;;;;;;;;;;;;AAYA,SAAIJ,oBAAoB,SAApBA,iBAAoB,CAAUrE,KAAV,EAAiB3B,KAAjB,EAAwB;;AAE5C,aAAIgC,oBAAoB5E,OAAOgE,KAAP,CAAaa,oBAAb,EAAxB;AAAA,aACI8E,KADJ;AAAA,aAEIC,eAFJ;AAAA,aAGIC,qBAHJ;;AAKA,aAAI7J,OAAOqB,IAAP,CAAYyI,aAAZ,CAA0BlH,MAAMjC,MAAhC,CAAJ,EAA6C;;AAEzC;AACA,iBAAIiC,MAAMjC,MAAN,CAAaL,KAAb,CAAmBO,IAAnB,MAA6B,EAAjC,EAAqC;;AAEjC0D,uBAAMrD,MAAN;AAEH,cAJD,MAIO;;AAEH;AAEH;AAEJ;;AAED,aAAIqD,MAAMgC,WAAN,CAAkB1F,IAAlB,EAAJ,EAA8B;;AAE1B8I,qBAAkB3J,OAAO0D,OAAP,CAAeqG,QAAf,EAAlB;AACAH,+BAAkBD,MAAMK,SAAN,GAAkBL,MAAMM,WAA1C;;AAEA,iBAAIjK,OAAOgE,KAAP,CAAa6B,QAAb,CAAsBqE,OAAtB,MAAmC,CAACN,eAApC,IAAuD5J,OAAOlB,KAAP,CAAaoG,MAAb,CAAoBN,oBAAoB,CAAxC,CAA3D,EAAuG;;AAEnG5E,wBAAO0D,OAAP,CAAeyG,WAAf,CAA2BvF,iBAA3B;AAEH,cAJD,MAIO;;AAEH;AAEH;AAEJ;;AAED,aAAI,CAACgF,eAAL,EAAsB;;AAElBrF,mBAAMrD,MAAN;AAEH;;AAGD2I,iCAAwB7J,OAAOuI,KAAP,CAAa6B,QAAb,CAAsBhB,UAAtB,CAAiC/G,MAAzD;;AAEA;;;AAGA,aAAIwH,0BAA0B,CAA9B,EAAiC;;AAE7B;AACA7J,oBAAO0D,OAAP,CAAevD,WAAf,GAA6B,IAA7B;;AAEA;AACAH,oBAAOb,EAAP,CAAUkL,eAAV;;AAEA;AACArK,oBAAOb,EAAP,CAAUwH,UAAV;;AAEA;AACAnB,oBAAO8E,UAAP,CAAkB,YAAY;;AAE1BtK,wBAAOgE,KAAP,CAAa0F,kBAAb,CAAgC,CAAhC;AAEH,cAJD,EAIG,EAJH;AAMH,UAlBD,MAkBO;;AAEH,iBAAI1J,OAAOgE,KAAP,CAAaC,UAAb,KAA4B,CAAhC,EAAmC;;AAE/B;AACAjE,wBAAOgE,KAAP,CAAa0F,kBAAb,CAAgC1J,OAAOgE,KAAP,CAAaC,UAA7C;AAEH,cALD,MAKO;;AAEH;AACAjE,wBAAOgE,KAAP,CAAawD,cAAb,CAA4BxH,OAAOgE,KAAP,CAAaC,UAAzC;AAEH;AAEJ;;AAEDjE,gBAAO2B,OAAP,CAAe8C,IAAf;;AAEA,aAAI,CAACzE,OAAO2B,OAAP,CAAegC,MAApB,EAA4B;;AAExB3D,oBAAO2B,OAAP,CAAeiC,IAAf;AAEH;;AAED;AACA5D,gBAAOb,EAAP,CAAUwH,UAAV;;AAEA;AACA/D,eAAMpB,cAAN;AAEH,MAnGD;;AAqGA;;;;;;;;AAQAkB,eAAU6H,yBAAV,GAAsC,UAAU3H,KAAV,EAAiB;;AAEnD;;;;;;AAMA,aAAI4H,kBAAkBxK,OAAO0D,OAAP,CAAevD,WAAf,CAA2BI,OAA3B,CAAmCwE,IAAzD;;AAEA/E,gBAAO2B,OAAP,CAAeC,QAAf,CAAwB6I,MAAxB,CAA+BD,eAA/B;;AAEA;AACAxK,gBAAO2B,OAAP,CAAekC,OAAf,CAAuBhC,KAAvB;AACA7B,gBAAO2B,OAAP,CAAeC,QAAf,CAAwB8I,iBAAxB;AAEH,MAhBD;;AAkBA,YAAOhI,SAAP;AAEH,EAt4BgB,CAs4Bd,EAt4Bc,CAAjB,C;;;;;;;;ACRA;;;;;;;AAOAhF,QAAOC,OAAP,GAAkB,UAAUqG,KAAV,EAAiB;;AAE/B,SAAIhE,SAASC,MAAMD,MAAnB;;AAEA;;;AAGAgE,WAAMC,UAAN,GAAmB,IAAnB;;AAEA;;;AAGAD,WAAM2G,MAAN,GAAe,IAAf;;AAEA;;;AAGA3G,WAAM4G,gBAAN,GAAyB,IAAzB;;AAEA;;;;;;AAMA5G,WAAM6G,GAAN,GAAY,UAAWC,EAAX,EAAeC,KAAf,EAAsBJ,MAAtB,EAA8B;;AAEtCA,kBAASA,UAAU3G,MAAM2G,MAAhB,IAA0B,CAAnC;AACAI,iBAASA,SAAU/G,MAAM4G,gBAAhB,IAAoC,CAA7C;;AAEA,aAAII,SAASF,GAAG1B,UAAhB;AAAA,aACI6B,SADJ;;AAGA,aAAKD,OAAO3I,MAAP,KAAkB,CAAvB,EAA2B;;AAEvB4I,yBAAYH,EAAZ;AAEH,UAJD,MAIO;;AAEHG,yBAAYD,OAAOD,KAAP,CAAZ;AAEH;;AAED;AACA,aAAID,GAAGpG,eAAH,IAAsB,MAA1B,EAAkC;;AAE9BoG,gBAAGI,KAAH;AACA;AAEH;;AAED,aAAIlL,OAAOqB,IAAP,CAAY4G,SAAZ,CAAsBgD,SAAtB,CAAJ,EAAsC;;AAElCA,yBAAYjL,OAAO0D,OAAP,CAAe2F,8BAAf,CAA8C4B,SAA9C,EAAyDA,UAAU7B,UAAV,CAAqB/G,MAA9E,CAAZ;AAEH;;AAED,aAAIsH,QAAYzB,SAASiD,WAAT,EAAhB;AAAA,aACIrD,YAAYtC,OAAOC,YAAP,EADhB;;AAGAD,gBAAO8E,UAAP,CAAkB,YAAY;;AAE1BX,mBAAMyB,QAAN,CAAeH,SAAf,EAA0BN,MAA1B;AACAhB,mBAAM0B,MAAN,CAAaJ,SAAb,EAAwBN,MAAxB;;AAEA7C,uBAAUwD,eAAV;AACAxD,uBAAUyD,QAAV,CAAmB5B,KAAnB;;AAEA3J,oBAAOgE,KAAP,CAAaW,qBAAb;AAEH,UAVD,EAUG,EAVH;AAYH,MA/CD;;AAiDA;;;;AAIAX,WAAMW,qBAAN,GAA8B,YAAY;;AAEtC;AACA,aAAImD,YAActC,OAAOC,YAAP,EAAlB;AAAA,aACIP,SAAclF,OAAOlB,KAAP,CAAaoG,MAD/B;AAAA,aAEI4D,cAAchB,UAAUnC,UAF5B;AAAA,aAGIoD,iBAHJ;;AAKA,aAAI,CAACD,WAAL,EAAkB;;AAEd;AAEH;;AAED;AACA,gBAAOA,YAAYpE,eAAZ,IAA+B,MAAtC,EAA8C;;AAE1CqE,iCAAoBD,YAAY5C,UAAhC;AACA4C,2BAAoBC,iBAApB;AAEH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;;AAEA,gBAAOF,eAAe5D,OAAO8D,oBAAP,CAAtB,EAAoD;;AAEhDA;AAEH;;AAEDhF,eAAMC,UAAN,GAAmB+E,oBAAnB;AAEH,MAjCD;;AAmCA;;;AAGAhF,WAAMa,oBAAN,GAA6B,YAAY;;AAErC,gBAAOb,MAAMC,UAAb;AAEH,MAJD;;AAMA;;;AAGAD,WAAMwD,cAAN,GAAuB,UAAUuD,KAAV,EAAiB;;AAEpC,aAAI7F,SAASlF,OAAOlB,KAAP,CAAaoG,MAA1B;AAAA,aACIsG,YAAYtG,OAAO6F,QAAQ,CAAf,CADhB;;AAGA,aAAI,CAACS,SAAL,EAAgB;;AAEZxL,oBAAOqB,IAAP,CAAYhD,GAAZ,CAAgB,wBAAhB;AACA;AAEH;;AAED;;;;AAIA,aAAI,CAACmN,UAAUpC,UAAV,CAAqB/G,MAA1B,EAAkC;;AAE9B,iBAAIoJ,mBAAmBvD,SAASwD,cAAT,CAAwB,EAAxB,CAAvB;;AAEAF,uBAAUG,WAAV,CAAsBF,gBAAtB;AAEH;;AAEDzL,gBAAOgE,KAAP,CAAaC,UAAb,GAA0B8G,QAAQ,CAAlC;AACA/K,gBAAOgE,KAAP,CAAa6G,GAAb,CAAiBW,SAAjB,EAA4B,CAA5B,EAA+B,CAA/B;AACAxL,gBAAO0D,OAAP,CAAekD,kBAAf,CAAkC4E,SAAlC;AAEH,MA5BD;;AA8BA;;;;AAIAxH,WAAMuD,UAAN,GAAmB,UAAUwD,KAAV,EAAiB;;AAEhC,aAAI7F,SAASlF,OAAOlB,KAAP,CAAaoG,MAA1B;AAAA,aACI0G,cAAc1G,OAAO6F,KAAP,CADlB;;AAGA,aAAK,CAACa,WAAN,EAAoB;;AAEhB;AAEH;;AAED;;;;AAIA,aAAI,CAACA,YAAYxC,UAAZ,CAAuB/G,MAA5B,EAAoC;;AAEhC,iBAAIoJ,mBAAmBvD,SAASwD,cAAT,CAAwB,EAAxB,CAAvB;;AAEAE,yBAAYD,WAAZ,CAAwBF,gBAAxB;AAEH;;AAEDzL,gBAAOgE,KAAP,CAAaC,UAAb,GAA0B8G,KAA1B;AACA/K,gBAAOgE,KAAP,CAAa6G,GAAb,CAAiBe,WAAjB,EAA8B,CAA9B,EAAiC,CAAjC;AACA5L,gBAAO0D,OAAP,CAAekD,kBAAf,CAAkCgF,WAAlC;AAEH,MA3BD;;AA6BA;;;AAGA5H,WAAM0F,kBAAN,GAA2B,UAAUqB,KAAV,EAAiB;;AAExCA,iBAAQA,SAAS,CAAjB;;AAEA,aAAI7F,SAASlF,OAAOlB,KAAP,CAAaoG,MAA1B;AAAA,aACI2G,gBAAgB3G,OAAO6F,QAAQ,CAAf,CADpB;AAAA,aAEIe,aAFJ;AAAA,aAGIC,qBAHJ;AAAA,aAIIN,gBAJJ;;AAOA,aAAI,CAACI,aAAL,EAAoB;;AAEhB7L,oBAAOqB,IAAP,CAAYhD,GAAZ,CAAgB,2BAAhB;AACA;AAEH;;AAEDyN,yBAAgB9L,OAAO0D,OAAP,CAAe2F,8BAAf,CAA8CwC,aAA9C,EAA6DA,cAAczC,UAAd,CAAyB/G,MAAtF,CAAhB;AACA0J,iCAAwBD,cAAczJ,MAAtC;;AAEA;;;;AAIA,aAAI,CAACwJ,cAAczC,UAAd,CAAyB/G,MAA9B,EAAsC;;AAElCoJ,gCAAmBvD,SAASwD,cAAT,CAAwB,EAAxB,CAAnB;AACAG,2BAAcF,WAAd,CAA0BF,gBAA1B;AAEH;AACDzL,gBAAOgE,KAAP,CAAaC,UAAb,GAA0B8G,QAAQ,CAAlC;AACA/K,gBAAOgE,KAAP,CAAa6G,GAAb,CAAiBgB,aAAjB,EAAgCA,cAAczC,UAAd,CAAyB/G,MAAzB,GAAkC,CAAlE,EAAqE0J,qBAArE;AACA/L,gBAAO0D,OAAP,CAAekD,kBAAf,CAAkC1B,OAAO6F,QAAQ,CAAf,CAAlC;AAEH,MAnCD;;AAqCA/G,WAAM6B,QAAN,GAAiB;;AAEbqE,kBAAU,mBAAY;;AAElB,iBAAIpC,YAAkBtC,OAAOC,YAAP,EAAtB;AAAA,iBACI6D,eAAkBxB,UAAUwB,YADhC;AAAA,iBAEI3D,aAAkBmC,UAAUnC,UAFhC;AAAA,iBAGIyB,kBAAkBpH,OAAO0D,OAAP,CAAe4D,kBAAf,CAAkC3B,UAAlC,CAHtB;AAAA,iBAIIqG,gBAAkB5E,gBAAgBgC,UAAhB,CAA2B,CAA3B,CAJtB;;AAMA,iBAAI,CAACpJ,OAAOqB,IAAP,CAAY4G,SAAZ,CAAsBtC,UAAtB,CAAL,EAAwC;;AAEpCA,8BAAaA,WAAWO,UAAxB;AAEH;;AAED,iBAAI+F,cAAetG,eAAeqG,cAAc5C,UAAd,CAAyB,CAAzB,CAAlC;AAAA,iBACI8C,eAAe5C,iBAAiB,CADpC;;AAGA,oBAAO2C,eAAeC,YAAtB;AAEH,UArBY;;AAuBbpG,mBAAW,oBAAY;;AAEnB,iBAAIgC,YAAetC,OAAOC,YAAP,EAAnB;AAAA,iBACI6D,eAAexB,UAAUwB,YAD7B;AAAA,iBAEI3D,aAAemC,UAAUnC,UAF7B;;AAIA;AACA,oBAAO,CAACA,UAAD,IAAe,CAACA,WAAWtD,MAA3B,IAAqCiH,iBAAiB3D,WAAWtD,MAAxE;AAEH;AAhCY,MAAjB;;AAoCA;;;;AAIA2B,WAAMmI,UAAN,GAAmB,UAAUC,IAAV,EAAgB;;AAE/B,aAAItE,SAAJ;AAAA,aAAe6B,KAAf;AAAA,aACI0C,WAAWD,IADf;;AAGA,aAAIA,KAAKjG,QAAL,IAAiBnG,OAAOqB,IAAP,CAAY+E,SAAZ,CAAsBkG,iBAA3C,EAA8D;;AAE1DD,wBAAWD,KAAKlD,SAAhB;AAEH;;AAEDpB,qBAAYtC,OAAOC,YAAP,EAAZ;;AAEAkE,iBAAQ7B,UAAUyE,UAAV,CAAqB,CAArB,CAAR;AACA5C,eAAM6C,cAAN;;AAEA7C,eAAMwC,UAAN,CAAiBC,IAAjB;;AAEAzC,eAAM8C,aAAN,CAAoBJ,QAApB;AACA1C,eAAM+C,QAAN,CAAe,IAAf;;AAEA5E,mBAAUwD,eAAV;AACAxD,mBAAUyD,QAAV,CAAmB5B,KAAnB;AAGH,MAzBD;;AA2BA,YAAO3F,KAAP;AAEH,EAzSgB,CAySd,EAzSc,CAAjB,C;;;;;;;;sjBCPA;;;;;;;;;;;AAWA;;;;;;;;AAEAtG,QAAOC,OAAP;AAAA;AAAA;;;AAEI;;;;AAFJ,6BAMsB;;AAEd,oBAAO,SAAP;AAEH;;AAED;;;;;;AAZJ;;AAiBI,sBAAYC,MAAZ,EAAoB;AAAA;;AAEhB,cAAKA,MAAL,GAAcA,MAAd;AACA,cAAK+O,MAAL,GAAc,IAAd;;AAEA,cAAKC,GAAL,GAAW;AACPrI,oBAAO,UADA;AAEPb,sBAAS,mBAFF;AAGPmJ,wBAAW,qBAHJ;AAIPC,0BAAa;AAJN,UAAX;;AAOA,cAAKC,YAAL,GAAoB,IAApB;AACA,cAAKC,aAAL,GAAqB,CAArB;AAEH;;AAED;;;;;;AAlCJ;AAAA;;;AAqEI;;;;;;;AArEJ,uCA4EkBC,UA5ElB,EA4EmD;AAAA,iBAArBC,WAAqB,uEAAP,KAAO;;;AAE3C,iBAAI3I,QAAY,cAAE4I,IAAF,CAAO,KAAP,EAAc,KAAKP,GAAL,CAASrI,KAAvB,CAAhB;AAAA,iBACI6I,eAAe,cAAED,IAAF,CAAO,KAAP,EAAc,KAAKP,GAAL,CAASlJ,OAAvB,CADnB;;AAGA0J,0BAAazB,WAAb,CAAyBsB,UAAzB;AACA1I,mBAAMoH,WAAN,CAAkByB,YAAlB;;AAEA,iBAAIF,WAAJ,EAAiB;;AAEbE,8BAAatM,SAAb,CAAuBC,GAAvB,CAA2B,KAAK6L,GAAL,CAASC,SAApC;AAEH;;AAEDtI,mBAAMhE,OAAN,CAAc8M,MAAd,GAAuB,KAAKL,aAAL,EAAvB;;AAEA,oBAAOzI,KAAP;AAEH;AA9FL;AAAA;;;AAgGI;;;;;;;;;AAhGJ,4CAyGuB6H,IAzGvB,EAyG6B;;AAErB,iBAAI,CAAC,cAAEkB,MAAF,CAASlB,IAAT,CAAL,EAAqB;;AAEjBA,wBAAOA,KAAKlG,UAAZ;AAEH;;AAED,iBAAIkG,SAAS,KAAKO,MAAL,CAAYxN,EAAZ,CAAeoJ,KAAf,CAAqB6B,QAA9B,IAA0CgC,SAASlE,SAASC,IAAhE,EAAsE;;AAElE,wBAAO,IAAP;AAEH,cAJD,MAIO;;AAEH,wBAAMiE,KAAKtL,SAAL,IAAkB,CAACsL,KAAKtL,SAAL,CAAe0H,QAAf,CAAwB,KAAKoE,GAAL,CAASrI,KAAjC,CAAzB,EAAkE;;AAE9D6H,4BAAOA,KAAKlG,UAAZ;AAEH;;AAED,wBAAOkG,IAAP;AAEH;AAEJ;AAjIL;AAAA;;;AAmII;;;;;;;;AAnIJ,qCA2IgBrH,IA3IhB,EA2IsB;;AAEd,iBAAIwI,WAAW,KAAKC,aAAL,CAAmBzI,IAAnB,CAAf;;AAEA,iBAAI,KAAK5E,WAAT,EAAsB;;AAElB,sBAAKA,WAAL,CAAiBsN,qBAAjB,CAAuC,UAAvC,EAAmDF,QAAnD;AAEH,cAJD,MAIO;;AAEH;;;AAGA,sBAAKZ,MAAL,CAAYxN,EAAZ,CAAeoJ,KAAf,CAAqB6B,QAArB,CAA8BuB,WAA9B,CAA0C4B,QAA1C;AAEH;;AAED;;;AAGA,kBAAKpN,WAAL,GAAmBoN,QAAnB;;AAEA,oBAAOA,SAAShN,OAAT,CAAiB8M,MAAxB;AAEH;AAnKL;AAAA;AAAA,2BAsCcV,MAtCd,EAsCsB;;AAEd,kBAAKA,MAAL,GAAcA,MAAd;AAEH;;AAED;;;;;;AA5CJ;AAAA;AAAA,6BAiDsB;;AAEd,oBAAO,KAAKI,YAAZ;AAEH;;AAED;;;;;AAvDJ;AAAA,2BA4DoBX,IA5DpB,EA4D0B;;AAElB,iBAAIhF,kBAAkB,KAAKE,kBAAL,CAAwB8E,IAAxB,CAAtB;;AAEA,kBAAKW,YAAL,GAAoB3F,eAApB;AAEH;AAlEL;;AAAA;AAAA;;AAuKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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d;AAEH;AAvBL;;AAAA;AAAA;;AAqEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,W;;;;;;;;;;;;ACjRA;;;AAGAjP,QAAOC,OAAP;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAEI;;;;;;AAMA;;;;;;;;;AARJ,kCAiBoB+c,MAjBpB,EAiBqE;AAAA,iBAAzCvC,OAAyC,uEAA/B,YAAM,CAAE,CAAuB;AAAA,iBAArBwC,QAAqB,uEAAV,YAAM,C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CA;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,W","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4cabd30a2732cc381e19","/**\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 */\nlet modules = editorModules.map( module => {\n\n return require('./components/modules/' + module );\n\n});\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 this.moduleInstances[Module.name] = 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 modules = {};\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 modules[moduleName] = this.moduleInstances[moduleName];\n\n }\n\n return modules;\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\"./_anchors\": 2,\n\t\"./_anchors.js\": 2,\n\t\"./_callbacks\": 3,\n\t\"./_callbacks.js\": 3,\n\t\"./_caret\": 4,\n\t\"./_caret.js\": 4,\n\t\"./_content\": 5,\n\t\"./_content.js\": 5,\n\t\"./_destroyer\": 7,\n\t\"./_destroyer.js\": 7,\n\t\"./_listeners\": 8,\n\t\"./_listeners.js\": 8,\n\t\"./_notifications\": 9,\n\t\"./_notifications.js\": 9,\n\t\"./_parser\": 10,\n\t\"./_parser.js\": 10,\n\t\"./_paste\": 11,\n\t\"./_paste.js\": 11,\n\t\"./_sanitizer\": 12,\n\t\"./_sanitizer.js\": 12,\n\t\"./_saver\": 14,\n\t\"./_saver.js\": 14,\n\t\"./_transport\": 15,\n\t\"./_transport.js\": 15,\n\t\"./blockManager\": 16,\n\t\"./blockManager.js\": 16,\n\t\"./eventDispatcher\": 18,\n\t\"./eventDispatcher.js\": 18,\n\t\"./renderer\": 19,\n\t\"./renderer.js\": 19,\n\t\"./toolbar\": 21,\n\t\"./toolbar.js\": 21,\n\t\"./toolbar/inline\": 22,\n\t\"./toolbar/inline.js\": 22,\n\t\"./toolbar/settings\": 23,\n\t\"./toolbar/settings.js\": 23,\n\t\"./toolbar/toolbar\": 24,\n\t\"./toolbar/toolbar.js\": 24,\n\t\"./toolbar/toolbox\": 25,\n\t\"./toolbar/toolbox.js\": 25,\n\t\"./tools\": 26,\n\t\"./tools.js\": 26,\n\t\"./ui\": 27,\n\t\"./ui.js\": 27\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\treturn map[req] || (function() { throw new Error(\"Cannot find module '\" + req + \"'.\") }());\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/modules ^\\.\\/.*$\n// module id = 1\n// module chunks = 0","/**\n * Codex Editor Anchors module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nmodule.exports = function (anchors) {\n\n let editor = codex.editor;\n\n anchors.input = null;\n anchors.currentNode = null;\n\n anchors.settingsOpened = function (currentBlock) {\n\n anchors.currentNode = currentBlock;\n anchors.input.value = anchors.currentNode.dataset.anchor || '';\n\n };\n\n anchors.anchorChanged = function (e) {\n\n var newAnchor = e.target.value = anchors.rusToTranslit(e.target.value);\n\n anchors.currentNode.dataset.anchor = newAnchor;\n\n if (newAnchor.trim() !== '') {\n\n anchors.currentNode.classList.add(editor.ui.className.BLOCK_WITH_ANCHOR);\n\n } else {\n\n anchors.currentNode.classList.remove(editor.ui.className.BLOCK_WITH_ANCHOR);\n\n }\n\n };\n\n anchors.keyDownOnAnchorInput = function (e) {\n\n if (e.keyCode == editor.core.keys.ENTER) {\n\n e.preventDefault();\n e.stopPropagation();\n\n e.target.blur();\n editor.toolbar.settings.close();\n\n }\n\n };\n\n anchors.keyUpOnAnchorInput = function (e) {\n\n if (e.keyCode >= editor.core.keys.LEFT && e.keyCode <= editor.core.keys.DOWN) {\n\n e.stopPropagation();\n\n }\n\n };\n\n anchors.rusToTranslit = function (string) {\n\n var ru = [\n 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й',\n 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф',\n 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ы', 'Ь', 'Э', 'Ю', 'Я'\n ],\n en = [\n 'A', 'B', 'V', 'G', 'D', 'E', 'E', 'Zh', 'Z', 'I', 'Y',\n 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F',\n 'H', 'C', 'Ch', 'Sh', 'Sch', '', 'Y', '', 'E', 'Yu', 'Ya'\n ];\n\n for (var i = 0; i < ru.length; i++) {\n\n string = string.split(ru[i]).join(en[i]);\n string = string.split(ru[i].toLowerCase()).join(en[i].toLowerCase());\n\n }\n\n string = string.replace(/[^0-9a-zA-Z_]+/g, '-');\n\n return string;\n\n };\n\n return anchors;\n\n}({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_anchors.js","/**\n * @module Codex Editor Callbacks module\n * @description Module works with editor added Elements\n *\n * @author Codex Team\n * @version 1.4.0\n */\n\nmodule.exports = (function (callbacks) {\n\n let editor = codex.editor;\n\n /**\n * used by UI module\n * @description Routes all keydowns on document\n * @param {Object} event\n */\n callbacks.globalKeydown = function (event) {\n\n switch (event.keyCode) {\n case editor.core.keys.ENTER : enterKeyPressed_(event); break;\n }\n\n };\n\n /**\n * used by UI module\n * @description Routes all keydowns on redactors area\n * @param {Object} event\n */\n callbacks.redactorKeyDown = function (event) {\n\n switch (event.keyCode) {\n case editor.core.keys.TAB : tabKeyPressedOnRedactorsZone_(event); break;\n case editor.core.keys.ENTER : enterKeyPressedOnRedactorsZone_(event); break;\n case editor.core.keys.ESC : escapeKeyPressedOnRedactorsZone_(event); break;\n default : defaultKeyPressedOnRedactorsZone_(event); break;\n }\n\n };\n\n /**\n * used by UI module\n * @description Routes all keyup events\n * @param {Object} event\n */\n callbacks.globalKeyup = function (event) {\n\n switch (event.keyCode) {\n case editor.core.keys.UP :\n case editor.core.keys.LEFT :\n case editor.core.keys.RIGHT :\n case editor.core.keys.DOWN : arrowKeyPressed_(event); break;\n }\n\n };\n\n /**\n * @param {Object} event\n * @private\n *\n * Handles behaviour when tab pressed\n * @description if Content is empty show toolbox (if it is closed) or leaf tools\n * uses Toolbars toolbox module to handle the situation\n */\n var tabKeyPressedOnRedactorsZone_ = function (event) {\n\n /**\n * Wait for solution. Would like to know the behaviour\n * @todo Add spaces\n */\n event.preventDefault();\n\n\n if (!editor.core.isBlockEmpty(editor.content.currentNode)) {\n\n return;\n\n }\n\n if ( !editor.toolbar.opened ) {\n\n editor.toolbar.open();\n\n }\n\n if (editor.toolbar.opened && !editor.toolbar.toolbox.opened) {\n\n editor.toolbar.toolbox.open();\n\n } else {\n\n editor.toolbar.toolbox.leaf();\n\n }\n\n };\n\n /**\n * Handles global EnterKey Press\n * @see enterPressedOnBlock_\n * @param {Object} event\n */\n var enterKeyPressed_ = function () {\n\n if (editor.content.editorAreaHightlighted) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n editor.caret.inputIndex = -1;\n\n enterPressedOnBlock_();\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n *\n * @param {Event} event\n * @private\n *\n * @description Inserts new block with initial type from settings\n */\n var enterPressedOnBlock_ = function () {\n\n var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n\n editor.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : editor.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n editor.toolbar.move();\n editor.toolbar.open();\n\n };\n\n\n /**\n * ENTER key handler\n *\n * @param {Object} event\n * @private\n *\n * @description Makes new block with initial type from settings\n */\n var enterKeyPressedOnRedactorsZone_ = function (event) {\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n editor.caret.saveCurrentInputIndex();\n\n }\n\n var currentInputIndex = editor.caret.getCurrentInputIndex() || 0,\n workingNode = editor.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = editor.toolbar.opened &&\n editor.toolbar.current &&\n event.target == editor.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = editor.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n editor.toolbar.toolbox.toolClicked(event);\n\n editor.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow paragraph lineBreaks with shift enter\n * Or if shiftkey pressed and enter and enabledLineBreaks, the let new block creation\n */\n if ( event.shiftKey || enableLineBreaks ) {\n\n event.stopPropagation();\n event.stopImmediatePropagation();\n return;\n\n }\n\n var currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = editor.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Allow making new

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks ) {\n\n editor.callback.enterPressedOnBlock(editor.content.currentBlock, event);\n event.preventDefault();\n return;\n\n }\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != 'true';\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == editor.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ) {\n\n event.preventDefault();\n\n editor.core.log('Splitting Text node...');\n\n editor.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!editor.state.inputs[currentInputIndex + 1].textContent.trim()) {\n\n editor.toolbar.showPlusButton();\n\n }\n\n } else {\n\n var islastNode = editor.content.isLastNode(currentSelectedNode);\n\n if ( islastNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n editor.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n editor.content.insertBlock({\n type: NEW_BLOCK_TYPE,\n block: editor.tools[NEW_BLOCK_TYPE].render()\n }, true);\n\n editor.toolbar.move();\n editor.toolbar.open();\n\n /** Show plus button with empty block */\n editor.toolbar.showPlusButton();\n\n }\n\n }\n\n /** get all inputs after new appending block */\n editor.ui.saveInputs();\n\n };\n\n /**\n * Escape behaviour\n * @param event\n * @private\n *\n * @description Closes toolbox and toolbar. Prevents default behaviour\n */\n var escapeKeyPressedOnRedactorsZone_ = function (event) {\n\n /** Close all toolbar */\n editor.toolbar.close();\n\n /** Close toolbox */\n editor.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n /**\n * @param {Event} event\n * @private\n *\n * closes and moves toolbar\n */\n var arrowKeyPressed_ = function (event) {\n\n editor.content.workingNodeChanged();\n\n /* Closing toolbar */\n editor.toolbar.close();\n editor.toolbar.move();\n\n };\n\n /**\n * @private\n * @param {Event} event\n *\n * @description Closes all opened bars from toolbar.\n * If block is mark, clears highlightning\n */\n var defaultKeyPressedOnRedactorsZone_ = function () {\n\n editor.toolbar.close();\n\n if (!editor.toolbar.inline.actionsOpened) {\n\n editor.toolbar.inline.close();\n editor.content.clearMark();\n\n }\n\n };\n\n /**\n * Handler when clicked on redactors area\n *\n * @protected\n * @param event\n *\n * @description Detects clicked area. If it is first-level block area, marks as detected and\n * on next enter press will be inserted new block\n * Otherwise, save carets position (input index) and put caret to the editable zone.\n *\n * @see detectWhenClickedOnFirstLevelBlockArea_\n *\n */\n callbacks.redactorClicked = function (event) {\n\n detectWhenClickedOnFirstLevelBlockArea_();\n\n editor.content.workingNodeChanged(event.target);\n editor.ui.saveInputs();\n\n var selectedText = editor.toolbar.inline.getSelectionText(),\n firstLevelBlock;\n\n /** If selection range took off, then we hide inline toolbar */\n if (selectedText.length === 0) {\n\n editor.toolbar.inline.close();\n\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n editor.caret.saveCurrentInputIndex();\n\n }\n\n if (editor.content.currentNode === null) {\n\n /**\n * If inputs in redactor does not exits, then we put input index 0 not -1\n */\n var indexOfLastInput = editor.state.inputs.length > 0 ? editor.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (editor.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n firstLevelBlock = editor.content.getFirstLevelBlock(editor.state.inputs[indexOfLastInput]);\n\n }\n\n /** If input is empty, then we set caret to the last input */\n if (editor.state.inputs.length && editor.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == editor.settings.initialBlockPlugin) {\n\n editor.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n\n editor.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : editor.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (editor.state.inputs.length === 1) {\n\n editor.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n editor.caret.setToNextBlock(indexOfLastInput);\n\n }\n\n }\n\n } else {\n\n /** Close all panels */\n editor.toolbar.settings.close();\n editor.toolbar.toolbox.close();\n\n }\n\n /**\n * Move toolbar and open\n */\n editor.toolbar.move();\n editor.toolbar.open();\n\n var inputIsEmpty = !editor.content.currentNode.textContent.trim(),\n currentNodeType = editor.content.currentNode.dataset.tool,\n isInitialType = currentNodeType == editor.settings.initialBlockPlugin;\n\n\n /** Hide plus buttons */\n editor.toolbar.hidePlusButton();\n\n if (!inputIsEmpty) {\n\n /** Mark current block */\n editor.content.markBlock();\n\n }\n\n if ( isInitialType && inputIsEmpty ) {\n\n /** Show plus button */\n editor.toolbar.showPlusButton();\n\n }\n\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n *\n * @private\n *\n * @description Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n var detectWhenClickedOnFirstLevelBlockArea_ = function () {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount === 0) {\n\n editor.content.editorAreaHightlighted = true;\n\n } else {\n\n if (!editor.core.isDomNode(anchorNode)) {\n\n anchorNode = anchorNode.parentNode;\n\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n\n flag = true;\n\n }\n\n while (anchorNode.contentEditable != 'true') {\n\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n\n flag = true;\n\n }\n\n if (anchorNode == document.body) {\n\n break;\n\n }\n\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n editor.content.editorAreaHightlighted = !flag;\n\n }\n\n };\n\n /**\n * Toolbar button click handler\n *\n * @param {Object} event - cursor to the button\n * @protected\n *\n * @description gets current tool and calls render method\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n editor.toolbar.current = button.dataset.type;\n\n editor.toolbar.toolbox.toolClicked(event);\n editor.toolbar.close();\n\n };\n\n /**\n * Show or Hide toolbox when plus button is clicked\n */\n callbacks.plusButtonClicked = function () {\n\n if (!editor.nodes.toolbox.classList.contains('opened')) {\n\n editor.toolbar.toolbox.open();\n\n } else {\n\n editor.toolbar.toolbox.close();\n\n }\n\n };\n\n /**\n * Block handlers for KeyDown events\n *\n * @protected\n * @param {Object} event\n *\n * Handles keydowns on block\n * @see blockRightOrDownArrowPressed_\n * @see backspacePressed_\n * @see blockLeftOrUpArrowPressed_\n */\n callbacks.blockKeydown = function (event) {\n\n let block = event.target; // event.target is input\n\n switch (event.keyCode) {\n\n case editor.core.keys.DOWN:\n case editor.core.keys.RIGHT:\n blockRightOrDownArrowPressed_(event);\n break;\n\n case editor.core.keys.BACKSPACE:\n backspacePressed_(block, event);\n break;\n\n case editor.core.keys.UP:\n case editor.core.keys.LEFT:\n blockLeftOrUpArrowPressed_(event);\n break;\n\n }\n\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n *\n * @param {Object} event\n * @private\n *\n * @description watches the selection and gets closest editable element.\n * Uses method getDeepestTextNodeFromPosition to get the last node of next block\n * Sets caret if it is contenteditable\n */\n var blockRightOrDownArrowPressed_ = function (event) {\n\n var selection = window.getSelection(),\n inputs = editor.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode) {\n\n return false;\n\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n\n editableElementIndex ++;\n\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n\n editor.caret.setToNextBlock(editableElementIndex);\n return;\n\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (editor.core.isDomNode(lastChild)) {\n\n deepestTextnode = editor.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n\n editor.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n\n }\n\n editor.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n *\n * @param {Object} event\n * @private\n *\n * watches the selection and gets closest editable element.\n * Uses method getDeepestTextNodeFromPosition to get the last node of previous block\n * Sets caret if it is contenteditable\n *\n */\n var blockLeftOrUpArrowPressed_ = function (event) {\n\n var selection = window.getSelection(),\n inputs = editor.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode) {\n\n return false;\n\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n\n return false;\n\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n\n editableElementIndex ++;\n\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n\n editor.caret.setToPreviousBlock(editableElementIndex);\n return;\n\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (editor.core.isDomNode(firstChild)) {\n\n deepestTextnode = editor.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n editor.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Handles backspace keydown\n *\n * @param {Element} block\n * @param {Object} event\n * @private\n *\n * @description if block is empty, delete the block and set caret to the previous block\n * If block is not empty, try to merge two blocks - current and previous\n * But it we try'n to remove first block, then we should set caret to the next block, not previous.\n * If we removed the last block, create new one\n */\n var backspacePressed_ = function (block, event) {\n\n var currentInputIndex = editor.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (editor.core.isNativeInput(event.target)) {\n\n /** If input value is empty - remove block */\n if (event.target.value.trim() == '') {\n\n block.remove();\n\n } else {\n\n return;\n\n }\n\n }\n\n if (block.textContent.trim()) {\n\n range = editor.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n if (editor.caret.position.atStart() && !selectionLength && editor.state.inputs[currentInputIndex - 1]) {\n\n editor.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n\n }\n\n if (!selectionLength) {\n\n block.remove();\n\n }\n\n\n firstLevelBlocksCount = editor.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n editor.content.currentNode = null;\n\n /** Inserting new empty initial block */\n editor.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n editor.ui.saveInputs();\n\n /** Set to current appended block */\n window.setTimeout(function () {\n\n editor.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (editor.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n editor.caret.setToPreviousBlock(editor.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n editor.caret.setToNextBlock(editor.caret.inputIndex);\n\n }\n\n }\n\n editor.toolbar.move();\n\n if (!editor.toolbar.opened) {\n\n editor.toolbar.open();\n\n }\n\n /** Updating inputs state */\n editor.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n /**\n * used by UI module\n * Clicks on block settings button\n *\n * @param {Object} event\n * @protected\n * @description Opens toolbar settings\n */\n callbacks.showSettingsButtonClicked = function (event) {\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = editor.content.currentNode.dataset.tool;\n\n editor.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n editor.toolbar.toolbox.close();\n editor.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_callbacks.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nmodule.exports = (function (caret) {\n\n let editor = codex.editor;\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function ( el, index, offset) {\n\n offset = offset || caret.offset || 0;\n index = index || caret.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.contentEditable != 'true') {\n\n el.focus();\n return;\n\n }\n\n if (editor.core.isDomNode(nodeToSet)) {\n\n nodeToSet = editor.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n window.setTimeout(function () {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n editor.caret.saveCurrentInputIndex();\n\n }, 20);\n\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = editor.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode) {\n\n return;\n\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n\n editableElementIndex ++;\n\n }\n\n caret.inputIndex = editableElementIndex;\n\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function () {\n\n return caret.inputIndex;\n\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function (index) {\n\n var inputs = editor.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n\n editor.core.log('We are reached the end');\n return;\n\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n\n var emptyTextElement = document.createTextNode('');\n\n nextInput.appendChild(emptyTextElement);\n\n }\n\n editor.caret.inputIndex = index + 1;\n editor.caret.set(nextInput, 0, 0);\n editor.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function (index) {\n\n var inputs = editor.state.inputs,\n targetInput = inputs[index];\n\n if ( !targetInput ) {\n\n return;\n\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n\n var emptyTextElement = document.createTextNode('');\n\n targetInput.appendChild(emptyTextElement);\n\n }\n\n editor.caret.inputIndex = index;\n editor.caret.set(targetInput, 0, 0);\n editor.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function (index) {\n\n index = index || 0;\n\n var inputs = editor.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n\n editor.core.log('We are reached first node');\n return;\n\n }\n\n lastChildNode = editor.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n\n }\n editor.caret.inputIndex = index - 1;\n editor.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n editor.content.workingNodeChanged(inputs[index - 1]);\n\n };\n\n caret.position = {\n\n atStart : function () {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = editor.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!editor.core.isDomNode(anchorNode)) {\n\n anchorNode = anchorNode.parentNode;\n\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function () {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n\n }\n };\n\n\n /**\n * Inserts node at the caret location\n * @param {HTMLElement|DocumentFragment} node\n */\n caret.insertNode = function (node) {\n\n var selection, range,\n lastNode = node;\n\n if (node.nodeType == editor.core.nodeTypes.DOCUMENT_FRAGMENT) {\n\n lastNode = node.lastChild;\n\n }\n\n selection = window.getSelection();\n\n range = selection.getRangeAt(0);\n range.deleteContents();\n\n range.insertNode(node);\n\n range.setStartAfter(lastNode);\n range.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n\n };\n\n return caret;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_caret.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @class Content\n * @classdesc Class works provides COdex Editor appearance logic\n *\n * @author Codex Team\n * @version 2.0.0\n */\n\nimport $ from '../dom';\n\nmodule.exports = class Content {\n\n /**\n * Module key name\n * @returns {string}\n */\n static get name() {\n\n return 'Content';\n\n }\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.CSS = {\n block: 'ce-block',\n content: 'ce-block__content',\n stretched: 'ce-block--stretched',\n highlighted: 'ce-block--highlighted',\n };\n\n this._currentNode = null;\n this._currentIndex = 0;\n\n }\n\n /**\n * Editor modules setter\n * @param {object} Editor\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n * Get current working node\n *\n * @returns {null|HTMLElement}\n */\n get currentNode() {\n\n return this._currentNode;\n\n }\n\n /**\n * Set working node. Working node should be first level block, so we find it before set one to _currentNode property\n *\n * @param {HTMLElement} node\n */\n set currentNode(node) {\n\n let firstLevelBlock = this.getFirstLevelBlock(node);\n\n this._currentNode = firstLevelBlock;\n\n }\n\n\n /**\n * @private\n * @param pluginHTML\n * @param {Boolean} isStretched - make stretched block or not\n *\n * @description adds necessary information to wrap new created block by first-level holder\n */\n composeBlock_(pluginHTML, isStretched = false) {\n\n let block = $.make('DIV', this.CSS.block),\n blockContent = $.make('DIV', this.CSS.content);\n\n blockContent.appendChild(pluginHTML);\n block.appendChild(blockContent);\n\n if (isStretched) {\n\n blockContent.classList.add(this.CSS.stretched);\n\n }\n\n block.dataset.toolId = this._currentIndex++;\n\n return block;\n\n };\n\n /**\n * Finds first-level block\n * @description looks for first-level block.\n * gets parent while node is not first-level\n *\n * @param {Element} node - selected or clicked in redactors area node\n * @protected\n *\n */\n getFirstLevelBlock(node) {\n\n if (!$.isNode(node)) {\n\n node = node.parentNode;\n\n }\n\n if (node === this.Editor.ui.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(node.classList && !node.classList.contains(this.CSS.block)) {\n\n node = node.parentNode;\n\n }\n\n return node;\n\n }\n\n };\n\n /**\n * Insert new block to working area\n *\n * @param {HTMLElement} tool\n *\n * @returns {Number} tool index\n *\n */\n insertBlock(tool) {\n\n let newBlock = this.composeBlock_(tool);\n\n if (this.currentNode) {\n\n this.currentNode.insertAdjacentElement('afterend', newBlock);\n\n } else {\n\n /**\n * If redactor is empty, append as first child\n */\n this.Editor.ui.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Set new node as current\n */\n this.currentNode = newBlock;\n\n return newBlock.dataset.toolId;\n\n }\n\n};\n\n// module.exports = (function (content) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * Links to current active block\n// * @type {null | Element}\n// */\n// content.currentNode = null;\n//\n// /**\n// * clicked in redactor area\n// * @type {null | Boolean}\n// */\n// content.editorAreaHightlighted = null;\n//\n// /**\n// * @deprecated\n// * Synchronizes redactor with original textarea\n// */\n// content.sync = function () {\n//\n// editor.core.log('syncing...');\n//\n// /**\n// * Save redactor content to editor.state\n// */\n// editor.state.html = editor.nodes.redactor.innerHTML;\n//\n// };\n//\n// /**\n// * Appends background to the block\n// *\n// * @description add CSS class to highlight visually first-level block area\n// */\n// content.markBlock = function () {\n//\n// editor.content.currentNode.classList.add(editor.ui.className.BLOCK_HIGHLIGHTED);\n//\n// };\n//\n// /**\n// * Clear background\n// *\n// * @description clears styles that highlights block\n// */\n// content.clearMark = function () {\n//\n// if (editor.content.currentNode) {\n//\n// editor.content.currentNode.classList.remove(editor.ui.className.BLOCK_HIGHLIGHTED);\n//\n// }\n//\n// };\n//\n// /**\n// * Finds first-level block\n// *\n// * @param {Element} node - selected or clicked in redactors area node\n// * @protected\n// *\n// * @description looks for first-level block.\n// * gets parent while node is not first-level\n// */\n// content.getFirstLevelBlock = function (node) {\n//\n// if (!editor.core.isDomNode(node)) {\n//\n// node = node.parentNode;\n//\n// }\n//\n// if (node === editor.nodes.redactor || node === document.body) {\n//\n// return null;\n//\n// } else {\n//\n// while(!node.classList.contains(editor.ui.className.BLOCK_CLASSNAME)) {\n//\n// node = node.parentNode;\n//\n// }\n//\n// return node;\n//\n// }\n//\n// };\n//\n// /**\n// * Trigger this event when working node changed\n// * @param {Element} targetNode - first-level of this node will be current\n// * @protected\n// *\n// * @description If targetNode is first-level then we set it as current else we look for parents to find first-level\n// */\n// content.workingNodeChanged = function (targetNode) {\n//\n// /** Clear background from previous marked block before we change */\n// editor.content.clearMark();\n//\n// if (!targetNode) {\n//\n// return;\n//\n// }\n//\n// content.currentNode = content.getFirstLevelBlock(targetNode);\n//\n// };\n//\n// /**\n// * Replaces one redactor block with another\n// * @protected\n// * @param {Element} targetBlock - block to replace. Mostly currentNode.\n// * @param {Element} newBlock\n// * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n// *\n// * [!] Function does not saves old block content.\n// * You can get it manually and pass with newBlock.innerHTML\n// */\n// content.replaceBlock = function (targetBlock, newBlock) {\n//\n// if (!targetBlock || !newBlock) {\n//\n// editor.core.log('replaceBlock: missed params');\n// return;\n//\n// }\n//\n// /** If target-block is not a frist-level block, then we iterate parents to find it */\n// while(!targetBlock.classList.contains(editor.ui.className.BLOCK_CLASSNAME)) {\n//\n// targetBlock = targetBlock.parentNode;\n//\n// }\n//\n// /** Replacing */\n// editor.nodes.redactor.replaceChild(newBlock, targetBlock);\n//\n// /**\n// * Set new node as current\n// */\n// editor.content.workingNodeChanged(newBlock);\n//\n// /**\n// * Add block handlers\n// */\n// editor.ui.addBlockHandlers(newBlock);\n//\n// /**\n// * Save changes\n// */\n// editor.ui.saveInputs();\n//\n// };\n//\n// /**\n// * @protected\n// *\n// * Inserts new block to redactor\n// * Wrapps block into a DIV with BLOCK_CLASSNAME class\n// *\n// * @param blockData {object}\n// * @param blockData.block {Element} element with block content\n// * @param blockData.type {string} block plugin\n// * @param needPlaceCaret {bool} pass true to set caret in new block\n// *\n// */\n// content.insertBlock = function ( blockData, needPlaceCaret ) {\n//\n// var workingBlock = editor.content.currentNode,\n// newBlockContent = blockData.block,\n// blockType = blockData.type,\n// isStretched = blockData.stretched;\n//\n// var newBlock = composeNewBlock_(newBlockContent, blockType, isStretched);\n//\n// if (workingBlock) {\n//\n// editor.core.insertAfter(workingBlock, newBlock);\n//\n// } else {\n//\n// /**\n// * If redactor is empty, append as first child\n// */\n// editor.nodes.redactor.appendChild(newBlock);\n//\n// }\n//\n// /**\n// * Block handler\n// */\n// editor.ui.addBlockHandlers(newBlock);\n//\n// /**\n// * Set new node as current\n// */\n// editor.content.workingNodeChanged(newBlock);\n//\n// /**\n// * Save changes\n// */\n// editor.ui.saveInputs();\n//\n//\n// if ( needPlaceCaret ) {\n//\n// /**\n// * If we don't know input index then we set default value -1\n// */\n// var currentInputIndex = editor.caret.getCurrentInputIndex() || -1;\n//\n//\n// if (currentInputIndex == -1) {\n//\n//\n// var editableElement = newBlock.querySelector('[contenteditable]'),\n// emptyText = document.createTextNode('');\n//\n// editableElement.appendChild(emptyText);\n// editor.caret.set(editableElement, 0, 0);\n//\n// editor.toolbar.move();\n// editor.toolbar.showPlusButton();\n//\n//\n// } else {\n//\n// if (currentInputIndex === editor.state.inputs.length - 1)\n// return;\n//\n// /** Timeout for browsers execution */\n// window.setTimeout(function () {\n//\n// /** Setting to the new input */\n// editor.caret.setToNextBlock(currentInputIndex);\n// editor.toolbar.move();\n// editor.toolbar.open();\n//\n// }, 10);\n//\n// }\n//\n// }\n//\n// /**\n// * Block is inserted, wait for new click that defined focusing on editors area\n// * @type {boolean}\n// */\n// content.editorAreaHightlighted = false;\n//\n// };\n//\n// /**\n// * Replaces blocks with saving content\n// * @protected\n// * @param {Element} noteToReplace\n// * @param {Element} newNode\n// * @param {Element} blockType\n// */\n// content.switchBlock = function (blockToReplace, newBlock, tool) {\n//\n// tool = tool || editor.content.currentNode.dataset.tool;\n// var newBlockComposed = composeNewBlock_(newBlock, tool);\n//\n// /** Replacing */\n// editor.content.replaceBlock(blockToReplace, newBlockComposed);\n//\n// /** Save new Inputs when block is changed */\n// editor.ui.saveInputs();\n//\n// };\n//\n// /**\n// * Iterates between child noted and looking for #text node on deepest level\n// * @protected\n// *\n// * @param {Element} block - node where find\n// * @param {int} postiton - starting postion\n// * Example: childNodex.length to find from the end\n// * or 0 to find from the start\n// * @return {Text} block\n// * @uses DFS\n// */\n// content.getDeepestTextNodeFromPosition = function (block, position) {\n//\n// /**\n// * Clear Block from empty and useless spaces with trim.\n// * Such nodes we should remove\n// */\n// var blockChilds = block.childNodes,\n// index,\n// node,\n// text;\n//\n// for(index = 0; index < blockChilds.length; index++) {\n//\n// node = blockChilds[index];\n//\n// if (node.nodeType == editor.core.nodeTypes.TEXT) {\n//\n// text = node.textContent.trim();\n//\n// /** Text is empty. We should remove this child from node before we start DFS\n// * decrease the quantity of childs.\n// */\n// if (text === '') {\n//\n// block.removeChild(node);\n// position--;\n//\n// }\n//\n// }\n//\n// }\n//\n// if (block.childNodes.length === 0) {\n//\n// return document.createTextNode('');\n//\n// }\n//\n// /** Setting default position when we deleted all empty nodes */\n// if ( position < 0 )\n// position = 1;\n//\n// var lookingFromStart = false;\n//\n// /** For looking from START */\n// if (position === 0) {\n//\n// lookingFromStart = true;\n// position = 1;\n//\n// }\n//\n// while ( position ) {\n//\n// /** initial verticle of node. */\n// if ( lookingFromStart ) {\n//\n// block = block.childNodes[0];\n//\n// } else {\n//\n// block = block.childNodes[position - 1];\n//\n// }\n//\n// if ( block.nodeType == editor.core.nodeTypes.TAG ) {\n//\n// position = block.childNodes.length;\n//\n// } else if (block.nodeType == editor.core.nodeTypes.TEXT ) {\n//\n// position = 0;\n//\n// }\n//\n// }\n//\n// return block;\n//\n// };\n//\n// /**\n// * @private\n// * @param {Element} block - current plugins render\n// * @param {String} tool - plugins name\n// * @param {Boolean} isStretched - make stretched block or not\n// *\n// * @description adds necessary information to wrap new created block by first-level holder\n// */\n// var composeNewBlock_ = function (block, tool, isStretched) {\n//\n// var newBlock = editor.draw.node('DIV', editor.ui.className.BLOCK_CLASSNAME, {}),\n// blockContent = editor.draw.node('DIV', editor.ui.className.BLOCK_CONTENT, {});\n//\n// blockContent.appendChild(block);\n// newBlock.appendChild(blockContent);\n//\n// if (isStretched) {\n//\n// blockContent.classList.add(editor.ui.className.BLOCK_STRETCHED);\n//\n// }\n//\n// newBlock.dataset.tool = tool;\n// return newBlock;\n//\n// };\n//\n// /**\n// * Returns Range object of current selection\n// * @protected\n// */\n// content.getRange = function () {\n//\n// var selection = window.getSelection().getRangeAt(0);\n//\n// return selection;\n//\n// };\n//\n// /**\n// * Divides block in two blocks (after and before caret)\n// *\n// * @protected\n// * @param {int} inputIndex - target input index\n// *\n// * @description splits current input content to the separate blocks\n// * When enter is pressed among the words, that text will be splited.\n// */\n// content.splitBlock = function (inputIndex) {\n//\n// var selection = window.getSelection(),\n// anchorNode = selection.anchorNode,\n// anchorNodeText = anchorNode.textContent,\n// caretOffset = selection.anchorOffset,\n// textBeforeCaret,\n// textNodeBeforeCaret,\n// textAfterCaret,\n// textNodeAfterCaret;\n//\n// var currentBlock = editor.content.currentNode.querySelector('[contentEditable]');\n//\n//\n// textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n// textAfterCaret = anchorNodeText.substring(caretOffset);\n//\n// textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n//\n// if (textAfterCaret) {\n//\n// textNodeAfterCaret = document.createTextNode(textAfterCaret);\n//\n// }\n//\n// var previousChilds = [],\n// nextChilds = [],\n// reachedCurrent = false;\n//\n// if (textNodeAfterCaret) {\n//\n// nextChilds.push(textNodeAfterCaret);\n//\n// }\n//\n// for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n//\n// if ( child != anchorNode ) {\n//\n// if ( !reachedCurrent ) {\n//\n// previousChilds.push(child);\n//\n// } else {\n//\n// nextChilds.push(child);\n//\n// }\n//\n// } else {\n//\n// reachedCurrent = true;\n//\n// }\n//\n// }\n//\n// /** Clear current input */\n// editor.state.inputs[inputIndex].innerHTML = '';\n//\n// /**\n// * Append all childs founded before anchorNode\n// */\n// var previousChildsLength = previousChilds.length;\n//\n// for(i = 0; i < previousChildsLength; i++) {\n//\n// editor.state.inputs[inputIndex].appendChild(previousChilds[i]);\n//\n// }\n//\n// editor.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n//\n// /**\n// * Append text node which is after caret\n// */\n// var nextChildsLength = nextChilds.length,\n// newNode = document.createElement('div');\n//\n// for(i = 0; i < nextChildsLength; i++) {\n//\n// newNode.appendChild(nextChilds[i]);\n//\n// }\n//\n// newNode = newNode.innerHTML;\n//\n// /** This type of block creates when enter is pressed */\n// var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n//\n// /**\n// * Make new paragraph with text after caret\n// */\n// editor.content.insertBlock({\n// type : NEW_BLOCK_TYPE,\n// block : editor.tools[NEW_BLOCK_TYPE].render({\n// text : newNode\n// })\n// }, true );\n//\n// };\n//\n// /**\n// * Merges two blocks — current and target\n// * If target index is not exist, then previous will be as target\n// *\n// * @protected\n// * @param {int} currentInputIndex\n// * @param {int} targetInputIndex\n// *\n// * @description gets two inputs indexes and merges into one\n// */\n// content.mergeBlocks = function (currentInputIndex, targetInputIndex) {\n//\n// /** If current input index is zero, then prevent method execution */\n// if (currentInputIndex === 0) {\n//\n// return;\n//\n// }\n//\n// var targetInput,\n// currentInputContent = editor.state.inputs[currentInputIndex].innerHTML;\n//\n// if (!targetInputIndex) {\n//\n// targetInput = editor.state.inputs[currentInputIndex - 1];\n//\n// } else {\n//\n// targetInput = editor.state.inputs[targetInputIndex];\n//\n// }\n//\n// targetInput.innerHTML += currentInputContent;\n//\n// };\n//\n// /**\n// * Iterates all right siblings and parents, which has right siblings\n// * while it does not reached the first-level block\n// *\n// * @param {Element} node\n// * @return {boolean}\n// */\n// content.isLastNode = function (node) {\n//\n// // console.log('погнали перебор родителей');\n//\n// var allChecked = false;\n//\n// while ( !allChecked ) {\n//\n// // console.log('Смотрим на %o', node);\n// // console.log('Проверим, пустые ли соседи справа');\n//\n// if ( !allSiblingsEmpty_(node) ) {\n//\n// // console.log('Есть непустые соседи. Узел не последний. Выходим.');\n// return false;\n//\n// }\n//\n// node = node.parentNode;\n//\n// /**\n// * Проверяем родителей до тех пор, пока не найдем блок первого уровня\n// */\n// if ( node.classList.contains(editor.ui.className.BLOCK_CONTENT) ) {\n//\n// allChecked = true;\n//\n// }\n//\n// }\n//\n// return true;\n//\n// };\n//\n// /**\n// * Checks if all element right siblings is empty\n// * @param node\n// */\n// var allSiblingsEmpty_ = function (node) {\n//\n// /**\n// * Нужно убедиться, что после пустого соседа ничего нет\n// */\n// var sibling = node.nextSibling;\n//\n// while ( sibling ) {\n//\n// if (sibling.textContent.length) {\n//\n// return false;\n//\n// }\n//\n// sibling = sibling.nextSibling;\n//\n// }\n//\n// return true;\n//\n// };\n//\n// /**\n// * @public\n// *\n// * @param {string} htmlData - html content as string\n// * @param {string} plainData - plain text\n// * @return {string} - html content as string\n// */\n// content.wrapTextWithParagraphs = function (htmlData, plainData) {\n//\n// if (!htmlData.trim()) {\n//\n// return wrapPlainTextWithParagraphs(plainData);\n//\n// }\n//\n// var wrapper = document.createElement('DIV'),\n// newWrapper = document.createElement('DIV'),\n// i,\n// paragraph,\n// firstLevelBlocks = ['DIV', 'P'],\n// blockTyped,\n// node;\n//\n// /**\n// * Make HTML Element to Wrap Text\n// * It allows us to work with input data as HTML content\n// */\n// wrapper.innerHTML = htmlData;\n// paragraph = document.createElement('P');\n//\n// for (i = 0; i < wrapper.childNodes.length; i++) {\n//\n// node = wrapper.childNodes[i];\n//\n// blockTyped = firstLevelBlocks.indexOf(node.tagName) != -1;\n//\n// /**\n// * If node is first-levet\n// * we add this node to our new wrapper\n// */\n// if ( blockTyped ) {\n//\n// /**\n// * If we had splitted inline nodes to paragraph before\n// */\n// if ( paragraph.childNodes.length ) {\n//\n// newWrapper.appendChild(paragraph.cloneNode(true));\n//\n// /** empty paragraph */\n// paragraph = null;\n// paragraph = document.createElement('P');\n//\n// }\n//\n// newWrapper.appendChild(node.cloneNode(true));\n//\n// } else {\n//\n// /** Collect all inline nodes to one as paragraph */\n// paragraph.appendChild(node.cloneNode(true));\n//\n// /** if node is last we should append this node to paragraph and paragraph to new wrapper */\n// if ( i == wrapper.childNodes.length - 1 ) {\n//\n// newWrapper.appendChild(paragraph.cloneNode(true));\n//\n// }\n//\n// }\n//\n// }\n//\n// return newWrapper.innerHTML;\n//\n// };\n//\n// /**\n// * Splits strings on new line and wraps paragraphs with

tag\n// * @param plainText\n// * @returns {string}\n// */\n// var wrapPlainTextWithParagraphs = function (plainText) {\n//\n// if (!plainText) return '';\n//\n// return '

' + plainText.split('\\n\\n').join('

') + '

';\n//\n// };\n//\n// /**\n// * Finds closest Contenteditable parent from Element\n// * @param {Element} node element looking from\n// * @return {Element} node contenteditable\n// */\n// content.getEditableParent = function (node) {\n//\n// while (node && node.contentEditable != 'true') {\n//\n// node = node.parentNode;\n//\n// }\n//\n// return node;\n//\n// };\n//\n// /**\n// * Clear editors content\n// *\n// * @param {Boolean} all — if true, delete all article data (content, id, etc.)\n// */\n// content.clear = function (all) {\n//\n// editor.nodes.redactor.innerHTML = '';\n// editor.content.sync();\n// editor.ui.saveInputs();\n// if (all) {\n//\n// editor.state.blocks = {};\n//\n// } else if (editor.state.blocks) {\n//\n// editor.state.blocks.items = [];\n//\n// }\n//\n// editor.content.currentNode = null;\n//\n// };\n//\n// /**\n// *\n// * Load new data to editor\n// * If editor is not empty, just append articleData.items\n// *\n// * @param articleData.items\n// */\n// content.load = function (articleData) {\n//\n// var currentContent = Object.assign({}, editor.state.blocks);\n//\n// editor.content.clear();\n//\n// if (!Object.keys(currentContent).length) {\n//\n// editor.state.blocks = articleData;\n//\n// } else if (!currentContent.items) {\n//\n// currentContent.items = articleData.items;\n// editor.state.blocks = currentContent;\n//\n// } else {\n//\n// currentContent.items = currentContent.items.concat(articleData.items);\n// editor.state.blocks = currentContent;\n//\n// }\n//\n// editor.renderer.makeBlocksFromData();\n//\n// };\n//\n// return content;\n//\n// })({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_content.js","/**\n * DOM manupulations helper\n */\nexport default class Dom {\n\n /**\n * Helper for making Elements with classname and attributes\n *\n * @param {string} tagName - new Element tag name\n * @param {array|string} classNames - list or name of CSS classname(s)\n * @param {Object} attributes - any attributes\n * @return {Element}\n */\n static make(tagName, classNames = null, attributes = {}) {\n\n var el = document.createElement(tagName);\n\n if ( Array.isArray(classNames) ) {\n\n el.classList.add(...classNames);\n\n } else if( classNames ) {\n\n el.classList.add(classNames);\n\n }\n\n for (let attrName in attributes) {\n\n el[attrName] = attributes[attrName];\n\n }\n\n return el;\n\n }\n\n /**\n * Append one or several elements to the parent\n *\n * @param {Element} parent - where to append\n * @param {Element|Element[]} - element ore elements list\n */\n static append(parent, elements) {\n\n if ( Array.isArray(elements) ) {\n\n elements.forEach( el => parent.appendChild(el) );\n\n } else {\n\n parent.appendChild(elements);\n\n }\n\n }\n\n /**\n * Selector Decorator\n *\n * Returns first match\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n *\n * @returns {Element}\n */\n static find(el = document, selector) {\n\n return el.querySelector(selector);\n\n }\n\n /**\n * Selector Decorator.\n *\n * Returns all matches\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n * @returns {NodeList}\n */\n static findAll(el = document, selector) {\n\n return el.querySelectorAll(selector);\n\n }\n\n static isNode(node) {\n\n return node && typeof node === 'object' && node.nodeType && node.nodeType === Node.ELEMENT_NODE;\n\n }\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.js","/**\n * Codex Editor Destroyer module\n *\n * @auhor Codex Team\n * @version 1.0\n */\n\nmodule.exports = function (destroyer) {\n\n let editor = codex.editor;\n\n destroyer.removeNodes = function () {\n\n editor.nodes.wrapper.remove();\n editor.nodes.notifications.remove();\n\n };\n\n destroyer.destroyPlugins = function () {\n\n for (var tool in editor.tools) {\n\n if (typeof editor.tools[tool].destroy === 'function') {\n\n editor.tools[tool].destroy();\n\n }\n\n }\n\n };\n\n destroyer.destroyScripts = function () {\n\n var scripts = document.getElementsByTagName('SCRIPT');\n\n for (var i = 0; i < scripts.length; i++) {\n\n if (scripts[i].id.indexOf(editor.scriptPrefix) + 1) {\n\n scripts[i].remove();\n i--;\n\n }\n\n }\n\n };\n\n\n /**\n * Delete editor data from webpage.\n * You should send settings argument with boolean flags:\n * @param settings.ui- remove redactor event listeners and DOM nodes\n * @param settings.scripts - remove redactor scripts from DOM\n * @param settings.plugins - remove plugin's objects\n * @param settings.core - remove editor core. You can remove core only if UI and scripts flags is true\n * }\n *\n */\n destroyer.destroy = function (settings) {\n\n if (!settings || typeof settings !== 'object') {\n\n return;\n\n }\n\n if (settings.ui) {\n\n destroyer.removeNodes();\n editor.listeners.removeAll();\n\n }\n\n if (settings.scripts) {\n\n destroyer.destroyScripts();\n\n }\n\n if (settings.plugins) {\n\n destroyer.destroyPlugins();\n\n }\n\n if (settings.ui && settings.scripts && settings.core) {\n\n delete codex.editor;\n\n }\n\n };\n\n return destroyer;\n\n}({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_destroyer.js","/**\n * Codex Editor Listeners module\n *\n * @author Codex Team\n * @version 1.0\n */\n\n/**\n * Module-decorator for event listeners assignment\n */\nmodule.exports = function (listeners) {\n\n var allListeners = [];\n\n /**\n * Search methods\n *\n * byElement, byType and byHandler returns array of suitable listeners\n * one and all takes element, eventType, and handler and returns first (all) suitable listener\n *\n */\n listeners.search = function () {\n\n var byElement = function (element, context) {\n\n var listenersOnElement = [];\n\n context = context || allListeners;\n\n for (var i = 0; i < context.length; i++) {\n\n var listener = context[i];\n\n if (listener.element === element) {\n\n listenersOnElement.push(listener);\n\n }\n\n }\n\n return listenersOnElement;\n\n };\n\n var byType = function (eventType, context) {\n\n var listenersWithType = [];\n\n context = context || allListeners;\n\n for (var i = 0; i < context.length; i++) {\n\n var listener = context[i];\n\n if (listener.type === eventType) {\n\n listenersWithType.push(listener);\n\n }\n\n }\n\n return listenersWithType;\n\n };\n\n var byHandler = function (handler, context) {\n\n var listenersWithHandler = [];\n\n context = context || allListeners;\n\n for (var i = 0; i < context.length; i++) {\n\n var listener = context[i];\n\n if (listener.handler === handler) {\n\n listenersWithHandler.push(listener);\n\n }\n\n }\n\n return listenersWithHandler;\n\n };\n\n var one = function (element, eventType, handler) {\n\n var result = allListeners;\n\n if (element)\n result = byElement(element, result);\n\n if (eventType)\n result = byType(eventType, result);\n\n if (handler)\n result = byHandler(handler, result);\n\n return result[0];\n\n };\n\n var all = function (element, eventType, handler) {\n\n var result = allListeners;\n\n if (element)\n result = byElement(element, result);\n\n if (eventType)\n result = byType(eventType, result);\n\n if (handler)\n result = byHandler(handler, result);\n\n return result;\n\n };\n\n return {\n byElement : byElement,\n byType : byType,\n byHandler : byHandler,\n one : one,\n all : all\n };\n\n }();\n\n listeners.add = function (element, eventType, handler, isCapture) {\n\n element.addEventListener(eventType, handler, isCapture);\n\n var data = {\n element: element,\n type: eventType,\n handler: handler\n };\n\n var alreadyAddedListener = listeners.search.one(element, eventType, handler);\n\n if (!alreadyAddedListener) {\n\n allListeners.push(data);\n\n }\n\n };\n\n listeners.remove = function (element, eventType, handler) {\n\n element.removeEventListener(eventType, handler);\n\n var existingListeners = listeners.search.all(element, eventType, handler);\n\n for (var i = 0; i < existingListeners.length; i++) {\n\n var index = allListeners.indexOf(existingListeners[i]);\n\n if (index > 0) {\n\n allListeners.splice(index, 1);\n\n }\n\n }\n\n };\n\n listeners.removeAll = function () {\n\n allListeners.map(function (current) {\n\n listeners.remove(current.element, current.type, current.handler);\n\n });\n\n };\n\n listeners.get = function (element, eventType, handler) {\n\n return listeners.search.all(element, eventType, handler);\n\n };\n\n return listeners;\n\n}({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_listeners.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nmodule.exports = (function (notifications) {\n\n let editor = codex.editor;\n\n var queue = [];\n\n var addToQueue = function (settings) {\n\n queue.push(settings);\n\n var index = 0;\n\n while ( index < queue.length && queue.length > 5) {\n\n if (queue[index].type == 'confirm' || queue[index].type == 'prompt') {\n\n index++;\n continue;\n\n }\n\n queue[index].close();\n queue.splice(index, 1);\n\n }\n\n };\n\n notifications.createHolder = function () {\n\n var holder = editor.draw.node('DIV', 'cdx-notifications-block');\n\n editor.nodes.notifications = document.body.appendChild(holder);\n\n return holder;\n\n };\n\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function (errorMsg, event) {\n\n editor.notifications.notification({message: 'This action is not available currently', type: event.type});\n\n };\n\n /**\n *\n * Appends notification\n *\n * settings = {\n * type - notification type (reserved types: alert, confirm, prompt). Just add class 'cdx-notification-'+type\n * message - notification message\n * okMsg - confirm button text (default - 'Ok')\n * cancelBtn - cancel button text (default - 'Cancel'). Only for confirm and prompt types\n * confirm - function-handler for ok button click\n * cancel - function-handler for cancel button click. Only for confirm and prompt types\n * time - time (in seconds) after which notification will close (default - 10s)\n * }\n *\n * @param settings\n */\n notifications.notification = function (constructorSettings) {\n\n /** Private vars and methods */\n var notification = null,\n cancel = null,\n type = null,\n confirm = null,\n inputField = null;\n\n var confirmHandler = function () {\n\n close();\n\n if (typeof confirm !== 'function' ) {\n\n return;\n\n }\n\n if (type == 'prompt') {\n\n confirm(inputField.value);\n return;\n\n }\n\n confirm();\n\n };\n\n var cancelHandler = function () {\n\n close();\n\n if (typeof cancel !== 'function' ) {\n\n return;\n\n }\n\n cancel();\n\n };\n\n\n /** Public methods */\n function create(settings) {\n\n if (!(settings && settings.message)) {\n\n editor.core.log('Can\\'t create notification. Message is missed');\n return;\n\n }\n\n settings.type = settings.type || 'alert';\n settings.time = settings.time*1000 || 10000;\n\n var wrapper = editor.draw.node('DIV', 'cdx-notification'),\n message = editor.draw.node('DIV', 'cdx-notification__message'),\n input = editor.draw.node('INPUT', 'cdx-notification__input'),\n okBtn = editor.draw.node('SPAN', 'cdx-notification__ok-btn'),\n cancelBtn = editor.draw.node('SPAN', 'cdx-notification__cancel-btn');\n\n message.textContent = settings.message;\n okBtn.textContent = settings.okMsg || 'ОК';\n cancelBtn.textContent = settings.cancelMsg || 'Отмена';\n\n editor.listeners.add(okBtn, 'click', confirmHandler);\n editor.listeners.add(cancelBtn, 'click', cancelHandler);\n\n wrapper.appendChild(message);\n\n if (settings.type == 'prompt') {\n\n wrapper.appendChild(input);\n\n }\n\n wrapper.appendChild(okBtn);\n\n if (settings.type == 'prompt' || settings.type == 'confirm') {\n\n wrapper.appendChild(cancelBtn);\n\n }\n\n wrapper.classList.add('cdx-notification-' + settings.type);\n wrapper.dataset.type = settings.type;\n\n notification = wrapper;\n type = settings.type;\n confirm = settings.confirm;\n cancel = settings.cancel;\n inputField = input;\n\n if (settings.type != 'prompt' && settings.type != 'confirm') {\n\n window.setTimeout(close, settings.time);\n\n }\n\n };\n\n /**\n * Show notification block\n */\n function send() {\n\n editor.nodes.notifications.appendChild(notification);\n inputField.focus();\n\n editor.nodes.notifications.classList.add('cdx-notification__notification-appending');\n\n window.setTimeout(function () {\n\n editor.nodes.notifications.classList.remove('cdx-notification__notification-appending');\n\n }, 100);\n\n addToQueue({type: type, close: close});\n\n };\n\n /**\n * Remove notification block\n */\n function close() {\n\n notification.remove();\n\n };\n\n\n if (constructorSettings) {\n\n create(constructorSettings);\n send();\n\n }\n\n return {\n create: create,\n send: send,\n close: close\n };\n\n };\n\n notifications.clear = function () {\n\n editor.nodes.notifications.innerHTML = '';\n queue = [];\n\n };\n\n return notifications;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nmodule.exports = (function (parser) {\n\n let editor = codex.editor;\n\n /** inserting text */\n parser.insertPastedContent = function (blockType, tag) {\n\n editor.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == editor.core.nodeTypes.TAG &&\n node.classList.contains(editor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_parser.js","/**\n * Codex Editor Paste module\n *\n * @author Codex Team\n * @version 1.1.1\n */\n\nmodule.exports = function (paste) {\n\n let editor = codex.editor;\n\n var patterns = [];\n\n paste.prepare = function () {\n\n var tools = editor.tools;\n\n for (var tool in tools) {\n\n if (!tools[tool].renderOnPastePatterns || !Array.isArray(tools[tool].renderOnPastePatterns)) {\n\n continue;\n\n }\n\n tools[tool].renderOnPastePatterns.map(function (pattern) {\n\n\n patterns.push(pattern);\n\n });\n\n }\n\n return Promise.resolve();\n\n };\n\n /**\n * Saves data\n * @param event\n */\n paste.pasted = function (event) {\n\n var clipBoardData = event.clipboardData || window.clipboardData,\n content = clipBoardData.getData('Text');\n\n var result = analize(content);\n\n if (result) {\n\n event.preventDefault();\n event.stopImmediatePropagation();\n\n }\n\n return result;\n\n };\n\n /**\n * Analizes pated string and calls necessary method\n */\n\n var analize = function (string) {\n\n var result = false,\n content = editor.content.currentNode,\n plugin = content.dataset.tool;\n\n patterns.map( function (pattern) {\n\n var execArray = pattern.regex.exec(string),\n match = execArray && execArray[0];\n\n if ( match && match === string.trim()) {\n\n /** current block is not empty */\n if ( content.textContent.trim() && plugin == editor.settings.initialBlockPlugin ) {\n\n pasteToNewBlock_();\n\n }\n\n pattern.callback(string, pattern);\n result = true;\n\n }\n\n });\n\n return result;\n\n };\n\n var pasteToNewBlock_ = function () {\n\n /** Create new initial block */\n editor.content.insertBlock({\n\n type : editor.settings.initialBlockPlugin,\n block : editor.tools[editor.settings.initialBlockPlugin].render({\n text : ''\n })\n\n }, false);\n\n };\n\n /**\n * This method prevents default behaviour.\n *\n * @param {Object} event\n * @protected\n *\n * @description We get from clipboard pasted data, sanitize, make a fragment that contains of this sanitized nodes.\n * Firstly, we need to memorize the caret position. We can do that by getting the range of selection.\n * After all, we insert clear fragment into caret placed position. Then, we should move the caret to the last node\n */\n paste.blockPasteCallback = function (event) {\n\n\n if (!needsToHandlePasteEvent(event.target)) {\n\n return;\n\n }\n\n /** Prevent default behaviour */\n event.preventDefault();\n\n /** get html pasted data - dirty data */\n var htmlData = event.clipboardData.getData('text/html'),\n plainData = event.clipboardData.getData('text/plain');\n\n /** Temporary DIV that is used to work with text's paragraphs as DOM-elements*/\n var paragraphs = editor.draw.node('DIV', '', {}),\n cleanData,\n wrappedData;\n\n /** Create fragment, that we paste to range after proccesing */\n cleanData = editor.sanitizer.clean(htmlData);\n\n /**\n * We wrap pasted text with

tags to split it logically\n * @type {string}\n */\n wrappedData = editor.content.wrapTextWithParagraphs(cleanData, plainData);\n paragraphs.innerHTML = wrappedData;\n\n /**\n * If there only one paragraph, just insert in at the caret location\n */\n if (paragraphs.childNodes.length == 1) {\n\n emulateUserAgentBehaviour(paragraphs.firstChild);\n return;\n\n }\n\n insertPastedParagraphs(paragraphs.childNodes);\n\n };\n\n /**\n * Checks if we should handle paste event on block\n * @param block\n *\n * @return {boolean}\n */\n var needsToHandlePasteEvent = function (block) {\n\n /** If area is input or textarea then allow default behaviour */\n if ( editor.core.isNativeInput(block) ) {\n\n return false;\n\n }\n\n var editableParent = editor.content.getEditableParent(block);\n\n /** Allow paste when event target placed in Editable element */\n if (!editableParent) {\n\n return false;\n\n }\n\n return true;\n\n };\n\n /**\n * Inserts new initial plugin blocks with data in paragraphs\n *\n * @param {Array} paragraphs - array of paragraphs (

) whit content, that should be inserted\n */\n var insertPastedParagraphs = function (paragraphs) {\n\n var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin,\n currentNode = editor.content.currentNode;\n\n\n paragraphs.forEach(function (paragraph) {\n\n /** Don't allow empty paragraphs */\n if (editor.core.isBlockEmpty(paragraph)) {\n\n return;\n\n }\n\n editor.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : editor.tools[NEW_BLOCK_TYPE].render({\n text : paragraph.innerHTML\n })\n });\n\n editor.caret.inputIndex++;\n\n });\n\n editor.caret.setToPreviousBlock(editor.caret.getCurrentInputIndex() + 1);\n\n\n /**\n * If there was no data in working node, remove it\n */\n if (editor.core.isBlockEmpty(currentNode)) {\n\n currentNode.remove();\n editor.ui.saveInputs();\n\n }\n\n\n };\n\n /**\n * Inserts node content at the caret position\n *\n * @param {Node} node - DOM node (could be DocumentFragment), that should be inserted at the caret location\n */\n var emulateUserAgentBehaviour = function (node) {\n\n var newNode;\n\n if (node.childElementCount) {\n\n newNode = document.createDocumentFragment();\n\n node.childNodes.forEach(function (current) {\n\n if (!editor.core.isDomNode(current) && current.data.trim() === '') {\n\n return;\n\n }\n\n newNode.appendChild(current.cloneNode(true));\n\n });\n\n } else {\n\n newNode = document.createTextNode(node.textContent);\n\n }\n\n editor.caret.insertNode(newNode);\n\n };\n\n\n return paste;\n\n}({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_paste.js","/**\n * Codex Sanitizer\n */\n\nmodule.exports = (function (sanitizer) {\n\n /** HTML Janitor library */\n let janitor = require('html-janitor');\n\n /** Codex Editor */\n let editor = codex.editor;\n\n sanitizer.prepare = function () {\n\n if (editor.settings.sanitizer && !editor.core.isEmpty(editor.settings.sanitizer)) {\n\n Config.CUSTOM = editor.settings.sanitizer;\n\n }\n\n };\n\n /**\n * Basic config\n */\n var Config = {\n\n /** User configuration */\n CUSTOM : null,\n\n BASIC : {\n\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: 'nofollow'\n }\n }\n }\n };\n\n sanitizer.Config = Config;\n\n /**\n *\n * @param userCustomConfig\n * @returns {*}\n * @private\n *\n * @description If developer uses editor's API, then he can customize sane restrictions.\n * Or, sane config can be defined globally in editors initialization. That config will be used everywhere\n * At least, if there is no config overrides, that API uses BASIC Default configation\n */\n let init_ = function (userCustomConfig) {\n\n let configuration = userCustomConfig || Config.CUSTOM || Config.BASIC;\n\n return new janitor(configuration);\n\n };\n\n /**\n * Cleans string from unwanted tags\n * @protected\n * @param {String} dirtyString - taint string\n * @param {Object} customConfig - allowed tags\n */\n sanitizer.clean = function (dirtyString, customConfig) {\n\n let janitorInstance = init_(customConfig);\n\n return janitorInstance.clean(dirtyString);\n\n };\n\n return sanitizer;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_sanitizer.js","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('html-janitor', factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.HTMLJanitor = factory();\n }\n}(this, function () {\n\n /**\n * @param {Object} config.tags Dictionary of allowed tags.\n * @param {boolean} config.keepNestedBlockElements Default false.\n */\n function HTMLJanitor(config) {\n\n var tagDefinitions = config['tags'];\n var tags = Object.keys(tagDefinitions);\n\n var validConfigValues = tags\n .map(function(k) { return typeof tagDefinitions[k]; })\n .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });\n\n if(!validConfigValues) {\n throw new Error(\"The configuration was invalid\");\n }\n\n this.config = config;\n }\n\n // TODO: not exhaustive?\n var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];\n function isBlockElement(node) {\n return blockElementNames.indexOf(node.nodeName) !== -1;\n }\n\n var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];\n function isInlineElement(node) {\n return inlineElementNames.indexOf(node.nodeName) !== -1;\n }\n\n HTMLJanitor.prototype.clean = function (html) {\n var sandbox = document.createElement('div');\n sandbox.innerHTML = html;\n\n this._sanitize(sandbox);\n\n return sandbox.innerHTML;\n };\n\n HTMLJanitor.prototype._sanitize = function (parentNode) {\n var treeWalker = createTreeWalker(parentNode);\n var node = treeWalker.firstChild();\n if (!node) { return; }\n\n do {\n // Ignore nodes that have already been sanitized\n if (node._sanitized) {\n continue;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // If this text node is just whitespace and the previous or next element\n // sibling is a block element, remove it\n // N.B.: This heuristic could change. Very specific to a bug with\n // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output\n // FIXME: make this an option?\n if (node.data.trim() === ''\n && ((node.previousElementSibling && isBlockElement(node.previousElementSibling))\n || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n } else {\n continue;\n }\n }\n\n // Remove all comments\n if (node.nodeType === Node.COMMENT_NODE) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n }\n\n var isInline = isInlineElement(node);\n var containsBlockElement;\n if (isInline) {\n containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);\n }\n\n // Block elements should not be nested (e.g.
  • ...); if\n // they are, we want to unwrap the inner block element.\n var isNotTopContainer = !! parentNode.parentNode;\n var isNestedBlockElement =\n isBlockElement(parentNode) &&\n isBlockElement(node) &&\n isNotTopContainer;\n\n var nodeName = node.nodeName.toLowerCase();\n\n var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);\n\n var isInvalid = isInline && containsBlockElement;\n\n // Drop tag entirely according to the whitelist *and* if the markup\n // is invalid.\n if (isInvalid || shouldRejectNode(node, allowedAttrs)\n || (!this.config.keepNestedBlockElements && isNestedBlockElement)) {\n // Do not keep the inner text of SCRIPT/STYLE elements.\n if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {\n while (node.childNodes.length > 0) {\n parentNode.insertBefore(node.childNodes[0], node);\n }\n }\n parentNode.removeChild(node);\n\n this._sanitize(parentNode);\n break;\n }\n\n // Sanitize attributes\n for (var a = 0; a < node.attributes.length; a += 1) {\n var attr = node.attributes[a];\n\n if (shouldRejectAttr(attr, allowedAttrs, node)) {\n node.removeAttribute(attr.name);\n // Shift the array to continue looping.\n a = a - 1;\n }\n }\n\n // Sanitize children\n this._sanitize(node);\n\n // Mark node as sanitized so it's ignored in future runs\n node._sanitized = true;\n } while ((node = treeWalker.nextSibling()));\n };\n\n function createTreeWalker(node) {\n return document.createTreeWalker(node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,\n null, false);\n }\n\n function getAllowedAttrs(config, nodeName, node){\n if (typeof config.tags[nodeName] === 'function') {\n return config.tags[nodeName](node);\n } else {\n return config.tags[nodeName];\n }\n }\n\n function shouldRejectNode(node, allowedAttrs){\n if (typeof allowedAttrs === 'undefined') {\n return true;\n } else if (typeof allowedAttrs === 'boolean') {\n return !allowedAttrs;\n }\n\n return false;\n }\n\n function shouldRejectAttr(attr, allowedAttrs, node){\n var attrName = attr.name.toLowerCase();\n\n if (allowedAttrs === true){\n return false;\n } else if (typeof allowedAttrs[attrName] === 'function'){\n return !allowedAttrs[attrName](attr.value, node);\n } else if (typeof allowedAttrs[attrName] === 'undefined'){\n return true;\n } else if (allowedAttrs[attrName] === false) {\n return true;\n } else if (typeof allowedAttrs[attrName] === 'string') {\n return (allowedAttrs[attrName] !== attr.value);\n }\n\n return false;\n }\n\n return HTMLJanitor;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/html-janitor/src/html-janitor.js\n// module id = 13\n// module chunks = 0","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.1.0\n */\n\nmodule.exports = (function (saver) {\n\n let editor = codex.editor;\n\n /**\n * @public\n * Save blocks\n */\n saver.save = function () {\n\n /** Save html content of redactor to memory */\n editor.state.html = editor.nodes.redactor.innerHTML;\n\n /** Clean jsonOutput state */\n editor.state.jsonOutput = [];\n\n return saveBlocks(editor.nodes.redactor.childNodes);\n\n };\n\n /**\n * @private\n * Save each block data\n *\n * @param blocks\n * @returns {Promise.}\n */\n let saveBlocks = function (blocks) {\n\n let data = [];\n\n for(let index = 0; index < blocks.length; index++) {\n\n data.push(getBlockData(blocks[index]));\n\n }\n\n return Promise.all(data)\n .then(makeOutput)\n .catch(editor.core.log);\n\n };\n\n /** Save and validate block data */\n let getBlockData = function (block) {\n\n return saveBlockData(block)\n .then(validateBlockData)\n .catch(editor.core.log);\n\n };\n\n /**\n * @private\n * Call block`s plugin save method and return saved data\n *\n * @param block\n * @returns {Object}\n */\n let saveBlockData = function (block) {\n\n let pluginName = block.dataset.tool;\n\n /** Check for plugin existence */\n if (!editor.tools[pluginName]) {\n\n editor.core.log(`Plugin «${pluginName}» not found`, 'error');\n return {data: null, pluginName: null};\n\n }\n\n /** Check for plugin having save method */\n if (typeof editor.tools[pluginName].save !== 'function') {\n\n editor.core.log(`Plugin «${pluginName}» must have save method`, 'error');\n return {data: null, pluginName: null};\n\n }\n\n /** Result saver */\n let blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n position = pluginsContent.dataset.inputPosition;\n\n /** If plugin wasn't available then return data from cache */\n if ( editor.tools[pluginName].available === false ) {\n\n return Promise.resolve({data: codex.editor.state.blocks.items[position].data, pluginName});\n\n }\n\n return Promise.resolve(pluginsContent)\n .then(editor.tools[pluginName].save)\n .then(data => Object({data, pluginName}));\n\n };\n\n /**\n * Call plugin`s validate method. Return false if validation failed\n *\n * @param data\n * @param pluginName\n * @returns {Object|Boolean}\n */\n let validateBlockData = function ({data, pluginName}) {\n\n if (!data || !pluginName) {\n\n return false;\n\n }\n\n if (editor.tools[pluginName].validate) {\n\n let result = editor.tools[pluginName].validate(data);\n\n /**\n * Do not allow invalid data\n */\n if (!result) {\n\n return false;\n\n }\n\n }\n\n return {data, pluginName};\n\n\n };\n\n /**\n * Compile article output\n *\n * @param savedData\n * @returns {{time: number, version, items: (*|Array)}}\n */\n let makeOutput = function (savedData) {\n\n savedData = savedData.filter(blockData => blockData);\n\n let items = savedData.map(blockData => Object({type: blockData.pluginName, data: blockData.data}));\n\n editor.state.jsonOutput = items;\n\n return {\n id: editor.state.blocks.id || null,\n time: +new Date(),\n version: editor.version,\n items\n };\n\n };\n\n return saver;\n\n})({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_saver.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @copyright 2017 Codex-Team\n * @version 1.2.0\n */\n\nmodule.exports = (function (transport) {\n\n let editor = codex.editor;\n\n\n /**\n * @private {Object} current XmlHttpRequest instance\n */\n var currentRequest = null;\n\n\n /**\n * @type {null} | {DOMElement} input - keeps input element in memory\n */\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n /**\n * Prepares input element where will be files\n */\n transport.prepare = function () {\n\n let input = editor.draw.node( 'INPUT', '', { type : 'file' } );\n\n editor.listeners.add(input, 'change', editor.transport.fileSelected);\n editor.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function () {\n\n /** Remove old input */\n transport.input = null;\n\n /** Prepare new one */\n transport.prepare();\n\n };\n\n /**\n * Callback for file selection\n * @param {Event} event\n */\n transport.fileSelected = function () {\n\n var input = this,\n i,\n files = input.files,\n formData = new FormData();\n\n if (editor.transport.arguments.multiple === true) {\n\n for ( i = 0; i < files.length; i++) {\n\n formData.append('files[]', files[i], files[i].name);\n\n }\n\n } else {\n\n formData.append('files', files[0], files[0].name);\n\n }\n\n currentRequest = editor.core.ajax({\n type : 'POST',\n data : formData,\n url : editor.transport.arguments.url,\n beforeSend : editor.transport.arguments.beforeSend,\n success : editor.transport.arguments.success,\n error : editor.transport.arguments.error,\n progress : editor.transport.arguments.progress\n });\n\n /** Clear input */\n transport.clearInput();\n\n };\n\n /**\n * Use plugin callbacks\n * @protected\n *\n * @param {Object} args - can have :\n * @param {String} args.url - fetch URL\n * @param {Function} args.beforeSend - function calls before sending ajax\n * @param {Function} args.success - success callback\n * @param {Function} args.error - on error handler\n * @param {Function} args.progress - xhr onprogress handler\n * @param {Boolean} args.multiple - allow select several files\n * @param {String} args.accept - adds accept attribute\n */\n transport.selectAndUpload = function (args) {\n\n transport.arguments = args;\n\n if ( args.multiple === true) {\n\n transport.input.setAttribute('multiple', 'multiple');\n\n }\n\n if ( args.accept ) {\n\n transport.input.setAttribute('accept', args.accept);\n\n }\n\n transport.input.click();\n\n };\n\n transport.abort = function () {\n\n currentRequest.abort();\n\n currentRequest = null;\n\n };\n\n return transport;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_transport.js","/**\n * @class BlockManager\n * @classdesc Manage editor`s blocks storage and appearance\n *\n *\n */\n\nimport Block from '../block';\nimport Util from '../util';\n\nmodule.exports = class 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._currentBlcokIndex = -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._currentBlcokIndex] = 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._currentBlcokIndex];\n\n }\n\n /**\n * Get working html element\n *\n * @return {HTMLElement}\n */\n get currentNode() {\n\n return this._blocks.nodes[this._currentBlcokIndex];\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._currentBlcokIndex = 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 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 Util.array(this.workingArea.children);\n\n }\n\n /**\n * Proxy trap to implement array-like setter\n *\n * @example\n * blocks[0] = new Block(...)\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — block index\n * @param {Block} block — Block to set\n * @returns {Boolean}\n */\n static set(instance, index, block) {\n\n if (isNaN(Number(index))) {\n\n return false;\n\n }\n\n instance.insert(index, block);\n\n return true;\n\n }\n\n /**\n * Proxy trap to implement array-like getter\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — Block index\n * @returns {Block|*}\n */\n static get(instance, index) {\n\n if (isNaN(Number(index))) {\n\n return instance[index];\n\n }\n\n return instance.get(index);\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/blockManager.js","/**\n *\n * @class Block\n * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool\n *\n * @property {Tool} tool — current block tool (Paragraph, for example)\n * @property {Object} CSS — block`s css classes\n *\n */\n\n\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 */\nmodule.exports = class Events {\n\n /**\n * Module key name\n * @returns {string}\n */\n static get name() {\n\n return 'Events';\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 * @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\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/eventDispatcher.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nimport Util from '../util';\n\nmodule.exports = class 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 Util.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};\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 * 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, reject) {\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} success\n * @param {Function} fallback\n *\n * @return {Promise}\n */\n function waitNextBlock(chainData, success, fallback) {\n\n return new Promise(function (resolve, reject) {\n\n chainData.function()\n .then(() => {\n\n success(chainData.data);\n\n })\n .then(resolve)\n .catch(function () {\n\n fallback(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/util.js","/**\n * DOM manipulations\n */\nimport $ from '../dom';\n\n/**\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 static get name() {\n\n return 'Toolbar';\n\n }\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 * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\n\nmodule.exports = (function (inline) {\n\n let editor = codex.editor;\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null;\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function () {\n\n var currentNode = editor.content.currentNode,\n tool = currentNode.dataset.tool,\n plugin;\n\n /**\n * tool allowed to open inline toolbar\n */\n plugin = editor.tools[tool];\n\n if (!plugin.showInlineToolbar)\n return;\n\n var selectedText = inline.getSelectionText(),\n toolbar = editor.nodes.inlineToolbar.wrapper;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n editor.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n editor.toolbar.inline.showButtons();\n\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function () {\n\n var toolbar = editor.nodes.inlineToolbar.wrapper;\n\n toolbar.classList.remove('opened');\n\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function () {\n\n if (!this.wrappersOffset) {\n\n this.wrappersOffset = this.getWrappersOffset();\n\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = editor.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n\n defaultOffset = 40;\n\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n editor.toolbar.inline.closeButtons();\n editor.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function (event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : editor.toolbar.inline.createLinkAction(event, type); break;\n default : editor.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n editor.nodes.inlineToolbar.buttons.childNodes.forEach(editor.toolbar.inline.hightlight);\n\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function () {\n\n var wrapper = editor.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n\n }\n return { top: _y, left: _x };\n\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function () {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != 'Control') {\n\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n\n range.collapse(true);\n var rect = range.getClientRects()[0];\n\n if (!rect) {\n\n return;\n\n }\n\n x = rect.left;\n y = rect.top;\n\n }\n\n }\n\n }\n return { x: x, y: y };\n\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function () {\n\n var selectedText = '';\n\n // all modern browsers and IE9+\n if (window.getSelection) {\n\n selectedText = window.getSelection().toString();\n\n }\n\n return selectedText;\n\n };\n\n /** Opens buttons block */\n inline.showButtons = function () {\n\n var buttons = editor.nodes.inlineToolbar.buttons;\n\n buttons.classList.add('opened');\n\n editor.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n editor.nodes.inlineToolbar.buttons.childNodes.forEach(editor.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function () {\n\n var buttons = editor.nodes.inlineToolbar.buttons;\n\n buttons.classList.remove('opened');\n\n editor.toolbar.inline.buttonsOpened = false;\n\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function () {\n\n var action = editor.nodes.inlineToolbar.actions;\n\n action.classList.add('opened');\n\n editor.toolbar.inline.actionsOpened = true;\n\n };\n\n /** Close actions block */\n inline.closeAction = function () {\n\n var action = editor.nodes.inlineToolbar.actions;\n\n action.innerHTML = '';\n action.classList.remove('opened');\n editor.toolbar.inline.actionsOpened = false;\n\n };\n\n\n /**\n * Callback for keydowns in inline toolbar \"Insert link...\" input\n */\n let inlineToolbarAnchorInputKeydown_ = function (event) {\n\n if (event.keyCode != editor.core.keys.ENTER) {\n\n return;\n\n }\n\n let editable = editor.content.currentNode,\n storedSelection = editor.toolbar.inline.storedSelection;\n\n editor.toolbar.inline.restoreSelection(editable, storedSelection);\n editor.toolbar.inline.setAnchor(this.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n editor.toolbar.inline.clearRange();\n\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function (event) {\n\n var isActive = this.isLinkActive();\n\n var editable = editor.content.currentNode,\n storedSelection = editor.toolbar.inline.saveSelection(editable);\n\n /** Save globally selection */\n editor.toolbar.inline.storedSelection = storedSelection;\n\n if (isActive) {\n\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n editor.toolbar.inline.restoreSelection(editable, storedSelection);\n\n editor.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = editor.draw.inputForLink();\n\n editor.nodes.inlineToolbar.actions.appendChild(action);\n\n editor.toolbar.inline.closeButtons();\n editor.toolbar.inline.showActions();\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n editor.listeners.add(action, 'keydown', inlineToolbarAnchorInputKeydown_, false);\n\n }\n\n };\n\n inline.isLinkActive = function () {\n\n var isActive = false;\n\n editor.nodes.inlineToolbar.buttons.childNodes.forEach(function (tool) {\n\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n\n isActive = true;\n\n }\n\n });\n\n return isActive;\n\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function (type) {\n\n document.execCommand(type, false, null);\n\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function (url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n editor.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function (containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function (containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [ containerEl ],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n\n }\n charIndex = nextCharIndex;\n\n } else {\n\n var i = node.childNodes.length;\n\n while (i--) {\n\n nodeStack.push(node.childNodes[i]);\n\n }\n\n }\n\n }\n\n var sel = window.getSelection();\n\n sel.removeAllRanges();\n sel.addRange(range);\n\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function () {\n\n var selection = window.getSelection();\n\n selection.removeAllRanges();\n\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function (tool) {\n\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n\n editor.toolbar.inline.setButtonHighlighted(tool);\n\n } else {\n\n editor.toolbar.inline.removeButtonsHighLight(tool);\n\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n\n editor.toolbar.inline.setButtonHighlighted(tool);\n\n }\n\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function (button) {\n\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n\n var icon = button.childNodes[0];\n\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n\n }\n\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function (button) {\n\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n\n var icon = button.childNodes[0];\n\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n\n }\n\n };\n\n\n return inline;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar/inline.js","/**\n * Toolbar settings\n *\n * @version 1.0.5\n */\n\nmodule.exports = (function (settings) {\n\n let editor = codex.editor;\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n /**\n * Append and open settings\n */\n settings.open = function (toolType) {\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if ( !editor.tools[toolType] || !editor.tools[toolType].makeSettings ) {\n\n return;\n\n }\n\n /**\n * Draw settings block\n */\n var settingsBlock = editor.tools[toolType].makeSettings();\n\n editor.nodes.pluginSettings.appendChild(settingsBlock);\n\n\n /** Open settings block */\n editor.nodes.blockSettings.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function () {\n\n editor.nodes.blockSettings.classList.remove('opened');\n editor.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function ( toolType ) {\n\n if ( !this.opened ) {\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function () {\n\n var removeBlockWrapper = editor.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = editor.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = editor.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = editor.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = editor.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отмена' });\n\n editor.listeners.add(settingButton, 'click', editor.toolbar.settings.removeButtonClicked, false);\n\n editor.listeners.add(confirmAction, 'click', editor.toolbar.settings.confirmRemovingRequest, false);\n\n editor.listeners.add(cancelAction, 'click', editor.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n editor.toolbar.settings.setting = settingButton;\n editor.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function () {\n\n var action = editor.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n\n editor.toolbar.settings.hideRemoveActions();\n\n } else {\n\n editor.toolbar.settings.showRemoveActions();\n\n }\n\n editor.toolbar.toolbox.close();\n editor.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function () {\n\n editor.toolbar.settings.actions.classList.remove('opened');\n\n };\n\n settings.confirmRemovingRequest = function () {\n\n var currentBlock = editor.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = editor.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n editor.content.currentNode = null;\n\n /** Inserting new empty initial block */\n editor.ui.addInitialBlock();\n\n }\n\n editor.ui.saveInputs();\n\n editor.toolbar.close();\n\n };\n\n settings.showRemoveActions = function () {\n\n editor.toolbar.settings.actions.classList.add('opened');\n\n };\n\n settings.hideRemoveActions = function () {\n\n editor.toolbar.settings.actions.classList.remove('opened');\n\n };\n\n return settings;\n\n})({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar/settings.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\n\nmodule.exports = (function (toolbar) {\n\n let editor = codex.editor;\n\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function () {\n\n if (editor.hideToolbar) {\n\n return;\n\n }\n\n let toolType = editor.content.currentNode.dataset.tool;\n\n if (!editor.tools[toolType] || !editor.tools[toolType].makeSettings ) {\n\n editor.nodes.showSettingsButton.classList.add('hide');\n\n } else {\n\n editor.nodes.showSettingsButton.classList.remove('hide');\n\n }\n\n editor.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function () {\n\n editor.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in editor.nodes.toolbarButtons) {\n\n editor.nodes.toolbarButtons[button].classList.remove('selected');\n\n }\n\n /** Close toolbox when toolbar is not displayed */\n editor.toolbar.toolbox.close();\n editor.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function () {\n\n if ( !this.opened ) {\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function () {\n\n editor.nodes.plusButton.classList.add('hide');\n\n };\n\n toolbar.showPlusButton = function () {\n\n editor.nodes.plusButton.classList.remove('hide');\n\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function () {\n\n /** Close Toolbox when we move toolbar */\n editor.toolbar.toolbox.close();\n\n if (!editor.content.currentNode) {\n\n return;\n\n }\n\n var newYCoordinate = editor.content.currentNode.offsetTop - (editor.toolbar.defaultToolbarHeight / 2) + editor.toolbar.defaultOffset;\n\n editor.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n editor.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar/toolbar.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\n\nmodule.exports = (function (toolbox) {\n\n let editor = codex.editor;\n\n toolbox.opened = false;\n toolbox.openedOnBlock = null;\n\n /** Shows toolbox */\n toolbox.open = function () {\n\n /** Close setting if toolbox is opened */\n if (editor.toolbar.settings.opened) {\n\n editor.toolbar.settings.close();\n\n }\n\n /** Add 'toolbar-opened' class for current block **/\n toolbox.openedOnBlock = editor.content.currentNode;\n toolbox.openedOnBlock.classList.add('toolbar-opened');\n\n /** display toolbox */\n editor.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n editor.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n editor.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function () {\n\n /** Remove 'toolbar-opened' class from current block **/\n if (toolbox.openedOnBlock) toolbox.openedOnBlock.classList.remove('toolbar-opened');\n toolbox.openedOnBlock = null;\n\n /** Makes toolbox disappear */\n editor.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n editor.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n editor.toolbar.toolbox.opened = false;\n\n editor.toolbar.current = null;\n\n };\n\n toolbox.leaf = function () {\n\n let currentTool = editor.toolbar.current,\n tools = Object.keys(editor.tools),\n barButtons = editor.nodes.toolbarButtons,\n nextToolIndex = 0,\n toolToSelect,\n visibleTool,\n tool;\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for(tool in editor.tools) {\n\n if (editor.tools[tool].displayInToolbox) {\n\n break;\n\n }\n\n nextToolIndex ++;\n\n }\n\n } else {\n\n nextToolIndex = (tools.indexOf(currentTool) + 1) % tools.length;\n visibleTool = tools[nextToolIndex];\n\n while (!editor.tools[visibleTool].displayInToolbox) {\n\n nextToolIndex = (nextToolIndex + 1) % tools.length;\n visibleTool = tools[nextToolIndex];\n\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n for ( var button in barButtons ) {\n\n barButtons[button].classList.remove('selected');\n\n }\n\n barButtons[toolToSelect].classList.add('selected');\n editor.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function (event) {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter', 'embed'],\n tool = editor.tools[editor.toolbar.current],\n workingNode = editor.content.currentNode,\n currentInputIndex = editor.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.render();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ) {\n\n /** Replace current block */\n editor.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n editor.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n window.setTimeout(function () {\n\n /** Set caret to current block */\n editor.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n editor.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n editor.toolbar.move();\n\n };\n\n return toolbox;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar/toolbox.js","/**\n * @module Codex Editor Tools Submodule\n *\n * Creates Instances from Plugins and binds external config to the instances\n */\n\n/**\n * 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 */\nlet util = require('../util');\n\nmodule.exports = class Tools {\n\n static get name() {\n\n return 'Tools';\n\n }\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 let self = this;\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 util.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\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/tools.js","/**\n * Module UI\n *\n * @type {UI}\n */\n// let className = {\n\n /**\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\n */\n // BLOCK_CLASSNAME : 'ce-block',\n\n /**\n * @const {String} wrapper for plugins content\n */\n // BLOCK_CONTENT : 'ce-block__content',\n\n /**\n * @const {String} BLOCK_STRETCHED - makes block stretched\n */\n // BLOCK_STRETCHED : 'ce-block--stretched',\n\n /**\n * @const {String} BLOCK_HIGHLIGHTED - adds background\n */\n // BLOCK_HIGHLIGHTED : 'ce-block--focused',\n\n /**\n * @const {String} - for all default settings\n */\n // SETTINGS_ITEM : 'ce-settings__item'\n// };\n\nlet CSS = {\n editorWrapper : 'codex-editor',\n editorZone : 'ce-redactor'\n};\n\n\nimport $ from '../dom';\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 */\nmodule.exports = class UI {\n\n /**\n * Module key name\n * @returns {string}\n */\n static get name() {\n\n return 'ui';\n\n }\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 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};\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"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 0d74f94a49f2a959d1a9","webpack:///./src/codex.js","webpack:///./src/components/modules ^\\.\\/.*$","webpack:///./src/components/modules/_anchors.js","webpack:///./src/components/modules/_callbacks.js","webpack:///./src/components/modules/_caret.js","webpack:///./src/components/modules/_content.js","webpack:///./src/components/dom.js","webpack:///./src/components/modules/_destroyer.js","webpack:///./src/components/modules/_listeners.js","webpack:///./src/components/modules/_notifications.js","webpack:///./src/components/modules/_parser.js","webpack:///./src/components/modules/_paste.js","webpack:///./src/components/modules/_sanitizer.js","webpack:///./~/html-janitor/src/html-janitor.js","webpack:///./src/components/modules/_saver.js","webpack:///./src/components/modules/_transport.js","webpack:///./src/components/modules/blockManager.js","webpack:///./src/components/block.js","webpack:///./src/components/modules/eventDispatcher.js","webpack:///./src/components/modules/renderer.js","webpack:///./src/components/util.js","webpack:///./src/components/modules/toolbar.js","webpack:///./src/components/modules/toolbar/inline.js","webpack:///./src/components/modules/toolbar/settings.js","webpack:///./src/components/modules/toolbar/toolbar.js","webpack:///./src/components/modules/toolbar/toolbox.js","webpack:///./src/components/modules/tools.js","webpack:///./src/components/modules/ui.js"],"names":["modules","editorModules","map","module","exports","config","moduleInstances","Promise","resolve","then","configuration","init","start","console","log","catch","error","constructModules","configureModules","forEach","Module","name","e","state","getModulesDiff","moduleName","prepareDecorator","prepare","ui","Tools","BlockManager","holderId","placeholder","sanitizer","p","b","a","hideToolbar","tools","toolsConfig","anchors","editor","codex","input","currentNode","settingsOpened","currentBlock","value","dataset","anchor","anchorChanged","newAnchor","target","rusToTranslit","trim","classList","add","className","BLOCK_WITH_ANCHOR","remove","keyDownOnAnchorInput","keyCode","core","keys","ENTER","preventDefault","stopPropagation","blur","toolbar","settings","close","keyUpOnAnchorInput","LEFT","DOWN","string","ru","en","i","length","split","join","toLowerCase","replace","callbacks","globalKeydown","event","enterKeyPressed_","redactorKeyDown","TAB","tabKeyPressedOnRedactorsZone_","enterKeyPressedOnRedactorsZone_","ESC","escapeKeyPressedOnRedactorsZone_","defaultKeyPressedOnRedactorsZone_","globalKeyup","UP","RIGHT","arrowKeyPressed_","isBlockEmpty","content","opened","open","toolbox","leaf","editorAreaHightlighted","caret","inputIndex","enterPressedOnBlock_","NEW_BLOCK_TYPE","initialBlockPlugin","insertBlock","type","block","render","move","contentEditable","saveCurrentInputIndex","currentInputIndex","getCurrentInputIndex","workingNode","tool","isEnterPressedOnToolbar","current","inputs","enableLineBreaks","toolClicked","stopImmediatePropagation","shiftKey","currentSelection","window","getSelection","currentSelectedNode","anchorNode","caretAtTheEndOfText","position","atTheEnd","isTextNodeHasParentBetweenContenteditable","callback","enterPressedOnBlock","parentNode","nodeType","nodeTypes","TEXT","splitBlock","textContent","showPlusButton","islastNode","isLastNode","saveInputs","workingNodeChanged","inline","actionsOpened","clearMark","redactorClicked","detectWhenClickedOnFirstLevelBlockArea_","selectedText","getSelectionText","firstLevelBlock","indexOfLastInput","getFirstLevelBlock","setToBlock","setToNextBlock","inputIsEmpty","currentNodeType","isInitialType","hidePlusButton","markBlock","selection","flag","rangeCount","isDomNode","document","body","toolbarButtonClicked","button","plusButtonClicked","nodes","contains","blockKeydown","blockRightOrDownArrowPressed_","BACKSPACE","backspacePressed_","blockLeftOrUpArrowPressed_","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","childNodes","getDeepestTextNodeFromPosition","anchorOffset","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","range","selectionLength","firstLevelBlocksCount","isNativeInput","getRange","endOffset","startOffset","atStart","mergeBlocks","redactor","addInitialBlock","setTimeout","showSettingsButtonClicked","currentToolType","toggle","hideRemoveActions","offset","focusedNodeIndex","set","el","index","childs","nodeToSet","focus","createRange","setStart","setEnd","removeAllRanges","addRange","nextInput","emptyTextElement","createTextNode","appendChild","targetInput","previousInput","lastChildNode","lengthOfLastChildNode","pluginsRender","isFirstNode","isOffsetZero","insertNode","node","lastNode","DOCUMENT_FRAGMENT","getRangeAt","deleteContents","setStartAfter","collapse","Editor","CSS","stretched","highlighted","_currentNode","_currentIndex","pluginHTML","isStretched","make","blockContent","toolId","isNode","newBlock","composeBlock_","insertAdjacentElement","Dom","tagName","classNames","attributes","createElement","Array","isArray","attrName","parent","elements","selector","querySelector","querySelectorAll","Node","ELEMENT_NODE","destroyer","removeNodes","wrapper","notifications","destroyPlugins","destroy","destroyScripts","scripts","getElementsByTagName","id","indexOf","scriptPrefix","listeners","removeAll","plugins","allListeners","search","byElement","element","context","listenersOnElement","listener","push","byType","eventType","listenersWithType","byHandler","handler","listenersWithHandler","one","result","all","isCapture","addEventListener","data","alreadyAddedListener","removeEventListener","existingListeners","splice","get","queue","addToQueue","createHolder","holder","draw","errorThrown","errorMsg","notification","message","constructorSettings","cancel","confirm","inputField","confirmHandler","cancelHandler","create","time","okBtn","cancelBtn","okMsg","cancelMsg","send","clear","innerHTML","parser","insertPastedContent","blockType","tag","text","isFirstLevelBlock","TAG","BLOCK_CLASSNAME","paste","patterns","renderOnPastePatterns","pattern","pasted","clipBoardData","clipboardData","getData","analize","plugin","execArray","regex","exec","match","pasteToNewBlock_","blockPasteCallback","needsToHandlePasteEvent","htmlData","plainData","paragraphs","cleanData","wrappedData","clean","wrapTextWithParagraphs","emulateUserAgentBehaviour","insertPastedParagraphs","editableParent","getEditableParent","paragraph","newNode","childElementCount","createDocumentFragment","cloneNode","janitor","require","isEmpty","Config","CUSTOM","BASIC","tags","href","rel","init_","userCustomConfig","dirtyString","customConfig","janitorInstance","saver","save","html","jsonOutput","saveBlocks","blocks","getBlockData","makeOutput","saveBlockData","validateBlockData","pluginName","pluginsContent","inputPosition","available","items","Object","validate","savedData","filter","blockData","Date","version","transport","currentRequest","arguments","fileSelected","clearInput","files","formData","FormData","multiple","append","ajax","url","beforeSend","success","progress","selectAndUpload","args","setAttribute","accept","click","abort","_blocks","_currentBloсkIndex","Blocks","Proxy","toolName","toolInstance","construct","array","workingArea","previousBlock","nextBlock","targetBlock","insert","children","instance","isNaN","Number","Block","_html","compose","subscribers","eventName","reduce","previousData","currentHandler","newData","chainData","function","makeBlock","sequence","item","chains","fallback","reject","previousValue","currentValue","iteration","waitNextBlock","collection","prototype","slice","call","Toolbar","actions","plusButton","settingsToggler","removeBlockButton","pluginSettings","defaultSettings","makeRemoveBlockButton","makeBlockSettingsPanel","buttonsOpened","wrappersOffset","storedSelection","show","showInlineToolbar","inlineToolbar","showButtons","getWrappersOffset","coords","getSelectionCoords","defaultOffset","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","style","transform","Math","floor","closeButtons","closeAction","createLinkAction","defaultToolAction","buttons","hightlight","getOffset","_x","_y","offsetLeft","offsetTop","clientLeft","clientTop","offsetParent","sel","boundingLeft","boundingTop","cloneRange","getClientRects","rect","toString","showActions","action","inlineToolbarAnchorInputKeydown_","editable","restoreSelection","setAnchor","clearRange","isActive","isLinkActive","saveSelection","inputForLink","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","startContainer","end","savedSel","charIndex","nodeStack","foundStart","stop","nextCharIndex","pop","queryCommandState","setButtonHighlighted","removeButtonsHighLight","icon","setting","toolType","makeSettings","settingsBlock","blockSettings","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","showRemoveActions","defaultToolbarHeight","showSettingsButton","toolbarButtons","newYCoordinate","openedOnBlock","currentTool","barButtons","nextToolIndex","toolToSelect","visibleTool","displayInToolbox","UNREPLACEBLE_TOOLS","newBlockContent","appendCallback","switchBlock","util","toolsAvailable","toolsUnavailable","iconClassName","toolClasses","self","hasOwnProperty","sequenceData","getListOfPrepareFunctions","toolPreparationList","toolClass","toolInstances","editorWrapper","editorZone","getElementById","Error"],"mappings":"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C;;AAMA,kBAAK/B,MAAL,CAAYgC,WAAZ,GAA0BhC,OAAOgC,WAAP,GAAqBhC,OAAOgC,WAA5B,GAA0C,KAApE;AACA,kBAAKhC,MAAL,CAAYiC,KAAZ,GAAoBjC,OAAOiC,KAAP,IAAgB,EAApC;AACA,kBAAKjC,MAAL,CAAYkC,WAAZ,GAA0BlC,OAAOkC,WAAP,IAAsB,EAAhD;AAEH;;AAED;;;;AAlEJ;AAAA,6BAsEwB;;AAEhB,oBAAO,KAAKlC,MAAZ;AAEH;AA1EL;;AAAA;AAAA;;AAyLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,W;;;;;;AC7WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kCAAiC,uDAAuD;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACzDA;;;;;;;AAOAF,QAAOC,OAAP,GAAiB,UAAUoC,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AAED;;;;;AAvDJ;AAAA,2BA4DoBX,IA5DpB,EA4D0B;;AAElB,iBAAIhF,kBAAkB,KAAKE,kBAAL,CAAwB8E,IAAxB,CAAtB;;AAEA,kBAAKW,YAAL,GAAoB3F,eAApB;AAEH;AAlEL;;AAAA;AAAA;;AAuKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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MAAd;AAEH;AAvBL;;AAAA;AAAA;;AAqEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,W;;;;;;;;;;;;ACjRA;;;AAGAjP,QAAOC,OAAP;AAAA;AAAA;AAAA;;AAAA;AAAA;;;AAEI;;;;;;AAMA;;;;;;;;;AARJ,kCAiBoB+c,MAjBpB,EAiBqE;AAAA,iBAAzCvC,OAAyC,uEAA/B,YAAM,CAAE,CAAuB;AAAA,iBAArBwC,QAAqB,uEAAV,YAA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;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,W","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0d74f94a49f2a959d1a9","/**\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 */\nlet modules = editorModules.map( module => {\n\n return require('./components/modules/' + module );\n\n});\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 this.moduleInstances[Module.name] = 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 modules = {};\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 modules[moduleName] = this.moduleInstances[moduleName];\n\n }\n\n return modules;\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\"./_anchors\": 2,\n\t\"./_anchors.js\": 2,\n\t\"./_callbacks\": 3,\n\t\"./_callbacks.js\": 3,\n\t\"./_caret\": 4,\n\t\"./_caret.js\": 4,\n\t\"./_content\": 5,\n\t\"./_content.js\": 5,\n\t\"./_destroyer\": 7,\n\t\"./_destroyer.js\": 7,\n\t\"./_listeners\": 8,\n\t\"./_listeners.js\": 8,\n\t\"./_notifications\": 9,\n\t\"./_notifications.js\": 9,\n\t\"./_parser\": 10,\n\t\"./_parser.js\": 10,\n\t\"./_paste\": 11,\n\t\"./_paste.js\": 11,\n\t\"./_sanitizer\": 12,\n\t\"./_sanitizer.js\": 12,\n\t\"./_saver\": 14,\n\t\"./_saver.js\": 14,\n\t\"./_transport\": 15,\n\t\"./_transport.js\": 15,\n\t\"./blockManager\": 16,\n\t\"./blockManager.js\": 16,\n\t\"./eventDispatcher\": 18,\n\t\"./eventDispatcher.js\": 18,\n\t\"./renderer\": 19,\n\t\"./renderer.js\": 19,\n\t\"./toolbar\": 21,\n\t\"./toolbar.js\": 21,\n\t\"./toolbar/inline\": 22,\n\t\"./toolbar/inline.js\": 22,\n\t\"./toolbar/settings\": 23,\n\t\"./toolbar/settings.js\": 23,\n\t\"./toolbar/toolbar\": 24,\n\t\"./toolbar/toolbar.js\": 24,\n\t\"./toolbar/toolbox\": 25,\n\t\"./toolbar/toolbox.js\": 25,\n\t\"./tools\": 26,\n\t\"./tools.js\": 26,\n\t\"./ui\": 27,\n\t\"./ui.js\": 27\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\treturn map[req] || (function() { throw new Error(\"Cannot find module '\" + req + \"'.\") }());\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 1;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/modules ^\\.\\/.*$\n// module id = 1\n// module chunks = 0","/**\n * Codex Editor Anchors module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nmodule.exports = function (anchors) {\n\n let editor = codex.editor;\n\n anchors.input = null;\n anchors.currentNode = null;\n\n anchors.settingsOpened = function (currentBlock) {\n\n anchors.currentNode = currentBlock;\n anchors.input.value = anchors.currentNode.dataset.anchor || '';\n\n };\n\n anchors.anchorChanged = function (e) {\n\n var newAnchor = e.target.value = anchors.rusToTranslit(e.target.value);\n\n anchors.currentNode.dataset.anchor = newAnchor;\n\n if (newAnchor.trim() !== '') {\n\n anchors.currentNode.classList.add(editor.ui.className.BLOCK_WITH_ANCHOR);\n\n } else {\n\n anchors.currentNode.classList.remove(editor.ui.className.BLOCK_WITH_ANCHOR);\n\n }\n\n };\n\n anchors.keyDownOnAnchorInput = function (e) {\n\n if (e.keyCode == editor.core.keys.ENTER) {\n\n e.preventDefault();\n e.stopPropagation();\n\n e.target.blur();\n editor.toolbar.settings.close();\n\n }\n\n };\n\n anchors.keyUpOnAnchorInput = function (e) {\n\n if (e.keyCode >= editor.core.keys.LEFT && e.keyCode <= editor.core.keys.DOWN) {\n\n e.stopPropagation();\n\n }\n\n };\n\n anchors.rusToTranslit = function (string) {\n\n var ru = [\n 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й',\n 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф',\n 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ь', 'Ы', 'Ь', 'Э', 'Ю', 'Я'\n ],\n en = [\n 'A', 'B', 'V', 'G', 'D', 'E', 'E', 'Zh', 'Z', 'I', 'Y',\n 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F',\n 'H', 'C', 'Ch', 'Sh', 'Sch', '', 'Y', '', 'E', 'Yu', 'Ya'\n ];\n\n for (var i = 0; i < ru.length; i++) {\n\n string = string.split(ru[i]).join(en[i]);\n string = string.split(ru[i].toLowerCase()).join(en[i].toLowerCase());\n\n }\n\n string = string.replace(/[^0-9a-zA-Z_]+/g, '-');\n\n return string;\n\n };\n\n return anchors;\n\n}({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_anchors.js","/**\n * @module Codex Editor Callbacks module\n * @description Module works with editor added Elements\n *\n * @author Codex Team\n * @version 1.4.0\n */\n\nmodule.exports = (function (callbacks) {\n\n let editor = codex.editor;\n\n /**\n * used by UI module\n * @description Routes all keydowns on document\n * @param {Object} event\n */\n callbacks.globalKeydown = function (event) {\n\n switch (event.keyCode) {\n case editor.core.keys.ENTER : enterKeyPressed_(event); break;\n }\n\n };\n\n /**\n * used by UI module\n * @description Routes all keydowns on redactors area\n * @param {Object} event\n */\n callbacks.redactorKeyDown = function (event) {\n\n switch (event.keyCode) {\n case editor.core.keys.TAB : tabKeyPressedOnRedactorsZone_(event); break;\n case editor.core.keys.ENTER : enterKeyPressedOnRedactorsZone_(event); break;\n case editor.core.keys.ESC : escapeKeyPressedOnRedactorsZone_(event); break;\n default : defaultKeyPressedOnRedactorsZone_(event); break;\n }\n\n };\n\n /**\n * used by UI module\n * @description Routes all keyup events\n * @param {Object} event\n */\n callbacks.globalKeyup = function (event) {\n\n switch (event.keyCode) {\n case editor.core.keys.UP :\n case editor.core.keys.LEFT :\n case editor.core.keys.RIGHT :\n case editor.core.keys.DOWN : arrowKeyPressed_(event); break;\n }\n\n };\n\n /**\n * @param {Object} event\n * @private\n *\n * Handles behaviour when tab pressed\n * @description if Content is empty show toolbox (if it is closed) or leaf tools\n * uses Toolbars toolbox module to handle the situation\n */\n var tabKeyPressedOnRedactorsZone_ = function (event) {\n\n /**\n * Wait for solution. Would like to know the behaviour\n * @todo Add spaces\n */\n event.preventDefault();\n\n\n if (!editor.core.isBlockEmpty(editor.content.currentNode)) {\n\n return;\n\n }\n\n if ( !editor.toolbar.opened ) {\n\n editor.toolbar.open();\n\n }\n\n if (editor.toolbar.opened && !editor.toolbar.toolbox.opened) {\n\n editor.toolbar.toolbox.open();\n\n } else {\n\n editor.toolbar.toolbox.leaf();\n\n }\n\n };\n\n /**\n * Handles global EnterKey Press\n * @see enterPressedOnBlock_\n * @param {Object} event\n */\n var enterKeyPressed_ = function () {\n\n if (editor.content.editorAreaHightlighted) {\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n editor.caret.inputIndex = -1;\n\n enterPressedOnBlock_();\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n *\n * @param {Event} event\n * @private\n *\n * @description Inserts new block with initial type from settings\n */\n var enterPressedOnBlock_ = function () {\n\n var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n\n editor.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : editor.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n editor.toolbar.move();\n editor.toolbar.open();\n\n };\n\n\n /**\n * ENTER key handler\n *\n * @param {Object} event\n * @private\n *\n * @description Makes new block with initial type from settings\n */\n var enterKeyPressedOnRedactorsZone_ = function (event) {\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n editor.caret.saveCurrentInputIndex();\n\n }\n\n var currentInputIndex = editor.caret.getCurrentInputIndex() || 0,\n workingNode = editor.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = editor.toolbar.opened &&\n editor.toolbar.current &&\n event.target == editor.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = editor.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n editor.toolbar.toolbox.toolClicked(event);\n\n editor.toolbar.close();\n\n /**\n * Stop other listeners callback executions\n */\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n return;\n\n }\n\n /**\n * Allow paragraph lineBreaks with shift enter\n * Or if shiftkey pressed and enter and enabledLineBreaks, the let new block creation\n */\n if ( event.shiftKey || enableLineBreaks ) {\n\n event.stopPropagation();\n event.stopImmediatePropagation();\n return;\n\n }\n\n var currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = editor.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks ) {\n\n editor.callback.enterPressedOnBlock(editor.content.currentBlock, event);\n event.preventDefault();\n return;\n\n }\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != 'true';\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == editor.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ) {\n\n event.preventDefault();\n\n editor.core.log('Splitting Text node...');\n\n editor.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!editor.state.inputs[currentInputIndex + 1].textContent.trim()) {\n\n editor.toolbar.showPlusButton();\n\n }\n\n } else {\n\n var islastNode = editor.content.isLastNode(currentSelectedNode);\n\n if ( islastNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n\n editor.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n editor.content.insertBlock({\n type: NEW_BLOCK_TYPE,\n block: editor.tools[NEW_BLOCK_TYPE].render()\n }, true);\n\n editor.toolbar.move();\n editor.toolbar.open();\n\n /** Show plus button with empty block */\n editor.toolbar.showPlusButton();\n\n }\n\n }\n\n /** get all inputs after new appending block */\n editor.ui.saveInputs();\n\n };\n\n /**\n * Escape behaviour\n * @param event\n * @private\n *\n * @description Closes toolbox and toolbar. Prevents default behaviour\n */\n var escapeKeyPressedOnRedactorsZone_ = function (event) {\n\n /** Close all toolbar */\n editor.toolbar.close();\n\n /** Close toolbox */\n editor.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n /**\n * @param {Event} event\n * @private\n *\n * closes and moves toolbar\n */\n var arrowKeyPressed_ = function (event) {\n\n editor.content.workingNodeChanged();\n\n /* Closing toolbar */\n editor.toolbar.close();\n editor.toolbar.move();\n\n };\n\n /**\n * @private\n * @param {Event} event\n *\n * @description Closes all opened bars from toolbar.\n * If block is mark, clears highlightning\n */\n var defaultKeyPressedOnRedactorsZone_ = function () {\n\n editor.toolbar.close();\n\n if (!editor.toolbar.inline.actionsOpened) {\n\n editor.toolbar.inline.close();\n editor.content.clearMark();\n\n }\n\n };\n\n /**\n * Handler when clicked on redactors area\n *\n * @protected\n * @param event\n *\n * @description Detects clicked area. If it is first-level block area, marks as detected and\n * on next enter press will be inserted new block\n * Otherwise, save carets position (input index) and put caret to the editable zone.\n *\n * @see detectWhenClickedOnFirstLevelBlockArea_\n *\n */\n callbacks.redactorClicked = function (event) {\n\n detectWhenClickedOnFirstLevelBlockArea_();\n\n editor.content.workingNodeChanged(event.target);\n editor.ui.saveInputs();\n\n var selectedText = editor.toolbar.inline.getSelectionText(),\n firstLevelBlock;\n\n /** If selection range took off, then we hide inline toolbar */\n if (selectedText.length === 0) {\n\n editor.toolbar.inline.close();\n\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n editor.caret.saveCurrentInputIndex();\n\n }\n\n if (editor.content.currentNode === null) {\n\n /**\n * If inputs in redactor does not exits, then we put input index 0 not -1\n */\n var indexOfLastInput = editor.state.inputs.length > 0 ? editor.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (editor.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n firstLevelBlock = editor.content.getFirstLevelBlock(editor.state.inputs[indexOfLastInput]);\n\n }\n\n /** If input is empty, then we set caret to the last input */\n if (editor.state.inputs.length && editor.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == editor.settings.initialBlockPlugin) {\n\n editor.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n\n editor.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : editor.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (editor.state.inputs.length === 1) {\n\n editor.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n editor.caret.setToNextBlock(indexOfLastInput);\n\n }\n\n }\n\n } else {\n\n /** Close all panels */\n editor.toolbar.settings.close();\n editor.toolbar.toolbox.close();\n\n }\n\n /**\n * Move toolbar and open\n */\n editor.toolbar.move();\n editor.toolbar.open();\n\n var inputIsEmpty = !editor.content.currentNode.textContent.trim(),\n currentNodeType = editor.content.currentNode.dataset.tool,\n isInitialType = currentNodeType == editor.settings.initialBlockPlugin;\n\n\n /** Hide plus buttons */\n editor.toolbar.hidePlusButton();\n\n if (!inputIsEmpty) {\n\n /** Mark current block */\n editor.content.markBlock();\n\n }\n\n if ( isInitialType && inputIsEmpty ) {\n\n /** Show plus button */\n editor.toolbar.showPlusButton();\n\n }\n\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n *\n * @private\n *\n * @description Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n var detectWhenClickedOnFirstLevelBlockArea_ = function () {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount === 0) {\n\n editor.content.editorAreaHightlighted = true;\n\n } else {\n\n if (!editor.core.isDomNode(anchorNode)) {\n\n anchorNode = anchorNode.parentNode;\n\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n\n flag = true;\n\n }\n\n while (anchorNode.contentEditable != 'true') {\n\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n\n flag = true;\n\n }\n\n if (anchorNode == document.body) {\n\n break;\n\n }\n\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n editor.content.editorAreaHightlighted = !flag;\n\n }\n\n };\n\n /**\n * Toolbar button click handler\n *\n * @param {Object} event - cursor to the button\n * @protected\n *\n * @description gets current tool and calls render method\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n editor.toolbar.current = button.dataset.type;\n\n editor.toolbar.toolbox.toolClicked(event);\n editor.toolbar.close();\n\n };\n\n /**\n * Show or Hide toolbox when plus button is clicked\n */\n callbacks.plusButtonClicked = function () {\n\n if (!editor.nodes.toolbox.classList.contains('opened')) {\n\n editor.toolbar.toolbox.open();\n\n } else {\n\n editor.toolbar.toolbox.close();\n\n }\n\n };\n\n /**\n * Block handlers for KeyDown events\n *\n * @protected\n * @param {Object} event\n *\n * Handles keydowns on block\n * @see blockRightOrDownArrowPressed_\n * @see backspacePressed_\n * @see blockLeftOrUpArrowPressed_\n */\n callbacks.blockKeydown = function (event) {\n\n let block = event.target; // event.target is input\n\n switch (event.keyCode) {\n\n case editor.core.keys.DOWN:\n case editor.core.keys.RIGHT:\n blockRightOrDownArrowPressed_(event);\n break;\n\n case editor.core.keys.BACKSPACE:\n backspacePressed_(block, event);\n break;\n\n case editor.core.keys.UP:\n case editor.core.keys.LEFT:\n blockLeftOrUpArrowPressed_(event);\n break;\n\n }\n\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n *\n * @param {Object} event\n * @private\n *\n * @description watches the selection and gets closest editable element.\n * Uses method getDeepestTextNodeFromPosition to get the last node of next block\n * Sets caret if it is contenteditable\n */\n var blockRightOrDownArrowPressed_ = function (event) {\n\n var selection = window.getSelection(),\n inputs = editor.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode) {\n\n return false;\n\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n\n editableElementIndex ++;\n\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n\n editor.caret.setToNextBlock(editableElementIndex);\n return;\n\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (editor.core.isDomNode(lastChild)) {\n\n deepestTextnode = editor.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n\n editor.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n\n }\n\n editor.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n *\n * @param {Object} event\n * @private\n *\n * watches the selection and gets closest editable element.\n * Uses method getDeepestTextNodeFromPosition to get the last node of previous block\n * Sets caret if it is contenteditable\n *\n */\n var blockLeftOrUpArrowPressed_ = function (event) {\n\n var selection = window.getSelection(),\n inputs = editor.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode) {\n\n return false;\n\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n\n return false;\n\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n\n editableElementIndex ++;\n\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n\n editor.caret.setToPreviousBlock(editableElementIndex);\n return;\n\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (editor.core.isDomNode(firstChild)) {\n\n deepestTextnode = editor.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n editor.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Handles backspace keydown\n *\n * @param {Element} block\n * @param {Object} event\n * @private\n *\n * @description if block is empty, delete the block and set caret to the previous block\n * If block is not empty, try to merge two blocks - current and previous\n * But it we try'n to remove first block, then we should set caret to the next block, not previous.\n * If we removed the last block, create new one\n */\n var backspacePressed_ = function (block, event) {\n\n var currentInputIndex = editor.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (editor.core.isNativeInput(event.target)) {\n\n /** If input value is empty - remove block */\n if (event.target.value.trim() == '') {\n\n block.remove();\n\n } else {\n\n return;\n\n }\n\n }\n\n if (block.textContent.trim()) {\n\n range = editor.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n if (editor.caret.position.atStart() && !selectionLength && editor.state.inputs[currentInputIndex - 1]) {\n\n editor.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n\n }\n\n if (!selectionLength) {\n\n block.remove();\n\n }\n\n\n firstLevelBlocksCount = editor.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n editor.content.currentNode = null;\n\n /** Inserting new empty initial block */\n editor.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n editor.ui.saveInputs();\n\n /** Set to current appended block */\n window.setTimeout(function () {\n\n editor.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (editor.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n editor.caret.setToPreviousBlock(editor.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n editor.caret.setToNextBlock(editor.caret.inputIndex);\n\n }\n\n }\n\n editor.toolbar.move();\n\n if (!editor.toolbar.opened) {\n\n editor.toolbar.open();\n\n }\n\n /** Updating inputs state */\n editor.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n /**\n * used by UI module\n * Clicks on block settings button\n *\n * @param {Object} event\n * @protected\n * @description Opens toolbar settings\n */\n callbacks.showSettingsButtonClicked = function (event) {\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = editor.content.currentNode.dataset.tool;\n\n editor.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n editor.toolbar.toolbox.close();\n editor.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_callbacks.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nmodule.exports = (function (caret) {\n\n let editor = codex.editor;\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function ( el, index, offset) {\n\n offset = offset || caret.offset || 0;\n index = index || caret.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.contentEditable != 'true') {\n\n el.focus();\n return;\n\n }\n\n if (editor.core.isDomNode(nodeToSet)) {\n\n nodeToSet = editor.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n window.setTimeout(function () {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n editor.caret.saveCurrentInputIndex();\n\n }, 20);\n\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = editor.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode) {\n\n return;\n\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n\n editableElementIndex ++;\n\n }\n\n caret.inputIndex = editableElementIndex;\n\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function () {\n\n return caret.inputIndex;\n\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function (index) {\n\n var inputs = editor.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n\n editor.core.log('We are reached the end');\n return;\n\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n\n var emptyTextElement = document.createTextNode('');\n\n nextInput.appendChild(emptyTextElement);\n\n }\n\n editor.caret.inputIndex = index + 1;\n editor.caret.set(nextInput, 0, 0);\n editor.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function (index) {\n\n var inputs = editor.state.inputs,\n targetInput = inputs[index];\n\n if ( !targetInput ) {\n\n return;\n\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n\n var emptyTextElement = document.createTextNode('');\n\n targetInput.appendChild(emptyTextElement);\n\n }\n\n editor.caret.inputIndex = index;\n editor.caret.set(targetInput, 0, 0);\n editor.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function (index) {\n\n index = index || 0;\n\n var inputs = editor.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n\n editor.core.log('We are reached first node');\n return;\n\n }\n\n lastChildNode = editor.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n\n }\n editor.caret.inputIndex = index - 1;\n editor.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n editor.content.workingNodeChanged(inputs[index - 1]);\n\n };\n\n caret.position = {\n\n atStart : function () {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = editor.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!editor.core.isDomNode(anchorNode)) {\n\n anchorNode = anchorNode.parentNode;\n\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function () {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n\n }\n };\n\n\n /**\n * Inserts node at the caret location\n * @param {HTMLElement|DocumentFragment} node\n */\n caret.insertNode = function (node) {\n\n var selection, range,\n lastNode = node;\n\n if (node.nodeType == editor.core.nodeTypes.DOCUMENT_FRAGMENT) {\n\n lastNode = node.lastChild;\n\n }\n\n selection = window.getSelection();\n\n range = selection.getRangeAt(0);\n range.deleteContents();\n\n range.insertNode(node);\n\n range.setStartAfter(lastNode);\n range.collapse(true);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n\n };\n\n return caret;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_caret.js","/**\n * Codex Editor Content Module\n * Works with DOM\n *\n * @class Content\n * @classdesc Class works provides COdex Editor appearance logic\n *\n * @author Codex Team\n * @version 2.0.0\n */\n\nimport $ from '../dom';\n\nmodule.exports = class Content {\n\n /**\n * Module key name\n * @returns {string}\n */\n static get name() {\n\n return 'Content';\n\n }\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.CSS = {\n block: 'ce-block',\n content: 'ce-block__content',\n stretched: 'ce-block--stretched',\n highlighted: 'ce-block--highlighted',\n };\n\n this._currentNode = null;\n this._currentIndex = 0;\n\n }\n\n /**\n * Editor modules setter\n * @param {object} Editor\n */\n set state(Editor) {\n\n this.Editor = Editor;\n\n }\n\n /**\n * Get current working node\n *\n * @returns {null|HTMLElement}\n */\n get currentNode() {\n\n return this._currentNode;\n\n }\n\n /**\n * Set working node. Working node should be first level block, so we find it before set one to _currentNode property\n *\n * @param {HTMLElement} node\n */\n set currentNode(node) {\n\n let firstLevelBlock = this.getFirstLevelBlock(node);\n\n this._currentNode = firstLevelBlock;\n\n }\n\n\n /**\n * @private\n * @param pluginHTML\n * @param {Boolean} isStretched - make stretched block or not\n *\n * @description adds necessary information to wrap new created block by first-level holder\n */\n composeBlock_(pluginHTML, isStretched = false) {\n\n let block = $.make('DIV', this.CSS.block),\n blockContent = $.make('DIV', this.CSS.content);\n\n blockContent.appendChild(pluginHTML);\n block.appendChild(blockContent);\n\n if (isStretched) {\n\n blockContent.classList.add(this.CSS.stretched);\n\n }\n\n block.dataset.toolId = this._currentIndex++;\n\n return block;\n\n };\n\n /**\n * Finds first-level block\n * @description looks for first-level block.\n * gets parent while node is not first-level\n *\n * @param {Element} node - selected or clicked in redactors area node\n * @protected\n *\n */\n getFirstLevelBlock(node) {\n\n if (!$.isNode(node)) {\n\n node = node.parentNode;\n\n }\n\n if (node === this.Editor.ui.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(node.classList && !node.classList.contains(this.CSS.block)) {\n\n node = node.parentNode;\n\n }\n\n return node;\n\n }\n\n };\n\n /**\n * Insert new block to working area\n *\n * @param {HTMLElement} tool\n *\n * @returns {Number} tool index\n *\n */\n insertBlock(tool) {\n\n let newBlock = this.composeBlock_(tool);\n\n if (this.currentNode) {\n\n this.currentNode.insertAdjacentElement('afterend', newBlock);\n\n } else {\n\n /**\n * If redactor is empty, append as first child\n */\n this.Editor.ui.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Set new node as current\n */\n this.currentNode = newBlock;\n\n return newBlock.dataset.toolId;\n\n }\n\n};\n\n// module.exports = (function (content) {\n//\n// let editor = codex.editor;\n//\n// /**\n// * Links to current active block\n// * @type {null | Element}\n// */\n// content.currentNode = null;\n//\n// /**\n// * clicked in redactor area\n// * @type {null | Boolean}\n// */\n// content.editorAreaHightlighted = null;\n//\n// /**\n// * @deprecated\n// * Synchronizes redactor with original textarea\n// */\n// content.sync = function () {\n//\n// editor.core.log('syncing...');\n//\n// /**\n// * Save redactor content to editor.state\n// */\n// editor.state.html = editor.nodes.redactor.innerHTML;\n//\n// };\n//\n// /**\n// * Appends background to the block\n// *\n// * @description add CSS class to highlight visually first-level block area\n// */\n// content.markBlock = function () {\n//\n// editor.content.currentNode.classList.add(editor.ui.className.BLOCK_HIGHLIGHTED);\n//\n// };\n//\n// /**\n// * Clear background\n// *\n// * @description clears styles that highlights block\n// */\n// content.clearMark = function () {\n//\n// if (editor.content.currentNode) {\n//\n// editor.content.currentNode.classList.remove(editor.ui.className.BLOCK_HIGHLIGHTED);\n//\n// }\n//\n// };\n//\n// /**\n// * Finds first-level block\n// *\n// * @param {Element} node - selected or clicked in redactors area node\n// * @protected\n// *\n// * @description looks for first-level block.\n// * gets parent while node is not first-level\n// */\n// content.getFirstLevelBlock = function (node) {\n//\n// if (!editor.core.isDomNode(node)) {\n//\n// node = node.parentNode;\n//\n// }\n//\n// if (node === editor.nodes.redactor || node === document.body) {\n//\n// return null;\n//\n// } else {\n//\n// while(!node.classList.contains(editor.ui.className.BLOCK_CLASSNAME)) {\n//\n// node = node.parentNode;\n//\n// }\n//\n// return node;\n//\n// }\n//\n// };\n//\n// /**\n// * Trigger this event when working node changed\n// * @param {Element} targetNode - first-level of this node will be current\n// * @protected\n// *\n// * @description If targetNode is first-level then we set it as current else we look for parents to find first-level\n// */\n// content.workingNodeChanged = function (targetNode) {\n//\n// /** Clear background from previous marked block before we change */\n// editor.content.clearMark();\n//\n// if (!targetNode) {\n//\n// return;\n//\n// }\n//\n// content.currentNode = content.getFirstLevelBlock(targetNode);\n//\n// };\n//\n// /**\n// * Replaces one redactor block with another\n// * @protected\n// * @param {Element} targetBlock - block to replace. Mostly currentNode.\n// * @param {Element} newBlock\n// * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n// *\n// * [!] Function does not saves old block content.\n// * You can get it manually and pass with newBlock.innerHTML\n// */\n// content.replaceBlock = function (targetBlock, newBlock) {\n//\n// if (!targetBlock || !newBlock) {\n//\n// editor.core.log('replaceBlock: missed params');\n// return;\n//\n// }\n//\n// /** If target-block is not a frist-level block, then we iterate parents to find it */\n// while(!targetBlock.classList.contains(editor.ui.className.BLOCK_CLASSNAME)) {\n//\n// targetBlock = targetBlock.parentNode;\n//\n// }\n//\n// /** Replacing */\n// editor.nodes.redactor.replaceChild(newBlock, targetBlock);\n//\n// /**\n// * Set new node as current\n// */\n// editor.content.workingNodeChanged(newBlock);\n//\n// /**\n// * Add block handlers\n// */\n// editor.ui.addBlockHandlers(newBlock);\n//\n// /**\n// * Save changes\n// */\n// editor.ui.saveInputs();\n//\n// };\n//\n// /**\n// * @protected\n// *\n// * Inserts new block to redactor\n// * Wrapps block into a DIV with BLOCK_CLASSNAME class\n// *\n// * @param blockData {object}\n// * @param blockData.block {Element} element with block content\n// * @param blockData.type {string} block plugin\n// * @param needPlaceCaret {bool} pass true to set caret in new block\n// *\n// */\n// content.insertBlock = function ( blockData, needPlaceCaret ) {\n//\n// var workingBlock = editor.content.currentNode,\n// newBlockContent = blockData.block,\n// blockType = blockData.type,\n// isStretched = blockData.stretched;\n//\n// var newBlock = composeNewBlock_(newBlockContent, blockType, isStretched);\n//\n// if (workingBlock) {\n//\n// editor.core.insertAfter(workingBlock, newBlock);\n//\n// } else {\n//\n// /**\n// * If redactor is empty, append as first child\n// */\n// editor.nodes.redactor.appendChild(newBlock);\n//\n// }\n//\n// /**\n// * Block handler\n// */\n// editor.ui.addBlockHandlers(newBlock);\n//\n// /**\n// * Set new node as current\n// */\n// editor.content.workingNodeChanged(newBlock);\n//\n// /**\n// * Save changes\n// */\n// editor.ui.saveInputs();\n//\n//\n// if ( needPlaceCaret ) {\n//\n// /**\n// * If we don't know input index then we set default value -1\n// */\n// var currentInputIndex = editor.caret.getCurrentInputIndex() || -1;\n//\n//\n// if (currentInputIndex == -1) {\n//\n//\n// var editableElement = newBlock.querySelector('[contenteditable]'),\n// emptyText = document.createTextNode('');\n//\n// editableElement.appendChild(emptyText);\n// editor.caret.set(editableElement, 0, 0);\n//\n// editor.toolbar.move();\n// editor.toolbar.showPlusButton();\n//\n//\n// } else {\n//\n// if (currentInputIndex === editor.state.inputs.length - 1)\n// return;\n//\n// /** Timeout for browsers execution */\n// window.setTimeout(function () {\n//\n// /** Setting to the new input */\n// editor.caret.setToNextBlock(currentInputIndex);\n// editor.toolbar.move();\n// editor.toolbar.open();\n//\n// }, 10);\n//\n// }\n//\n// }\n//\n// /**\n// * Block is inserted, wait for new click that defined focusing on editors area\n// * @type {boolean}\n// */\n// content.editorAreaHightlighted = false;\n//\n// };\n//\n// /**\n// * Replaces blocks with saving content\n// * @protected\n// * @param {Element} noteToReplace\n// * @param {Element} newNode\n// * @param {Element} blockType\n// */\n// content.switchBlock = function (blockToReplace, newBlock, tool) {\n//\n// tool = tool || editor.content.currentNode.dataset.tool;\n// var newBlockComposed = composeNewBlock_(newBlock, tool);\n//\n// /** Replacing */\n// editor.content.replaceBlock(blockToReplace, newBlockComposed);\n//\n// /** Save new Inputs when block is changed */\n// editor.ui.saveInputs();\n//\n// };\n//\n// /**\n// * Iterates between child noted and looking for #text node on deepest level\n// * @protected\n// *\n// * @param {Element} block - node where find\n// * @param {int} postiton - starting postion\n// * Example: childNodex.length to find from the end\n// * or 0 to find from the start\n// * @return {Text} block\n// * @uses DFS\n// */\n// content.getDeepestTextNodeFromPosition = function (block, position) {\n//\n// /**\n// * Clear Block from empty and useless spaces with trim.\n// * Such nodes we should remove\n// */\n// var blockChilds = block.childNodes,\n// index,\n// node,\n// text;\n//\n// for(index = 0; index < blockChilds.length; index++) {\n//\n// node = blockChilds[index];\n//\n// if (node.nodeType == editor.core.nodeTypes.TEXT) {\n//\n// text = node.textContent.trim();\n//\n// /** Text is empty. We should remove this child from node before we start DFS\n// * decrease the quantity of childs.\n// */\n// if (text === '') {\n//\n// block.removeChild(node);\n// position--;\n//\n// }\n//\n// }\n//\n// }\n//\n// if (block.childNodes.length === 0) {\n//\n// return document.createTextNode('');\n//\n// }\n//\n// /** Setting default position when we deleted all empty nodes */\n// if ( position < 0 )\n// position = 1;\n//\n// var lookingFromStart = false;\n//\n// /** For looking from START */\n// if (position === 0) {\n//\n// lookingFromStart = true;\n// position = 1;\n//\n// }\n//\n// while ( position ) {\n//\n// /** initial verticle of node. */\n// if ( lookingFromStart ) {\n//\n// block = block.childNodes[0];\n//\n// } else {\n//\n// block = block.childNodes[position - 1];\n//\n// }\n//\n// if ( block.nodeType == editor.core.nodeTypes.TAG ) {\n//\n// position = block.childNodes.length;\n//\n// } else if (block.nodeType == editor.core.nodeTypes.TEXT ) {\n//\n// position = 0;\n//\n// }\n//\n// }\n//\n// return block;\n//\n// };\n//\n// /**\n// * @private\n// * @param {Element} block - current plugins render\n// * @param {String} tool - plugins name\n// * @param {Boolean} isStretched - make stretched block or not\n// *\n// * @description adds necessary information to wrap new created block by first-level holder\n// */\n// var composeNewBlock_ = function (block, tool, isStretched) {\n//\n// var newBlock = editor.draw.node('DIV', editor.ui.className.BLOCK_CLASSNAME, {}),\n// blockContent = editor.draw.node('DIV', editor.ui.className.BLOCK_CONTENT, {});\n//\n// blockContent.appendChild(block);\n// newBlock.appendChild(blockContent);\n//\n// if (isStretched) {\n//\n// blockContent.classList.add(editor.ui.className.BLOCK_STRETCHED);\n//\n// }\n//\n// newBlock.dataset.tool = tool;\n// return newBlock;\n//\n// };\n//\n// /**\n// * Returns Range object of current selection\n// * @protected\n// */\n// content.getRange = function () {\n//\n// var selection = window.getSelection().getRangeAt(0);\n//\n// return selection;\n//\n// };\n//\n// /**\n// * Divides block in two blocks (after and before caret)\n// *\n// * @protected\n// * @param {int} inputIndex - target input index\n// *\n// * @description splits current input content to the separate blocks\n// * When enter is pressed among the words, that text will be splited.\n// */\n// content.splitBlock = function (inputIndex) {\n//\n// var selection = window.getSelection(),\n// anchorNode = selection.anchorNode,\n// anchorNodeText = anchorNode.textContent,\n// caretOffset = selection.anchorOffset,\n// textBeforeCaret,\n// textNodeBeforeCaret,\n// textAfterCaret,\n// textNodeAfterCaret;\n//\n// var currentBlock = editor.content.currentNode.querySelector('[contentEditable]');\n//\n//\n// textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n// textAfterCaret = anchorNodeText.substring(caretOffset);\n//\n// textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n//\n// if (textAfterCaret) {\n//\n// textNodeAfterCaret = document.createTextNode(textAfterCaret);\n//\n// }\n//\n// var previousChilds = [],\n// nextChilds = [],\n// reachedCurrent = false;\n//\n// if (textNodeAfterCaret) {\n//\n// nextChilds.push(textNodeAfterCaret);\n//\n// }\n//\n// for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n//\n// if ( child != anchorNode ) {\n//\n// if ( !reachedCurrent ) {\n//\n// previousChilds.push(child);\n//\n// } else {\n//\n// nextChilds.push(child);\n//\n// }\n//\n// } else {\n//\n// reachedCurrent = true;\n//\n// }\n//\n// }\n//\n// /** Clear current input */\n// editor.state.inputs[inputIndex].innerHTML = '';\n//\n// /**\n// * Append all childs founded before anchorNode\n// */\n// var previousChildsLength = previousChilds.length;\n//\n// for(i = 0; i < previousChildsLength; i++) {\n//\n// editor.state.inputs[inputIndex].appendChild(previousChilds[i]);\n//\n// }\n//\n// editor.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n//\n// /**\n// * Append text node which is after caret\n// */\n// var nextChildsLength = nextChilds.length,\n// newNode = document.createElement('div');\n//\n// for(i = 0; i < nextChildsLength; i++) {\n//\n// newNode.appendChild(nextChilds[i]);\n//\n// }\n//\n// newNode = newNode.innerHTML;\n//\n// /** This type of block creates when enter is pressed */\n// var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin;\n//\n// /**\n// * Make new paragraph with text after caret\n// */\n// editor.content.insertBlock({\n// type : NEW_BLOCK_TYPE,\n// block : editor.tools[NEW_BLOCK_TYPE].render({\n// text : newNode\n// })\n// }, true );\n//\n// };\n//\n// /**\n// * Merges two blocks — current and target\n// * If target index is not exist, then previous will be as target\n// *\n// * @protected\n// * @param {int} currentInputIndex\n// * @param {int} targetInputIndex\n// *\n// * @description gets two inputs indexes and merges into one\n// */\n// content.mergeBlocks = function (currentInputIndex, targetInputIndex) {\n//\n// /** If current input index is zero, then prevent method execution */\n// if (currentInputIndex === 0) {\n//\n// return;\n//\n// }\n//\n// var targetInput,\n// currentInputContent = editor.state.inputs[currentInputIndex].innerHTML;\n//\n// if (!targetInputIndex) {\n//\n// targetInput = editor.state.inputs[currentInputIndex - 1];\n//\n// } else {\n//\n// targetInput = editor.state.inputs[targetInputIndex];\n//\n// }\n//\n// targetInput.innerHTML += currentInputContent;\n//\n// };\n//\n// /**\n// * Iterates all right siblings and parents, which has right siblings\n// * while it does not reached the first-level block\n// *\n// * @param {Element} node\n// * @return {boolean}\n// */\n// content.isLastNode = function (node) {\n//\n// // console.log('погнали перебор родителей');\n//\n// var allChecked = false;\n//\n// while ( !allChecked ) {\n//\n// // console.log('Смотрим на %o', node);\n// // console.log('Проверим, пустые ли соседи справа');\n//\n// if ( !allSiblingsEmpty_(node) ) {\n//\n// // console.log('Есть непустые соседи. Узел не последний. Выходим.');\n// return false;\n//\n// }\n//\n// node = node.parentNode;\n//\n// /**\n// * Проверяем родителей до тех пор, пока не найдем блок первого уровня\n// */\n// if ( node.classList.contains(editor.ui.className.BLOCK_CONTENT) ) {\n//\n// allChecked = true;\n//\n// }\n//\n// }\n//\n// return true;\n//\n// };\n//\n// /**\n// * Checks if all element right siblings is empty\n// * @param node\n// */\n// var allSiblingsEmpty_ = function (node) {\n//\n// /**\n// * Нужно убедиться, что после пустого соседа ничего нет\n// */\n// var sibling = node.nextSibling;\n//\n// while ( sibling ) {\n//\n// if (sibling.textContent.length) {\n//\n// return false;\n//\n// }\n//\n// sibling = sibling.nextSibling;\n//\n// }\n//\n// return true;\n//\n// };\n//\n// /**\n// * @public\n// *\n// * @param {string} htmlData - html content as string\n// * @param {string} plainData - plain text\n// * @return {string} - html content as string\n// */\n// content.wrapTextWithParagraphs = function (htmlData, plainData) {\n//\n// if (!htmlData.trim()) {\n//\n// return wrapPlainTextWithParagraphs(plainData);\n//\n// }\n//\n// var wrapper = document.createElement('DIV'),\n// newWrapper = document.createElement('DIV'),\n// i,\n// paragraph,\n// firstLevelBlocks = ['DIV', 'P'],\n// blockTyped,\n// node;\n//\n// /**\n// * Make HTML Element to Wrap Text\n// * It allows us to work with input data as HTML content\n// */\n// wrapper.innerHTML = htmlData;\n// paragraph = document.createElement('P');\n//\n// for (i = 0; i < wrapper.childNodes.length; i++) {\n//\n// node = wrapper.childNodes[i];\n//\n// blockTyped = firstLevelBlocks.indexOf(node.tagName) != -1;\n//\n// /**\n// * If node is first-levet\n// * we add this node to our new wrapper\n// */\n// if ( blockTyped ) {\n//\n// /**\n// * If we had splitted inline nodes to paragraph before\n// */\n// if ( paragraph.childNodes.length ) {\n//\n// newWrapper.appendChild(paragraph.cloneNode(true));\n//\n// /** empty paragraph */\n// paragraph = null;\n// paragraph = document.createElement('P');\n//\n// }\n//\n// newWrapper.appendChild(node.cloneNode(true));\n//\n// } else {\n//\n// /** Collect all inline nodes to one as paragraph */\n// paragraph.appendChild(node.cloneNode(true));\n//\n// /** if node is last we should append this node to paragraph and paragraph to new wrapper */\n// if ( i == wrapper.childNodes.length - 1 ) {\n//\n// newWrapper.appendChild(paragraph.cloneNode(true));\n//\n// }\n//\n// }\n//\n// }\n//\n// return newWrapper.innerHTML;\n//\n// };\n//\n// /**\n// * Splits strings on new line and wraps paragraphs with

    tag\n// * @param plainText\n// * @returns {string}\n// */\n// var wrapPlainTextWithParagraphs = function (plainText) {\n//\n// if (!plainText) return '';\n//\n// return '

    ' + plainText.split('\\n\\n').join('

    ') + '

    ';\n//\n// };\n//\n// /**\n// * Finds closest Contenteditable parent from Element\n// * @param {Element} node element looking from\n// * @return {Element} node contenteditable\n// */\n// content.getEditableParent = function (node) {\n//\n// while (node && node.contentEditable != 'true') {\n//\n// node = node.parentNode;\n//\n// }\n//\n// return node;\n//\n// };\n//\n// /**\n// * Clear editors content\n// *\n// * @param {Boolean} all — if true, delete all article data (content, id, etc.)\n// */\n// content.clear = function (all) {\n//\n// editor.nodes.redactor.innerHTML = '';\n// editor.content.sync();\n// editor.ui.saveInputs();\n// if (all) {\n//\n// editor.state.blocks = {};\n//\n// } else if (editor.state.blocks) {\n//\n// editor.state.blocks.items = [];\n//\n// }\n//\n// editor.content.currentNode = null;\n//\n// };\n//\n// /**\n// *\n// * Load new data to editor\n// * If editor is not empty, just append articleData.items\n// *\n// * @param articleData.items\n// */\n// content.load = function (articleData) {\n//\n// var currentContent = Object.assign({}, editor.state.blocks);\n//\n// editor.content.clear();\n//\n// if (!Object.keys(currentContent).length) {\n//\n// editor.state.blocks = articleData;\n//\n// } else if (!currentContent.items) {\n//\n// currentContent.items = articleData.items;\n// editor.state.blocks = currentContent;\n//\n// } else {\n//\n// currentContent.items = currentContent.items.concat(articleData.items);\n// editor.state.blocks = currentContent;\n//\n// }\n//\n// editor.renderer.makeBlocksFromData();\n//\n// };\n//\n// return content;\n//\n// })({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_content.js","/**\n * DOM manupulations helper\n */\nexport default class Dom {\n\n /**\n * Helper for making Elements with classname and attributes\n *\n * @param {string} tagName - new Element tag name\n * @param {array|string} classNames - list or name of CSS classname(s)\n * @param {Object} attributes - any attributes\n * @return {Element}\n */\n static make(tagName, classNames = null, attributes = {}) {\n\n var el = document.createElement(tagName);\n\n if ( Array.isArray(classNames) ) {\n\n el.classList.add(...classNames);\n\n } else if( classNames ) {\n\n el.classList.add(classNames);\n\n }\n\n for (let attrName in attributes) {\n\n el[attrName] = attributes[attrName];\n\n }\n\n return el;\n\n }\n\n /**\n * Append one or several elements to the parent\n *\n * @param {Element} parent - where to append\n * @param {Element|Element[]} - element ore elements list\n */\n static append(parent, elements) {\n\n if ( Array.isArray(elements) ) {\n\n elements.forEach( el => parent.appendChild(el) );\n\n } else {\n\n parent.appendChild(elements);\n\n }\n\n }\n\n /**\n * Selector Decorator\n *\n * Returns first match\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n *\n * @returns {Element}\n */\n static find(el = document, selector) {\n\n return el.querySelector(selector);\n\n }\n\n /**\n * Selector Decorator.\n *\n * Returns all matches\n *\n * @param {Element} el - element we searching inside. Default - DOM Document\n * @param {String} selector - searching string\n * @returns {NodeList}\n */\n static findAll(el = document, selector) {\n\n return el.querySelectorAll(selector);\n\n }\n\n static isNode(node) {\n\n return node && typeof node === 'object' && node.nodeType && node.nodeType === Node.ELEMENT_NODE;\n\n }\n};\n\n\n// WEBPACK FOOTER //\n// ./src/components/dom.js","/**\n * Codex Editor Destroyer module\n *\n * @auhor Codex Team\n * @version 1.0\n */\n\nmodule.exports = function (destroyer) {\n\n let editor = codex.editor;\n\n destroyer.removeNodes = function () {\n\n editor.nodes.wrapper.remove();\n editor.nodes.notifications.remove();\n\n };\n\n destroyer.destroyPlugins = function () {\n\n for (var tool in editor.tools) {\n\n if (typeof editor.tools[tool].destroy === 'function') {\n\n editor.tools[tool].destroy();\n\n }\n\n }\n\n };\n\n destroyer.destroyScripts = function () {\n\n var scripts = document.getElementsByTagName('SCRIPT');\n\n for (var i = 0; i < scripts.length; i++) {\n\n if (scripts[i].id.indexOf(editor.scriptPrefix) + 1) {\n\n scripts[i].remove();\n i--;\n\n }\n\n }\n\n };\n\n\n /**\n * Delete editor data from webpage.\n * You should send settings argument with boolean flags:\n * @param settings.ui- remove redactor event listeners and DOM nodes\n * @param settings.scripts - remove redactor scripts from DOM\n * @param settings.plugins - remove plugin's objects\n * @param settings.core - remove editor core. You can remove core only if UI and scripts flags is true\n * }\n *\n */\n destroyer.destroy = function (settings) {\n\n if (!settings || typeof settings !== 'object') {\n\n return;\n\n }\n\n if (settings.ui) {\n\n destroyer.removeNodes();\n editor.listeners.removeAll();\n\n }\n\n if (settings.scripts) {\n\n destroyer.destroyScripts();\n\n }\n\n if (settings.plugins) {\n\n destroyer.destroyPlugins();\n\n }\n\n if (settings.ui && settings.scripts && settings.core) {\n\n delete codex.editor;\n\n }\n\n };\n\n return destroyer;\n\n}({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_destroyer.js","/**\n * Codex Editor Listeners module\n *\n * @author Codex Team\n * @version 1.0\n */\n\n/**\n * Module-decorator for event listeners assignment\n */\nmodule.exports = function (listeners) {\n\n var allListeners = [];\n\n /**\n * Search methods\n *\n * byElement, byType and byHandler returns array of suitable listeners\n * one and all takes element, eventType, and handler and returns first (all) suitable listener\n *\n */\n listeners.search = function () {\n\n var byElement = function (element, context) {\n\n var listenersOnElement = [];\n\n context = context || allListeners;\n\n for (var i = 0; i < context.length; i++) {\n\n var listener = context[i];\n\n if (listener.element === element) {\n\n listenersOnElement.push(listener);\n\n }\n\n }\n\n return listenersOnElement;\n\n };\n\n var byType = function (eventType, context) {\n\n var listenersWithType = [];\n\n context = context || allListeners;\n\n for (var i = 0; i < context.length; i++) {\n\n var listener = context[i];\n\n if (listener.type === eventType) {\n\n listenersWithType.push(listener);\n\n }\n\n }\n\n return listenersWithType;\n\n };\n\n var byHandler = function (handler, context) {\n\n var listenersWithHandler = [];\n\n context = context || allListeners;\n\n for (var i = 0; i < context.length; i++) {\n\n var listener = context[i];\n\n if (listener.handler === handler) {\n\n listenersWithHandler.push(listener);\n\n }\n\n }\n\n return listenersWithHandler;\n\n };\n\n var one = function (element, eventType, handler) {\n\n var result = allListeners;\n\n if (element)\n result = byElement(element, result);\n\n if (eventType)\n result = byType(eventType, result);\n\n if (handler)\n result = byHandler(handler, result);\n\n return result[0];\n\n };\n\n var all = function (element, eventType, handler) {\n\n var result = allListeners;\n\n if (element)\n result = byElement(element, result);\n\n if (eventType)\n result = byType(eventType, result);\n\n if (handler)\n result = byHandler(handler, result);\n\n return result;\n\n };\n\n return {\n byElement : byElement,\n byType : byType,\n byHandler : byHandler,\n one : one,\n all : all\n };\n\n }();\n\n listeners.add = function (element, eventType, handler, isCapture) {\n\n element.addEventListener(eventType, handler, isCapture);\n\n var data = {\n element: element,\n type: eventType,\n handler: handler\n };\n\n var alreadyAddedListener = listeners.search.one(element, eventType, handler);\n\n if (!alreadyAddedListener) {\n\n allListeners.push(data);\n\n }\n\n };\n\n listeners.remove = function (element, eventType, handler) {\n\n element.removeEventListener(eventType, handler);\n\n var existingListeners = listeners.search.all(element, eventType, handler);\n\n for (var i = 0; i < existingListeners.length; i++) {\n\n var index = allListeners.indexOf(existingListeners[i]);\n\n if (index > 0) {\n\n allListeners.splice(index, 1);\n\n }\n\n }\n\n };\n\n listeners.removeAll = function () {\n\n allListeners.map(function (current) {\n\n listeners.remove(current.element, current.type, current.handler);\n\n });\n\n };\n\n listeners.get = function (element, eventType, handler) {\n\n return listeners.search.all(element, eventType, handler);\n\n };\n\n return listeners;\n\n}({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_listeners.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nmodule.exports = (function (notifications) {\n\n let editor = codex.editor;\n\n var queue = [];\n\n var addToQueue = function (settings) {\n\n queue.push(settings);\n\n var index = 0;\n\n while ( index < queue.length && queue.length > 5) {\n\n if (queue[index].type == 'confirm' || queue[index].type == 'prompt') {\n\n index++;\n continue;\n\n }\n\n queue[index].close();\n queue.splice(index, 1);\n\n }\n\n };\n\n notifications.createHolder = function () {\n\n var holder = editor.draw.node('DIV', 'cdx-notifications-block');\n\n editor.nodes.notifications = document.body.appendChild(holder);\n\n return holder;\n\n };\n\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function (errorMsg, event) {\n\n editor.notifications.notification({message: 'This action is not available currently', type: event.type});\n\n };\n\n /**\n *\n * Appends notification\n *\n * settings = {\n * type - notification type (reserved types: alert, confirm, prompt). Just add class 'cdx-notification-'+type\n * message - notification message\n * okMsg - confirm button text (default - 'Ok')\n * cancelBtn - cancel button text (default - 'Cancel'). Only for confirm and prompt types\n * confirm - function-handler for ok button click\n * cancel - function-handler for cancel button click. Only for confirm and prompt types\n * time - time (in seconds) after which notification will close (default - 10s)\n * }\n *\n * @param settings\n */\n notifications.notification = function (constructorSettings) {\n\n /** Private vars and methods */\n var notification = null,\n cancel = null,\n type = null,\n confirm = null,\n inputField = null;\n\n var confirmHandler = function () {\n\n close();\n\n if (typeof confirm !== 'function' ) {\n\n return;\n\n }\n\n if (type == 'prompt') {\n\n confirm(inputField.value);\n return;\n\n }\n\n confirm();\n\n };\n\n var cancelHandler = function () {\n\n close();\n\n if (typeof cancel !== 'function' ) {\n\n return;\n\n }\n\n cancel();\n\n };\n\n\n /** Public methods */\n function create(settings) {\n\n if (!(settings && settings.message)) {\n\n editor.core.log('Can\\'t create notification. Message is missed');\n return;\n\n }\n\n settings.type = settings.type || 'alert';\n settings.time = settings.time*1000 || 10000;\n\n var wrapper = editor.draw.node('DIV', 'cdx-notification'),\n message = editor.draw.node('DIV', 'cdx-notification__message'),\n input = editor.draw.node('INPUT', 'cdx-notification__input'),\n okBtn = editor.draw.node('SPAN', 'cdx-notification__ok-btn'),\n cancelBtn = editor.draw.node('SPAN', 'cdx-notification__cancel-btn');\n\n message.textContent = settings.message;\n okBtn.textContent = settings.okMsg || 'ОК';\n cancelBtn.textContent = settings.cancelMsg || 'Отмена';\n\n editor.listeners.add(okBtn, 'click', confirmHandler);\n editor.listeners.add(cancelBtn, 'click', cancelHandler);\n\n wrapper.appendChild(message);\n\n if (settings.type == 'prompt') {\n\n wrapper.appendChild(input);\n\n }\n\n wrapper.appendChild(okBtn);\n\n if (settings.type == 'prompt' || settings.type == 'confirm') {\n\n wrapper.appendChild(cancelBtn);\n\n }\n\n wrapper.classList.add('cdx-notification-' + settings.type);\n wrapper.dataset.type = settings.type;\n\n notification = wrapper;\n type = settings.type;\n confirm = settings.confirm;\n cancel = settings.cancel;\n inputField = input;\n\n if (settings.type != 'prompt' && settings.type != 'confirm') {\n\n window.setTimeout(close, settings.time);\n\n }\n\n };\n\n /**\n * Show notification block\n */\n function send() {\n\n editor.nodes.notifications.appendChild(notification);\n inputField.focus();\n\n editor.nodes.notifications.classList.add('cdx-notification__notification-appending');\n\n window.setTimeout(function () {\n\n editor.nodes.notifications.classList.remove('cdx-notification__notification-appending');\n\n }, 100);\n\n addToQueue({type: type, close: close});\n\n };\n\n /**\n * Remove notification block\n */\n function close() {\n\n notification.remove();\n\n };\n\n\n if (constructorSettings) {\n\n create(constructorSettings);\n send();\n\n }\n\n return {\n create: create,\n send: send,\n close: close\n };\n\n };\n\n notifications.clear = function () {\n\n editor.nodes.notifications.innerHTML = '';\n queue = [];\n\n };\n\n return notifications;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nmodule.exports = (function (parser) {\n\n let editor = codex.editor;\n\n /** inserting text */\n parser.insertPastedContent = function (blockType, tag) {\n\n editor.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == editor.core.nodeTypes.TAG &&\n node.classList.contains(editor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_parser.js","/**\n * Codex Editor Paste module\n *\n * @author Codex Team\n * @version 1.1.1\n */\n\nmodule.exports = function (paste) {\n\n let editor = codex.editor;\n\n var patterns = [];\n\n paste.prepare = function () {\n\n var tools = editor.tools;\n\n for (var tool in tools) {\n\n if (!tools[tool].renderOnPastePatterns || !Array.isArray(tools[tool].renderOnPastePatterns)) {\n\n continue;\n\n }\n\n tools[tool].renderOnPastePatterns.map(function (pattern) {\n\n\n patterns.push(pattern);\n\n });\n\n }\n\n return Promise.resolve();\n\n };\n\n /**\n * Saves data\n * @param event\n */\n paste.pasted = function (event) {\n\n var clipBoardData = event.clipboardData || window.clipboardData,\n content = clipBoardData.getData('Text');\n\n var result = analize(content);\n\n if (result) {\n\n event.preventDefault();\n event.stopImmediatePropagation();\n\n }\n\n return result;\n\n };\n\n /**\n * Analizes pated string and calls necessary method\n */\n\n var analize = function (string) {\n\n var result = false,\n content = editor.content.currentNode,\n plugin = content.dataset.tool;\n\n patterns.map( function (pattern) {\n\n var execArray = pattern.regex.exec(string),\n match = execArray && execArray[0];\n\n if ( match && match === string.trim()) {\n\n /** current block is not empty */\n if ( content.textContent.trim() && plugin == editor.settings.initialBlockPlugin ) {\n\n pasteToNewBlock_();\n\n }\n\n pattern.callback(string, pattern);\n result = true;\n\n }\n\n });\n\n return result;\n\n };\n\n var pasteToNewBlock_ = function () {\n\n /** Create new initial block */\n editor.content.insertBlock({\n\n type : editor.settings.initialBlockPlugin,\n block : editor.tools[editor.settings.initialBlockPlugin].render({\n text : ''\n })\n\n }, false);\n\n };\n\n /**\n * This method prevents default behaviour.\n *\n * @param {Object} event\n * @protected\n *\n * @description We get from clipboard pasted data, sanitize, make a fragment that contains of this sanitized nodes.\n * Firstly, we need to memorize the caret position. We can do that by getting the range of selection.\n * After all, we insert clear fragment into caret placed position. Then, we should move the caret to the last node\n */\n paste.blockPasteCallback = function (event) {\n\n\n if (!needsToHandlePasteEvent(event.target)) {\n\n return;\n\n }\n\n /** Prevent default behaviour */\n event.preventDefault();\n\n /** get html pasted data - dirty data */\n var htmlData = event.clipboardData.getData('text/html'),\n plainData = event.clipboardData.getData('text/plain');\n\n /** Temporary DIV that is used to work with text's paragraphs as DOM-elements*/\n var paragraphs = editor.draw.node('DIV', '', {}),\n cleanData,\n wrappedData;\n\n /** Create fragment, that we paste to range after proccesing */\n cleanData = editor.sanitizer.clean(htmlData);\n\n /**\n * We wrap pasted text with

    tags to split it logically\n * @type {string}\n */\n wrappedData = editor.content.wrapTextWithParagraphs(cleanData, plainData);\n paragraphs.innerHTML = wrappedData;\n\n /**\n * If there only one paragraph, just insert in at the caret location\n */\n if (paragraphs.childNodes.length == 1) {\n\n emulateUserAgentBehaviour(paragraphs.firstChild);\n return;\n\n }\n\n insertPastedParagraphs(paragraphs.childNodes);\n\n };\n\n /**\n * Checks if we should handle paste event on block\n * @param block\n *\n * @return {boolean}\n */\n var needsToHandlePasteEvent = function (block) {\n\n /** If area is input or textarea then allow default behaviour */\n if ( editor.core.isNativeInput(block) ) {\n\n return false;\n\n }\n\n var editableParent = editor.content.getEditableParent(block);\n\n /** Allow paste when event target placed in Editable element */\n if (!editableParent) {\n\n return false;\n\n }\n\n return true;\n\n };\n\n /**\n * Inserts new initial plugin blocks with data in paragraphs\n *\n * @param {Array} paragraphs - array of paragraphs (

    ) whit content, that should be inserted\n */\n var insertPastedParagraphs = function (paragraphs) {\n\n var NEW_BLOCK_TYPE = editor.settings.initialBlockPlugin,\n currentNode = editor.content.currentNode;\n\n\n paragraphs.forEach(function (paragraph) {\n\n /** Don't allow empty paragraphs */\n if (editor.core.isBlockEmpty(paragraph)) {\n\n return;\n\n }\n\n editor.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : editor.tools[NEW_BLOCK_TYPE].render({\n text : paragraph.innerHTML\n })\n });\n\n editor.caret.inputIndex++;\n\n });\n\n editor.caret.setToPreviousBlock(editor.caret.getCurrentInputIndex() + 1);\n\n\n /**\n * If there was no data in working node, remove it\n */\n if (editor.core.isBlockEmpty(currentNode)) {\n\n currentNode.remove();\n editor.ui.saveInputs();\n\n }\n\n\n };\n\n /**\n * Inserts node content at the caret position\n *\n * @param {Node} node - DOM node (could be DocumentFragment), that should be inserted at the caret location\n */\n var emulateUserAgentBehaviour = function (node) {\n\n var newNode;\n\n if (node.childElementCount) {\n\n newNode = document.createDocumentFragment();\n\n node.childNodes.forEach(function (current) {\n\n if (!editor.core.isDomNode(current) && current.data.trim() === '') {\n\n return;\n\n }\n\n newNode.appendChild(current.cloneNode(true));\n\n });\n\n } else {\n\n newNode = document.createTextNode(node.textContent);\n\n }\n\n editor.caret.insertNode(newNode);\n\n };\n\n\n return paste;\n\n}({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_paste.js","/**\n * Codex Sanitizer\n */\n\nmodule.exports = (function (sanitizer) {\n\n /** HTML Janitor library */\n let janitor = require('html-janitor');\n\n /** Codex Editor */\n let editor = codex.editor;\n\n sanitizer.prepare = function () {\n\n if (editor.settings.sanitizer && !editor.core.isEmpty(editor.settings.sanitizer)) {\n\n Config.CUSTOM = editor.settings.sanitizer;\n\n }\n\n };\n\n /**\n * Basic config\n */\n var Config = {\n\n /** User configuration */\n CUSTOM : null,\n\n BASIC : {\n\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: 'nofollow'\n }\n }\n }\n };\n\n sanitizer.Config = Config;\n\n /**\n *\n * @param userCustomConfig\n * @returns {*}\n * @private\n *\n * @description If developer uses editor's API, then he can customize sane restrictions.\n * Or, sane config can be defined globally in editors initialization. That config will be used everywhere\n * At least, if there is no config overrides, that API uses BASIC Default configation\n */\n let init_ = function (userCustomConfig) {\n\n let configuration = userCustomConfig || Config.CUSTOM || Config.BASIC;\n\n return new janitor(configuration);\n\n };\n\n /**\n * Cleans string from unwanted tags\n * @protected\n * @param {String} dirtyString - taint string\n * @param {Object} customConfig - allowed tags\n */\n sanitizer.clean = function (dirtyString, customConfig) {\n\n let janitorInstance = init_(customConfig);\n\n return janitorInstance.clean(dirtyString);\n\n };\n\n return sanitizer;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_sanitizer.js","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('html-janitor', factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.HTMLJanitor = factory();\n }\n}(this, function () {\n\n /**\n * @param {Object} config.tags Dictionary of allowed tags.\n * @param {boolean} config.keepNestedBlockElements Default false.\n */\n function HTMLJanitor(config) {\n\n var tagDefinitions = config['tags'];\n var tags = Object.keys(tagDefinitions);\n\n var validConfigValues = tags\n .map(function(k) { return typeof tagDefinitions[k]; })\n .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });\n\n if(!validConfigValues) {\n throw new Error(\"The configuration was invalid\");\n }\n\n this.config = config;\n }\n\n // TODO: not exhaustive?\n var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];\n function isBlockElement(node) {\n return blockElementNames.indexOf(node.nodeName) !== -1;\n }\n\n var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];\n function isInlineElement(node) {\n return inlineElementNames.indexOf(node.nodeName) !== -1;\n }\n\n HTMLJanitor.prototype.clean = function (html) {\n var sandbox = document.createElement('div');\n sandbox.innerHTML = html;\n\n this._sanitize(sandbox);\n\n return sandbox.innerHTML;\n };\n\n HTMLJanitor.prototype._sanitize = function (parentNode) {\n var treeWalker = createTreeWalker(parentNode);\n var node = treeWalker.firstChild();\n if (!node) { return; }\n\n do {\n // Ignore nodes that have already been sanitized\n if (node._sanitized) {\n continue;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // If this text node is just whitespace and the previous or next element\n // sibling is a block element, remove it\n // N.B.: This heuristic could change. Very specific to a bug with\n // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output\n // FIXME: make this an option?\n if (node.data.trim() === ''\n && ((node.previousElementSibling && isBlockElement(node.previousElementSibling))\n || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n } else {\n continue;\n }\n }\n\n // Remove all comments\n if (node.nodeType === Node.COMMENT_NODE) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n }\n\n var isInline = isInlineElement(node);\n var containsBlockElement;\n if (isInline) {\n containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);\n }\n\n // Block elements should not be nested (e.g.
  • ...); if\n // they are, we want to unwrap the inner block element.\n var isNotTopContainer = !! parentNode.parentNode;\n var isNestedBlockElement =\n isBlockElement(parentNode) &&\n isBlockElement(node) &&\n isNotTopContainer;\n\n var nodeName = node.nodeName.toLowerCase();\n\n var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);\n\n var isInvalid = isInline && containsBlockElement;\n\n // Drop tag entirely according to the whitelist *and* if the markup\n // is invalid.\n if (isInvalid || shouldRejectNode(node, allowedAttrs)\n || (!this.config.keepNestedBlockElements && isNestedBlockElement)) {\n // Do not keep the inner text of SCRIPT/STYLE elements.\n if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {\n while (node.childNodes.length > 0) {\n parentNode.insertBefore(node.childNodes[0], node);\n }\n }\n parentNode.removeChild(node);\n\n this._sanitize(parentNode);\n break;\n }\n\n // Sanitize attributes\n for (var a = 0; a < node.attributes.length; a += 1) {\n var attr = node.attributes[a];\n\n if (shouldRejectAttr(attr, allowedAttrs, node)) {\n node.removeAttribute(attr.name);\n // Shift the array to continue looping.\n a = a - 1;\n }\n }\n\n // Sanitize children\n this._sanitize(node);\n\n // Mark node as sanitized so it's ignored in future runs\n node._sanitized = true;\n } while ((node = treeWalker.nextSibling()));\n };\n\n function createTreeWalker(node) {\n return document.createTreeWalker(node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,\n null, false);\n }\n\n function getAllowedAttrs(config, nodeName, node){\n if (typeof config.tags[nodeName] === 'function') {\n return config.tags[nodeName](node);\n } else {\n return config.tags[nodeName];\n }\n }\n\n function shouldRejectNode(node, allowedAttrs){\n if (typeof allowedAttrs === 'undefined') {\n return true;\n } else if (typeof allowedAttrs === 'boolean') {\n return !allowedAttrs;\n }\n\n return false;\n }\n\n function shouldRejectAttr(attr, allowedAttrs, node){\n var attrName = attr.name.toLowerCase();\n\n if (allowedAttrs === true){\n return false;\n } else if (typeof allowedAttrs[attrName] === 'function'){\n return !allowedAttrs[attrName](attr.value, node);\n } else if (typeof allowedAttrs[attrName] === 'undefined'){\n return true;\n } else if (allowedAttrs[attrName] === false) {\n return true;\n } else if (typeof allowedAttrs[attrName] === 'string') {\n return (allowedAttrs[attrName] !== attr.value);\n }\n\n return false;\n }\n\n return HTMLJanitor;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/html-janitor/src/html-janitor.js\n// module id = 13\n// module chunks = 0","/**\n * Codex Editor Saver\n *\n * @author Codex Team\n * @version 1.1.0\n */\n\nmodule.exports = (function (saver) {\n\n let editor = codex.editor;\n\n /**\n * @public\n * Save blocks\n */\n saver.save = function () {\n\n /** Save html content of redactor to memory */\n editor.state.html = editor.nodes.redactor.innerHTML;\n\n /** Clean jsonOutput state */\n editor.state.jsonOutput = [];\n\n return saveBlocks(editor.nodes.redactor.childNodes);\n\n };\n\n /**\n * @private\n * Save each block data\n *\n * @param blocks\n * @returns {Promise.}\n */\n let saveBlocks = function (blocks) {\n\n let data = [];\n\n for(let index = 0; index < blocks.length; index++) {\n\n data.push(getBlockData(blocks[index]));\n\n }\n\n return Promise.all(data)\n .then(makeOutput)\n .catch(editor.core.log);\n\n };\n\n /** Save and validate block data */\n let getBlockData = function (block) {\n\n return saveBlockData(block)\n .then(validateBlockData)\n .catch(editor.core.log);\n\n };\n\n /**\n * @private\n * Call block`s plugin save method and return saved data\n *\n * @param block\n * @returns {Object}\n */\n let saveBlockData = function (block) {\n\n let pluginName = block.dataset.tool;\n\n /** Check for plugin existence */\n if (!editor.tools[pluginName]) {\n\n editor.core.log(`Plugin «${pluginName}» not found`, 'error');\n return {data: null, pluginName: null};\n\n }\n\n /** Check for plugin having save method */\n if (typeof editor.tools[pluginName].save !== 'function') {\n\n editor.core.log(`Plugin «${pluginName}» must have save method`, 'error');\n return {data: null, pluginName: null};\n\n }\n\n /** Result saver */\n let blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n position = pluginsContent.dataset.inputPosition;\n\n /** If plugin wasn't available then return data from cache */\n if ( editor.tools[pluginName].available === false ) {\n\n return Promise.resolve({data: codex.editor.state.blocks.items[position].data, pluginName});\n\n }\n\n return Promise.resolve(pluginsContent)\n .then(editor.tools[pluginName].save)\n .then(data => Object({data, pluginName}));\n\n };\n\n /**\n * Call plugin`s validate method. Return false if validation failed\n *\n * @param data\n * @param pluginName\n * @returns {Object|Boolean}\n */\n let validateBlockData = function ({data, pluginName}) {\n\n if (!data || !pluginName) {\n\n return false;\n\n }\n\n if (editor.tools[pluginName].validate) {\n\n let result = editor.tools[pluginName].validate(data);\n\n /**\n * Do not allow invalid data\n */\n if (!result) {\n\n return false;\n\n }\n\n }\n\n return {data, pluginName};\n\n\n };\n\n /**\n * Compile article output\n *\n * @param savedData\n * @returns {{time: number, version, items: (*|Array)}}\n */\n let makeOutput = function (savedData) {\n\n savedData = savedData.filter(blockData => blockData);\n\n let items = savedData.map(blockData => Object({type: blockData.pluginName, data: blockData.data}));\n\n editor.state.jsonOutput = items;\n\n return {\n id: editor.state.blocks.id || null,\n time: +new Date(),\n version: editor.version,\n items\n };\n\n };\n\n return saver;\n\n})({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_saver.js","/**\n *\n * Codex.Editor Transport Module\n *\n * @copyright 2017 Codex-Team\n * @version 1.2.0\n */\n\nmodule.exports = (function (transport) {\n\n let editor = codex.editor;\n\n\n /**\n * @private {Object} current XmlHttpRequest instance\n */\n var currentRequest = null;\n\n\n /**\n * @type {null} | {DOMElement} input - keeps input element in memory\n */\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n /**\n * Prepares input element where will be files\n */\n transport.prepare = function () {\n\n let input = editor.draw.node( 'INPUT', '', { type : 'file' } );\n\n editor.listeners.add(input, 'change', editor.transport.fileSelected);\n editor.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function () {\n\n /** Remove old input */\n transport.input = null;\n\n /** Prepare new one */\n transport.prepare();\n\n };\n\n /**\n * Callback for file selection\n * @param {Event} event\n */\n transport.fileSelected = function () {\n\n var input = this,\n i,\n files = input.files,\n formData = new FormData();\n\n if (editor.transport.arguments.multiple === true) {\n\n for ( i = 0; i < files.length; i++) {\n\n formData.append('files[]', files[i], files[i].name);\n\n }\n\n } else {\n\n formData.append('files', files[0], files[0].name);\n\n }\n\n currentRequest = editor.core.ajax({\n type : 'POST',\n data : formData,\n url : editor.transport.arguments.url,\n beforeSend : editor.transport.arguments.beforeSend,\n success : editor.transport.arguments.success,\n error : editor.transport.arguments.error,\n progress : editor.transport.arguments.progress\n });\n\n /** Clear input */\n transport.clearInput();\n\n };\n\n /**\n * Use plugin callbacks\n * @protected\n *\n * @param {Object} args - can have :\n * @param {String} args.url - fetch URL\n * @param {Function} args.beforeSend - function calls before sending ajax\n * @param {Function} args.success - success callback\n * @param {Function} args.error - on error handler\n * @param {Function} args.progress - xhr onprogress handler\n * @param {Boolean} args.multiple - allow select several files\n * @param {String} args.accept - adds accept attribute\n */\n transport.selectAndUpload = function (args) {\n\n transport.arguments = args;\n\n if ( args.multiple === true) {\n\n transport.input.setAttribute('multiple', 'multiple');\n\n }\n\n if ( args.accept ) {\n\n transport.input.setAttribute('accept', args.accept);\n\n }\n\n transport.input.click();\n\n };\n\n transport.abort = function () {\n\n currentRequest.abort();\n\n currentRequest = null;\n\n };\n\n return transport;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/_transport.js","/**\n * @class BlockManager\n * @classdesc Manage editor`s blocks storage and appearance\n *\n *\n */\n\nimport Block from '../block';\nimport Util from '../util';\n\nmodule.exports = class 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._currentBloсkIndex = -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._currentBloсkIndex] = 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._currentBloсkIndex];\n\n }\n\n /**\n * Get working html element\n *\n * @return {HTMLElement}\n */\n get currentNode() {\n\n return this._blocks.nodes[this._currentBloсkIndex];\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._currentBloсkIndex = 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 Util.array(this.workingArea.children);\n\n }\n\n /**\n * Proxy trap to implement array-like setter\n *\n * @example\n * blocks[0] = new Block(...)\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — block index\n * @param {Block} block — Block to set\n * @returns {Boolean}\n */\n static set(instance, index, block) {\n\n if (isNaN(Number(index))) {\n\n return false;\n\n }\n\n instance.insert(index, block);\n\n return true;\n\n }\n\n /**\n * Proxy trap to implement array-like getter\n *\n * @param {Blocks} instance — Blocks instance\n * @param {Number|String} index — Block index\n * @returns {Block|*}\n */\n static get(instance, index) {\n\n if (isNaN(Number(index))) {\n\n return instance[index];\n\n }\n\n return instance.get(index);\n\n }\n\n}\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/blockManager.js","/**\n *\n * @class Block\n * @classdesc This class describes editor`s block, including block`s HTMLElement, data and tool\n *\n * @property {Tool} tool — current block tool (Paragraph, for example)\n * @property {Object} CSS — block`s css classes\n *\n */\n\n\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 */\nmodule.exports = class Events {\n\n /**\n * Module key name\n * @returns {string}\n */\n static get name() {\n\n return 'Events';\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 * @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\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/eventDispatcher.js","/**\n * Codex Editor Renderer Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nimport Util from '../util';\n\nmodule.exports = class 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 Util.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};\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 * 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, reject) {\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} success\n * @param {Function} fallback\n *\n * @return {Promise}\n */\n function waitNextBlock(chainData, success, fallback) {\n\n return new Promise(function (resolve, reject) {\n\n chainData.function()\n .then(() => {\n\n success(chainData.data);\n\n })\n .then(resolve)\n .catch(function () {\n\n fallback(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/util.js","/**\n * DOM manipulations\n */\nimport $ from '../dom';\n\n/**\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 static get name() {\n\n return 'Toolbar';\n\n }\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 * Inline toolbar\n *\n * Contains from tools:\n * Bold, Italic, Underline and Anchor\n *\n * @author Codex Team\n * @version 1.0\n */\n\nmodule.exports = (function (inline) {\n\n let editor = codex.editor;\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null;\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function () {\n\n var currentNode = editor.content.currentNode,\n tool = currentNode.dataset.tool,\n plugin;\n\n /**\n * tool allowed to open inline toolbar\n */\n plugin = editor.tools[tool];\n\n if (!plugin.showInlineToolbar)\n return;\n\n var selectedText = inline.getSelectionText(),\n toolbar = editor.nodes.inlineToolbar.wrapper;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n editor.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n editor.toolbar.inline.showButtons();\n\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function () {\n\n var toolbar = editor.nodes.inlineToolbar.wrapper;\n\n toolbar.classList.remove('opened');\n\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function () {\n\n if (!this.wrappersOffset) {\n\n this.wrappersOffset = this.getWrappersOffset();\n\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = editor.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n\n defaultOffset = 40;\n\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n editor.toolbar.inline.closeButtons();\n editor.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function (event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : editor.toolbar.inline.createLinkAction(event, type); break;\n default : editor.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n editor.nodes.inlineToolbar.buttons.childNodes.forEach(editor.toolbar.inline.hightlight);\n\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function () {\n\n var wrapper = editor.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n\n }\n return { top: _y, left: _x };\n\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function () {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != 'Control') {\n\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n\n range.collapse(true);\n var rect = range.getClientRects()[0];\n\n if (!rect) {\n\n return;\n\n }\n\n x = rect.left;\n y = rect.top;\n\n }\n\n }\n\n }\n return { x: x, y: y };\n\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function () {\n\n var selectedText = '';\n\n // all modern browsers and IE9+\n if (window.getSelection) {\n\n selectedText = window.getSelection().toString();\n\n }\n\n return selectedText;\n\n };\n\n /** Opens buttons block */\n inline.showButtons = function () {\n\n var buttons = editor.nodes.inlineToolbar.buttons;\n\n buttons.classList.add('opened');\n\n editor.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n editor.nodes.inlineToolbar.buttons.childNodes.forEach(editor.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function () {\n\n var buttons = editor.nodes.inlineToolbar.buttons;\n\n buttons.classList.remove('opened');\n\n editor.toolbar.inline.buttonsOpened = false;\n\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function () {\n\n var action = editor.nodes.inlineToolbar.actions;\n\n action.classList.add('opened');\n\n editor.toolbar.inline.actionsOpened = true;\n\n };\n\n /** Close actions block */\n inline.closeAction = function () {\n\n var action = editor.nodes.inlineToolbar.actions;\n\n action.innerHTML = '';\n action.classList.remove('opened');\n editor.toolbar.inline.actionsOpened = false;\n\n };\n\n\n /**\n * Callback for keydowns in inline toolbar \"Insert link...\" input\n */\n let inlineToolbarAnchorInputKeydown_ = function (event) {\n\n if (event.keyCode != editor.core.keys.ENTER) {\n\n return;\n\n }\n\n let editable = editor.content.currentNode,\n storedSelection = editor.toolbar.inline.storedSelection;\n\n editor.toolbar.inline.restoreSelection(editable, storedSelection);\n editor.toolbar.inline.setAnchor(this.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n editor.toolbar.inline.clearRange();\n\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function (event) {\n\n var isActive = this.isLinkActive();\n\n var editable = editor.content.currentNode,\n storedSelection = editor.toolbar.inline.saveSelection(editable);\n\n /** Save globally selection */\n editor.toolbar.inline.storedSelection = storedSelection;\n\n if (isActive) {\n\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n editor.toolbar.inline.restoreSelection(editable, storedSelection);\n\n editor.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = editor.draw.inputForLink();\n\n editor.nodes.inlineToolbar.actions.appendChild(action);\n\n editor.toolbar.inline.closeButtons();\n editor.toolbar.inline.showActions();\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n editor.listeners.add(action, 'keydown', inlineToolbarAnchorInputKeydown_, false);\n\n }\n\n };\n\n inline.isLinkActive = function () {\n\n var isActive = false;\n\n editor.nodes.inlineToolbar.buttons.childNodes.forEach(function (tool) {\n\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n\n isActive = true;\n\n }\n\n });\n\n return isActive;\n\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function (type) {\n\n document.execCommand(type, false, null);\n\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function (url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n editor.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function (containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function (containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [ containerEl ],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n\n }\n charIndex = nextCharIndex;\n\n } else {\n\n var i = node.childNodes.length;\n\n while (i--) {\n\n nodeStack.push(node.childNodes[i]);\n\n }\n\n }\n\n }\n\n var sel = window.getSelection();\n\n sel.removeAllRanges();\n sel.addRange(range);\n\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function () {\n\n var selection = window.getSelection();\n\n selection.removeAllRanges();\n\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function (tool) {\n\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n\n editor.toolbar.inline.setButtonHighlighted(tool);\n\n } else {\n\n editor.toolbar.inline.removeButtonsHighLight(tool);\n\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n\n editor.toolbar.inline.setButtonHighlighted(tool);\n\n }\n\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function (button) {\n\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n\n var icon = button.childNodes[0];\n\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n\n }\n\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function (button) {\n\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n\n var icon = button.childNodes[0];\n\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n\n }\n\n };\n\n\n return inline;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar/inline.js","/**\n * Toolbar settings\n *\n * @version 1.0.5\n */\n\nmodule.exports = (function (settings) {\n\n let editor = codex.editor;\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n /**\n * Append and open settings\n */\n settings.open = function (toolType) {\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if ( !editor.tools[toolType] || !editor.tools[toolType].makeSettings ) {\n\n return;\n\n }\n\n /**\n * Draw settings block\n */\n var settingsBlock = editor.tools[toolType].makeSettings();\n\n editor.nodes.pluginSettings.appendChild(settingsBlock);\n\n\n /** Open settings block */\n editor.nodes.blockSettings.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function () {\n\n editor.nodes.blockSettings.classList.remove('opened');\n editor.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function ( toolType ) {\n\n if ( !this.opened ) {\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function () {\n\n var removeBlockWrapper = editor.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = editor.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = editor.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = editor.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = editor.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отмена' });\n\n editor.listeners.add(settingButton, 'click', editor.toolbar.settings.removeButtonClicked, false);\n\n editor.listeners.add(confirmAction, 'click', editor.toolbar.settings.confirmRemovingRequest, false);\n\n editor.listeners.add(cancelAction, 'click', editor.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n editor.toolbar.settings.setting = settingButton;\n editor.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function () {\n\n var action = editor.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n\n editor.toolbar.settings.hideRemoveActions();\n\n } else {\n\n editor.toolbar.settings.showRemoveActions();\n\n }\n\n editor.toolbar.toolbox.close();\n editor.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function () {\n\n editor.toolbar.settings.actions.classList.remove('opened');\n\n };\n\n settings.confirmRemovingRequest = function () {\n\n var currentBlock = editor.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = editor.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n editor.content.currentNode = null;\n\n /** Inserting new empty initial block */\n editor.ui.addInitialBlock();\n\n }\n\n editor.ui.saveInputs();\n\n editor.toolbar.close();\n\n };\n\n settings.showRemoveActions = function () {\n\n editor.toolbar.settings.actions.classList.add('opened');\n\n };\n\n settings.hideRemoveActions = function () {\n\n editor.toolbar.settings.actions.classList.remove('opened');\n\n };\n\n return settings;\n\n})({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar/settings.js","/**\n * Codex Editor toolbar module\n *\n * Contains:\n * - Inline toolbox\n * - Toolbox within plus button\n * - Settings section\n *\n * @author Codex Team\n * @version 1.0\n */\n\nmodule.exports = (function (toolbar) {\n\n let editor = codex.editor;\n\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function () {\n\n if (editor.hideToolbar) {\n\n return;\n\n }\n\n let toolType = editor.content.currentNode.dataset.tool;\n\n if (!editor.tools[toolType] || !editor.tools[toolType].makeSettings ) {\n\n editor.nodes.showSettingsButton.classList.add('hide');\n\n } else {\n\n editor.nodes.showSettingsButton.classList.remove('hide');\n\n }\n\n editor.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function () {\n\n editor.nodes.toolbar.classList.remove('opened');\n\n toolbar.opened = false;\n toolbar.current = null;\n\n for (var button in editor.nodes.toolbarButtons) {\n\n editor.nodes.toolbarButtons[button].classList.remove('selected');\n\n }\n\n /** Close toolbox when toolbar is not displayed */\n editor.toolbar.toolbox.close();\n editor.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function () {\n\n if ( !this.opened ) {\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function () {\n\n editor.nodes.plusButton.classList.add('hide');\n\n };\n\n toolbar.showPlusButton = function () {\n\n editor.nodes.plusButton.classList.remove('hide');\n\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function () {\n\n /** Close Toolbox when we move toolbar */\n editor.toolbar.toolbox.close();\n\n if (!editor.content.currentNode) {\n\n return;\n\n }\n\n var newYCoordinate = editor.content.currentNode.offsetTop - (editor.toolbar.defaultToolbarHeight / 2) + editor.toolbar.defaultOffset;\n\n editor.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n editor.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar/toolbar.js","/**\n * Codex Editor toolbox\n *\n * All tools be able to appended here\n *\n * @author Codex Team\n * @version 1.0\n */\n\nmodule.exports = (function (toolbox) {\n\n let editor = codex.editor;\n\n toolbox.opened = false;\n toolbox.openedOnBlock = null;\n\n /** Shows toolbox */\n toolbox.open = function () {\n\n /** Close setting if toolbox is opened */\n if (editor.toolbar.settings.opened) {\n\n editor.toolbar.settings.close();\n\n }\n\n /** Add 'toolbar-opened' class for current block **/\n toolbox.openedOnBlock = editor.content.currentNode;\n toolbox.openedOnBlock.classList.add('toolbar-opened');\n\n /** display toolbox */\n editor.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n editor.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n editor.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function () {\n\n /** Remove 'toolbar-opened' class from current block **/\n if (toolbox.openedOnBlock) toolbox.openedOnBlock.classList.remove('toolbar-opened');\n toolbox.openedOnBlock = null;\n\n /** Makes toolbox disappear */\n editor.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n editor.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n editor.toolbar.toolbox.opened = false;\n\n editor.toolbar.current = null;\n\n };\n\n toolbox.leaf = function () {\n\n let currentTool = editor.toolbar.current,\n tools = Object.keys(editor.tools),\n barButtons = editor.nodes.toolbarButtons,\n nextToolIndex = 0,\n toolToSelect,\n visibleTool,\n tool;\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for(tool in editor.tools) {\n\n if (editor.tools[tool].displayInToolbox) {\n\n break;\n\n }\n\n nextToolIndex ++;\n\n }\n\n } else {\n\n nextToolIndex = (tools.indexOf(currentTool) + 1) % tools.length;\n visibleTool = tools[nextToolIndex];\n\n while (!editor.tools[visibleTool].displayInToolbox) {\n\n nextToolIndex = (nextToolIndex + 1) % tools.length;\n visibleTool = tools[nextToolIndex];\n\n }\n\n }\n\n toolToSelect = tools[nextToolIndex];\n\n for ( var button in barButtons ) {\n\n barButtons[button].classList.remove('selected');\n\n }\n\n barButtons[toolToSelect].classList.add('selected');\n editor.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function (event) {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter', 'embed'],\n tool = editor.tools[editor.toolbar.current],\n workingNode = editor.content.currentNode,\n currentInputIndex = editor.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.render();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ) {\n\n /** Replace current block */\n editor.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n editor.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n\n appendCallback.call(event);\n\n }\n\n window.setTimeout(function () {\n\n /** Set caret to current block */\n editor.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n editor.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n editor.toolbar.move();\n\n };\n\n return toolbox;\n\n})({});\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/toolbar/toolbox.js","/**\n * @module Codex Editor Tools Submodule\n *\n * Creates Instances from Plugins and binds external config to the instances\n */\n\n/**\n * 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 */\nlet util = require('../util');\n\nmodule.exports = class Tools {\n\n static get name() {\n\n return 'Tools';\n\n }\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 let self = this;\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 util.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\n\n\n// WEBPACK FOOTER //\n// ./src/components/modules/tools.js","/**\n * Module UI\n *\n * @type {UI}\n */\n// let className = {\n\n /**\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\n */\n // BLOCK_CLASSNAME : 'ce-block',\n\n /**\n * @const {String} wrapper for plugins content\n */\n // BLOCK_CONTENT : 'ce-block__content',\n\n /**\n * @const {String} BLOCK_STRETCHED - makes block stretched\n */\n // BLOCK_STRETCHED : 'ce-block--stretched',\n\n /**\n * @const {String} BLOCK_HIGHLIGHTED - adds background\n */\n // BLOCK_HIGHLIGHTED : 'ce-block--focused',\n\n /**\n * @const {String} - for all default settings\n */\n // SETTINGS_ITEM : 'ce-settings__item'\n// };\n\nlet CSS = {\n editorWrapper : 'codex-editor',\n editorZone : 'ce-redactor'\n};\n\n\nimport $ from '../dom';\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 */\nmodule.exports = class UI {\n\n /**\n * Module key name\n * @returns {string}\n */\n static get name() {\n\n return 'ui';\n\n }\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 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};\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"],"sourceRoot":""} \ No newline at end of file diff --git a/src/components/block.js b/src/components/block.js index 299cf236..62518d1f 100644 --- a/src/components/block.js +++ b/src/components/block.js @@ -27,7 +27,7 @@ export default class Block { content: 'ce-block__content' }; - this._html = this._compose(); + this._html = this.compose(); } @@ -37,7 +37,7 @@ export default class Block { * @returns {HTMLDivElement} * @private */ - _compose() { + compose() { let wrapper = $.make('div', this.CSS.wrapper), content = $.make('div', this.CSS.content); diff --git a/src/components/modules/blockManager.js b/src/components/modules/blockManager.js index 9c51715b..44fbf259 100644 --- a/src/components/modules/blockManager.js +++ b/src/components/modules/blockManager.js @@ -20,7 +20,7 @@ module.exports = class BlockManager { this.config = config; this.Editor = null; this._blocks = null; - this._currentBlcokIndex = -1; + this._currentBloсkIndex = -1; } @@ -83,7 +83,7 @@ module.exports = class BlockManager { let toolInstance = this.Editor.Tools.construct(toolName, data), block = new Block(toolInstance); - this._blocks[++this._currentBlcokIndex] = block; + this._blocks[++this._currentBloсkIndex] = block; } @@ -115,7 +115,7 @@ module.exports = class BlockManager { */ get currentBlock() { - return this._blocks[this._currentBlcokIndex]; + return this._blocks[this._currentBloсkIndex]; } @@ -126,7 +126,7 @@ module.exports = class BlockManager { */ get currentNode() { - return this._blocks.nodes[this._currentBlcokIndex]; + return this._blocks.nodes[this._currentBloсkIndex]; } @@ -141,7 +141,7 @@ module.exports = class BlockManager { let nodes = this._blocks.nodes; - this._currentBlcokIndex = nodes.indexOf(element); + this._currentBloсkIndex = nodes.indexOf(element); } @@ -210,6 +210,7 @@ class Blocks { if (index > this.length) { + // @todo decide how to handle this case return; } diff --git a/src/components/modules/renderer.js b/src/components/modules/renderer.js index 49bb1cf2..6b29cb09 100644 --- a/src/components/modules/renderer.js +++ b/src/components/modules/renderer.js @@ -45,7 +45,7 @@ module.exports = class Renderer { for (let i = 0; i < items.length; i++) { chainData.push({ - function: () => this._makeBlock(items[i]) + function: () => this.makeBlock(items[i]) }); } @@ -63,7 +63,7 @@ module.exports = class Renderer { * @returns {Promise.} * @private */ - _makeBlock(item) { + makeBlock(item) { let tool = item.type, data = item.data;