From b76ec5c0a1a2565fc2bc49ed76c95a03bedfd016 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Sun, 18 Dec 2016 16:54:34 +0300 Subject: [PATCH] toolbox leaf (#96) * toolbox leaf * new bundle * bundle updates * code improved * updated --- codex-editor.js | 27 +- codex-editor.js.map | 2 +- codex.editor.js | 4253 ------------------------------------ codex.editor.js.map | 1 - modules/toolbar/toolbox.js | 28 +- package.json | 19 +- 6 files changed, 62 insertions(+), 4268 deletions(-) delete mode 100644 codex.editor.js delete mode 100644 codex.editor.js.map diff --git a/codex-editor.js b/codex-editor.js index 8157dd4f..ccd848dd 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -2581,11 +2581,18 @@ var codex = toolbox.leaf = function () { var currentTool = codex.toolbar.current, + tool, tools = Object.keys(codex.tools), barButtons = codex.nodes.toolbarButtons, nextToolIndex, + hiddenToolsAmount = 0, toolToSelect; + /** Count toolbox hidden tools */ + for (tool in codex.tools) { + if (!codex.tools[tool].displayInToolbox) hiddenToolsAmount++; + } + if (!currentTool) { /** Get first tool from object*/ @@ -2596,7 +2603,22 @@ var codex = nextToolIndex = tools.indexOf(currentTool) + 1; - if (nextToolIndex == tools.length) nextToolIndex = 0; + var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 1); + + if (toolIsLastInToolbox) { + + nextToolIndex = 0; + + /** getting first displayed tool */ + for (tool in codex.tools) { + + nextToolIndex++; + + if (!codex.tools[tool].displayInToolbox) { + break; + } + } + } toolToSelect = tools[nextToolIndex]; } @@ -2604,7 +2626,6 @@ var codex = for (var button in barButtons) { barButtons[button].classList.remove('selected'); }barButtons[toolToSelect].classList.add('selected'); - codex.toolbar.current = toolToSelect; }; @@ -4012,7 +4033,7 @@ var codex = /** * Splits content by `\n` and returns blocks */ - parser.getSeparatedTexttSeparatedTextFromContent = function (content) { + parser.getSeparatedTextFromContent = function (content) { return content.split('\n'); }; diff --git a/codex-editor.js.map b/codex-editor.js.map index 6f844ba6..dfb06355 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 2637f25dac40d95fed4c","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js"],"names":["editor","require","module","exports","codex","init","settings","tools","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","toolbar","inlineToolbar","buttons","actions","toolbox","notifications","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","core","prepare","then","ui","make","addTools","bindEvents","preparePlugins","transport","renderer","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","draw","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","callback","globalKeydown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPaste","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","content","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","stretched","isStretched","saver","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","cover","classList","contains","push","currentNode","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","parser","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","caret","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","text","textContent","trim","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","dfs","clearStyles","href","blockTags","allowedTags","needReplace","includes","tagName","isDisplayedAsBlock","replace","getAttribute","attributes","removeAttribute","sanitized","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","leaf","currentTool","Object","barButtons","nextToolIndex","toolToSelect","indexOf","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","tabKeyPressed","enterKeyPressed","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","firstLevelBlocksArea","clickedOnFirstLevelBlockArea","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","_blockPaste","observer","MutationObserver","handlePasteEvents","config","childList","characterData","observe","mutations","currentToolType","bar","placeholder","div","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","getSeparatedTexttSeparatedTextFromContent","split","insertPastedContent","getSeparatedTextFromContent","parsedTextContent","parseTextareaContent","initialContent","getNodesFromString","appendNodesToRedactor","inputString","contentHolder","createBlockByDomNode","nodeList","item","storeBlockType","parentBlock","nodeContent","isPlainTextNode"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;;;;AAIA;;AAEA,KAAIA,SAAS,mBAAAC,CAAQ,CAAR,CAAb;AACAC,QAAOC,OAAP,GAAiBH,MAAjB,C;;;;;;;;ACPA,KAAII,QAAS,UAASA,KAAT,EAAe;;AAExB,SAAIC,OAAO,SAAPA,IAAO,GAAW;;AAElBJ,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,CAAR;AACAA,SAAA,mBAAAA,CAAQ,EAAR;AACAA,SAAA,mBAAAA,CAAQ,EAAR;AACAA,SAAA,mBAAAA,CAAQ,EAAR;AACAA,SAAA,mBAAAA,CAAQ,EAAR;AACAA,SAAA,mBAAAA,CAAQ,EAAR;AACAA,SAAA,mBAAAA,CAAQ,EAAR;AACH,MAfD;;AAiBA;;;;;AAKAG,WAAME,QAAN,GAAiB;AACbC,gBAAY,CAAC,WAAD,EAAc,QAAd,EAAwB,SAAxB,EAAmC,MAAnC,EAA2C,OAA3C,EAAoD,MAApD,EAA4D,SAA5D,EAAuE,WAAvE,EAAoF,OAApF,CADC;AAEbC,qBAAY,cAFC;AAGbC,0BAAiB,oBAHJ;;AAKb;AACAC,6BAAoB;AANP,MAAjB;;AASA;;;;;AAKAN,WAAMO,KAAN,GAAc;AACVC,mBAAoB,IADV;AAEVC,kBAAoB,IAFV;AAGVC,kBAAoB,IAHV;AAIVC,wBAAoB;AAChBF,sBAAU,IADM;AAEhBG,sBAAU,IAFM;AAGhBC,sBAAU;AAHM,UAJV;AASVC,kBAAoB,IATV;AAUVC,wBAAoB,IAVV;AAWVC,qBAAoB,IAXV;AAYVC,6BAAoB,IAZV;AAaVC,0BAAoB,IAbV;AAcVC,wBAAoB,IAdV;AAeVC,yBAAoB,IAfV;AAgBVC,0BAAoB,IAhBV;AAiBVC,yBAAoB,EAjBV,EAiBc;AACxBC,mBAAoB;AAlBV,MAAd;;AAqBA;;;;;AAKAvB,WAAMwB,KAAN,GAAc;AACVC,qBAAY,EADF;AAEVC,iBAAY,EAFF;AAGVC,iBAAY;AAHF,MAAd;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA3B,WAAM4B,KAAN,GAAc,UAAUC,YAAV,EAAwB;;AAElC5B;;AAEA,cAAK6B,IAAL,CAAUC,OAAV,CAAkBF,YAAlB;;AAEA;AAFA,UAGKG,IAHL,CAGU,KAAKC,EAAL,CAAQC,IAHlB,EAIKF,IAJL,CAIU,KAAKC,EAAL,CAAQE,QAJlB,EAKKH,IALL,CAKU,KAAKC,EAAL,CAAQG,UALlB,EAMKJ,IANL,CAMU,KAAKC,EAAL,CAAQI,cANlB,EAOKL,IAPL,CAOU,KAAKM,SAAL,CAAeP,OAPzB,EAQKC,IARL,CAQU,KAAKO,QAAL,CAAcC,kBARxB,EASKR,IATL,CASU,KAAKC,EAAL,CAAQQ,UATlB,EAUKC,KAVL,CAUW,UAAUC,KAAV,EAAiB;AACpB3C,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,sCAAf,EAAuD,MAAvD,EAA+DD,KAA/D;AACH,UAZL;AAcH,MAlBD;;AAoBA,YAAO3C,KAAP;AAEH,EA3HW,CA2HT,EA3HS,CAAZ;;AA6HAF,QAAOC,OAAP,GAAiBC,KAAjB,C;;;;;;;;;;AC7HA,KAAIA,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIiC,OAAQ,UAASA,IAAT,EAAe;;AAEvB;;;;;;AAMAA,UAAKC,OAAL,GAAe,UAAUF,YAAV,EAAwB;;AAEnC,gBAAO,IAAIgB,OAAJ,CAAY,UAASC,OAAT,EAAkBC,MAAlB,EAA0B;;AAEzC,iBAAKlB,YAAL,EAAmB;;AAEf7B,uBAAME,QAAN,CAAeC,KAAf,GAAuB0B,aAAa1B,KAAb,IAAsBH,MAAME,QAAN,CAAeC,KAA5D;AAEH;;AAED,iBAAI0B,aAAamB,IAAjB,EAAuB;AACnBhD,uBAAMwB,KAAN,CAAYE,MAAZ,GAAqBG,aAAamB,IAAlC;AACH;;AAEDhD,mBAAMO,KAAN,CAAYC,QAAZ,GAAuByC,SAASC,cAAT,CAAwBrB,aAAazB,UAAb,IAA2BJ,MAAME,QAAN,CAAeE,UAAlE,CAAvB;;AAEA,iBAAI,QAAOJ,MAAMO,KAAN,CAAYC,QAAnB,MAAgC2C,SAAhC,IAA6CnD,MAAMO,KAAN,CAAYC,QAAZ,KAAyB,IAA1E,EAAgF;AAC5EuC,wBAAOK,MAAM,mCAAmCvB,aAAazB,UAAtD,CAAP;AACH,cAFD,MAEO;AACH0C;AACH;AAEJ,UApBM,CAAP;AAsBH,MAxBD;;AA0BA;;;;AAIAhB,UAAKc,GAAL,GAAW,UAAUS,GAAV,EAAeC,IAAf,EAAqBC,GAArB,EAA0B;;AAEjCD,gBAAOA,QAAQ,KAAf;;AAEA,aAAI,CAACC,GAAL,EAAU;AACNA,mBAAOF,OAAO,WAAd;AACAA,mBAAO,yBAAP;AACH,UAHD,MAGO;AACHA,mBAAO,0BAA0BA,GAAjC;AACH;;AAED,aAAG;AACC,iBAAK,aAAaG,MAAb,IAAuBC,QAASH,IAAT,CAA5B,EAA6C;AACzC,qBAAKC,GAAL,EAAWE,QAASH,IAAT,EAAiBD,GAAjB,EAAuBE,GAAvB,EAAX,KACKE,QAASH,IAAT,EAAiBD,GAAjB;AACR;AAEJ,UAND,CAMC,OAAMK,CAAN,EAAQ,CAAE;AAEd,MAnBD;;AAqBA;;;;;AAKA5B,UAAK6B,WAAL,GAAmB,UAAUC,MAAV,EAAkBC,OAAlB,EAA2B;AAC1CD,gBAAOE,UAAP,CAAkBC,YAAlB,CAA+BF,OAA/B,EAAwCD,OAAOI,WAA/C;AACH,MAFD;;AAIA;;;;;AAKAlC,UAAKmC,SAAL,GAAiB;AACbC,cAAU,CADG;AAEbC,eAAU,CAFG;AAGbC,kBAAU;AAHG,MAAjB;;AAMA;;;;AAIAtC,UAAKuC,IAAL,GAAY,EAAEC,WAAW,CAAb,EAAgBC,KAAK,CAArB,EAAwBC,OAAO,EAA/B,EAAmCC,OAAO,EAA1C,EAA8CC,MAAM,EAApD,EAAwDC,KAAK,EAA7D,EAAiEC,KAAK,EAAtE,EAA0EC,OAAO,EAAjF,EAAqFC,MAAM,EAA3F,EAA+FC,IAAI,EAAnG,EAAuGC,MAAM,EAA7G,EAAiHC,OAAO,EAAxH,EAA4HC,QAAQ,EAApI,EAAwIC,MAAM,EAA9I,EAAZ;;AAEA;;;;;AAKArD,UAAKsD,SAAL,GAAiB,UAAUC,EAAV,EAAc;AAC3B,gBAAOA,MAAM,QAAOA,EAAP,yCAAOA,EAAP,OAAc,QAApB,IAAgCA,GAAGC,QAAnC,IAA+CD,GAAGC,QAAH,IAAe,KAAKrB,SAAL,CAAeC,GAApF;AACH,MAFD;;AAIA;;;AAGApC,UAAKyD,IAAL,GAAY,UAAUvC,IAAV,EAAgB;;AAExB,aAAI,CAACA,IAAD,IAAS,CAACA,KAAKwC,GAAnB,EAAuB;AACnB;AACH;;AAED,aAAIC,UAAmBjC,OAAOkC,cAAP,GAAwB,IAAIA,cAAJ,EAAxB,GAA+C,IAAIC,aAAJ,CAAkB,mBAAlB,CAAtE;AAAA,aACIC,mBAAmB,4BAAU,CAAE,CADnC;AAAA,aAEIC,SAAS,EAFb;AAAA,aAGIC,GAHJ;;AAKA9C,cAAK+C,KAAL,GAAuB,IAAvB;AACA/C,cAAKM,IAAL,GAAuBN,KAAKM,IAAL,IAAa,KAApC;AACAN,cAAKA,IAAL,GAAuBA,KAAKA,IAAL,IAAa,EAApC;AACAA,cAAK,cAAL,IAAuBA,KAAK,cAAL,KAAwB,iCAA/C;AACA4C,4BAAuB5C,KAAKgD,OAAL,IAAgBJ,gBAAvC;;AAEA,aAAI5C,KAAKM,IAAL,IAAa,KAAb,IAAsBN,KAAKA,IAA/B,EAAqC;;AAEjCA,kBAAKwC,GAAL,GAAW,KAAKS,IAAL,CAAUjD,KAAKwC,GAAf,IAAsBxC,KAAKwC,GAAL,GAAW,GAAX,GAAiBxC,KAAKA,IAA5C,GAAmDA,KAAKwC,GAAL,GAAW,GAAX,GAAiBxC,KAAKA,IAApF;AAEH,UAJD,MAIO;;AAEH,kBAAI8C,GAAJ,IAAW9C,KAAKA,IAAhB,EAAsB;AAClB6C,2BAAWC,MAAM,GAAN,GAAYI,mBAAmBlD,KAAKA,IAAL,CAAU8C,GAAV,CAAnB,CAAZ,GAAiD,GAA5D;AACH;AACJ;;AAED,aAAI9C,KAAKmD,eAAT,EAA0B;AACtBV,qBAAQU,eAAR,GAA0B,IAA1B;AACH;;AAED,aAAInD,KAAKoD,UAAL,IAAmB,OAAOpD,KAAKoD,UAAZ,IAA0B,UAAjD,EAA6D;AACzDpD,kBAAKoD,UAAL,CAAgBC,IAAhB;AACH;;AAEDZ,iBAAQa,IAAR,CAActD,KAAKM,IAAnB,EAAyBN,KAAKwC,GAA9B,EAAmCxC,KAAK+C,KAAxC;AACAN,iBAAQc,gBAAR,CAAyB,kBAAzB,EAA6C,gBAA7C;AACAd,iBAAQc,gBAAR,CAAyB,cAAzB,EAAyC,mCAAzC;;AAEAd,iBAAQe,kBAAR,GAA6B,YAAW;AACpC,iBAAIf,QAAQgB,UAAR,IAAsB,CAAtB,IAA2BhB,QAAQiB,MAAR,IAAkB,GAAjD,EAAsD;AAClDd,kCAAiBH,QAAQkB,YAAzB;AACH;AACJ,UAJD;;AAMAlB,iBAAQmB,IAAR,CAAaf,MAAb;AACH,MA/CD;;AAiDA;AACA/D,UAAK+E,YAAL,GAAoB,UAASC,UAAT,EAAqBC,YAArB,EAAmC;;AAEnD;AACA,aAAK,CAACA,YAAD,IAAkBA,gBAAgB9D,SAASC,cAAT,CAAwB,eAAe6D,YAAvC,CAAvC,EAA+F;AAC3F/G,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,+DAAf,EAAgF,MAAhF;AACA;AACH;;AAGD,aAAIoE,SAAW/D,SAASgE,aAAT,CAAuB,QAAvB,CAAf;AACAD,gBAAO1D,IAAP,GAAc,iBAAd;AACA0D,gBAAOE,GAAP,GAAaJ,UAAb;AACAE,gBAAOjB,KAAP,GAAe,IAAf;AACAiB,gBAAOG,KAAP,GAAe,IAAf;;AAEA,aAAIJ,YAAJ,EAAkB;AACdC,oBAAOI,EAAP,GAAY,eAAeL,YAA3B;AACH;;AAED9D,kBAASoE,IAAT,CAAcC,WAAd,CAA0BN,MAA1B;AACA,gBAAOA,MAAP;AACH,MArBD;;AAuBA,YAAOlF,IAAP;AAEH,EA5KU,CA4KR,EA5KQ,CAAX;;AA8KA9B,OAAM8B,IAAN,GAAaA,IAAb;;AAEAhC,QAAOC,OAAP,GAAiB+B,IAAjB,C;;;;;;;;AClLA,KAAI9B,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIoC,KAAM,UAASA,EAAT,EAAY;;AAElB;;;AAGAA,QAAGsF,SAAH,GAAe;;AAEX;;;AAGAC,0BAAkB,UALP;;AAOP;;;AAGAC,wBAAgB,mBAVT;;AAYP;;;AAGAC,0BAAkB,qBAfX;;AAiBP;;;AAGAC,4BAAoB,mBApBb;;AAsBP;;;AAGAC,6BAAqB,qBAzBd;;AA2BP;;;AAGAC,wBAAgB;;AA9BT,MAAf;;AAkCA;;;;;AAKA5F,QAAGC,IAAH,GAAU,YAAY;;AAElB,aAAIzB,OAAJ,EACIC,OADJ,EAEIoH,cAFJ,EAGInH,aAHJ,EAIIY,QAJJ,EAKIwG,OALJ,EAMIhH,aANJ,EAOIiH,YAPJ,EAQI7G,aARJ,EASIF,kBATJ,EAUIC,eAVJ,EAWIJ,OAXJ,EAYIE,UAZJ;;AAcA;AACAP,mBAAUT,MAAMiI,IAAN,CAAWxH,OAAX,EAAV;;AAEA;AACAT,eAAM8B,IAAN,CAAW6B,WAAX,CAAuB3D,MAAMO,KAAN,CAAYC,QAAnC,EAA6CC,OAA7C;;AAEA;AACAM,yBAAgBf,MAAMiI,IAAN,CAAWC,YAAX,EAAhB;AACAlI,eAAMO,KAAN,CAAYQ,aAAZ,GAA4BkC,SAASkF,IAAT,CAAcb,WAAd,CAA0BvG,aAA1B,CAA5B;;AAEA;AACAL,mBAAwBV,MAAMiI,IAAN,CAAWvH,OAAX,EAAxB;AACAoH,0BAAwB9H,MAAMiI,IAAN,CAAWH,cAAX,EAAxB;AACAnH,yBAAwBX,MAAMiI,IAAN,CAAWtH,aAAX,EAAxB;AACAK,sBAAwBhB,MAAMiI,IAAN,CAAWjH,UAAX,EAAxB;AACAC,8BAAwBjB,MAAMiI,IAAN,CAAWG,cAAX,EAAxB;AACAlH,2BAAwBlB,MAAMU,OAAN,CAAcR,QAAd,CAAuBmI,qBAAvB,EAAxB;AACAlH,yBAAwBnB,MAAMiI,IAAN,CAAW9G,aAAX,EAAxB;AACA6G,wBAAwBhI,MAAMiI,IAAN,CAAWD,YAAX,EAAxB;AACAlH,mBAAwBd,MAAMiI,IAAN,CAAWnH,OAAX,EAAxB;AACAS,oBAAwBvB,MAAMiI,IAAN,CAAW1G,QAAX,EAAxB;;AAEA;AACA,aAAIF,kBAAkBrB,MAAMiI,IAAN,CAAW5G,eAAX,EAAtB;AAAA,aACID,iBAAkBpB,MAAMiI,IAAN,CAAWK,eAAX,EADtB;;AAGA;AACAnH,uBAAcmG,WAAd,CAA0BlG,cAA1B;AACAD,uBAAcmG,WAAd,CAA0BjG,eAA1B;;AAEA;;;AAGA2G,sBAAaV,WAAb,CAAyBrG,kBAAzB;AACA+G,sBAAaV,WAAb,CAAyBpG,eAAzB;AACA8G,sBAAaV,WAAb,CAAyBnG,aAAzB;;AAEA;AACA2G,wBAAeR,WAAf,CAA2BtG,UAA3B;;AAEA;AACA8G,wBAAeR,WAAf,CAA2BxG,OAA3B;;AAEA;AACAJ,iBAAQ4G,WAAR,CAAoBU,YAApB;;AAEA;AACAtH,iBAAQ4G,WAAR,CAAoBQ,cAApB;;AAEArH,iBAAQ6G,WAAR,CAAoB5G,OAApB;;AAEAD,iBAAQ6G,WAAR,CAAoB/F,QAApB;;AAEA;AACAvB,eAAMO,KAAN,CAAYE,OAAZ,GAAiCA,OAAjC;AACAT,eAAMO,KAAN,CAAYG,OAAZ,GAAiCA,OAAjC;AACAV,eAAMO,KAAN,CAAYS,UAAZ,GAAiCA,UAAjC;AACAhB,eAAMO,KAAN,CAAYO,OAAZ,GAAiCA,OAAjC;AACAd,eAAMO,KAAN,CAAYY,aAAZ,GAAiCA,aAAjC;AACAnB,eAAMO,KAAN,CAAYa,cAAZ,GAAiCA,cAAjC;AACApB,eAAMO,KAAN,CAAYc,eAAZ,GAAiCA,eAAjC;AACArB,eAAMO,KAAN,CAAYU,kBAAZ,GAAiCA,kBAAjC;AACAjB,eAAMO,KAAN,CAAYW,eAAZ,GAAiCA,eAAjC;;AAEAlB,eAAMO,KAAN,CAAYgB,QAAZ,GAAuBA,QAAvB;;AAEAvB,eAAMiC,EAAN,CAASsG,iBAAT,CAA2B5H,aAA3B;;AAEA;AACAX,eAAMU,OAAN,CAAcR,QAAd,CAAuBsI,kBAAvB;AACH,MAtFD;;AAwFAvG,QAAGsG,iBAAH,GAAuB,UAASE,SAAT,EAAoB;;AAEvC;AACAzI,eAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAA1B,GAAoCgI,SAApC;;AAEA;AACAzI,eAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,GAAoCZ,MAAMiI,IAAN,CAAWS,oBAAX,EAApC;;AAEA;AACA1I,eAAMO,KAAN,CAAYI,aAAZ,CAA0BE,OAA1B,GAAoCb,MAAMiI,IAAN,CAAWU,oBAAX,EAApC;;AAEA;AACA3I,eAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAA1B,CAAkC6G,WAAlC,CAA8CtH,MAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAAxE;AACAZ,eAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAA1B,CAAkC6G,WAAlC,CAA8CtH,MAAMO,KAAN,CAAYI,aAAZ,CAA0BE,OAAxE;;AAEAb,eAAMO,KAAN,CAAYE,OAAZ,CAAoB6G,WAApB,CAAgCtH,MAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAA1D;AACH,MAhBD;;AAkBA;;;;AAIAwB,QAAGE,QAAH,GAAc,YAAY;;AAEtB,aAAIyG,IAAJ,EACIC,WADJ;;AAGA,cAAI,IAAIC,IAAR,IAAgB9I,MAAME,QAAN,CAAeC,KAA/B,EAAsC;AAClCyI,oBAAO5I,MAAME,QAAN,CAAeC,KAAf,CAAqB2I,IAArB,CAAP;AACA9I,mBAAMG,KAAN,CAAY2I,IAAZ,IAAoBF,IAApB,CAAyB;AAC5B;;AAED;AACA,cAAK,IAAIE,IAAT,IAAiB9I,MAAMG,KAAvB,EAA6B;;AAEzByI,oBAAO5I,MAAMG,KAAN,CAAY2I,IAAZ,CAAP;;AAEA,iBAAIF,KAAKG,gBAAL,IAAyB,KAA7B,EAAoC;AAChC;AACH;;AAED,iBAAI,CAACH,KAAKI,aAAV,EAAyB;AACrBhJ,uBAAM8B,IAAN,CAAWc,GAAX,CAAe,gDAAf,EAAiE,MAAjE,EAAyEkG,IAAzE;AACA;AACH;;AAED,iBAAI,OAAOF,KAAK1G,IAAZ,IAAoB,UAAxB,EAAoC;AAChClC,uBAAM8B,IAAN,CAAWc,GAAX,CAAe,qCAAf,EAAsD,MAAtD,EAA8DkG,IAA9D;AACA;AACH;;AAED;;;AAGAD,2BAAc7I,MAAMiI,IAAN,CAAWgB,aAAX,CAAyBH,IAAzB,EAA+BF,KAAKI,aAApC,CAAd;;AAEAhJ,mBAAMO,KAAN,CAAYO,OAAZ,CAAoBwG,WAApB,CAAgCuB,WAAhC;;AAEA;AACA7I,mBAAMO,KAAN,CAAYe,cAAZ,CAA2BwH,IAA3B,IAAmCD,WAAnC;AACH;;AAGD;;;AAGA7I,eAAMiC,EAAN,CAASiH,qBAAT;AAGH,MA/CD;;AAiDAjH,QAAGiH,qBAAH,GAA2B,YAAW;;AAElC,aAAI/I,QAAQ;;AAERgJ,mBAAM;AACFC,uBAAU,cADR;AAEFC,0BAAU;AAFR,cAFE;;AAORC,qBAAQ;AACJF,uBAAU,gBADN;AAEJC,0BAAU;AAFN,cAPA;;AAYRE,wBAAW;AACPH,uBAAU,mBADH;AAEPC,0BAAU;AAFH,cAZH;;AAiBRG,mBAAM;AACFJ,uBAAU,cADR;AAEFC,0BAAU;AAFR;AAjBE,UAAZ;;AAuBA,aAAII,UAAJ,EACIb,IADJ;;AAGA,cAAI,IAAIE,IAAR,IAAgB3I,KAAhB,EAAuB;;AAEnByI,oBAAOzI,MAAM2I,IAAN,CAAP;;AAEAW,0BAAazJ,MAAMiI,IAAN,CAAWyB,mBAAX,CAA+BZ,IAA/B,EAAqCF,KAAKQ,IAA1C,CAAb;;AAEApJ,mBAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,CAAkC0G,WAAlC,CAA8CmC,UAA9C;AACA;;;AAGAzJ,mBAAMiC,EAAN,CAAS0H,+BAAT,CAAyCF,UAAzC,EAAqDb,KAAKS,OAA1D;AACH;AAEJ,MAzCD;;AA2CA;;;;AAIApH,QAAGG,UAAH,GAAgB,YAAY;;AAExBpC,eAAM8B,IAAN,CAAWc,GAAX,CAAe,qBAAf,EAAsC,MAAtC;;AAEAY,gBAAOoG,gBAAP,CAAwB,OAAxB,EAAiC,UAAUC,QAAV,EAAoBrE,GAApB,EAAyBsE,UAAzB,EAAqC;AAClE9J,mBAAMe,aAAN,CAAoBgJ,WAApB,CAAgCF,QAAhC,EAA0CG,KAA1C;AACH,UAFD,EAEG,KAFH;;AAIA;AACAhK,eAAMO,KAAN,CAAYgB,QAAZ,CAAqBqI,gBAArB,CAAsC,SAAtC,EAAiD5J,MAAMiK,QAAN,CAAeC,aAAhE,EAA+E,KAA/E;;AAEA;AACAjH,kBAAS2G,gBAAT,CAA0B,OAA1B,EAAmC5J,MAAMiK,QAAN,CAAeE,WAAlD,EAA+D,KAA/D;;AAEA;;;AAGAnK,eAAMO,KAAN,CAAYgB,QAAZ,CAAqBqI,gBAArB,CAAsC,OAAtC,EAA+C5J,MAAMiK,QAAN,CAAeG,eAA9D,EAA+E,KAA/E;;AAEA;;;AAGApK,eAAMO,KAAN,CAAYS,UAAZ,CAAuB4I,gBAAvB,CAAwC,OAAxC,EAAiD5J,MAAMiK,QAAN,CAAeI,iBAAhE,EAAmF,KAAnF;;AAEA;;;AAGArK,eAAMO,KAAN,CAAYU,kBAAZ,CAA+B2I,gBAA/B,CAAgD,OAAhD,EAAyD5J,MAAMiK,QAAN,CAAeK,yBAAxE,EAAmG,KAAnG;AACA;;;;AAIAtK,eAAMO,KAAN,CAAYgB,QAAZ,CAAqBqI,gBAArB,CAAsC,OAAtC,EAA+C5J,MAAMiK,QAAN,CAAeM,kBAA9D,EAAkF,KAAlF;;AAEA;AACA,cAAK,IAAIC,MAAT,IAAmBxK,MAAMO,KAAN,CAAYe,cAA/B,EAA8C;AAC1CtB,mBAAMO,KAAN,CAAYe,cAAZ,CAA2BkJ,MAA3B,EAAmCZ,gBAAnC,CAAoD,OAApD,EAA6D5J,MAAMiK,QAAN,CAAeQ,oBAA5E,EAAkG,KAAlG;AACH;AAEJ,MAvCD;;AAyCA;;;;AAIAxI,QAAGI,cAAH,GAAoB,YAAW;;AAE3B,cAAI,IAAIuG,IAAR,IAAgB5I,MAAMG,KAAtB,EAA6B;;AAEzB,iBAAI,OAAOH,MAAMG,KAAN,CAAYyI,IAAZ,EAAkB7G,OAAzB,IAAoC,UAAxC,EACI;;AAEJ/B,mBAAMG,KAAN,CAAYyI,IAAZ,EAAkB7G,OAAlB;AACH;AACJ,MATD,EAWAE,GAAGyI,gBAAH,GAAsB,UAASC,KAAT,EAAgB;;AAElC,aAAI,CAACA,KAAL,EAAY;;AAEZ;;;AAGAA,eAAMf,gBAAN,CAAuB,SAAvB,EAAkC,UAASI,KAAT,EAAgB;AAC9ChK,mBAAMiK,QAAN,CAAeW,YAAf,CAA4BZ,KAA5B,EAAmCW,KAAnC;AACH,UAFD,EAEG,KAFH;;AAIA;;;AAGAA,eAAMf,gBAAN,CAAuB,OAAvB,EAAgC,UAAUI,KAAV,EAAiB;AAC7ChK,mBAAMiK,QAAN,CAAeY,UAAf,CAA0Bb,KAA1B;AACH,UAFD,EAEG,KAFH;;AAIAW,eAAMf,gBAAN,CAAuB,SAAvB,EAAkC,YAAU;AACxC5J,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBC,IAArB;AACH,UAFD,EAEG,KAFH;AAIH,MAjCD;;AAmCA;AACA9I,QAAGQ,UAAH,GAAgB,YAAW;;AAEvB,aAAIlB,WAAWvB,MAAMO,KAAN,CAAYgB,QAA3B;AAAA,aACIyJ,WAAW,EADf;;AAGA;AACAhL,eAAMwB,KAAN,CAAYG,MAAZ,GAAqBJ,SAAS0J,gBAAT,CAA0B,0BAA1B,CAArB;AACH,MAPD;;AASA;;;AAGAhJ,QAAGiJ,eAAH,GAAqB,YAAU;;AAE3B,aAAIC,mBAAmBnL,MAAME,QAAN,CAAeI,kBAAtC;AAAA,aACI8K,YADJ;;AAGA,aAAK,CAACpL,MAAMG,KAAN,CAAYgL,gBAAZ,CAAN,EAAqC;AACjCnL,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,mEAAf,EAAoF,MAApF,EAA4FuI,gBAA5F;AACA;AACH;;AAEDC,wBAAepL,MAAMG,KAAN,CAAYgL,gBAAZ,EAA8BE,MAA9B,EAAf;;AAEAD,sBAAaE,YAAb,CAA0B,kBAA1B,EAA8C,qBAA9C;;AAEAtL,eAAMuL,OAAN,CAAcC,WAAd,CAA0B;AACtBlI,mBAAQ6H,gBADc;AAEtBR,oBAAQS;AAFc,UAA1B;;AAKApL,eAAMuL,OAAN,CAAcE,kBAAd,CAAiCL,YAAjC;AAEH,MArBD;;AAuBAnJ,QAAG0H,+BAAH,GAAqC,UAASa,MAAT,EAAiBlH,IAAjB,EAAuB;;AAExDkH,gBAAOZ,gBAAP,CAAwB,WAAxB,EAAqC,UAASI,KAAT,EAAgB;;AAEjDhK,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBY,WAArB,CAAiC1B,KAAjC,EAAwC1G,IAAxC;AAEH,UAJD,EAIG,KAJH;AAKH,MAPD;;AASA,YAAOrB,EAAP;AAEH,EAzXQ,CAyXN,EAzXM,CAAT;;AA2XAjC,OAAMiC,EAAN,GAAWA,EAAX;AACAnC,QAAOC,OAAP,GAAiBC,KAAjB,C;;;;;;;;AC9XA,KAAIA,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIyC,YAAa,UAASA,SAAT,EAAmB;;AAEhCA,eAAUqJ,KAAV,GAAkB,IAAlB;;AAEA;;;AAGArJ,eAAUsJ,SAAV,GAAsB,IAAtB;;AAEAtJ,eAAUP,OAAV,GAAoB,YAAU;;AAE1B,aAAI4J,QAAQ1I,SAASgE,aAAT,CAAuB,OAAvB,CAAZ;;AAEA0E,eAAMrI,IAAN,GAAa,MAAb;AACAqI,eAAM/B,gBAAN,CAAuB,QAAvB,EAAiC5J,MAAMsC,SAAN,CAAgBuJ,YAAjD;;AAEA7L,eAAMsC,SAAN,CAAgBqJ,KAAhB,GAAwBA,KAAxB;AAEH,MATD;;AAWA;AACArJ,eAAUwJ,UAAV,GAAuB,YAAW;;AAE9B;AACA,cAAKH,KAAL,GAAa,IAAb;;AAEA;AACA,cAAK5J,OAAL;AACH,MAPD;;AASA;;;AAGAO,eAAUuJ,YAAV,GAAyB,UAAS7B,KAAT,EAAe;;AAEpC,aAAI2B,QAAc,IAAlB;AAAA,aACII,QAAcJ,MAAMI,KADxB;AAAA,aAEIC,cAAcD,MAAME,MAFxB;AAAA,aAGIC,YAAc,IAAIC,QAAJ,EAHlB;AAAA,aAIIC,IAJJ;AAAA,aAKIC,CALJ;;AAOAH,mBAAUI,MAAV,CAAiB,OAAjB,EAA0BP,MAAM,CAAN,CAA1B,EAAoCA,MAAM,CAAN,EAASjD,IAA7C;;AAEA9I,eAAMsC,SAAN,CAAgBiD,IAAhB,CAAqB;AACjBvC,mBAAOkJ,SADU;AAEjB9F,yBAAapG,MAAMsC,SAAN,CAAgBsJ,SAAhB,CAA0BxF,UAFtB;AAGjBJ,sBAAahG,MAAMsC,SAAN,CAAgBsJ,SAAhB,CAA0B5F,OAHtB;AAIjBrD,oBAAa3C,MAAMsC,SAAN,CAAgBsJ,SAAhB,CAA0BjJ;AAJtB,UAArB;AAMH,MAjBD;;AAmBA;;;;AAIAL,eAAUiK,eAAV,GAA4B,UAAUC,IAAV,EAAgB;;AAExC,cAAKZ,SAAL,GAAiBY,IAAjB;AACA,cAAKb,KAAL,CAAWc,KAAX;AAEH,MALD;;AAOA;;;AAGAnK,eAAUiD,IAAV,GAAiB,UAASM,MAAT,EAAgB;;AAE7B,aAAI6G,MAAM,IAAIhH,cAAJ,EAAV;AAAA,aACIU,aAAa,OAAOP,OAAOO,UAAd,IAA4B,UAA5B,GAAyCP,OAAOO,UAAhD,GAA6D,YAAU,CAAE,CAD1F;AAAA,aAEIJ,UAAa,OAAOH,OAAOG,OAAd,IAA4B,UAA5B,GAAyCH,OAAOG,OAAhD,GAA0D,YAAU,CAAE,CAFvF;AAAA,aAGIrD,QAAa,OAAOkD,OAAOlD,KAAd,IAA4B,UAA5B,GAAyCkD,OAAOlD,KAAhD,GAA0D,YAAU,CAAE,CAHvF;;AAKAyD;;AAEAsG,aAAIpG,IAAJ,CAAS,MAAT,EAAiBtG,MAAME,QAAN,CAAeG,eAAhC,EAAiD,IAAjD;;AAEAqM,aAAInG,gBAAJ,CAAqB,kBAArB,EAAyC,gBAAzC;;AAEAmG,aAAIC,MAAJ,GAAa,YAAY;AACrB,iBAAID,IAAIhG,MAAJ,KAAe,GAAnB,EAAwB;AACpBV,yBAAQ0G,IAAI/F,YAAZ;AACH,cAFD,MAEO;AACHlD,yBAAQb,GAAR,CAAY,mBAAZ,EAAiC8J,GAAjC;AACA/J;AACH;AACJ,UAPD;;AASA+J,aAAI9F,IAAJ,CAASf,OAAO7C,IAAhB;AACA,cAAK8I,UAAL;AAEH,MAzBD;;AA2BA,YAAOxJ,SAAP;AAEH,EA/Fe,CA+Fb,EA/Fa,CAAhB;;AAiGAtC,OAAMsC,SAAN,GAAkBA,SAAlB;AACAxC,QAAOC,OAAP,GAAkBuC,SAAlB,C;;;;;;;;ACpGA,KAAItC,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAI0C,WAAY,UAASA,QAAT,EAAmB;;AAE/B;;;AAGAA,cAASC,kBAAT,GAA8B,YAAY;;AAEtC;;;AAGA,aAAI,CAACxC,MAAMwB,KAAN,CAAYE,MAAZ,CAAmBkL,KAAnB,CAAyBX,MAA9B,EAAsC;;AAElCjM,mBAAMiC,EAAN,CAASiJ,eAAT;AACA;AAEH;;AAEDrI,iBAAQC,OAAR;;AAEA;AAFA,UAGKd,IAHL,CAGU,YAAW;AACb,oBAAOhC,MAAMwB,KAAN,CAAYE,MAAnB;AACH,UALL;;AAOI;AAPJ,UAQKM,IARL,CAQUhC,MAAMuC,QAAN,CAAesK,YARzB;;AAUI;AAVJ,UAWKnK,KAXL,CAWW,UAASC,KAAT,EAAgB;AACnB3C,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,8BAAf,EAA+C,OAA/C,EAAwDD,KAAxD;AACH,UAbL;AAeH,MA3BD;;AA6BA;;;;;AAKAJ,cAASsK,YAAT,GAAwB,UAAU7J,IAAV,EAAgB;;AAEpC,aAAItB,SAASsB,KAAK4J,KAAlB;;AAEA;;;;AAIA,aAAIE,eAAejK,QAAQC,OAAR,EAAnB;;AAEA,cAAK,IAAIiK,QAAQ,CAAjB,EAAoBA,QAAQrL,OAAOuK,MAAnC,EAA4Cc,OAA5C,EAAsD;;AAElD;AACA/M,mBAAMuC,QAAN,CAAeyK,iBAAf,CAAiCF,YAAjC,EAA+CpL,MAA/C,EAAuDqL,KAAvD;AAEH;AAEJ,MAjBD;;AAmBA;;;AAGAxK,cAASyK,iBAAT,GAA6B,UAAUF,YAAV,EAAwBpL,MAAxB,EAAgCqL,KAAhC,EAAuC;;AAEhE;AACAD;;AAEA;AAFA,UAGK9K,IAHL,CAGU,YAAW;;AAEb,oBAAOhC,MAAMuC,QAAN,CAAe0K,YAAf,CAA4BvL,MAA5B,EAAqCqL,KAArC,CAAP;AAEH,UAPL;;AASI;;;AATJ,UAYK/K,IAZL,CAYUhC,MAAMuC,QAAN,CAAe2K,mBAZzB;;AAcI;;;AAdJ,UAiBKlL,IAjBL,CAiBU,UAASmL,SAAT,EAAmB;;AAErB;;;AAGAnN,mBAAMuL,OAAN,CAAcC,WAAd,CAA0B2B,SAA1B;;AAEA;AACA,oBAAOA,UAAUxC,KAAjB;AAEH,UA3BL;;AA6BI;AA7BJ,UA8BKjI,KA9BL,CA8BW,UAASC,KAAT,EAAgB;AACnB3C,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,uCAAf,EAAwD,OAAxD,EAAiED,KAAjE;AACH,UAhCL;AAkCH,MArCD;;AAuCA;;;;AAIAJ,cAAS0K,YAAT,GAAwB,UAAUG,UAAV,EAAsBL,KAAtB,EAA6B;;AAEjD,gBAAOlK,QAAQC,OAAR,GAAkBd,IAAlB,CAAuB,YAAW;;AAErC,oBAAOoL,WAAWL,KAAX,CAAP;AAEH,UAJM,CAAP;AAKH,MAPD;;AASA;;;;;;;;;;;;;AAaAxK,cAAS2K,mBAAT,GAA+B,UAAUC,SAAV,EAAqB;;AAEhD;AACA,aAAIE,aAAaF,UAAU7J,IAA3B;;AAEA;AACA;;AAEA;AACA,aAAI,CAACtD,MAAMG,KAAN,CAAYkN,UAAZ,CAAL,EAA8B;AAC1B,mBAAMjK,sBAAiBiK,UAAjB,oBAAN;AACH;;AAED;AACA,aAAI,OAAOrN,MAAMG,KAAN,CAAYkN,UAAZ,EAAwBhC,MAA/B,IAAyC,UAA7C,EAAyD;;AAErD,mBAAMjI,sBAAiBiK,UAAjB,0CAAN;AACH;;AAED;AACA,aAAI1C,QAAQ3K,MAAMG,KAAN,CAAYkN,UAAZ,EAAwBhC,MAAxB,CAA+B8B,UAAUnK,IAAzC,CAAZ;;AAEA;AACA;;AAEA;AACA,aAAIsK,YAAYtN,MAAMG,KAAN,CAAYkN,UAAZ,EAAwBE,WAAxB,IAAuC,KAAvD;;AAEA;AACA,gBAAO;AACHjK,mBAAY+J,UADT;AAEH1C,oBAAYA,KAFT;AAGH2C,wBAAYA;AAHT,UAAP;AAMH,MAnCD;;AAqCA,YAAO/K,QAAP;AAEH,EArKc,CAqKZ,EArKY,CAAf;;AAuKAvC,OAAMuC,QAAN,GAAiBA,QAAjB;AACAzC,QAAOC,OAAP,GAAiBwC,QAAjB,C;;;;;;;;AC1KA,KAAIvC,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAI2N,QAAS,UAASA,KAAT,EAAgB;;AAEzB;;;;AAIAA,WAAMC,UAAN,GAAmB,YAAY;;AAE3B;AACAzN,eAAMwB,KAAN,CAAYkM,IAAZ,GAAmB1N,MAAMO,KAAN,CAAYgB,QAAZ,CAAqBoM,SAAxC;;AAEA;AACA3N,eAAMwB,KAAN,CAAYC,UAAZ,GAAyB,EAAzB;;AAEAoB,iBAAQC,OAAR,GAEKd,IAFL,CAEU,YAAW;AACb,oBAAOhC,MAAMO,KAAN,CAAYgB,QAAZ,CAAqBqM,UAA5B;AACH,UAJL;AAKI;AALJ,UAMK5L,IANL,CAMUhC,MAAMwN,KAAN,CAAYK,SANtB,EAQK7L,IARL,CAQU,YAAW;AACb;AACH,UAVL,EAYKU,KAZL,CAYY,UAASC,KAAT,EAAgB;AACpBc,qBAAQb,GAAR,CAAY,mBAAZ;AACH,UAdL;AAgBH,MAxBD;;AA0BA4K,WAAMK,SAAN,GAAkB,UAASnM,MAAT,EAAiB;;AAE/B,aAAIoM,QAAQjL,QAAQC,OAAR,EAAZ;;AAEA,cAAI,IAAIiK,QAAQ,CAAhB,EAAmBA,QAAQrL,OAAOuK,MAAlC,EAA0Cc,OAA1C,EAAmD;;AAE/C;AACA/M,mBAAMwN,KAAN,CAAYO,YAAZ,CAAyBD,KAAzB,EAAgCpM,MAAhC,EAAwCqL,KAAxC;AAEH;AAEJ,MAXD;;AAaA;AACAS,WAAMO,YAAN,GAAqB,UAASD,KAAT,EAAgBpM,MAAhB,EAAwBqL,KAAxB,EAA+B;;AAEhDe,eAAM9L,IAAN,CAAW,YAAW;AAClB,oBAAOhC,MAAMwN,KAAN,CAAYP,YAAZ,CAAyBvL,MAAzB,EAAiCqL,KAAjC,CAAP;AACH,UAFD,EAIK/K,IAJL,CAIUhC,MAAMwN,KAAN,CAAYQ,sBAJtB;AAMH,MARD;;AAWA;;;;AAIAR,WAAMP,YAAN,GAAqB,UAAUG,UAAV,EAAsBL,KAAtB,EAA6B;;AAE9C,gBAAOlK,QAAQC,OAAR,GAAkBd,IAAlB,CAAuB,YAAW;;AAErC,oBAAOoL,WAAWL,KAAX,CAAP;AAEH,UAJM,CAAP;AAKH,MAPD;;AASAS,WAAMQ,sBAAN,GAA+B,UAASrD,KAAT,EAAgB;;AAE3C,aAAI0C,aAAa1C,MAAMsD,OAAN,CAAcrF,IAA/B;;AAEA;AACA,aAAI,CAAC5I,MAAMG,KAAN,CAAYkN,UAAZ,CAAL,EAA8B;AAC1B,mBAAMjK,sBAAiBiK,UAAjB,oBAAN;AACH;;AAED;AACA,aAAI,OAAOrN,MAAMG,KAAN,CAAYkN,UAAZ,EAAwBa,IAA/B,IAAuC,UAA3C,EAAuD;;AAEnD,mBAAM9K,sBAAiBiK,UAAjB,gCAAN;AACH;;AAED;AACA,aAAIc,eAAiBxD,MAAMiD,UAAN,CAAiB,CAAjB,CAArB;AAAA,aACIQ,iBAAiBD,aAAaP,UAAb,CAAwB,CAAxB,CADrB;AAAA,aAEIS,YAAiBrO,MAAMG,KAAN,CAAYkN,UAAZ,EAAwBa,IAAxB,CAA6BE,cAA7B,CAFrB;AAAA,aAGIE,MAHJ;;AAMAA,kBAAS;AACLhL,mBAAM+J,UADD;AAELrK,mBAAMqL;AAFD,UAAT;;AAKA;AACAC,gBAAOC,KAAP,GAAe5D,MAAM6D,SAAN,CAAgBC,QAAhB,CAAyBzO,MAAMiC,EAAN,CAASsF,SAAT,CAAmBK,kBAA5C,CAAf;;AAEA5H,eAAMwB,KAAN,CAAYC,UAAZ,CAAuBiN,IAAvB,CAA4BJ,MAA5B;AACH,MA/BD;;AAiCA,YAAOd,KAAP;AAEH,EAzGW,CAyGT,EAzGS,CAAZ;;AA2GAxN,OAAMwN,KAAN,GAAcA,KAAd;AACA1N,QAAOC,OAAP,GAAiByN,KAAjB,C;;;;;;;;AC9GA,KAAIxN,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAI0L,UAAW,UAASA,OAAT,EAAkB;;AAE7BA,aAAQoD,WAAR,GAAsB,IAAtB;;AAEA;;;AAGApD,aAAQqD,IAAR,GAAe,YAAY;;AAEvB5O,eAAM8B,IAAN,CAAWc,GAAX,CAAe,YAAf;;AAEA;;;AAGA5C,eAAMwB,KAAN,CAAYkM,IAAZ,GAAmB1N,MAAMO,KAAN,CAAYgB,QAAZ,CAAqBoM,SAAxC;AAEH,MATD;;AAWA;;;AAGApC,aAAQsD,cAAR,GAAyB,YAAW;;AAEhC,aAAIC,YAAYtL,OAAOuL,YAAP,EAAhB;AAAA,aACIC,OADJ;;AAGA,aAAIF,UAAUG,UAAV,KAAyB,IAA7B,EAAmC;AAC/B,oBAAO,IAAP;AACH;;AAED,aAAKH,UAAUG,UAAV,CAAqB3J,QAArB,IAAiCtF,MAAM8B,IAAN,CAAWmC,SAAX,CAAqBC,GAA3D,EAAiE;AAC7D8K,uBAAUF,UAAUG,UAApB;AACH,UAFD,MAEO;AACHD,uBAAUF,UAAUI,SAAV,CAAoBC,aAA9B;AACH;;AAED,aAAK,CAACnP,MAAMoP,MAAN,CAAaC,iBAAb,CAA+BL,OAA/B,CAAN,EAAgD;;AAE5C;AACA,iBAAIM,SAASN,QAAQlL,UAArB;;AAEA,oBAAOwL,UAAU,CAACtP,MAAMoP,MAAN,CAAaC,iBAAb,CAA+BC,MAA/B,CAAlB,EAAyD;AACrDA,0BAASA,OAAOxL,UAAhB;AACH;;AAEDkL,uBAAUM,MAAV;AACH;;AAED,aAAIN,WAAWhP,MAAMO,KAAN,CAAYgB,QAA3B,EAAoC;AAChC,oBAAOyN,OAAP;AACH;;AAED,gBAAO,IAAP;AAEH,MAjCD;;AAmCA;;;AAGAzD,aAAQgE,SAAR,GAAoB,YAAW;;AAE3BvP,eAAMuL,OAAN,CAAcoD,WAAd,CAA0BH,SAA1B,CAAoCgB,GAApC,CAAwCxP,MAAMiC,EAAN,CAASsF,SAAT,CAAmBI,iBAA3D;AACH,MAHD;;AAKA;;;AAGA4D,aAAQkE,SAAR,GAAoB,YAAW;;AAE3B,aAAIzP,MAAMuL,OAAN,CAAcoD,WAAlB,EAA+B;AAC3B3O,mBAAMuL,OAAN,CAAcoD,WAAd,CAA0BH,SAA1B,CAAoCkB,MAApC,CAA2C1P,MAAMiC,EAAN,CAASsF,SAAT,CAAmBI,iBAA9D;AACH;AAEJ,MAND;;AAQA;;;;;;AAMA4D,aAAQoE,kBAAR,GAA6B,UAASC,IAAT,EAAe;;AAExC,aAAI,CAAC5P,MAAM8B,IAAN,CAAWsD,SAAX,CAAqBwK,IAArB,CAAL,EAAiC;AAC7BA,oBAAOA,KAAK9L,UAAZ;AACH;;AAED,aAAI8L,SAAS5P,MAAMO,KAAN,CAAYgB,QAArB,IAAiCqO,SAAS3M,SAASkF,IAAvD,EAA6D;;AAEzD,oBAAO,IAAP;AAEH,UAJD,MAIO;;AAEH,oBAAM,CAACyH,KAAKpB,SAAL,CAAeC,QAAf,CAAwBzO,MAAMiC,EAAN,CAASsF,SAAT,CAAmBC,eAA3C,CAAP,EAAoE;AAChEoI,wBAAOA,KAAK9L,UAAZ;AACH;;AAED,oBAAO8L,IAAP;AACH;AAEJ,MAnBD;;AAqBA;;;;;AAKArE,aAAQE,kBAAR,GAA6B,UAAUoE,UAAV,EAAsB;;AAE/C;AACA7P,eAAMuL,OAAN,CAAckE,SAAd;;AAEA,aAAI,CAACI,UAAL,EAAiB;AACb;AACH;;AAED,cAAKlB,WAAL,GAAmB,KAAKgB,kBAAL,CAAwBE,UAAxB,CAAnB;AAEH,MAXD;;AAaA;;;;;;;;;;AAUAtE,aAAQuE,YAAR,GAAuB,SAASC,aAAT,CAAuBC,WAAvB,EAAoCC,QAApC,EAA8C;;AAEjE,aAAI,CAACD,WAAD,IAAgB,CAACC,QAArB,EAA8B;AAC1BjQ,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,6BAAf;AACA;AACH;;AAED;AACA,gBAAM,CAACoN,YAAYxB,SAAZ,CAAsBC,QAAtB,CAA+BzO,MAAMiC,EAAN,CAASsF,SAAT,CAAmBC,eAAlD,CAAP,EAA2E;AACvEwI,2BAAcA,YAAYlM,UAA1B;AACH;;AAED;AACA9D,eAAMO,KAAN,CAAYgB,QAAZ,CAAqB2O,YAArB,CAAkCD,QAAlC,EAA4CD,WAA5C;;AAEA;;;AAGAhQ,eAAMuL,OAAN,CAAcE,kBAAd,CAAiCwE,QAAjC;;AAEA;;;AAGAjQ,eAAMiC,EAAN,CAASyI,gBAAT,CAA0BuF,QAA1B;;AAEA;;;AAGAjQ,eAAMiC,EAAN,CAASQ,UAAT;AAEH,MA9BD;;AAgCA;;;;;;;;;;;;AAYA8I,aAAQC,WAAR,GAAsB,UAAU2B,SAAV,EAAqBgD,cAArB,EAAsC;;AAExD,aAAIC,eAAkBpQ,MAAMuL,OAAN,CAAcoD,WAApC;AAAA,aACI0B,kBAAkBlD,UAAUxC,KADhC;AAAA,aAEI2F,YAAkBnD,UAAU7J,IAFhC;AAAA,aAGIiK,cAAkBJ,UAAUG,SAHhC;;AAKA,aAAI2C,WAAWjQ,MAAMuL,OAAN,CAAcgF,eAAd,CAA8BF,eAA9B,EAA+CC,SAA/C,EAA0D/C,WAA1D,CAAf;;AAEA,aAAI6C,YAAJ,EAAkB;;AAEdpQ,mBAAM8B,IAAN,CAAW6B,WAAX,CAAuByM,YAAvB,EAAqCH,QAArC;AAEH,UAJD,MAIO;AACH;;;AAGAjQ,mBAAMO,KAAN,CAAYgB,QAAZ,CAAqB+F,WAArB,CAAiC2I,QAAjC;AAEH;;AAED;;;AAGAjQ,eAAMiC,EAAN,CAASyI,gBAAT,CAA0BuF,QAA1B;;AAEA;;;AAGAjQ,eAAMuL,OAAN,CAAcE,kBAAd,CAAiCwE,QAAjC;;AAEA;;;AAGAjQ,eAAMiC,EAAN,CAASQ,UAAT;;AAGA,aAAK0N,cAAL,EAAsB;;AAElB;;;AAGA,iBAAIK,oBAAoBxQ,MAAMyQ,KAAN,CAAYC,oBAAZ,MAAsC,CAAC,CAA/D;;AAGA,iBAAIF,qBAAqB,CAAC,CAA1B,EAA6B;;AAGzB,qBAAIG,kBAAkBV,SAASW,aAAT,CAAuB,mBAAvB,CAAtB;AAAA,qBACIC,YAAkB5N,SAAS6N,cAAT,CAAwB,EAAxB,CADtB;;AAGAH,iCAAgBrJ,WAAhB,CAA4BuJ,SAA5B;AACA7Q,uBAAMyQ,KAAN,CAAYM,GAAZ,CAAgBJ,eAAhB,EAAiC,CAAjC,EAAoC,CAApC;;AAEA3Q,uBAAMU,OAAN,CAAcsQ,IAAd;AACAhR,uBAAMU,OAAN,CAAcuQ,cAAd;AAGH,cAbD,MAaO;;AAEH;AACAC,4BAAW,YAAY;;AAEnB;AACAlR,2BAAMyQ,KAAN,CAAYU,cAAZ,CAA2BX,iBAA3B;AACAxQ,2BAAMU,OAAN,CAAcsQ,IAAd;AACAhR,2BAAMU,OAAN,CAAc4F,IAAd;AAEH,kBAPD,EAOG,EAPH;AASH;AAEJ;AAEJ,MA1ED;;AA4EA;;;;;;;AAOAiF,aAAQ6F,WAAR,GAAsB,UAASC,cAAT,EAAyBpB,QAAzB,EAAmCrH,IAAnC,EAAwC;;AAE1D,aAAI0I,mBAAmBtR,MAAMuL,OAAN,CAAcgF,eAAd,CAA8BN,QAA9B,EAAwCrH,IAAxC,CAAvB;;AAEA;AACA5I,eAAMuL,OAAN,CAAcuE,YAAd,CAA2BuB,cAA3B,EAA2CC,gBAA3C;;AAEA;AACAtR,eAAMiC,EAAN,CAASQ,UAAT;AACH,MATD;;AAWA;;;;;;;;;;AAUA8I,aAAQgG,8BAAR,GAAyC,UAAU5G,KAAV,EAAiB6G,QAAjB,EAA2B;;AAEhE;;;;AAIA,aAAIC,cAAc9G,MAAMiD,UAAxB;AAAA,aACIb,KADJ;AAAA,aAEI6C,IAFJ;AAAA,aAGI8B,IAHJ;;AAKA,cAAI3E,QAAQ,CAAZ,EAAeA,QAAQ0E,YAAYxF,MAAnC,EAA2Cc,OAA3C,EACA;AACI6C,oBAAO6B,YAAY1E,KAAZ,CAAP;;AAEA,iBAAI6C,KAAKtK,QAAL,IAAiBtF,MAAM8B,IAAN,CAAWmC,SAAX,CAAqBE,IAA1C,EAAgD;;AAE5CuN,wBAAO9B,KAAK+B,WAAL,CAAiBC,IAAjB,EAAP;;AAEA;;;AAGA,qBAAIF,SAAS,EAAb,EAAiB;;AAEb/G,2BAAMkH,WAAN,CAAkBjC,IAAlB;AACA4B;AACH;AACJ;AACJ;;AAED,aAAI7G,MAAMiD,UAAN,CAAiB3B,MAAjB,KAA4B,CAAhC,EAAmC;AAC/B,oBAAOhJ,SAAS6N,cAAT,CAAwB,EAAxB,CAAP;AACH;;AAED;AACA,aAAKU,WAAW,CAAhB,EACIA,WAAW,CAAX;;AAEJ,aAAIM,qBAAqB,KAAzB;;AAEA;AACA,aAAIN,aAAa,CAAjB,EAAoB;AAChBM,kCAAqB,IAArB;AACAN,wBAAW,CAAX;AACH;;AAED,gBAAQA,QAAR,EAAmB;;AAEf;AACA,iBAAKM,kBAAL,EAA0B;AACtBnH,yBAAQA,MAAMiD,UAAN,CAAiB,CAAjB,CAAR;AACH,cAFD,MAEO;AACHjD,yBAAQA,MAAMiD,UAAN,CAAiB4D,WAAW,CAA5B,CAAR;AACH;;AAED,iBAAK7G,MAAMrF,QAAN,IAAkBtF,MAAM8B,IAAN,CAAWmC,SAAX,CAAqBC,GAA5C,EAAiD;;AAE7CsN,4BAAW7G,MAAMiD,UAAN,CAAiB3B,MAA5B;AAEH,cAJD,MAIO,IAAItB,MAAMrF,QAAN,IAAkBtF,MAAM8B,IAAN,CAAWmC,SAAX,CAAqBE,IAA3C,EAAiD;;AAEpDqN,4BAAW,CAAX;AACH;AAEJ;;AAED,gBAAO7G,KAAP;AACH,MAnED;;AAqEA;;;AAGAY,aAAQgF,eAAR,GAA0B,UAAU5F,KAAV,EAAiB/B,IAAjB,EAAuB2E,WAAvB,EAAoC;;AAE1D,aAAI0C,WAAejQ,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,KAAhB,EAAuB5P,MAAMiC,EAAN,CAASsF,SAAT,CAAmBC,eAA1C,EAA2D,EAA3D,CAAnB;AAAA,aACI2G,eAAenO,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,KAAhB,EAAuB5P,MAAMiC,EAAN,CAASsF,SAAT,CAAmBE,aAA1C,EAAyD,EAAzD,CADnB;;AAGA0G,sBAAa7G,WAAb,CAAyBqD,KAAzB;AACAsF,kBAAS3I,WAAT,CAAqB6G,YAArB;;AAEA,aAAIZ,WAAJ,EAAiB;AACbY,0BAAaK,SAAb,CAAuBgB,GAAvB,CAA2BxP,MAAMiC,EAAN,CAASsF,SAAT,CAAmBG,eAA9C;AACH;;AAEDuI,kBAAShC,OAAT,CAAiBrF,IAAjB,GAAwBA,IAAxB;AACA,gBAAOqH,QAAP;AACH,MAdD;;AAgBA;;;AAGA1E,aAAQwG,QAAR,GAAmB,YAAW;;AAE1B,aAAIjD,YAAYtL,OAAOuL,YAAP,GAAsBiD,UAAtB,CAAiC,CAAjC,CAAhB;;AAEA,gBAAOlD,SAAP;AACH,MALD;;AAOA;;;;;AAKAvD,aAAQ0G,UAAR,GAAqB,UAASC,UAAT,EAAqB;;AAEtC,aAAIpD,YAAiBtL,OAAOuL,YAAP,EAArB;AAAA,aACIE,aAAiBH,UAAUG,UAD/B;AAAA,aAEIkD,iBAAiBlD,WAAW0C,WAFhC;AAAA,aAGIS,cAAiBtD,UAAUuD,YAH/B;AAAA,aAIIC,eAJJ;AAAA,aAKIC,mBALJ;AAAA,aAMIC,cANJ;AAAA,aAOIC,kBAPJ;;AASA,aAAIC,eAAe1S,MAAMuL,OAAN,CAAcoD,WAAd,CAA0BiC,aAA1B,CAAwC,mBAAxC,CAAnB;;AAGA0B,2BAAsBH,eAAeQ,SAAf,CAAyB,CAAzB,EAA4BP,WAA5B,CAAtB;AACAI,0BAAsBL,eAAeQ,SAAf,CAAyBP,WAAzB,CAAtB;;AAEAG,+BAAsBtP,SAAS6N,cAAT,CAAwBwB,eAAxB,CAAtB;;AAEA,aAAIE,cAAJ,EAAoB;AAChBC,kCAAsBxP,SAAS6N,cAAT,CAAwB0B,cAAxB,CAAtB;AACH;;AAED,aAAII,iBAAiB,EAArB;AAAA,aACIC,aAAiB,EADrB;AAAA,aAEIC,iBAAiB,KAFrB;;AAIA,aAAIL,kBAAJ,EAAwB;AACpBI,wBAAWnE,IAAX,CAAgB+D,kBAAhB;AACH;;AAED,cAAM,IAAIpG,IAAI,CAAR,EAAW0G,KAAjB,EAAwB,CAAC,EAAEA,QAAQL,aAAa9E,UAAb,CAAwBvB,CAAxB,CAAV,CAAzB,EAAgEA,GAAhE,EAAqE;;AAEjE,iBAAK0G,SAAS9D,UAAd,EAA2B;AACvB,qBAAK,CAAC6D,cAAN,EAAsB;AAClBF,oCAAelE,IAAf,CAAoBqE,KAApB;AACH,kBAFD,MAEO;AACHF,gCAAWnE,IAAX,CAAgBqE,KAAhB;AACH;AACJ,cAND,MAMO;AACHD,kCAAiB,IAAjB;AACH;AAEJ;;AAED;AACA9S,eAAMwB,KAAN,CAAYG,MAAZ,CAAmBuQ,UAAnB,EAA+BvE,SAA/B,GAA2C,EAA3C;;AAEA;;;AAGA,aAAIqF,uBAAuBJ,eAAe3G,MAA1C;;AAEA,cAAII,IAAI,CAAR,EAAWA,IAAI2G,oBAAf,EAAqC3G,GAArC,EAA0C;AACtCrM,mBAAMwB,KAAN,CAAYG,MAAZ,CAAmBuQ,UAAnB,EAA+B5K,WAA/B,CAA2CsL,eAAevG,CAAf,CAA3C;AACH;;AAEDrM,eAAMwB,KAAN,CAAYG,MAAZ,CAAmBuQ,UAAnB,EAA+B5K,WAA/B,CAA2CiL,mBAA3C;;AAEA;;;AAGA,aAAIU,mBAAmBJ,WAAW5G,MAAlC;AAAA,aACIiH,UAAmBjQ,SAASgE,aAAT,CAAuB,KAAvB,CADvB;;AAGA,cAAIoF,IAAI,CAAR,EAAWA,IAAI4G,gBAAf,EAAiC5G,GAAjC,EAAsC;AAClC6G,qBAAQ5L,WAAR,CAAoBuL,WAAWxG,CAAX,CAApB;AACH;;AAED6G,mBAAUA,QAAQvF,SAAlB;;AAEA;AACA,aAAIwF,iBAAiB,WAArB;;AAEA;;;AAGAnT,eAAMuL,OAAN,CAAcC,WAAd,CAA0B;AACtBlI,mBAAQ6P,cADc;AAEtBxI,oBAAQ3K,MAAMG,KAAN,CAAYgT,cAAZ,EAA4B9H,MAA5B,CAAmC;AACvCqG,uBAAOwB;AADgC,cAAnC;AAFc,UAA1B,EAKG,IALH;AAOH,MApFD;;AAsFA;;;;AAIA3H,aAAQ6H,WAAR,GAAsB,UAAS5C,iBAAT,EAA4B6C,gBAA5B,EAA8C;;AAEhE;AACA,aAAI7C,sBAAsB,CAA1B,EAA6B;AACzB;AACH;;AAED,aAAI8C,WAAJ;AAAA,aACIC,sBAAsBvT,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB6O,iBAAnB,EAAsC7C,SADhE;;AAGA,aAAI,CAAC0F,gBAAL,EAAuB;;AAEnBC,2BAActT,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB6O,oBAAoB,CAAvC,CAAd;AAEH,UAJD,MAIO;;AAEH8C,2BAActT,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB0R,gBAAnB,CAAd;AAEH;;AAEDC,qBAAY3F,SAAZ,IAAyB4F,mBAAzB;AACH,MArBD;;AAuBA;;;;;;AAMAhI,aAAQiI,KAAR,GAAgB,UAASC,QAAT,EAAmB;;AAE/B,aAAIC,cAAc1T,MAAMuL,OAAN,CAAcoD,WAAhC;AAAA,aACI/F,OAAc8K,YAAYzF,OAAZ,CAAoBrF,IADtC;;AAGA,aAAI5I,MAAMG,KAAN,CAAYyI,IAAZ,EAAkB+K,cAAtB,EAAsC;AAClC3T,mBAAMuL,OAAN,CAAcqI,QAAd,CAAuBH,SAASI,UAAhC;AACH,UAFD,MAEO;AACH7T,mBAAMuL,OAAN,CAAcuI,gBAAd,CAA+BL,SAASI,UAAxC;AACH;AAEJ,MAXD;;AAaA;;;;;;AAMAtI,aAAQuI,gBAAR,GAA2B,UAASvT,KAAT,EAAgB;;AAEvC,aAAIqP,OAAWrP,MAAM,CAAN,CAAf;AAAA,aACIwT,WAAW9Q,SAAS6N,cAAT,CAAwBlB,KAAK+B,WAA7B,CADf;;AAGA,aAAI3R,MAAM8B,IAAN,CAAWsD,SAAX,CAAqBwK,IAArB,CAAJ,EAAgC;AAC5BA,kBAAK9L,UAAL,CAAgBoM,YAAhB,CAA6B6D,QAA7B,EAAuCnE,IAAvC;AACH;AACJ,MARD;;AAUA;;;;;;;AAOArE,aAAQqI,QAAR,GAAmB,UAAShQ,MAAT,EAAiB;;AAEhC,aAAI,CAACA,MAAL,EAAa;AACT;AACH;;AAED,cAAK,IAAIyI,IAAI,CAAb,EAAgBA,IAAIzI,OAAOgK,UAAP,CAAkB3B,MAAtC,EAA8CI,GAA9C,EAAmD;AAC/C,kBAAK2H,GAAL,CAASpQ,OAAOgK,UAAP,CAAkBvB,CAAlB,CAAT;AACH;AACJ,MATD;;AAWA;;;;AAIAd,aAAQ0I,WAAR,GAAsB,UAASrQ,MAAT,EAAiB;;AAEnC,aAAIsQ,IAAJ;AAAA,aACIhB,UAAU,IADd;AAAA,aAEIiB,YAAc,CAAC,GAAD,EAAM,YAAN,EAAoB,IAApB,EAA0B,MAA1B,EAAkC,IAAlC,EAAwC,IAAxC,EAA8C,IAA9C,EAAoD,IAApD,EAA0D,IAA1D,EAAgE,IAAhE,EAAsE,IAAtE,EAA4E,IAA5E,EAAkF,KAAlF,EAAyF,KAAzF,EAAgG,QAAhG,EAA0G,SAA1G,CAFlB;AAAA,aAGIC,cAAc,CAAC,GAAD,EAAM,GAAN,EAAW,GAAX,EAAgB,GAAhB,EAAqB,GAArB,EAA0B,IAA1B,CAHlB;AAAA,aAIIC,cAAc,CAACD,YAAYE,QAAZ,CAAqB1Q,OAAO2Q,OAA5B,CAJnB;AAAA,aAKIC,qBAAqBL,UAAUG,QAAV,CAAmB1Q,OAAO2Q,OAA1B,CALzB;;AAOA,aAAI,CAACvU,MAAM8B,IAAN,CAAWsD,SAAX,CAAqBxB,MAArB,CAAL,EAAkC;AAC9B,oBAAOA,MAAP;AACH;;AAED,aAAI,CAACA,OAAOE,UAAZ,EAAuB;AACnB,oBAAOF,MAAP;AACH;;AAED,aAAIyQ,WAAJ,EAAiB;;AAEb,iBAAIG,kBAAJ,EAAwB;;AAEpBtB,2BAAUjQ,SAASgE,aAAT,CAAuB,GAAvB,CAAV;AACAiM,yBAAQvF,SAAR,GAAoB/J,OAAO+J,SAA3B;AACA/J,wBAAOE,UAAP,CAAkBoM,YAAlB,CAA+BgD,OAA/B,EAAwCtP,MAAxC;AACAA,0BAASsP,OAAT;AAEH,cAPD,MAOO;;AAEHA,2BAAUjQ,SAAS6N,cAAT,OAA4BlN,OAAO+N,WAAnC,OAAV;AACAuB,yBAAQvB,WAAR,GAAsBuB,QAAQvB,WAAR,CAAoB8C,OAApB,CAA4B,SAA5B,EAAuC,GAAvC,CAAtB;AACA7Q,wBAAOE,UAAP,CAAkBoM,YAAlB,CAA+BgD,OAA/B,EAAwCtP,MAAxC;AAEH;AACJ;;AAED;AACA,aAAIA,OAAO2Q,OAAP,IAAkB,GAAtB,EAA2B;AACvBL,oBAAOtQ,OAAO8Q,YAAP,CAAoB,MAApB,CAAP;AACH;;AAED;AACA,gBAAM9Q,OAAO+Q,UAAP,CAAkB1I,MAAlB,GAA2B,CAAjC,EAAoC;AAChCrI,oBAAOgR,eAAP,CAAuBhR,OAAO+Q,UAAP,CAAkB,CAAlB,EAAqB7L,IAA5C;AACH;;AAED;AACA,aAAIoL,IAAJ,EAAU;AACNtQ,oBAAO0H,YAAP,CAAoB,MAApB,EAA4B4I,IAA5B;AACH;;AAED,gBAAOtQ,MAAP;AAEH,MApDD;;AAsDA;;;;;AAKA2H,aAAQyI,GAAR,GAAc,UAAS3O,EAAT,EAAa;;AAEvB,aAAI,CAACrF,MAAM8B,IAAN,CAAWsD,SAAX,CAAqBC,EAArB,CAAL,EACI;;AAEJ,aAAIwP,YAAY,KAAKZ,WAAL,CAAiB5O,EAAjB,CAAhB;;AAEA,cAAI,IAAIgH,IAAI,CAAZ,EAAeA,IAAIwI,UAAUjH,UAAV,CAAqB3B,MAAxC,EAAgDI,GAAhD,EAAqD;AACjD,kBAAK2H,GAAL,CAASa,UAAUjH,UAAV,CAAqBvB,CAArB,CAAT;AACH;AAEJ,MAXD;;AAaA,YAAOd,OAAP;AAEH,EAjnBa,CAinBX,EAjnBW,CAAd;;AAmnBAvL,OAAMuL,OAAN,GAAgBA,OAAhB;AACAzL,QAAOC,OAAP,GAAiBwL,OAAjB,C;;;;;;;;ACtnBA,KAAIvL,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIa,UAAW,UAASA,OAAT,EAAkB;;AAE7BA,aAAQT,IAAR,GAAe,YAAW;AACtBS,iBAAQR,QAAR,GAAmB,mBAAAL,CAAQ,CAAR,CAAnB;AACAa,iBAAQoK,MAAR,GAAmB,mBAAAjL,CAAQ,EAAR,CAAnB;AACAa,iBAAQI,OAAR,GAAmB,mBAAAjB,CAAQ,EAAR,CAAnB;AACH,MAJD;;AAMA;;;AAGAa,aAAQoU,oBAAR,GAA+B,EAA/B;;AAEApU,aAAQqU,aAAR,GAAwB,EAAxB;;AAEArU,aAAQsU,MAAR,GAAiB,KAAjB;;AAEAtU,aAAQuU,OAAR,GAAkB,IAAlB;;AAEA;;;AAGAvU,aAAQ4F,IAAR,GAAe,YAAW;;AAEtBtG,eAAMO,KAAN,CAAYG,OAAZ,CAAoB8N,SAApB,CAA8BgB,GAA9B,CAAkC,QAAlC;AACA,cAAKwF,MAAL,GAAc,IAAd;AAEH,MALD;;AAOA;;;AAGAtU,aAAQwU,KAAR,GAAgB,YAAU;;AAEtBlV,eAAMO,KAAN,CAAYG,OAAZ,CAAoB8N,SAApB,CAA8BkB,MAA9B,CAAqC,QAArC;AACA,cAAKsF,MAAL,GAAe,KAAf;;AAEA,cAAKC,OAAL,GAAe,IAAf;;AAEA,cAAK,IAAIzK,MAAT,IAAmBxK,MAAMO,KAAN,CAAYe,cAA/B,EAA8C;AAC1CtB,mBAAMO,KAAN,CAAYe,cAAZ,CAA2BkJ,MAA3B,EAAmCgE,SAAnC,CAA6CkB,MAA7C,CAAoD,UAApD;AACH;;AAED;AACA1P,eAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;AACAlV,eAAMU,OAAN,CAAcR,QAAd,CAAuBgV,KAAvB;AAEH,MAfD;;AAiBAxU,aAAQyU,MAAR,GAAiB,YAAU;;AAEvB,aAAK,CAAC,KAAKH,MAAX,EAAmB;;AAEf,kBAAK1O,IAAL;AAEH,UAJD,MAIO;;AAEH,kBAAK4O,KAAL;AAEH;AAEJ,MAZD;;AAcAxU,aAAQ0U,cAAR,GAAyB,YAAW;AAChCpV,eAAMO,KAAN,CAAYS,UAAZ,CAAuBwN,SAAvB,CAAiCgB,GAAjC,CAAqC,MAArC;AACH,MAFD;;AAIA9O,aAAQuQ,cAAR,GAAyB,YAAW;AAChCjR,eAAMO,KAAN,CAAYS,UAAZ,CAAuBwN,SAAvB,CAAiCkB,MAAjC,CAAwC,MAAxC;AACH,MAFD;;AAIA;;;AAGAhP,aAAQsQ,IAAR,GAAe,YAAW;;AAEtB;AACAhR,eAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;;AAEA,aAAI,CAAClV,MAAMuL,OAAN,CAAcoD,WAAnB,EAAgC;AAC5B;AACH;;AAED,aAAI0G,gBAAgBrV,MAAMO,KAAN,CAAYG,OAAZ,CAAoB4U,YAApB,IAAoCtV,MAAMU,OAAN,CAAcoU,oBAAtE;AAAA,aACIS,iBAAiBvV,MAAMuL,OAAN,CAAcoD,WAAd,CAA0B6G,SAA1B,GAAuCxV,MAAMU,OAAN,CAAcoU,oBAAd,GAAqC,CAA5E,GAAiF9U,MAAMU,OAAN,CAAcqU,aADpH;;AAGA/U,eAAMO,KAAN,CAAYG,OAAZ,CAAoB+U,KAApB,CAA0BC,SAA1B,uBAAwDC,KAAKC,KAAL,CAAWL,cAAX,CAAxD;;AAEA;AACAvV,eAAMU,OAAN,CAAcR,QAAd,CAAuB2V,iBAAvB;AAEH,MAjBD;;AAmBA,YAAOnV,OAAP;AAEH,EA/Fa,CA+FX,EA/FW,CAAd;;AAiGAA,SAAQT,IAAR;;AAEAD,OAAMU,OAAN,GAAgBA,OAAhB;AACAZ,QAAOC,OAAP,GAAiBW,OAAjB,C;;;;;;;;ACtGA,KAAIV,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIK,WAAY,UAASA,QAAT,EAAmB;;AAE/BA,cAASD,IAAT,GAAgB,YAAW;AACvBJ,SAAA,mBAAAA,CAAQ,CAAR;AACH,MAFD;;AAIAK,cAAS8U,MAAT,GAAkB,KAAlB;;AAEA9U,cAAS4V,OAAT,GAAmB,IAAnB;AACA5V,cAASW,OAAT,GAAmB,IAAnB;;AAEAX,cAASqO,KAAT,GAAiB,IAAjB;;AAEA;;;AAGArO,cAASoG,IAAT,GAAgB,UAASyP,QAAT,EAAkB;;AAE9B;;;;AAIA,aAAI,CAAC/V,MAAMG,KAAN,CAAY4V,QAAZ,CAAD,IAA0B,CAAC/V,MAAM8B,IAAN,CAAWsD,SAAX,CAAqBpF,MAAMG,KAAN,CAAY4V,QAAZ,EAAsB7V,QAA3C,CAA/B,EAAsF;;AAElFF,mBAAM8B,IAAN,CAAWc,GAAX,iBAA0BmT,QAA1B,2BAAuD,MAAvD;AACA;AAEH,UALD,MAKO;;AAEH/V,mBAAMO,KAAN,CAAYa,cAAZ,CAA2BkG,WAA3B,CAAuCtH,MAAMG,KAAN,CAAY4V,QAAZ,EAAsB7V,QAA7D;AAEH;;AAED,aAAIwS,eAAe1S,MAAMuL,OAAN,CAAcoD,WAAjC;;AAEA;AACA3O,eAAMO,KAAN,CAAYY,aAAZ,CAA0BqN,SAA1B,CAAoCgB,GAApC,CAAwC,QAAxC;AACAxP,eAAMU,OAAN,CAAcR,QAAd,CAAuBsI,kBAAvB;AACA,cAAKwM,MAAL,GAAc,IAAd;AACH,MAvBD;;AAyBA;;;AAGA9U,cAASgV,KAAT,GAAiB,YAAU;;AAEvBlV,eAAMO,KAAN,CAAYY,aAAZ,CAA0BqN,SAA1B,CAAoCkB,MAApC,CAA2C,QAA3C;AACA1P,eAAMO,KAAN,CAAYa,cAAZ,CAA2BuM,SAA3B,GAAuC,EAAvC;;AAEA,cAAKqH,MAAL,GAAc,KAAd;AAEH,MAPD;;AASA;;;AAGA9U,cAASiV,MAAT,GAAkB,UAAUY,QAAV,EAAoB;;AAElC,aAAK,CAAC,KAAKf,MAAX,EAAmB;;AAEf,kBAAK1O,IAAL,CAAUyP,QAAV;AAEH,UAJD,MAIO;;AAEH,kBAAKb,KAAL;AAEH;AAEJ,MAZD;;AAcA;;;AAGAhV,cAASsI,kBAAT,GAA8B,YAAW;;AAErC;AACA,aAAIwN,eAAJ;;AAEA;AACAhW,eAAMO,KAAN,CAAYc,eAAZ,CAA4BsM,SAA5B,GAAwC,EAAxC;;AAGA;AACAqI,2BAAkBhW,MAAMU,OAAN,CAAcR,QAAd,CAAuB+V,mBAAvB,EAAlB;;AAEA;;;;AAIA;;;;AAIAjW,eAAMO,KAAN,CAAYc,eAAZ,CAA4BiG,WAA5B,CAAwC0O,eAAxC;AAEH,MAtBD;;AAwBA;;;;;;;;;AASA9V,cAAS+V,mBAAT,GAA+B,YAAW;;AAEtC,aAAIC,sBAAsBlW,MAAMU,OAAN,CAAcR,QAAd,CAAuBgW,mBAAvB,EAA1B;AAAA,aACIJ,OADJ;AAAA,aAEI9S,IAFJ;;AAIA,aAAI,CAACkT,mBAAL,EAA0B;;AAEtBlT,oBAAO;AACH2K,4BAAY;AADT,cAAP;AAIH,UAND,MAMO;;AAEH3K,oBAAO;AACH2K,4BAAY;AADT,cAAP;AAIH;;AAEDmI,mBAAU9V,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,KAAhB,EAAuB5P,MAAMiC,EAAN,CAASsF,SAAT,CAAmBM,aAA1C,EAAyD7E,IAAzD,CAAV;AACA8S,iBAAQlM,gBAAR,CAAyB,OAAzB,EAAkC5J,MAAMU,OAAN,CAAcR,QAAd,CAAuBiW,cAAzD,EAAyE,KAAzE;;AAEA,gBAAOL,OAAP;AACH,MAxBD;;AA0BA;;;AAGA5V,cAASiW,cAAT,GAA0B,YAAW;;AAEjC,aAAIxH,cAAc3O,MAAMuL,OAAN,CAAcoD,WAAhC;;AAEAA,qBAAYH,SAAZ,CAAsB2G,MAAtB,CAA6BnV,MAAMiC,EAAN,CAASsF,SAAT,CAAmBK,kBAAhD;;AAEA5H,eAAMU,OAAN,CAAcR,QAAd,CAAuBgV,KAAvB;AACH,MAPD;;AASAhV,cAASgW,mBAAT,GAA+B,YAAW;;AAEtC,aAAIxD,eAAe1S,MAAMuL,OAAN,CAAcoD,WAAjC;;AAEA,aAAI+D,YAAJ,EAAkB;AACd,oBAAOA,aAAalE,SAAb,CAAuBC,QAAvB,CAAgCzO,MAAMiC,EAAN,CAASsF,SAAT,CAAmBK,kBAAnD,CAAP;AACH,UAFD,MAEO;AACH,oBAAO,KAAP;AACH;AACJ,MATD;;AAWA;;;AAGA1H,cAASmI,qBAAT,GAAiC,YAAW;;AAExC,aAAI+N,qBAAsBpW,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,MAAhB,EAAwB,wBAAxB,EAAkD,EAAlD,CAA1B;AAAA,aACIyG,gBAAgBrW,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,MAAhB,EAAwB,4BAAxB,EAAsD,EAAEjC,WAAY,+BAAd,EAAtD,CADpB;AAAA,aAEI2I,gBAAgBtW,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,KAAhB,EAAuB,iCAAvB,EAA0D,EAA1D,CAFpB;AAAA,aAGI2G,gBAAgBvW,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,KAAhB,EAAuB,4BAAvB,EAAqD,EAAE+B,aAAc,cAAhB,EAArD,CAHpB;AAAA,aAII6E,eAAgBxW,MAAMiI,IAAN,CAAW2H,IAAX,CAAgB,KAAhB,EAAuB,2BAAvB,EAAoD,EAAE+B,aAAc,mBAAhB,EAApD,CAJpB;;AAMA0E,uBAAczM,gBAAd,CAA+B,OAA/B,EAAwC5J,MAAMU,OAAN,CAAcR,QAAd,CAAuBuW,mBAA/D,EAAoF,KAApF;;AAEAF,uBAAc3M,gBAAd,CAA+B,OAA/B,EAAwC5J,MAAMU,OAAN,CAAcR,QAAd,CAAuBwW,sBAA/D,EAAuF,KAAvF;;AAEAF,sBAAa5M,gBAAb,CAA8B,OAA9B,EAAuC5J,MAAMU,OAAN,CAAcR,QAAd,CAAuByW,qBAA9D,EAAqF,KAArF;;AAEAL,uBAAchP,WAAd,CAA0BiP,aAA1B;AACAD,uBAAchP,WAAd,CAA0BkP,YAA1B;;AAEAJ,4BAAmB9O,WAAnB,CAA+B+O,aAA/B;AACAD,4BAAmB9O,WAAnB,CAA+BgP,aAA/B;;AAEA;AACAtW,eAAMU,OAAN,CAAcR,QAAd,CAAuB4V,OAAvB,GAAiCO,aAAjC;AACArW,eAAMU,OAAN,CAAcR,QAAd,CAAuBW,OAAvB,GAAiCyV,aAAjC;;AAEA,gBAAOF,kBAAP;AAEH,MA1BD;;AA4BAlW,cAASuW,mBAAT,GAA+B,YAAW;;AAEtC,aAAIG,SAAS5W,MAAMU,OAAN,CAAcR,QAAd,CAAuBW,OAApC;;AAEA,aAAI+V,OAAOpI,SAAP,CAAiBC,QAAjB,CAA0B,QAA1B,CAAJ,EAAyC;AACrCzO,mBAAMU,OAAN,CAAcR,QAAd,CAAuB2V,iBAAvB;AACH,UAFD,MAEO;AACH7V,mBAAMU,OAAN,CAAcR,QAAd,CAAuB2W,iBAAvB;AACH;;AAED7W,eAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;AACAlV,eAAMU,OAAN,CAAcR,QAAd,CAAuBgV,KAAvB;AAEH,MAbD;;AAeAhV,cAASyW,qBAAT,GAAiC,YAAW;;AAExC3W,eAAMU,OAAN,CAAcR,QAAd,CAAuBW,OAAvB,CAA+B2N,SAA/B,CAAyCkB,MAAzC,CAAgD,QAAhD;AACH,MAHD;;AAKAxP,cAASwW,sBAAT,GAAkC,YAAW;;AAEzC,aAAIhE,eAAe1S,MAAMuL,OAAN,CAAcoD,WAAjC;AAAA,aACImI,qBADJ;;AAGApE,sBAAahD,MAAb;;AAEAoH,iCAAwB9W,MAAMO,KAAN,CAAYgB,QAAZ,CAAqBqM,UAArB,CAAgC3B,MAAxD;;AAEA;;;AAGA,aAAI6K,0BAA0B,CAA9B,EAAiC;;AAE7B;AACA9W,mBAAMuL,OAAN,CAAcoD,WAAd,GAA4B,IAA5B;;AAEA;AACA3O,mBAAMiC,EAAN,CAASiJ,eAAT;AACH;;AAEDlL,eAAMiC,EAAN,CAASQ,UAAT;;AAEAzC,eAAMU,OAAN,CAAcwU,KAAd;AACH,MAxBD;;AA0BAhV,cAAS2W,iBAAT,GAA6B,YAAW;AACpC7W,eAAMU,OAAN,CAAcR,QAAd,CAAuBW,OAAvB,CAA+B2N,SAA/B,CAAyCgB,GAAzC,CAA6C,QAA7C;AACH,MAFD;;AAIAtP,cAAS2V,iBAAT,GAA6B,YAAW;AACpC7V,eAAMU,OAAN,CAAcR,QAAd,CAAuBW,OAAvB,CAA+B2N,SAA/B,CAAyCkB,MAAzC,CAAgD,QAAhD;AACH,MAFD;;AAIA,YAAOxP,QAAP;AAEH,EAlPc,CAkPZ,EAlPY,CAAf;;AAoPAA,UAASD,IAAT;;AAEAH,QAAOC,OAAP,GAAiBG,QAAjB,C;;;;;;;;ACxPA,KAAIF,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIiL,SAAU,UAASA,MAAT,EAAiB;;AAE3BA,YAAO7K,IAAP,GAAc,YAAW,CAExB,CAFD;;AAIA6K,YAAOiM,aAAP,GAAuB,IAAvB;AACAjM,YAAOkM,aAAP,GAAuB,IAAvB;AACAlM,YAAOmM,cAAP,GAAwB,IAAxB;;AAEA;;;;AAIAnM,YAAOoM,eAAP,GAAyB,IAAzB;;AAEA;;;;;AAKApM,YAAOC,IAAP,GAAc,YAAW;;AAErB,aAAIoM,eAAe,KAAKC,gBAAL,EAAnB;AAAA,aACI1W,UAAeV,MAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAD7C;AAAA,aAEIG,UAAeZ,MAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAF7C;;AAIA,aAAIuW,aAAalL,MAAb,GAAsB,CAA1B,EAA6B;;AAEzB;AACAjM,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBkG,IAArB;;AAEA;AACAtQ,qBAAQ8N,SAAR,CAAkBgB,GAAlB,CAAsB,QAAtB;;AAEA;AACAxP,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBuM,WAArB;AACH;AAEJ,MAzBD;;AA2BA;;;;;AAKAvM,YAAOoK,KAAP,GAAe,YAAW;AACtB,aAAIxU,UAAUV,MAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAAxC;AACAC,iBAAQ8N,SAAR,CAAkBkB,MAAlB,CAAyB,QAAzB;AACH,MAHD;;AAKA;;;;;AAKA5E,YAAOkG,IAAP,GAAc,YAAW;;AAErB,aAAI,CAAC,KAAKiG,cAAV,EAA0B;AACtB,kBAAKA,cAAL,GAAsB,KAAKK,iBAAL,EAAtB;AACH;;AAED,aAAIC,SAAkB,KAAKC,kBAAL,EAAtB;AAAA,aACIzC,gBAAkB,CADtB;AAAA,aAEIrU,UAAkBV,MAAMO,KAAN,CAAYI,aAAZ,CAA0BF,OAFhD;AAAA,aAGIgX,cAHJ;AAAA,aAIIC,cAJJ;;AAMA,aAAIhX,QAAQiX,YAAR,KAAyB,CAA7B,EAAgC;AAC5B5C,6BAAgB,EAAhB;AACH;;AAED0C,0BAAiBF,OAAOK,CAAP,GAAW,KAAKX,cAAL,CAAoBY,IAAhD;AACAH,0BAAiBH,OAAOO,CAAP,GAAWtU,OAAOuU,OAAlB,GAA4B,KAAKd,cAAL,CAAoBe,GAAhD,GAAsDjD,aAAtD,GAAsErU,QAAQiX,YAA/F;;AAEAjX,iBAAQ+U,KAAR,CAAcC,SAAd,oBAAyCC,KAAKC,KAAL,CAAW6B,cAAX,CAAzC,YAA0E9B,KAAKC,KAAL,CAAW8B,cAAX,CAA1E;;AAEA;AACA1X,eAAMU,OAAN,CAAcoK,MAAd,CAAqBmN,YAArB;AACAjY,eAAMU,OAAN,CAAcoK,MAAd,CAAqBoN,WAArB;AAEH,MAzBD;;AA2BA;;;;;;AAMApN,YAAOY,WAAP,GAAqB,UAAS1B,KAAT,EAAgB1G,IAAhB,EAAsB;;AAEvC;;;;AAIA,iBAAQA,IAAR;AACI,kBAAK,YAAL;AAAoBtD,uBAAMU,OAAN,CAAcoK,MAAd,CAAqBqN,gBAArB,CAAsCnO,KAAtC,EAA6C1G,IAA7C,EAAoD;AACxE;AAAoBtD,uBAAMU,OAAN,CAAcoK,MAAd,CAAqBsN,iBAArB,CAAuC9U,IAAvC,EAA8C;AAFtE;;AAKA;;;;AAIAtD,eAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,CAAkCgN,UAAlC,CAA6CyK,OAA7C,CAAqDrY,MAAMU,OAAN,CAAcoK,MAAd,CAAqBwN,UAA1E;AACH,MAhBD;;AAkBA;;;;;AAKAxN,YAAOwM,iBAAP,GAA2B,YAAW;;AAElC,aAAI7W,UAAUT,MAAMO,KAAN,CAAYE,OAA1B;AAAA,aACI8X,SAAU,KAAKC,SAAL,CAAe/X,OAAf,CADd;;AAGA,cAAKwW,cAAL,GAAsBsB,MAAtB;AACA,gBAAOA,MAAP;AAEH,MARD;;AAUA;;;;;;;;AAQAzN,YAAO0N,SAAP,GAAmB,UAAWnT,EAAX,EAAgB;;AAE/B,aAAIoT,KAAK,CAAT;AACA,aAAIC,KAAK,CAAT;;AAEA,gBAAOrT,MAAM,CAACsT,MAAOtT,GAAGuT,UAAV,CAAP,IAAiC,CAACD,MAAOtT,GAAGmQ,SAAV,CAAzC,EAAiE;AAC7DiD,mBAAOpT,GAAGuT,UAAH,GAAgBvT,GAAGwT,UAA1B;AACAH,mBAAOrT,GAAGmQ,SAAH,GAAenQ,GAAGyT,SAAzB;AACAzT,kBAAKA,GAAG0T,YAAR;AACH;AACD,gBAAO,EAAEf,KAAKU,EAAP,EAAWb,MAAMY,EAAjB,EAAP;AACH,MAXD;;AAaA;;;;;;AAMA3N,YAAO0M,kBAAP,GAA4B,YAAW;;AAEnC,aAAIwB,MAAM/V,SAAS6L,SAAnB;AAAA,aAA8BmK,KAA9B;AACA,aAAIrB,IAAI,CAAR;AAAA,aAAWE,IAAI,CAAf;;AAEA,aAAIkB,GAAJ,EAAS;;AAEL,iBAAIA,IAAI1V,IAAJ,IAAY,SAAhB,EAA2B;AACvB2V,yBAAQD,IAAIE,WAAJ,EAAR;AACAD,uBAAME,QAAN,CAAe,IAAf;AACAvB,qBAAIqB,MAAMG,YAAV;AACAtB,qBAAImB,MAAMI,WAAV;AACH;AAEJ,UATD,MASO,IAAI7V,OAAOuL,YAAX,EAAyB;;AAE5BiK,mBAAMxV,OAAOuL,YAAP,EAAN;;AAEA,iBAAIiK,IAAIM,UAAR,EAAoB;;AAEhBL,yBAAQD,IAAIhH,UAAJ,CAAe,CAAf,EAAkBuH,UAAlB,EAAR;AACA,qBAAIN,MAAMO,cAAV,EAA0B;AACtBP,2BAAME,QAAN,CAAe,IAAf;AACA,yBAAIM,OAAOR,MAAMO,cAAN,GAAuB,CAAvB,CAAX;AACA5B,yBAAI6B,KAAK5B,IAAT;AACAC,yBAAI2B,KAAKzB,GAAT;AACH;AAEJ;AACJ;AACD,gBAAO,EAAEJ,GAAGA,CAAL,EAAQE,GAAGA,CAAX,EAAP;AACH,MA/BD;;AAiCA;;;;;;AAMAhN,YAAOsM,gBAAP,GAA0B,SAASA,gBAAT,GAA2B;;AAEjD,aAAID,eAAe,EAAnB;;AAEA,aAAI3T,OAAOuL,YAAX,EAAwB;AAAE;AACtBoI,4BAAe3T,OAAOuL,YAAP,GAAsB2K,QAAtB,EAAf;AACH;;AAED,gBAAOvC,YAAP;AACH,MATD;;AAWA;AACArM,YAAOuM,WAAP,GAAqB,YAAW;;AAE5B,aAAIzW,UAAUZ,MAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAAxC;AACAA,iBAAQ4N,SAAR,CAAkBgB,GAAlB,CAAsB,QAAtB;;AAEAxP,eAAMU,OAAN,CAAcoK,MAAd,CAAqBiM,aAArB,GAAqC,IAArC;;AAEA;AACA/W,eAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,CAAkCgN,UAAlC,CAA6CyK,OAA7C,CAAqDrY,MAAMU,OAAN,CAAcoK,MAAd,CAAqBwN,UAA1E;AAEH,MAVD;;AAYA;AACAxN,YAAOmN,YAAP,GAAsB,YAAW;AAC7B,aAAIrX,UAAUZ,MAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAAxC;AACAA,iBAAQ4N,SAAR,CAAkBkB,MAAlB,CAAyB,QAAzB;;AAEA1P,eAAMU,OAAN,CAAcoK,MAAd,CAAqBiM,aAArB,GAAqC,KAArC;AACH,MALD;;AAOA;AACAjM,YAAO6O,WAAP,GAAqB,YAAW;AAC5B,aAAI/C,SAAS5W,MAAMO,KAAN,CAAYI,aAAZ,CAA0BE,OAAvC;AACA+V,gBAAOpI,SAAP,CAAiBgB,GAAjB,CAAqB,QAArB;;AAEAxP,eAAMU,OAAN,CAAcoK,MAAd,CAAqBkM,aAArB,GAAqC,IAArC;AACH,MALD;;AAOA;AACAlM,YAAOoN,WAAP,GAAqB,YAAW;AAC5B,aAAItB,SAAS5W,MAAMO,KAAN,CAAYI,aAAZ,CAA0BE,OAAvC;AACA+V,gBAAOjJ,SAAP,GAAmB,EAAnB;AACAiJ,gBAAOpI,SAAP,CAAiBkB,MAAjB,CAAwB,QAAxB;AACA1P,eAAMU,OAAN,CAAcoK,MAAd,CAAqBkM,aAArB,GAAqC,KAArC;AACH,MALD;;AAOA;AACAlM,YAAOqN,gBAAP,GAA0B,UAASnO,KAAT,EAAgB1G,IAAhB,EAAsB;;AAE5C,aAAIsW,WAAW,KAAKC,YAAL,EAAf;;AAEA,aAAIC,WAAkB9Z,MAAMuL,OAAN,CAAcoD,WAApC;AAAA,aACIuI,kBAAkBlX,MAAMU,OAAN,CAAcoK,MAAd,CAAqBoM,eAD3C;;AAGA,aAAI0C,QAAJ,EAAc;;AAEV,iBAAI9K,YAActL,OAAOuL,YAAP,EAAlB;AAAA,iBACIE,aAAcH,UAAUG,UAD5B;;AAGAiI,+BAAkBlX,MAAMU,OAAN,CAAcoK,MAAd,CAAqBiP,aAArB,CAAmCD,QAAnC,CAAlB;;AAEA;;;;;;AAMA9Z,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBkP,gBAArB,CAAsCF,QAAtC,EAAgD5C,eAAhD;;AAEAlX,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBsN,iBAArB,CAAuC,QAAvC;AAEH,UAjBD,MAiBO;;AAEH;AACA,iBAAIxB,SAAS5W,MAAMiI,IAAN,CAAWgS,YAAX,EAAb;AACAja,mBAAMO,KAAN,CAAYI,aAAZ,CAA0BE,OAA1B,CAAkCyG,WAAlC,CAA8CsP,MAA9C;;AAEA5W,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBmN,YAArB;AACAjY,mBAAMU,OAAN,CAAcoK,MAAd,CAAqB6O,WAArB;;AAEAzC,+BAAkBlX,MAAMU,OAAN,CAAcoK,MAAd,CAAqBiP,aAArB,CAAmCD,QAAnC,CAAlB;;AAEA;;;;;AAKAlD,oBAAOsD,KAAP;AACAlQ,mBAAMmQ,cAAN;;AAEA;AACAvD,oBAAOhN,gBAAP,CAAwB,SAAxB,EAAmC,UAASI,KAAT,EAAe;;AAE9C,qBAAIA,MAAMoQ,OAAN,IAAiBpa,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBG,KAArC,EAA4C;;AAExCxE,2BAAMU,OAAN,CAAcoK,MAAd,CAAqBkP,gBAArB,CAAsCF,QAAtC,EAAgD5C,eAAhD;AACAlX,2BAAMU,OAAN,CAAcoK,MAAd,CAAqBuP,SAArB,CAA+BzD,OAAO0D,KAAtC;;AAEA;;;AAGAtQ,2BAAMmQ,cAAN;AACAnQ,2BAAMuQ,wBAAN;;AAEAva,2BAAMU,OAAN,CAAcoK,MAAd,CAAqB0P,UAArB;AACH;AAEJ,cAhBD,EAgBG,KAhBH;AAiBH;AACJ,MA9DD;;AAgEA1P,YAAO+O,YAAP,GAAsB,YAAW;;AAE7B,aAAID,WAAW,KAAf;;AAEA5Z,eAAMO,KAAN,CAAYI,aAAZ,CAA0BC,OAA1B,CAAkCgN,UAAlC,CAA6CyK,OAA7C,CAAqD,UAASzP,IAAT,EAAe;AAChE,iBAAI6R,WAAW7R,KAAKqF,OAAL,CAAa3K,IAA5B;;AAEA,iBAAImX,YAAY,MAAZ,IAAsB7R,KAAK4F,SAAL,CAAeC,QAAf,CAAwB,cAAxB,CAA1B,EAAmE;AAC/DmL,4BAAW,IAAX;AACH;AACJ,UAND;;AAQA,gBAAOA,QAAP;AACH,MAbD;;AAeA;AACA9O,YAAOsN,iBAAP,GAA2B,UAAS9U,IAAT,EAAe;AACtCL,kBAASyX,WAAT,CAAqBpX,IAArB,EAA2B,KAA3B,EAAkC,IAAlC;AACH,MAFD;;AAIA;;;;;;;AAOAwH,YAAOuP,SAAP,GAAmB,UAAS7U,GAAT,EAAc;;AAE7BvC,kBAASyX,WAAT,CAAqB,YAArB,EAAmC,KAAnC,EAA0ClV,GAA1C;;AAEA;AACAxF,eAAMU,OAAN,CAAcoK,MAAd,CAAqBoN,WAArB;AACH,MAND;;AAQA;;;;;AAKApN,YAAOiP,aAAP,GAAuB,UAASY,WAAT,EAAsB;;AAEzC,aAAI1B,QAAQzV,OAAOuL,YAAP,GAAsBiD,UAAtB,CAAiC,CAAjC,CAAZ;AAAA,aACI4I,oBAAoB3B,MAAMM,UAAN,EADxB;AAAA,aAEI3X,KAFJ;;AAIAgZ,2BAAkBC,kBAAlB,CAAqCF,WAArC;AACAC,2BAAkBE,MAAlB,CAAyB7B,MAAM8B,cAA/B,EAA+C9B,MAAM+B,WAArD;;AAEApZ,iBAAQgZ,kBAAkBlB,QAAlB,GAA6BzN,MAArC;;AAEA,gBAAO;AACHrK,oBAAOA,KADJ;AAEHqZ,kBAAKrZ,QAAQqX,MAAMS,QAAN,GAAiBzN;AAF3B,UAAP;AAIH,MAfD;;AAiBA;;;;;;;;AAQAnB,YAAOkP,gBAAP,GAA0B,UAASW,WAAT,EAAsBO,QAAtB,EAAgC;;AAEtD,aAAIjC,QAAYhW,SAASiW,WAAT,EAAhB;AAAA,aACIiC,YAAY,CADhB;;AAGAlC,eAAMmC,QAAN,CAAeT,WAAf,EAA4B,CAA5B;AACA1B,eAAME,QAAN,CAAe,IAAf;;AAEA,aAAIkC,YAAY,CAACV,WAAD,CAAhB;AAAA,aACI/K,IADJ;AAAA,aAEI0L,aAAa,KAFjB;AAAA,aAGIC,OAAO,KAHX;AAAA,aAIIC,aAJJ;;AAMA,gBAAO,CAACD,IAAD,KAAU3L,OAAOyL,UAAUI,GAAV,EAAjB,CAAP,EAA0C;;AAEtC,iBAAI7L,KAAKtK,QAAL,IAAiB,CAArB,EAAwB;;AAEpBkW,iCAAgBL,YAAYvL,KAAK3D,MAAjC;;AAEA,qBAAI,CAACqP,UAAD,IAAeJ,SAAStZ,KAAT,IAAkBuZ,SAAjC,IAA8CD,SAAStZ,KAAT,IAAkB4Z,aAApE,EAAmF;AAC/EvC,2BAAMmC,QAAN,CAAexL,IAAf,EAAqBsL,SAAStZ,KAAT,GAAiBuZ,SAAtC;AACAG,kCAAa,IAAb;AACH;AACD,qBAAIA,cAAcJ,SAASD,GAAT,IAAgBE,SAA9B,IAA2CD,SAASD,GAAT,IAAgBO,aAA/D,EAA8E;AAC1EvC,2BAAM6B,MAAN,CAAalL,IAAb,EAAmBsL,SAASD,GAAT,GAAeE,SAAlC;AACAI,4BAAO,IAAP;AACH;AACDJ,6BAAYK,aAAZ;AACH,cAbD,MAaO;AACH,qBAAInP,IAAIuD,KAAKhC,UAAL,CAAgB3B,MAAxB;AACA,wBAAOI,GAAP,EAAY;AACRgP,+BAAU3M,IAAV,CAAekB,KAAKhC,UAAL,CAAgBvB,CAAhB,CAAf;AACH;AACJ;AACJ;;AAED,aAAI2M,MAAMxV,OAAOuL,YAAP,EAAV;AACAiK,aAAI0C,eAAJ;AACA1C,aAAI2C,QAAJ,CAAa1C,KAAb;AACH,MAxCD;;AA0CA;;;;;AAKAnO,YAAO0P,UAAP,GAAoB,YAAW;AAC3B,aAAI1L,YAAYtL,OAAOuL,YAAP,EAAhB;AACAD,mBAAU4M,eAAV;AACH,MAHD;;AAKA;;;;;AAKA5Q,YAAOwN,UAAP,GAAoB,UAAS1P,IAAT,EAAe;AAC/B,aAAI6R,WAAW7R,KAAKqF,OAAL,CAAa3K,IAA5B;;AAEA,aAAIL,SAAS2Y,iBAAT,CAA2BnB,QAA3B,CAAJ,EAA0C;AACtCza,mBAAMU,OAAN,CAAcoK,MAAd,CAAqB+Q,oBAArB,CAA0CjT,IAA1C;AACH,UAFD,MAEO;AACH5I,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBgR,sBAArB,CAA4ClT,IAA5C;AACH;;AAED;;;;AAIA,aAAIkG,YAAYtL,OAAOuL,YAAP,EAAhB;AAAA,aACIgN,MAAMjN,UAAUG,UAAV,CAAqBnL,UAD/B;;AAGA,aAAIiY,IAAIxH,OAAJ,IAAe,GAAf,IAAsBkG,YAAY,MAAtC,EAA8C;AAC1Cza,mBAAMU,OAAN,CAAcoK,MAAd,CAAqB+Q,oBAArB,CAA0CjT,IAA1C;AACH;AACJ,MAnBD;;AAqBA;;;;;AAKAkC,YAAO+Q,oBAAP,GAA8B,UAASrR,MAAT,EAAiB;AAC3CA,gBAAOgE,SAAP,CAAiBgB,GAAjB,CAAqB,cAArB;;AAEA;AACA,aAAIhF,OAAOyD,OAAP,CAAe3K,IAAf,IAAuB,MAA3B,EAAmC;AAC/B,iBAAI8F,OAAOoB,OAAOoD,UAAP,CAAkB,CAAlB,CAAX;AACAxE,kBAAKoF,SAAL,CAAekB,MAAf,CAAsB,cAAtB;AACAtG,kBAAKoF,SAAL,CAAegB,GAAf,CAAmB,gBAAnB;AACH;AACJ,MATD;;AAWA;;;;;AAKA1E,YAAOgR,sBAAP,GAAgC,UAAStR,MAAT,EAAiB;AAC7CA,gBAAOgE,SAAP,CAAiBkB,MAAjB,CAAwB,cAAxB;;AAEA;AACA,aAAIlF,OAAOyD,OAAP,CAAe3K,IAAf,IAAuB,MAA3B,EAAmC;AAC/B,iBAAI8F,OAAOoB,OAAOoD,UAAP,CAAkB,CAAlB,CAAX;AACAxE,kBAAKoF,SAAL,CAAekB,MAAf,CAAsB,gBAAtB;AACAtG,kBAAKoF,SAAL,CAAegB,GAAf,CAAmB,cAAnB;AACH;AACJ,MATD;;AAYA,YAAO1E,MAAP;AACH,EA9dY,CA8dV,EA9dU,CAAb;;AAgeAA,QAAO7K,IAAP;;AAEAH,QAAOC,OAAP,GAAiB+K,MAAjB,C;;;;;;;;ACpeA,KAAI9K,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIiB,UAAW,UAASA,OAAT,EAAkB;;AAE7BA,aAAQb,IAAR,GAAe,YAAW;AACtBJ,SAAA,mBAAAA,CAAQ,CAAR;AACH,MAFD;;AAIAiB,aAAQkU,MAAR,GAAiB,KAAjB;;AAEA;AACAlU,aAAQwF,IAAR,GAAe,YAAW;;AAEtB;AACA,aAAItG,MAAMU,OAAN,CAAcR,QAAd,CAAuB8U,MAA3B,EAAmC;AAC/BhV,mBAAMU,OAAN,CAAcR,QAAd,CAAuBgV,KAAvB;AACH;;AAED;AACAlV,eAAMO,KAAN,CAAYO,OAAZ,CAAoB0N,SAApB,CAA8BgB,GAA9B,CAAkC,QAAlC;;AAEA;AACAxP,eAAMO,KAAN,CAAYS,UAAZ,CAAuBwN,SAAvB,CAAiCgB,GAAjC,CAAqC,SAArC;;AAEA;AACAxP,eAAMU,OAAN,CAAcI,OAAd,CAAsBkU,MAAtB,GAA+B,IAA/B;AAEH,MAhBD;;AAkBA;AACAlU,aAAQoU,KAAR,GAAgB,YAAW;;AAEvB;AACAlV,eAAMO,KAAN,CAAYO,OAAZ,CAAoB0N,SAApB,CAA8BkB,MAA9B,CAAqC,QAArC;;AAEA;AACA1P,eAAMO,KAAN,CAAYS,UAAZ,CAAuBwN,SAAvB,CAAiCkB,MAAjC,CAAwC,SAAxC;;AAEA;AACA1P,eAAMU,OAAN,CAAcI,OAAd,CAAsBkU,MAAtB,GAA+B,KAA/B;AAEH,MAXD;;AAaAlU,aAAQkb,IAAR,GAAe,YAAU;;AAErB,aAAIC,cAAcjc,MAAMU,OAAN,CAAcuU,OAAhC;AAAA,aACI9U,QAAc+b,OAAO7X,IAAP,CAAYrE,MAAMG,KAAlB,CADlB;AAAA,aAEIgc,aAAcnc,MAAMO,KAAN,CAAYe,cAF9B;AAAA,aAGI8a,aAHJ;AAAA,aAIIC,YAJJ;;AAMA,aAAK,CAACJ,WAAN,EAAoB;;AAEhB;AACA,kBAAKI,YAAL,IAAqBF,UAArB;AAAiC;AAAjC;AAEH,UALD,MAKO;;AAEHC,6BAAgBjc,MAAMmc,OAAN,CAAcL,WAAd,IAA6B,CAA7C;;AAEA,iBAAKG,iBAAiBjc,MAAM8L,MAA5B,EAAoCmQ,gBAAgB,CAAhB;;AAEpCC,4BAAelc,MAAMic,aAAN,CAAf;AAEH;;AAED,cAAK,IAAI5R,MAAT,IAAmB2R,UAAnB;AAA+BA,wBAAW3R,MAAX,EAAmBgE,SAAnB,CAA6BkB,MAA7B,CAAoC,UAApC;AAA/B,UAEAyM,WAAWE,YAAX,EAAyB7N,SAAzB,CAAmCgB,GAAnC,CAAuC,UAAvC;;AAEAxP,eAAMU,OAAN,CAAcuU,OAAd,GAAwBoH,YAAxB;AAEH,MA7BD;;AA+BA;;;;AAIAvb,aAAQ4K,WAAR,GAAsB,YAAW;;AAE7B;;;AAGA,aAAI6Q,qBAAqB,CAAC,OAAD,EAAU,MAAV,EAAkB,MAAlB,EAA0B,WAA1B,EAAuC,SAAvC,CAAzB;AAAA,aACI3T,OAAqB5I,MAAMG,KAAN,CAAYH,MAAMU,OAAN,CAAcuU,OAA1B,CADzB;AAAA,aAEIvB,cAAqB1T,MAAMuL,OAAN,CAAcoD,WAFvC;AAAA,aAGI6B,oBAAqBxQ,MAAMyQ,KAAN,CAAYyB,UAHrC;AAAA,aAII7B,eAJJ;AAAA,aAKImM,cALJ;AAAA,aAMIrP,SANJ;;AAQA;AACAkD,2BAAkBzH,KAAK1G,IAAL,EAAlB;;AAEA;AACAiL,qBAAY;AACRxC,oBAAY0F,eADJ;AAER/M,mBAAYsF,KAAKtF,IAFT;AAGRgK,wBAAY;AAHJ,UAAZ;;AAMA,aACIoG,eACA6I,mBAAmBD,OAAnB,CAA2B5I,YAAYzF,OAAZ,CAAoBrF,IAA/C,MAAyD,CAAC,CAD1D,IAEA8K,YAAY/B,WAAZ,CAAwBC,IAAxB,OAAmC,EAHvC,EAIC;AACG;AACA5R,mBAAMuL,OAAN,CAAc6F,WAAd,CAA0BsC,WAA1B,EAAuCrD,eAAvC,EAAwDzH,KAAKtF,IAA7D;AAEH,UARD,MAQO;;AAEH;AACAtD,mBAAMuL,OAAN,CAAcC,WAAd,CAA0B2B,SAA1B;;AAEA;AACAqD;AAEH;;AAED;AACAgM,0BAAiB5T,KAAK4T,cAAtB;;AAEA,aAAIA,kBAAkB,OAAOA,cAAP,IAAyB,UAA/C,EAA2D;AACvDA,4BAAenW,IAAf,CAAoB2D,KAApB;AACH;;AAEDkH,oBAAW,YAAW;;AAElB;AACAlR,mBAAMyQ,KAAN,CAAYgM,UAAZ,CAAuBjM,iBAAvB;AAEH,UALD,EAKG,EALH;;AAQA;;;AAGAxQ,eAAMuL,OAAN,CAAcE,kBAAd;;AAEA;;;AAGAzL,eAAMU,OAAN,CAAcsQ,IAAd;AACH,MAjED;;AAmEA,YAAOlQ,OAAP;AAEH,EAjJa,CAiJX,EAjJW,CAAd;;AAmJAA,SAAQb,IAAR;;AAEAH,QAAOC,OAAP,GAAiBe,OAAjB,C;;;;;;;;ACvJA,KAAId,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIM,QAAS,UAASA,KAAT,EAAgB;;AAEzB,YAAOA,KAAP;AAEH,EAJW,CAIT,EAJS,CAAZ;;AAMAH,OAAMG,KAAN,GAAcA,KAAd;AACAL,QAAOC,OAAP,GAAiBI,KAAjB,C;;;;;;;;ACTA,KAAIH,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAI6c,YAAa,UAASA,SAAT,EAAoB;;AAEjCA,eAAUC,mBAAV,GAAgC,IAAhC;;AAEAD,eAAUxS,aAAV,GAA0B,UAASF,KAAT,EAAe;AACrC,iBAAQA,MAAMoQ,OAAd;AACI,kBAAKpa,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBE,GAArB;AAA6BvE,uBAAMiK,QAAN,CAAe2S,aAAf,CAA6B5S,KAA7B,EAA2C;AACxE,kBAAKhK,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBG,KAArB;AAA6BxE,uBAAMiK,QAAN,CAAe4S,eAAf,CAA+B7S,KAA/B,EAA2C;AACxE,kBAAKhK,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBO,GAArB;AAA6B5E,uBAAMiK,QAAN,CAAe6S,gBAAf,CAAgC9S,KAAhC,EAA2C;AACxE;AAA+BhK,uBAAMiK,QAAN,CAAe8S,iBAAf,CAAiC/S,KAAjC,EAA4C;AAJ/E;AAMH,MAPD;;AASA0S,eAAUvS,WAAV,GAAwB,UAASH,KAAT,EAAe;AACnC,iBAAQA,MAAMoQ,OAAd;AACI,kBAAKpa,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBU,EAArB;AACA,kBAAK/E,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBS,IAArB;AACA,kBAAK9E,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBY,KAArB;AACA,kBAAKjF,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBW,IAArB;AAA6BhF,uBAAMiK,QAAN,CAAe+S,eAAf,CAA+BhT,KAA/B,EAAuC;AAJxE;AAMH,MAPD;;AASA0S,eAAUE,aAAV,GAA0B,UAAS5S,KAAT,EAAe;;AAErC,aAAK,CAAChK,MAAMU,OAAN,CAAcsU,MAApB,EAA6B;AACzBhV,mBAAMU,OAAN,CAAc4F,IAAd;AACH;;AAED,aAAItG,MAAMU,OAAN,CAAcsU,MAAd,IAAwB,CAAChV,MAAMU,OAAN,CAAcI,OAAd,CAAsBkU,MAAnD,EAA2D;AACvDhV,mBAAMU,OAAN,CAAcI,OAAd,CAAsBwF,IAAtB;AACH,UAFD,MAEO;AACHtG,mBAAMU,OAAN,CAAcI,OAAd,CAAsBkb,IAAtB;AACH;;AAEDhS,eAAMmQ,cAAN;AACH,MAbD;;AAeA;;;;AAIAuC,eAAUG,eAAV,GAA4B,UAAS7S,KAAT,EAAe;;AAEvC;AACA,aAAIiT,uBAAuBjd,MAAMiK,QAAN,CAAeiT,4BAAf,EAA3B;;AAEA,aAAID,oBAAJ,EAA0B;AACtBjT,mBAAMmQ,cAAN;;AAEA;;;;AAIAna,mBAAMyQ,KAAN,CAAYyB,UAAZ,GAAyB,CAAC,CAA1B;;AAEAlS,mBAAMiK,QAAN,CAAekT,mBAAf;AACA;AACH;;AAED,aAAInT,MAAMpG,MAAN,CAAawZ,eAAb,IAAgC,MAApC,EAA4C;;AAExC;AACApd,mBAAMyQ,KAAN,CAAY4M,qBAAZ;AACH;;AAED,aAAI,CAACrd,MAAMuL,OAAN,CAAcoD,WAAnB,EAAgC;AAC5B;;;AAGA3O,mBAAMiK,QAAN,CAAekT,mBAAf,CAAmCnT,KAAnC;AACA;AACH;;AAGD,aAAIwG,oBAA0BxQ,MAAMyQ,KAAN,CAAYC,oBAAZ,MAAsC,CAApE;AAAA,aACIgD,cAA0B1T,MAAMuL,OAAN,CAAcoD,WAD5C;AAAA,aAEI/F,OAA0B8K,YAAYzF,OAAZ,CAAoBrF,IAFlD;AAAA,aAGI0U,0BAA0Btd,MAAMU,OAAN,CAAcsU,MAAd,IACtBhV,MAAMU,OAAN,CAAcuU,OADQ,IAEtBjL,MAAMpG,MAAN,IAAgB5D,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB6O,iBAAnB,CALxB;;AAOA;AACA,aAAI+M,mBAAmBvd,MAAMG,KAAN,CAAYyI,IAAZ,EAAkB2U,gBAAzC;;AAEA;AACA,aAAIpK,iBAAiB,WAArB;;AAEA;;;AAGA,aAAKmK,uBAAL,EAA+B;;AAE3BtT,mBAAMmQ,cAAN;;AAEAna,mBAAMU,OAAN,CAAcI,OAAd,CAAsB4K,WAAtB,CAAkC1B,KAAlC;;AAEAhK,mBAAMU,OAAN,CAAcwU,KAAd;;AAEA;AAEH;;AAED;;;AAGA,aAAKlL,MAAMwT,QAAN,IAAkB,CAACD,gBAAxB,EAA0C;AACtCvd,mBAAMiK,QAAN,CAAekT,mBAAf,CAAmCnd,MAAMuL,OAAN,CAAcmH,YAAjD,EAA+D1I,KAA/D;AACAA,mBAAMmQ,cAAN;AAEH,UAJD,MAIO,IAAMnQ,MAAMwT,QAAN,IAAkB,CAACD,gBAApB,IAA0C,CAACvT,MAAMwT,QAAP,IAAmBD,gBAAlE,EAAqF;AACxF;AACA;AACH;;AAED,aAAIE,iBAAiB,KAArB;AAAA,aACIC,mBAAmBla,OAAOuL,YAAP,EADvB;AAAA,aAEI4O,sBAAsBD,iBAAiBzO,UAF3C;AAAA,aAGI2O,sBAAsB5d,MAAMyQ,KAAN,CAAYe,QAAZ,CAAqBqM,QAArB,EAH1B;AAAA,aAIIC,4CAA4C,KAJhD;;AAMA;;;;;AAKAA,qDAA4CH,uBAAuBA,oBAAoB7Z,UAApB,CAA+BsZ,eAA/B,IAAkD,MAArH;;AAEA;;;AAGA,aACIO,oBAAoBrY,QAApB,IAAgCtF,MAAM8B,IAAN,CAAWmC,SAAX,CAAqBE,IAArD,IACA,CAAC2Z,yCADD,IAEA,CAACF,mBAHL,EAIC;;AAEG5T,mBAAMmQ,cAAN;;AAEAna,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,wBAAf;;AAEA5C,mBAAMuL,OAAN,CAAc0G,UAAd,CAAyBzB,iBAAzB;;AAEA;AACA,iBAAI,CAACxQ,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB6O,oBAAoB,CAAvC,EAA0CmB,WAA1C,CAAsDC,IAAtD,EAAL,EAAmE;AAC/D5R,uBAAMU,OAAN,CAAcuQ,cAAd;AACH;AAEJ,UAjBD,MAiBO;;AAEH,iBAAK0M,uBAAuBA,oBAAoB7Z,UAAhD,EAA4D;;AAExD2Z,kCAAiB,CAACE,oBAAoB7Z,UAApB,CAA+BE,WAAjD;AAEH;;AAED,iBAAKyZ,kBAAkBG,mBAAvB,EAA6C;;AAEzC5T,uBAAMmQ,cAAN;;AAEAna,uBAAM8B,IAAN,CAAWc,GAAX,CAAe,kDAAf;;AAEA5C,uBAAMuL,OAAN,CAAcC,WAAd,CAA0B;AACtBlI,2BAAQ6P,cADc;AAEtBxI,4BAAQ3K,MAAMG,KAAN,CAAYgT,cAAZ,EAA4B9H,MAA5B;AAFc,kBAA1B,EAGG,IAHH;;AAKArL,uBAAMU,OAAN,CAAcsQ,IAAd;AACAhR,uBAAMU,OAAN,CAAc4F,IAAd;;AAEA;AACAtG,uBAAMU,OAAN,CAAcuQ,cAAd;AAEH,cAjBD,MAiBO;;AAEHjR,uBAAM8B,IAAN,CAAWc,GAAX,CAAe,yBAAf;AAEH;AAEJ;;AAED;AACA5C,eAAMiC,EAAN,CAASQ,UAAT;AAEH,MA9ID;;AAgJAia,eAAUI,gBAAV,GAA6B,UAAS9S,KAAT,EAAe;;AAExC;AACAhK,eAAMU,OAAN,CAAcwU,KAAd;;AAEA;AACAlV,eAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;;AAEAlL,eAAMmQ,cAAN;AAEH,MAVD;;AAYAuC,eAAUM,eAAV,GAA4B,UAAShT,KAAT,EAAe;;AAEvChK,eAAMuL,OAAN,CAAcE,kBAAd;;AAEA;AACAzL,eAAMU,OAAN,CAAcwU,KAAd;AACAlV,eAAMU,OAAN,CAAcsQ,IAAd;AAEH,MARD;;AAUA0L,eAAUK,iBAAV,GAA8B,UAAS/S,KAAT,EAAgB;;AAE1ChK,eAAMU,OAAN,CAAcwU,KAAd;;AAEA,aAAI,CAAClV,MAAMU,OAAN,CAAcoK,MAAd,CAAqBkM,aAA1B,EAAyC;AACrChX,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBoK,KAArB;AACAlV,mBAAMuL,OAAN,CAAckE,SAAd;AACH;AACJ,MARD;;AAUAiN,eAAUtS,eAAV,GAA4B,UAAUJ,KAAV,EAAiB;;AAEzChK,eAAMuL,OAAN,CAAcE,kBAAd,CAAiCzB,MAAMpG,MAAvC;;AAEA5D,eAAMiC,EAAN,CAASQ,UAAT;;AAEA,aAAI0U,eAAenX,MAAMU,OAAN,CAAcoK,MAAd,CAAqBsM,gBAArB,EAAnB;;AAEA;;;AAGA,aAAID,aAAalL,MAAb,KAAwB,CAA5B,EAA+B;AAC3BjM,mBAAMU,OAAN,CAAcoK,MAAd,CAAqBoK,KAArB;AACH;;AAED;AACA,aAAIlL,MAAMpG,MAAN,CAAawZ,eAAb,IAAgC,MAApC,EAA4C;;AAExCpd,mBAAMyQ,KAAN,CAAY4M,qBAAZ;AAEH;;AAED,aAAIrd,MAAMuL,OAAN,CAAcoD,WAAd,KAA8B,IAAlC,EAAwC;;AAEpC;;;AAGA,iBAAIoP,mBAAmB/d,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBsK,MAAnB,GAA4B,CAA5B,GAAgCjM,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBsK,MAAnB,GAA4B,CAA5D,GAAgE,CAAvF;;AAEA;AACA,iBAAIjM,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBsK,MAAvB,EAA+B;;AAE3B;AACA,qBAAI+R,kBAAmBhe,MAAMuL,OAAN,CAAcoE,kBAAd,CAAiC3P,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBoc,gBAAnB,CAAjC,CAAvB;AACH;;AAED;AACA,iBAAI/d,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBsK,MAAnB,IAA6BjM,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBoc,gBAAnB,EAAqCpM,WAArC,KAAqD,EAAlF,IAAwFqM,gBAAgB/P,OAAhB,CAAwBrF,IAAxB,IAAgC,WAA5H,EAAyI;;AAErI5I,uBAAMyQ,KAAN,CAAYgM,UAAZ,CAAuBsB,gBAAvB;AAEH,cAJD,MAIO;;AAEH;AACA,qBAAI5K,iBAAiB,WAArB;;AAEAnT,uBAAMuL,OAAN,CAAcC,WAAd,CAA0B;AACtBlI,2BAAQ6P,cADc;AAEtBxI,4BAAQ3K,MAAMG,KAAN,CAAYgT,cAAZ,EAA4B9H,MAA5B;AAFc,kBAA1B;;AAKA;AACA,qBAAIrL,MAAMwB,KAAN,CAAYG,MAAZ,CAAmBsK,MAAnB,KAA8B,CAAlC,EAAqC;;AAEjCjM,2BAAMyQ,KAAN,CAAYgM,UAAZ,CAAuBsB,gBAAvB;AAEH,kBAJD,MAIO;;AAEH;AACA/d,2BAAMyQ,KAAN,CAAYU,cAAZ,CAA2B4M,gBAA3B;AACH;AACJ;;AAED;;;AAGA/d,mBAAMU,OAAN,CAAcsQ,IAAd;;AAGAhR,mBAAMU,OAAN,CAAc4F,IAAd;AAEH,UAjDD,MAiDO;;AAEH;;;AAGAtG,mBAAMU,OAAN,CAAcsQ,IAAd;;AAEAhR,mBAAMU,OAAN,CAAc4F,IAAd;;AAEA;AACAtG,mBAAMU,OAAN,CAAcR,QAAd,CAAuBgV,KAAvB;AACAlV,mBAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;AACH;;AAGD,aAAI+I,eAAe,CAACje,MAAMuL,OAAN,CAAcoD,WAAd,CAA0BgD,WAA1B,CAAsCC,IAAtC,EAApB;;AAEA,aAAIqM,YAAJ,EAAkB;;AAEd;AACAje,mBAAMU,OAAN,CAAcuQ,cAAd;AAEH,UALD,MAKO;;AAEH;AACAjR,mBAAMU,OAAN,CAAc0U,cAAd;AAEH;;AAED,aAAI8I,kBAAkBle,MAAMuL,OAAN,CAAcoD,WAAd,CAA0BV,OAA1B,CAAkCrF,IAAxD;;AAEA;AACA,aAAIsV,mBAAmB,WAAnB,IAAkC,CAACD,YAAvC,EAAqD;;AAEjDje,mBAAMuL,OAAN,CAAcgE,SAAd;AAEH;AAEJ,MA7GD;;AA+GA;;;;;;;AAOAmN,eAAUQ,4BAAV,GAAyC,YAAW;;AAEhD,aAAIpO,YAAatL,OAAOuL,YAAP,EAAjB;AAAA,aACIE,aAAaH,UAAUG,UAD3B;AAAA,aAEIkP,OAAO,KAFX;;AAKA,aAAIrP,UAAUwK,UAAV,IAAwB,CAA5B,EAA+B;;AAE3B,oBAAO,IAAP;AAEH,UAJD,MAIO;;AAEH,iBAAI,CAACtZ,MAAM8B,IAAN,CAAWsD,SAAX,CAAqB6J,UAArB,CAAL,EAAuC;AACnCA,8BAAaA,WAAWnL,UAAxB;AACH;;AAED;AACA,iBAAImL,WAAWmO,eAAX,IAA8B,MAAlC,EAA0C;AACtCe,wBAAO,IAAP;AACH;;AAED,oBAAOlP,WAAWmO,eAAX,IAA8B,MAArC,EAA6C;AACzCnO,8BAAaA,WAAWnL,UAAxB;;AAEA,qBAAImL,WAAWmO,eAAX,IAA8B,MAAlC,EAA0C;AACtCe,4BAAO,IAAP;AACH;;AAED,qBAAIlP,cAAchM,SAASkF,IAA3B,EAAiC;AAC7B;AACH;AACJ;;AAED;AACA,oBAAOgW,OAAO,KAAP,GAAe,IAAtB;AACH;AAEJ,MAtCD;;AAwCA;;;;AAIAzB,eAAUjS,oBAAV,GAAiC,UAAUT,KAAV,EAAiB;;AAE9C,aAAIQ,SAAS,IAAb;;AAEAxK,eAAMU,OAAN,CAAcuU,OAAd,GAAwBzK,OAAOyD,OAAP,CAAe3K,IAAvC;;AAEAtD,eAAMU,OAAN,CAAcI,OAAd,CAAsB4K,WAAtB,CAAkC1B,KAAlC;AACAhK,eAAMU,OAAN,CAAcwU,KAAd;AAEH,MATD;;AAWAwH,eAAUnS,kBAAV,GAA+B,UAAUP,KAAV,EAAiB;;AAE5C;;;AAGA,aAAI,KAAK2S,mBAAT,EAA6B;AACzByB,0BAAa,KAAKzB,mBAAlB;AACH;;AAED;;;AAGA,cAAKA,mBAAL,GAA2BzL,WAAW,YAAW;;AAE7ClR,mBAAMuL,OAAN,CAAcqD,IAAd;AAEH,UAJ0B,EAIxB,GAJwB,CAA3B;AAMH,MAlBD;;AAoBA;AACA8N,eAAUrS,iBAAV,GAA8B,YAAW;;AAErC,aAAI,CAACrK,MAAMO,KAAN,CAAYO,OAAZ,CAAoB0N,SAApB,CAA8BC,QAA9B,CAAuC,QAAvC,CAAL,EAAuD;;AAEnDzO,mBAAMU,OAAN,CAAcI,OAAd,CAAsBwF,IAAtB;AAEH,UAJD,MAIO;;AAEHtG,mBAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;AAEH;AACJ,MAXD;;AAaA;;;AAGAwH,eAAU9R,YAAV,GAAyB,UAASZ,KAAT,EAAgBW,KAAhB,EAAuB;;AAE5C,iBAAQX,MAAMoQ,OAAd;;AAEI,kBAAKpa,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBW,IAArB;AACA,kBAAKhF,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBY,KAArB;AACIjF,uBAAMiK,QAAN,CAAeoU,4BAAf,CAA4C1T,KAA5C;AACA;;AAEJ,kBAAK3K,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBC,SAArB;AACItE,uBAAMiK,QAAN,CAAeqU,gBAAf,CAAgC3T,KAAhC;AACA;;AAEJ,kBAAK3K,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBU,EAArB;AACA,kBAAK/E,MAAM8B,IAAN,CAAWuC,IAAX,CAAgBS,IAArB;AACI9E,uBAAMiK,QAAN,CAAesU,yBAAf,CAAyC5T,KAAzC;AACA;;AAdR;AAiBH,MAnBD;;AAqBA;;;AAGA+R,eAAU2B,4BAAV,GAAyC,UAAU1T,KAAV,EAAiB;;AAEtD,aAAImE,YAActL,OAAOuL,YAAP,EAAlB;AAAA,aACIpN,SAAc3B,MAAMwB,KAAN,CAAYG,MAD9B;AAAA,aAEI6c,cAAc1P,UAAUG,UAF5B;AAAA,aAGIwP,iBAHJ;;AAKA;AACA,aAAI,CAACD,WAAL,EAAiB;AACb,oBAAO,KAAP;AACH;;AAED;AACA,gBAAOA,YAAYpB,eAAZ,IAA+B,MAAtC,EAA8C;;AAE1CqB,iCAAoBD,YAAY1a,UAAhC;AACA0a,2BAAoBC,iBAApB;AACH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;AACA,gBAAOF,eAAe7c,OAAO+c,oBAAP,CAAtB,EAAoD;AAChDA;AACH;;AAED;;;;AAIA,aAAI,CAACF,YAAY7M,WAAjB,EACA;AACI3R,mBAAMyQ,KAAN,CAAYU,cAAZ,CAA2BuN,oBAA3B;AACA;AACH;;AAED;;;AAGA,aAAIC,mBAAsB,KAA1B;AAAA,aACIf,sBAAsB,KAD1B;;AAGA,aAAIgB,SAAJ,EACIC,eADJ;;AAGAD,qBAAYJ,YAAY5Q,UAAZ,CAAuB4Q,YAAY5Q,UAAZ,CAAuB3B,MAAvB,GAAgC,CAAvD,CAAZ;;AAEA,aAAIjM,MAAM8B,IAAN,CAAWsD,SAAX,CAAqBwZ,SAArB,CAAJ,EAAqC;;AAEjCC,+BAAkB7e,MAAMuL,OAAN,CAAcgG,8BAAd,CAA6CqN,SAA7C,EAAwDA,UAAUhR,UAAV,CAAqB3B,MAA7E,CAAlB;AAEH,UAJD,MAIO;;AAEH4S,+BAAkBD,SAAlB;AAEH;;AAEDD,4BAAmB7P,UAAUG,UAAV,IAAwB4P,eAA3C;AACAjB,+BAAsBiB,gBAAgB5S,MAAhB,IAA0B6C,UAAUuD,YAA1D;;AAEA,aAAK,CAACsM,gBAAD,IAAsB,CAACf,mBAA5B,EAAkD;AAC9C5d,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,qDAAf;AACA,oBAAO,KAAP;AACH;;AAED5C,eAAMyQ,KAAN,CAAYU,cAAZ,CAA2BuN,oBAA3B;AAEH,MAlED;;AAoEA;;;AAGAhC,eAAU6B,yBAAV,GAAsC,UAAU5T,KAAV,EAAiB;;AAEnD,aAAImE,YAActL,OAAOuL,YAAP,EAAlB;AAAA,aACIpN,SAAc3B,MAAMwB,KAAN,CAAYG,MAD9B;AAAA,aAEI6c,cAAc1P,UAAUG,UAF5B;AAAA,aAGIwP,iBAHJ;;AAKA;AACA,aAAI,CAACD,WAAL,EAAiB;AACb,oBAAO,KAAP;AACH;;AAED;;;AAGA,aAAK1P,UAAUuD,YAAV,KAA2B,CAAhC,EAAmC;AAC/B,oBAAO,KAAP;AACH;;AAED;AACA,gBAAOmM,YAAYpB,eAAZ,IAA+B,MAAtC,EAA8C;AAC1CqB,iCAAoBD,YAAY1a,UAAhC;AACA0a,2BAAoBC,iBAApB;AACH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;AACA,gBAAOF,eAAe7c,OAAO+c,oBAAP,CAAtB,EAAoD;AAChDA;AACH;;AAED;;;AAGA,aAAII,oBAAsB,KAA1B;AAAA,aACIC,sBAAsB,KAD1B;;AAGA,aAAIC,UAAJ,EACIH,eADJ;;AAGA;;;;AAIA,aAAI,CAACL,YAAY7M,WAAjB,EAA8B;AAC1B3R,mBAAMyQ,KAAN,CAAYwO,kBAAZ,CAA+BP,oBAA/B;AACA;AACH;;AAEDM,sBAAaR,YAAY5Q,UAAZ,CAAuB,CAAvB,CAAb;;AAEA,aAAI5N,MAAM8B,IAAN,CAAWsD,SAAX,CAAqB4Z,UAArB,CAAJ,EAAsC;;AAElCH,+BAAkB7e,MAAMuL,OAAN,CAAcgG,8BAAd,CAA6CyN,UAA7C,EAAyD,CAAzD,CAAlB;AAEH,UAJD,MAIO;;AAEHH,+BAAkBG,UAAlB;AAEH;;AAEDF,6BAAsBhQ,UAAUG,UAAV,IAAwB4P,eAA9C;AACAE,+BAAsBjQ,UAAUuD,YAAV,KAA2B,CAAjD;;AAEA,aAAKyM,qBAAqBC,mBAA1B,EAAgD;;AAE5C/e,mBAAMyQ,KAAN,CAAYwO,kBAAZ,CAA+BP,oBAA/B;AAEH;AAEJ,MAtED;;AAwEA;;;AAGAhC,eAAUS,mBAAV,GAAgC,UAAUnT,KAAV,EAAiB;;AAE7C,aAAImJ,iBAAkB,WAAtB;;AAEAnT,eAAMuL,OAAN,CAAcC,WAAd,CAA0B;AACtBlI,mBAAQ6P,cADc;AAEtBxI,oBAAQ3K,MAAMG,KAAN,CAAYgT,cAAZ,EAA4B9H,MAA5B;AAFc,UAA1B,EAGG,IAHH;;AAKArL,eAAMU,OAAN,CAAcsQ,IAAd;AACAhR,eAAMU,OAAN,CAAc4F,IAAd;AAEH,MAZD;;AAcAoW,eAAU4B,gBAAV,GAA6B,UAAU3T,KAAV,EAAiB;;AAE1C,aAAI6F,oBAAoBxQ,MAAMyQ,KAAN,CAAYC,oBAAZ,EAAxB;AAAA,aACIuI,KADJ;AAAA,aAEIiG,eAFJ;AAAA,aAGIpI,qBAHJ;;AAKA,aAAInM,MAAMgH,WAAN,CAAkBC,IAAlB,EAAJ,EAA8B;;AAE1BqH,qBAAkBjZ,MAAMuL,OAAN,CAAcwG,QAAd,EAAlB;AACAmN,+BAAkBjG,MAAMkG,SAAN,GAAkBlG,MAAM+B,WAA1C;;AAEA,iBAAIhb,MAAMyQ,KAAN,CAAYe,QAAZ,CAAqB4N,OAArB,MAAkC,CAACF,eAAvC,EAAwD;;AAEpDlf,uBAAMuL,OAAN,CAAc6H,WAAd,CAA0B5C,iBAA1B;AAEH,cAJD,MAIO;;AAEH;AAEH;AACJ;;AAED,aAAI,CAAC0O,eAAL,EAAsB;AAClBvU,mBAAM+E,MAAN;AACH;;AAGDoH,iCAAwB9W,MAAMO,KAAN,CAAYgB,QAAZ,CAAqBqM,UAArB,CAAgC3B,MAAxD;;AAEA;;;AAGA,aAAI6K,0BAA0B,CAA9B,EAAiC;;AAE7B;AACA9W,mBAAMuL,OAAN,CAAcoD,WAAd,GAA4B,IAA5B;;AAEA;AACA3O,mBAAMiC,EAAN,CAASiJ,eAAT;;AAEA;AACAlL,mBAAMiC,EAAN,CAASQ,UAAT;;AAEA;AACAyO,wBAAW,YAAY;;AAEnBlR,uBAAMyQ,KAAN,CAAYwO,kBAAZ,CAA+B,CAA/B;AAEH,cAJD,EAIG,EAJH;AAMH,UAlBD,MAkBO;;AAEH,iBAAIjf,MAAMyQ,KAAN,CAAYyB,UAAZ,KAA2B,CAA/B,EAAkC;;AAE9B;AACAlS,uBAAMyQ,KAAN,CAAYwO,kBAAZ,CAA+Bjf,MAAMyQ,KAAN,CAAYyB,UAA3C;AAEH,cALD,MAKO;;AAEH;AACAlS,uBAAMyQ,KAAN,CAAYU,cAAZ,CAA2BnR,MAAMyQ,KAAN,CAAYyB,UAAvC;AAEH;AACJ;;AAEDlS,eAAMU,OAAN,CAAcsQ,IAAd;;AAEA,aAAI,CAAChR,MAAMU,OAAN,CAAcsU,MAAnB,EAA2B;AACvBhV,mBAAMU,OAAN,CAAc4F,IAAd;AACH;;AAED;AACAtG,eAAMiC,EAAN,CAASQ,UAAT;;AAEA;AACAuH,eAAMmQ,cAAN;AAEH,MA9ED;;AAgFAuC,eAAU7R,UAAV,GAAuB,UAASb,KAAT,EAAgB;;AAEnC,aAAIwG,oBAAoBxQ,MAAMyQ,KAAN,CAAYC,oBAAZ,EAAxB;AAAA,aACId,OAAO5P,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB6O,iBAAnB,CADX;;AAGAU,oBAAW,YAAW;;AAElBlR,mBAAMuL,OAAN,CAAcqI,QAAd,CAAuBhE,IAAvB;AAEH,UAJD,EAIG,EAJH;AAMH,MAXD;;AAaA8M,eAAU2C,WAAV,GAAwB,UAASrV,KAAT,EAAgB;;AAEpC,aAAIwG,oBAAoBxQ,MAAMyQ,KAAN,CAAYC,oBAAZ,EAAxB;;AAEA;;;AAGA,aAAI4O,WAAW,IAAIC,gBAAJ,CAAqBvf,MAAMiK,QAAN,CAAeuV,iBAApC,CAAf;;AAEA;;;AAGA,aAAIC,SAAS,EAAE9K,YAAY,IAAd,EAAoB+K,WAAW,IAA/B,EAAqCC,eAAe,KAApD,EAAb;;AAEA;AACAL,kBAASM,OAAT,CAAiB5f,MAAMwB,KAAN,CAAYG,MAAZ,CAAmB6O,iBAAnB,CAAjB,EAAwDiP,MAAxD;AACH,MAhBD;;AAkBA;;;AAGA/C,eAAU8C,iBAAV,GAA8B,UAASK,SAAT,EAAoB;AAC9CA,mBAAUxH,OAAV,CAAkBrY,MAAMuL,OAAN,CAAciI,KAAhC;AACH,MAFD;;AAIA;;;AAGAkJ,eAAUpS,yBAAV,GAAsC,YAAU;;AAE5C;;;;;;AAMA,aAAIwV,kBAAkB9f,MAAMuL,OAAN,CAAcoD,WAAd,CAA0BV,OAA1B,CAAkCrF,IAAxD;;AAEA5I,eAAMU,OAAN,CAAcR,QAAd,CAAuBiV,MAAvB,CAA8B2K,eAA9B;;AAEA;AACA9f,eAAMU,OAAN,CAAcI,OAAd,CAAsBoU,KAAtB;AACAlV,eAAMU,OAAN,CAAcR,QAAd,CAAuB2V,iBAAvB;AAEH,MAhBD;;AAkBA,YAAO6G,SAAP;AAEH,EAhvBe,CAgvBb,EAhvBa,CAAhB;;AAkvBA1c,OAAMiK,QAAN,GAAiByS,SAAjB;AACA5c,QAAOC,OAAP,GAAkB2c,SAAlB,C;;;;;;;;ACrvBA,KAAI1c,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIoI,OAAQ,UAASA,IAAT,EAAe;;AAEvB;;;AAGAA,UAAKxH,OAAL,GAAe,YAAY;;AAEvB,aAAIA,UAAUwC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAxG,iBAAQ8G,SAAR,IAAqB,cAArB;;AAEA,gBAAO9G,OAAP;AAEH,MARD;;AAUA;;;AAGAwH,UAAK1G,QAAL,GAAgB,YAAY;;AAExB,aAAIA,WAAW0B,SAASgE,aAAT,CAAuB,KAAvB,CAAf;;AAEA1F,kBAASgG,SAAT,IAAsB,aAAtB;;AAEA,gBAAOhG,QAAP;AAEH,MARD;;AAUA0G,UAAKF,OAAL,GAAe,YAAW;;AAEtB,aAAI4C,QAAQ1H,SAASgE,aAAT,CAAuB,KAAvB,CAAZ;;AAEA0D,eAAMpD,SAAN,IAAmB,UAAnB;;AAEA,gBAAOoD,KAAP;AAEH,MARD;;AAUA;;;AAGA1C,UAAKvH,OAAL,GAAe,YAAY;;AAEvB,aAAIqf,MAAM9c,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEA8Y,aAAIxY,SAAJ,IAAiB,YAAjB;;AAEA,gBAAOwY,GAAP;AACH,MAPD;;AASA9X,UAAKH,cAAL,GAAsB,YAAW;;AAE7B,aAAIrH,UAAUwC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;AACAxG,iBAAQ+N,SAAR,CAAkBgB,GAAlB,CAAsB,qBAAtB;;AAEA,gBAAO/O,OAAP;AACH,MAND;;AAQA;;;AAGAwH,UAAKtH,aAAL,GAAqB,YAAW;;AAE5B,aAAIof,MAAM9c,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEA8Y,aAAIxY,SAAJ,IAAiB,mBAAjB;;AAEA,gBAAOwY,GAAP;AAEH,MARD;;AAUA;;;AAGA9X,UAAKS,oBAAL,GAA4B,YAAW;;AAEnC,aAAIjI,UAAUwC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAxG,iBAAQ8G,SAAR,IAAqB,4BAArB;;AAEA,gBAAO9G,OAAP;AACH,MAPD;;AASA;;;AAGAwH,UAAKU,oBAAL,GAA4B,YAAW;;AAEnC,aAAIlI,UAAUwC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAxG,iBAAQ8G,SAAR,IAAqB,4BAArB;;AAEA,gBAAO9G,OAAP;AAEH,MARD;;AAUAwH,UAAKgS,YAAL,GAAoB,YAAW;;AAE3B,aAAItO,QAAQ1I,SAASgE,aAAT,CAAuB,OAAvB,CAAZ;;AAEA0E,eAAMrI,IAAN,GAAoB,OAApB;AACAqI,eAAMpE,SAAN,IAAoB,cAApB;AACAoE,eAAMqU,WAAN,GAAoB,cAApB;AACArU,eAAML,YAAN,CAAmB,MAAnB,EAA2B,aAA3B;;AAEAK,eAAML,YAAN,CAAmB,WAAnB,EAAgC,WAAhC;;AAEA,gBAAOK,KAAP;AAEH,MAbD;;AAeA;;;AAGA1D,UAAKC,YAAL,GAAoB,YAAW;;AAE3B,aAAIyC,QAAQ1H,SAASgE,aAAT,CAAuB,KAAvB,CAAZ;;AAEA0D,eAAM6D,SAAN,CAAgBgB,GAAhB,CAAoB,wBAApB;;AAEA,gBAAO7E,KAAP;AAEH,MARD;;AAUA;;;AAGA1C,UAAKD,YAAL,GAAoB,YAAW;;AAE3B,aAAI2C,QAAQ1H,SAASgE,aAAT,CAAuB,KAAvB,CAAZ;;AAEA0D,eAAMpD,SAAN,IAAmB,qBAAnB;;AAEA,gBAAOoD,KAAP;AACH,MAPD;;AASA;;;AAGA1C,UAAK9G,aAAL,GAAqB,YAAY;;AAE7B,aAAIjB,WAAW+C,SAASgE,aAAT,CAAuB,KAAvB,CAAf;;AAEA/G,kBAASqH,SAAT,IAAsB,aAAtB;;AAEA,gBAAOrH,QAAP;AACH,MAPD;;AASA+H,UAAK5G,eAAL,GAAuB,YAAW;;AAE9B,aAAI4e,MAAMhd,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEAgZ,aAAIzR,SAAJ,CAAcgB,GAAd,CAAkB,qBAAlB;;AAEA,gBAAOyQ,GAAP;AACH,MAPD,EASAhY,KAAKK,eAAL,GAAuB,YAAW;;AAE9B,aAAI2X,MAAMhd,SAASgE,aAAT,CAAuB,KAAvB,CAAV;;AAEAgZ,aAAIzR,SAAJ,CAAcgB,GAAd,CAAkB,oBAAlB;;AAEA,gBAAOyQ,GAAP;AAEH,MAjBD;;AAmBAhY,UAAKjH,UAAL,GAAkB,YAAW;;AAEzB,aAAIwJ,SAASvH,SAASgE,aAAT,CAAuB,MAAvB,CAAb;;AAEAuD,gBAAOjD,SAAP,GAAmB,kBAAnB;AACA;;AAEA,gBAAOiD,MAAP;AACH,MARD;;AAUA;;;AAGAvC,UAAKG,cAAL,GAAsB,YAAY;;AAE9B,aAAI8X,UAAUjd,SAASgE,aAAT,CAAuB,MAAvB,CAAd;;AAEAiZ,iBAAQ3Y,SAAR,GAAoB,0BAApB;;AAEA;AACA2Y,iBAAQvS,SAAR,GAAoB,6BAApB;;AAEA,gBAAOuS,OAAP;AACH,MAVD;;AAYA;;;;AAIAjY,UAAKnH,OAAL,GAAe,YAAW;;AAEtB,aAAIL,UAAUwC,SAASgE,aAAT,CAAuB,KAAvB,CAAd;;AAEAxG,iBAAQ8G,SAAR,GAAoB,mBAApB;;AAEA,gBAAO9G,OAAP;AACH,MAPD;;AASA;;;;;;;;;AASAwH,UAAKgB,aAAL,GAAqB,UAAU3F,IAAV,EAAgB6c,SAAhB,EAA2B;;AAE5C,aAAI3V,SAAavH,SAASgE,aAAT,CAAuB,IAAvB,CAAjB;AAAA,aACImZ,YAAand,SAASgE,aAAT,CAAuB,GAAvB,CADjB;AAAA,aAEIoZ,aAAapd,SAASgE,aAAT,CAAuB,MAAvB,CAFjB;;AAIAuD,gBAAOyD,OAAP,CAAe3K,IAAf,GAAsBA,IAAtB;AACAkH,gBAAOc,YAAP,CAAoB,OAApB,EAA6BhI,IAA7B;;AAEA8c,mBAAU5R,SAAV,CAAoBgB,GAApB,CAAwB2Q,SAAxB;AACAE,oBAAW7R,SAAX,CAAqBgB,GAArB,CAAyB,yBAAzB;;AAGAhF,gBAAOlD,WAAP,CAAmB8Y,SAAnB;AACA5V,gBAAOlD,WAAP,CAAmB+Y,UAAnB;;AAEA,gBAAO7V,MAAP;AAEH,MAlBD;;AAoBA;;;;;;;;AAQAvC,UAAKyB,mBAAL,GAA2B,UAASpG,IAAT,EAAe6c,SAAf,EAA0B;AACjD,aAAI3V,SAAavH,SAASgE,aAAT,CAAuB,QAAvB,CAAjB;AAAA,aACImZ,YAAand,SAASgE,aAAT,CAAuB,GAAvB,CADjB;;AAGAuD,gBAAOlH,IAAP,GAAc,QAAd;AACAkH,gBAAOyD,OAAP,CAAe3K,IAAf,GAAsBA,IAAtB;AACA8c,mBAAU5R,SAAV,CAAoBgB,GAApB,CAAwB2Q,SAAxB;;AAEA3V,gBAAOlD,WAAP,CAAmB8Y,SAAnB;;AAEA,gBAAO5V,MAAP;AACH,MAXD;;AAaA;;;AAGAvC,UAAK0C,KAAL,GAAa,UAAU4J,OAAV,EAAmBhJ,OAAnB,EAA4B;;AAErC,aAAIqE,OAAO3M,SAASgE,aAAT,CAAuBsN,OAAvB,CAAX;;AAEA3E,cAAKjC,SAAL,GAAiBpC,WAAW,EAA5B;;AAEA,gBAAOqE,IAAP;AAEH,MARD;;AAUA;;;;;;AAMA3H,UAAK2H,IAAL,GAAY,UAAU2E,OAAV,EAAoBhN,SAApB,EAAgC+Y,UAAhC,EAA4C;;AAEpD,aAAIjb,KAAKpC,SAASgE,aAAT,CAAwBsN,OAAxB,CAAT;;AAEA,aAAKhN,SAAL,EAAiBlC,GAAGkC,SAAH,GAAeA,SAAf;;AAEjB,aAAK+Y,UAAL,EAAkB;;AAEd,kBAAK,IAAIxX,IAAT,IAAiBwX,UAAjB,EAA4B;AACxBjb,oBAAGyD,IAAH,IAAWwX,WAAWxX,IAAX,CAAX;AACH;AACJ;;AAED,gBAAOzD,EAAP;AACH,MAdD;;AAgBA4C,UAAKsY,aAAL,GAAqB,UAASjd,IAAT,EAAeiI,OAAf,EAAwB;;AAEzC,gBAAO;AACHjI,mBAAQA,IADL;AAEHqH,oBAAQ6V,QAAQrgB,KAAR,CAAcmD,IAAd,EAAoB+H,MAApB,CAA2B;AAC/BqG,uBAAOnG;AADwB,cAA3B;AAFL,UAAP;AAMH,MARD;;AAUA,YAAOtD,IAAP;AAEH,EA9SU,CA8SR,EA9SQ,CAAX;;AAgTAjI,OAAMiI,IAAN,GAAaA,IAAb;;AAEAnI,QAAOC,OAAP,GAAiBkI,IAAjB,C;;;;;;;;ACpTA,KAAIjI,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAI4Q,QAAS,UAASA,KAAT,EAAgB;;AAEzB;;;AAGAA,WAAMyB,UAAN,GAAmB,IAAnB;;AAEA;;;AAGAzB,WAAM8H,MAAN,GAAe,IAAf;;AAEA;;;AAGA9H,WAAMgQ,gBAAN,GAAyB,IAAzB;;AAEA;;;;;;AAMAhQ,WAAMM,GAAN,GAAY,UAAU1L,EAAV,EAAe0H,KAAf,EAAsBwL,MAAtB,EAA8B;;AAEtCA,kBAASA,UAAU,KAAKA,MAAf,IAAyB,CAAlC;AACAxL,iBAASA,SAAU,KAAK0T,gBAAf,IAAmC,CAA5C;;AAEA,aAAIC,SAASrb,GAAGuI,UAAhB;AAAA,aACI+S,SADJ;;AAGA,aAAKD,OAAOzU,MAAP,KAAkB,CAAvB,EAA2B;;AAEvB0U,yBAAYtb,EAAZ;AAEH,UAJD,MAIO;;AAEHsb,yBAAYD,OAAO3T,KAAP,CAAZ;AAEH;;AAED;AACA,aAAI1H,GAAGkP,OAAH,IAAc,OAAlB,EAA2B;AACvBlP,gBAAG6U,KAAH;AACA;AACH;;AAED,aAAIla,MAAM8B,IAAN,CAAWsD,SAAX,CAAqBub,SAArB,CAAJ,EAAqC;;AAEjCA,yBAAY3gB,MAAMuL,OAAN,CAAcgG,8BAAd,CAA6CoP,SAA7C,EAAwDA,UAAU/S,UAAV,CAAqB3B,MAA7E,CAAZ;AACH;;AAED,aAAIgN,QAAYhW,SAASiW,WAAT,EAAhB;AAAA,aACIpK,YAAYtL,OAAOuL,YAAP,EADhB;;AAGAmC,oBAAW,YAAW;;AAElB+H,mBAAMmC,QAAN,CAAeuF,SAAf,EAA0BpI,MAA1B;AACAU,mBAAM6B,MAAN,CAAa6F,SAAb,EAAwBpI,MAAxB;;AAEAzJ,uBAAU4M,eAAV;AACA5M,uBAAU6M,QAAV,CAAmB1C,KAAnB;;AAEAjZ,mBAAMyQ,KAAN,CAAY4M,qBAAZ;AAEH,UAVD,EAUG,EAVH;AAWH,MA3CD;;AA6CA;;;;AAIA5M,WAAM4M,qBAAN,GAA8B,YAAY;;AAEtC;AACA,aAAIvO,YAActL,OAAOuL,YAAP,EAAlB;AAAA,aACIpN,SAAc3B,MAAMwB,KAAN,CAAYG,MAD9B;AAAA,aAEI6c,cAAc1P,UAAUG,UAF5B;AAAA,aAGIwP,iBAHJ;;AAKA,aAAI,CAACD,WAAL,EAAiB;AACb;AACH;;AAED;AACA,gBAAOA,YAAYpB,eAAZ,IAA+B,MAAtC,EAA8C;AAC1CqB,iCAAoBD,YAAY1a,UAAhC;AACA0a,2BAAoBC,iBAApB;AACH;;AAED;AACA,aAAIC,uBAAuB,CAA3B;;AAEA,gBAAOF,eAAe7c,OAAO+c,oBAAP,CAAtB,EAAoD;AAChDA;AACH;;AAED,cAAKxM,UAAL,GAAkBwM,oBAAlB;AACH,MA1BD;;AA4BA;;;AAGAjO,WAAMC,oBAAN,GAA6B,YAAW;AACpC,gBAAO,KAAKwB,UAAZ;AACH,MAFD;;AAIA;;;AAGAzB,WAAMU,cAAN,GAAuB,UAASpE,KAAT,EAAgB;;AAEnC,aAAIpL,SAAS3B,MAAMwB,KAAN,CAAYG,MAAzB;AAAA,aACIif,YAAYjf,OAAOoL,QAAQ,CAAf,CADhB;;AAGA,aAAI,CAAC6T,SAAL,EAAgB;AACZ5gB,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,wBAAf;AACA;AACH;;AAED;;;;AAIA,aAAI,CAACge,UAAUhT,UAAV,CAAqB3B,MAA1B,EAAkC;AAC9B,iBAAI4U,mBAAmB5d,SAAS6N,cAAT,CAAwB,EAAxB,CAAvB;AACA8P,uBAAUtZ,WAAV,CAAsBuZ,gBAAtB;AACH;;AAED7gB,eAAMyQ,KAAN,CAAYyB,UAAZ,GAAyBnF,QAAQ,CAAjC;AACA/M,eAAMyQ,KAAN,CAAYM,GAAZ,CAAgB6P,SAAhB,EAA2B,CAA3B,EAA8B,CAA9B;AACA5gB,eAAMuL,OAAN,CAAcE,kBAAd,CAAiCmV,SAAjC;AAEH,MAvBD;;AAyBA;;;;AAIAnQ,WAAMgM,UAAN,GAAmB,UAAS1P,KAAT,EAAgB;;AAE/B,aAAIpL,SAAS3B,MAAMwB,KAAN,CAAYG,MAAzB;AAAA,aACI2R,cAAc3R,OAAOoL,KAAP,CADlB;;AAGAtJ,iBAAQqd,MAAR,CAAgBxN,WAAhB,EAA8B,gDAA9B;;AAEA,aAAK,CAACA,WAAN,EAAoB;AAChB;AACH;;AAED;;;;AAIA,aAAI,CAACA,YAAY1F,UAAZ,CAAuB3B,MAA5B,EAAoC;AAChC,iBAAI4U,mBAAmB5d,SAAS6N,cAAT,CAAwB,EAAxB,CAAvB;AACAwC,yBAAYhM,WAAZ,CAAwBuZ,gBAAxB;AACH;;AAED7gB,eAAMyQ,KAAN,CAAYyB,UAAZ,GAAyBnF,KAAzB;AACA/M,eAAMyQ,KAAN,CAAYM,GAAZ,CAAgBuC,WAAhB,EAA6B,CAA7B,EAAgC,CAAhC;AACAtT,eAAMuL,OAAN,CAAcE,kBAAd,CAAiC6H,WAAjC;AAEH,MAxBD;;AA0BA;;;AAGA7C,WAAMwO,kBAAN,GAA2B,UAASlS,KAAT,EAAgB;;AAEvCA,iBAAQA,SAAS,CAAjB;;AAEA,aAAIpL,SAAS3B,MAAMwB,KAAN,CAAYG,MAAzB;AAAA,aACIof,gBAAgBpf,OAAOoL,QAAQ,CAAf,CADpB;AAAA,aAEIiU,aAFJ;AAAA,aAGIC,qBAHJ;AAAA,aAIIJ,gBAJJ;;AAOA,aAAI,CAACE,aAAL,EAAoB;AAChB/gB,mBAAM8B,IAAN,CAAWc,GAAX,CAAe,2BAAf;AACA;AACH;;AAEDoe,yBAAgBhhB,MAAMuL,OAAN,CAAcgG,8BAAd,CAA6CwP,aAA7C,EAA4DA,cAAcnT,UAAd,CAAyB3B,MAArF,CAAhB;AACAgV,iCAAwBD,cAAc/U,MAAtC;;AAEA;;;;AAIA,aAAI,CAAC8U,cAAcnT,UAAd,CAAyB3B,MAA9B,EAAsC;;AAElC4U,gCAAmB5d,SAAS6N,cAAT,CAAwB,EAAxB,CAAnB;AACAiQ,2BAAczZ,WAAd,CAA0BuZ,gBAA1B;AACH;AACD7gB,eAAMyQ,KAAN,CAAYyB,UAAZ,GAAyBnF,QAAQ,CAAjC;AACA/M,eAAMyQ,KAAN,CAAYM,GAAZ,CAAgBgQ,aAAhB,EAA+BA,cAAcnT,UAAd,CAAyB3B,MAAzB,GAAkC,CAAjE,EAAoEgV,qBAApE;AACAjhB,eAAMuL,OAAN,CAAcE,kBAAd,CAAiC9J,OAAOoL,QAAQ,CAAf,CAAjC;AACH,MA/BD;;AAiCA0D,WAAMe,QAAN,GAAiB;;AAEb4N,kBAAU,mBAAW;;AAEjB,iBAAItQ,YAAkBtL,OAAOuL,YAAP,EAAtB;AAAA,iBACIsD,eAAkBvD,UAAUuD,YADhC;AAAA,iBAEIpD,aAAkBH,UAAUG,UAFhC;AAAA,iBAGI+O,kBAAkBhe,MAAMuL,OAAN,CAAcoE,kBAAd,CAAiCV,UAAjC,CAHtB;AAAA,iBAIIsR,gBAAkBvC,gBAAgBpQ,UAAhB,CAA2B,CAA3B,CAJtB;;AAMA,iBAAI,CAAC5N,MAAM8B,IAAN,CAAWsD,SAAX,CAAqB6J,UAArB,CAAL,EAAuC;AACnCA,8BAAaA,WAAWnL,UAAxB;AACH;;AAED,iBAAIod,cAAejS,eAAesR,cAAc3S,UAAd,CAAyB,CAAzB,CAAlC;AAAA,iBACIuT,eAAe9O,iBAAiB,CADpC;;AAGA,oBAAO6O,eAAeC,YAAtB;AAEH,UAnBY;;AAqBbtD,mBAAW,oBAAW;;AAElB,iBAAI/O,YAAetL,OAAOuL,YAAP,EAAnB;AAAA,iBACIsD,eAAevD,UAAUuD,YAD7B;AAAA,iBAEIpD,aAAeH,UAAUG,UAF7B;;AAIA;AACA,oBAAO,CAACA,UAAD,IAAe,CAACA,WAAWhD,MAA3B,IAAqCoG,iBAAiBpD,WAAWhD,MAAxE;AACH;AA7BY,MAAjB;;AAgCA,YAAOwE,KAAP;AAEH,EA3OW,CA2OT,EA3OS,CAAZ;;AA6OAzQ,OAAMyQ,KAAN,GAAcA,KAAd;AACA3Q,QAAOC,OAAP,GAAiB0Q,KAAjB,C;;;;;;;;AChPA,KAAIzQ,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIkB,gBAAiB,UAASA,aAAT,EAAwB;;AAEzC;;;;AAIAA,mBAAcgJ,WAAd,GAA4B,UAASF,QAAT,EAAmBG,KAAnB,EAA0B;;AAElDhK,eAAMe,aAAN,CAAoB6F,IAApB,CAAyB,wCAAzB,EAAmEoD,MAAM1G,IAAzE,EAA+E,KAA/E;AAEH,MAJD;;AAMA;;;;;;AAMAvC,mBAAc6F,IAAd,GAAqB,UAASwa,OAAT,EAAkB9d,IAAlB,EAAwBgJ,MAAxB,EAAgC;;AAEjD,aAAI+U,eAAerhB,MAAMiI,IAAN,CAAW0C,KAAX,CAAiB,KAAjB,CAAnB;;AAEA0W,sBAAa1P,WAAb,GAA2ByP,OAA3B;AACAC,sBAAa7S,SAAb,CAAuBgB,GAAvB,CAA2B,sBAA3B,EAAmD,qBAAqBlM,IAAxE,EAA8E,SAA9E;;AAEA,aAAI,CAACgJ,MAAL,EAAa;AACTtM,mBAAMO,KAAN,CAAYQ,aAAZ,CAA0B4M,SAA1B,GAAsC,EAAtC;AACH;;AAED3N,eAAMO,KAAN,CAAYQ,aAAZ,CAA0BuG,WAA1B,CAAsC+Z,YAAtC;;AAEAnQ,oBAAW,YAAY;AACnBmQ,0BAAa3R,MAAb;AACH,UAFD,EAEG,IAFH;AAIH,MA7BD;;AA+BA,YAAO3O,aAAP;AAEH,EAvCmB,CAuCjB,EAvCiB,CAApB;;AAyCAf,OAAMe,aAAN,GAAsBA,aAAtB;AACAjB,QAAOC,OAAP,GAAiBgB,aAAjB,C;;;;;;;;AC5CA,KAAIf,QAAQ,mBAAAH,CAAQ,CAAR,CAAZ;;AAEA,KAAIuP,SAAU,UAASA,MAAT,EAAiB;;AAE3BA,YAAOnP,IAAP,GAAc,YAAW,CAExB,CAFD;;AAIA;;;AAGAmP,YAAOkS,yCAAP,GAAmD,UAAS/V,OAAT,EAAkB;AACjE,gBAAOA,QAAQgW,KAAR,CAAc,IAAd,CAAP;AACH,MAFD;;AAIA;AACAnS,YAAOoS,mBAAP,GAA6B,UAASjW,OAAT,EAAkB;;AAE3C,aAAI7J,SAAS,KAAK+f,2BAAL,CAAiClW,OAAjC,CAAb;AAAA,aACIc,CADJ;AAAA,aAEI6F,aAAasO,QAAQ/P,KAAR,CAAcC,oBAAd,EAFjB;AAAA,aAGIqD,QAHJ;AAAA,aAII2N,iBAJJ;;AAMA,cAAIrV,IAAI,CAAR,EAAWA,IAAI3K,OAAOuK,MAAtB,EAA8BI,GAA9B,EAAmC;;AAE/B3K,oBAAO2K,CAAP,EAAUuF,IAAV;;AAEA,iBAAIlQ,OAAO2K,CAAP,CAAJ,EAAe;AACX,qBAAIrJ,OAAOwd,QAAQvY,IAAR,CAAasY,aAAb,CAA2B,WAA3B,EAAwC7e,OAAO2K,CAAP,CAAxC,CAAX;AACAmU,yBAAQjV,OAAR,CAAgBC,WAAhB,CAA4BxI,IAA5B;AACH;AACJ;AAEJ,MAlBD;;AAoBA;;;AAGAoM,YAAOuS,oBAAP,GAA8B,YAAY;;AAEtC,aAAIC,iBAAiBpB,QAAQjgB,KAAR,CAAcC,QAAd,CAAuB8Z,KAA5C;;AAEA,aAAKsH,eAAehQ,IAAf,GAAsB3F,MAAtB,KAAiC,CAAtC,EAA0C,OAAO,IAAP;;AAG1CuU,iBAAQpR;;AAER;AAFA,UAGKyS,kBAHL,CAGwBD,cAHxB;;AAKI;AALJ,UAMK5f,IANL,CAMUwe,QAAQpR,MAAR,CAAe0S,qBANzB;;AAQI;AARJ,UASKpf,KATL,CASW,UAASC,KAAT,EAAgB;AACnB6d,qBAAQ1e,IAAR,CAAac,GAAb,CAAiB,iCAAjB,EAAoD,MAApD,EAA4DD,KAA5D;AACH,UAXL;AAaH,MApBD;;AAsBA;;;;;AAKAyM,YAAOyS,kBAAP,GAA4B,UAAUE,WAAV,EAAuB;;AAE/C,gBAAOlf,QAAQC,OAAR,GAAkBd,IAAlB,CAAuB,YAAW;;AAErC,iBAAIggB,gBAAgB/e,SAASgE,aAAT,CAAuB,KAAvB,CAApB;;AAEA+a,2BAAcrU,SAAd,GAA0BoU,WAA1B;;AAEA;;;;;;AAMA,oBAAOC,cAAcpU,UAArB;AAEH,UAdM,CAAP;AAeH,MAjBD;;AAmBA;;;;AAIAwB,YAAO0S,qBAAP,GAA+B,UAASvhB,KAAT,EAAgB;;AAE3C;;;;AAIA,aAAIuM,eAAejK,QAAQC,OAAR,EAAnB;;AAGA,cAAK,IAAIiK,QAAQ,CAAjB,EAAoBA,QAAQxM,MAAM0L,MAAlC,EAA2Cc,OAA3C,EAAqD;;AAEjD;AACAyT,qBAAQpR,MAAR,CAAepC,iBAAf,CAAiCF,YAAjC,EAA+CvM,KAA/C,EAAsDwM,KAAtD;AAEH;AAEJ,MAhBD;;AAkBA;;;AAGAqC,YAAOpC,iBAAP,GAA2B,UAAUF,YAAV,EAAwBvM,KAAxB,EAA+BwM,KAA/B,EAAsC;;AAE7D;AACAD;;AAEA;AAFA,UAGK9K,IAHL,CAGU,YAAW;;AAEb,oBAAOwe,QAAQpR,MAAR,CAAenC,YAAf,CAA4B1M,KAA5B,EAAoCwM,KAApC,CAAP;AAEH,UAPL;;AASI;;;;AATJ,UAaK/K,IAbL,CAaU,UAAS4N,IAAT,EAAc;;AAEhB,iBAAIjF,QAAQ6V,QAAQpR,MAAR,CAAe6S,oBAAf,CAAoCrS,IAApC,CAAZ;;AAEA,iBAAK4Q,QAAQ1e,IAAR,CAAasD,SAAb,CAAuBuF,KAAvB,CAAL,EAAqC;;AAEjCA,uBAAMyS,eAAN,GAAwB,MAAxB;;AAEA;AACAzS,uBAAM6D,SAAN,CAAgBgB,GAAhB,CAAoB,UAApB;;AAEA;AACAgR,yBAAQjgB,KAAR,CAAcgB,QAAd,CAAuB+F,WAAvB,CAAmCqD,KAAnC;;AAEA;AACA6V,yBAAQhf,KAAR,CAAcE,MAAd,CAAqBgN,IAArB,CAA0B/D,KAA1B;;AAEA,wBAAOA,KAAP;AAEH;AACD,oBAAO,IAAP;AACH,UAlCL,EAoCK3I,IApCL,CAoCUwe,QAAQve,EAAR,CAAWyI,gBApCrB;;AAsCI;AAtCJ,UAuCKhI,KAvCL,CAuCW,UAASC,KAAT,EAAgB;AACnB6d,qBAAQ1e,IAAR,CAAac,GAAb,CAAiB,uCAAjB,EAA0D,MAA1D,EAAkED,KAAlE;AACH,UAzCL;AA2CH,MA9CD;;AAgDA;;;;AAIAyM,YAAOnC,YAAP,GAAsB,UAAUiV,QAAV,EAAoBnV,KAApB,EAA2B;;AAE7C,gBAAOlK,QAAQC,OAAR,GAAkBd,IAAlB,CAAuB,YAAW;;AAErC,oBAAOkgB,SAASC,IAAT,CAAcpV,KAAd,CAAP;AAEH,UAJM,CAAP;AAKH,MAPD;;AASA;;;;;;;;;AASAqC,YAAO6S,oBAAP,GAA8B,UAAUrS,IAAV,EAAgB;;AAE1C;AACA,aAAK4Q,QAAQpR,MAAR,CAAeC,iBAAf,CAAiCO,IAAjC,CAAL,EAA6C;;AAEzC;AACAA,oBAAO,KAAKwS,cAAL,CAAoBxS,IAApB,CAAP;;AAEA,oBAAOA,IAAP;AACH;;AAED;AACA,aAAIyS,WAAJ;AAAA,aACIC,cAAkB1S,KAAK+B,WAAL,CAAiBC,IAAjB,EADtB;AAAA,aAEI2Q,kBAAkB3S,KAAKtK,QAAL,IAAiBkb,QAAQ1e,IAAR,CAAamC,SAAb,CAAuBC,GAF9D;;AAKA;AACA,aAAIqe,mBAAmB,CAACD,YAAYrW,MAApC,EAA4C,OAAO,IAAP;;AAE5C;AACAoW,uBAAc7B,QAAQvY,IAAR,CAAa0C,KAAb,CAAmB,GAAnB,CAAd;;AAEA,aAAI4X,eAAJ,EAAoB;AAChBF,yBAAY1Q,WAAZ,GAA0B2Q,YAAY7N,OAAZ,CAAoB,UAApB,EAAgC,IAAhC,CAA1B,CADgB,CACiD;AACpE,UAFD,MAEO;AACH4N,yBAAY/a,WAAZ,CAAwBsI,IAAxB;AACH;;AAED;AACAyS,uBAAc,KAAKD,cAAL,CAAoBC,WAApB,CAAd;;AAEA,gBAAOA,WAAP;AAEH,MAlCD;;AAoCA;;;;;;;;;AASAjT,YAAOgT,cAAP,GAAwB,UAAUxS,IAAV,EAAgB;;AAEpC,iBAAQA,KAAK2E,OAAb;AACI,kBAAK,GAAL;AAAoB3E,sBAAK3B,OAAL,CAAarF,IAAb,GAAoB,WAApB,CAAiC;AACrD,kBAAK,IAAL;AACA,kBAAK,IAAL;AACA,kBAAK,IAAL;AACA,kBAAK,IAAL;AACA,kBAAK,IAAL;AACA,kBAAK,IAAL;AAAoBgH,sBAAK3B,OAAL,CAAarF,IAAb,GAAoB,QAApB,CAA8B;AAClD,kBAAK,YAAL;AAAoBgH,sBAAK3B,OAAL,CAAarF,IAAb,GAAoB,OAApB,CAA6B;AACjD,kBAAK,MAAL;AAAoBgH,sBAAK3B,OAAL,CAAarF,IAAb,GAAoB,MAApB,CAA4B;AATpD;;AAYA,gBAAOgH,IAAP;AAEH,MAhBD;;AAkBA;;;AAGAR,YAAOC,iBAAP,GAA2B,UAAUO,IAAV,EAAgB;;AAEvC,gBAAOA,KAAKtK,QAAL,IAAiBkb,QAAQ1e,IAAR,CAAamC,SAAb,CAAuBC,GAAxC,IACH0L,KAAKpB,SAAL,CAAeC,QAAf,CAAwB+R,QAAQve,EAAR,CAAWsF,SAAX,CAAqBC,eAA7C,CADJ;AAGH,MALD;;AAOA,YAAO4H,MAAP;AAEH,EA7PY,CA6PV,EA7PU,CAAb;;AA+PAA,QAAOnP,IAAP;;AAEAD,OAAMoP,MAAN,GAAeA,MAAf;AACAtP,QAAOC,OAAP,GAAiBqP,MAAjB,C","file":"./codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 2637f25dac40d95fed4c\n **/","/**\n *\n */\n\n'use strict';\n\nvar editor = require('./editor');\nmodule.exports = editor;\n\n\n\n/** WEBPACK FOOTER **\n ** ./index.js\n **/","var codex = (function(codex){\n\n var init = function() {\n\n require('./modules/core');\n require('./modules/ui');\n require('./modules/transport');\n require('./modules/renderer');\n require('./modules/saver');\n require('./modules/content');\n require('./modules/toolbar/toolbar');\n require('./modules/tools');\n require('./modules/callbacks');\n require('./modules/draw');\n require('./modules/caret');\n require('./modules/notifications');\n require('./modules/parser');\n };\n\n /**\n * @public\n *\n * holds initial settings\n */\n codex.settings = {\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\n textareaId: 'codex-editor',\n uploadImagesUrl: '/editor/transport/',\n\n // Type of block showing on empty editor\n initialBlockPlugin: \"paragraph\"\n };\n\n /**\n * public\n *\n * Static nodes\n */\n codex.nodes = {\n textarea : null,\n wrapper : null,\n toolbar : null,\n inlineToolbar : {\n wrapper : null,\n buttons : null,\n actions : null\n },\n toolbox : null,\n notifications : null,\n plusButton : null,\n showSettingsButton: null,\n showTrashButton : null,\n blockSettings : null,\n pluginSettings : null,\n defaultSettings : null,\n toolbarButtons : {}, // { type : DomEl, ... }\n redactor : null\n };\n\n /**\n * @public\n *\n * Output state\n */\n codex.state = {\n jsonOutput: [],\n blocks : [],\n inputs : []\n };\n\n /**\n * Initialization\n * @uses Promise cEditor.core.prepare\n * @param {} userSettings are :\n * - tools [],\n * - textareaId String\n * ...\n *\n * Load user defined tools\n * Tools must contain this important objects :\n * @param {String} type - this is a type of plugin. It can be used as plugin name\n * @param {String} iconClassname - this a icon in toolbar\n * @param {Object} make - what should plugin do, when it is clicked\n * @param {Object} appendCallback - callback after clicking\n * @param {Element} settings - what settings does it have\n * @param {Object} render - plugin get JSON, and should return HTML\n * @param {Object} save - plugin gets HTML content, returns JSON\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\n *\n * @example\n * - type : 'header',\n * - iconClassname : 'ce-icon-header',\n * - make : headerTool.make,\n * - appendCallback : headerTool.appendCallback,\n * - settings : headerTool.makeSettings(),\n * - render : headerTool.render,\n * - save : headerTool.save,\n * - displayInToolbox : true,\n * - enableLineBreaks : false\n */\n codex.start = function (userSettings) {\n\n init();\n\n this.core.prepare(userSettings)\n\n // If all ok, make UI, bind events and parse initial-content\n .then(this.ui.make)\n .then(this.ui.addTools)\n .then(this.ui.bindEvents)\n .then(this.ui.preparePlugins)\n .then(this.transport.prepare)\n .then(this.renderer.makeBlocksFromData)\n .then(this.ui.saveInputs)\n .catch(function (error) {\n codex.core.log('Initialization failed with error: %o', 'warn', error);\n });\n\n };\n\n return codex;\n\n})({});\n\nmodule.exports = codex;\n\n\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./editor.js\n **/","var codex = require('./../editor');\n\nvar core = (function(core) {\n\n /**\n * @public\n *\n * Editor preparing method\n * @return Promise\n */\n core.prepare = function (userSettings) {\n\n return new Promise(function(resolve, reject) {\n\n if ( userSettings ){\n\n codex.settings.tools = userSettings.tools || codex.settings.tools;\n\n }\n\n if (userSettings.data) {\n codex.state.blocks = userSettings.data;\n }\n\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\n\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\n } else {\n resolve();\n }\n\n });\n\n };\n\n /**\n * Logging method\n * @param type = ['log', 'info', 'warn']\n */\n core.log = function (msg, type, arg) {\n\n type = type || 'log';\n\n if (!arg) {\n arg = msg || 'undefined';\n msg = '[codex-editor]: %o';\n } else {\n msg = '[codex-editor]: ' + msg;\n }\n\n try{\n if ( 'console' in window && console[ type ] ){\n if ( arg ) console[ type ]( msg , arg );\n else console[ type ]( msg );\n }\n\n }catch(e){}\n\n };\n\n /**\n * @protected\n *\n * Helper for insert one element after another\n */\n core.insertAfter = function (target, element) {\n target.parentNode.insertBefore(element, target.nextSibling);\n };\n\n /**\n * @const\n *\n * Readable DOM-node types map\n */\n core.nodeTypes = {\n TAG : 1,\n TEXT : 3,\n COMMENT : 8\n };\n\n /**\n * @const\n * Readable keys map\n */\n core.keys = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, LEFT: 37, UP: 38, DOWN: 40, RIGHT: 39, DELETE: 46, META: 91 };\n\n /**\n * @protected\n *\n * Check object for DOM node\n */\n core.isDomNode = function (el) {\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\n };\n\n /**\n * Native Ajax\n */\n core.ajax = function (data) {\n\n if (!data || !data.url){\n return;\n }\n\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\n success_function = function(){},\n params = '',\n obj;\n\n data.async = true;\n data.type = data.type || 'GET';\n data.data = data.data || '';\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\n success_function = data.success || success_function ;\n\n if (data.type == 'GET' && data.data) {\n\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\n\n } else {\n\n for(obj in data.data) {\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\n }\n }\n\n if (data.withCredentials) {\n XMLHTTP.withCredentials = true;\n }\n\n if (data.beforeSend && typeof data.beforeSend == 'function') {\n data.beforeSend.call();\n }\n\n XMLHTTP.open( data.type, data.url, data.async );\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n\n XMLHTTP.onreadystatechange = function() {\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\n success_function(XMLHTTP.responseText);\n }\n };\n\n XMLHTTP.send(params);\n };\n\n /** Appends script to head of document */\n core.importScript = function(scriptPath, instanceName) {\n\n /** Script is already loaded */\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\n return;\n }\n\n\n var script = document.createElement('SCRIPT');\n script.type = \"text/javascript\";\n script.src = scriptPath;\n script.async = true;\n script.defer = true;\n\n if (instanceName) {\n script.id = \"ce-script-\" + instanceName;\n }\n\n document.head.appendChild(script);\n return script;\n };\n\n return core;\n\n})({});\n\ncodex.core = core;\n\nmodule.exports = core;\n\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./modules/core.js\n **/","var codex = require('../editor');\n\nvar ui = (function(ui){\n\n /**\n * Basic editor classnames\n */\n ui.className = {\n\n /**\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\n */\n BLOCK_CLASSNAME : 'ce-block',\n\n /**\n * @const {String} wrapper for plugins content\n */\n BLOCK_CONTENT : 'ce-block__content',\n\n /**\n * @const {String} BLOCK_STRETCHED - makes block stretched\n */\n BLOCK_STRETCHED : 'ce-block--stretched',\n\n /**\n * @const {String} BLOCK_HIGHLIGHTED - adds background\n */\n BLOCK_HIGHLIGHTED : 'ce-block--focused',\n\n /**\n * @const {String} - highlights covered blocks\n */\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\n\n /**\n * @const {String} - for all default settings\n */\n SETTINGS_ITEM : 'ce-settings__item'\n\n };\n\n /**\n * @protected\n *\n * Making main interface\n */\n ui.make = function () {\n\n var wrapper,\n toolbar,\n toolbarContent,\n inlineToolbar,\n redactor,\n ceBlock,\n notifications,\n blockButtons,\n blockSettings,\n showSettingsButton,\n showTrashButton,\n toolbox,\n plusButton;\n\n /** Make editor wrapper */\n wrapper = codex.draw.wrapper();\n\n /** Append editor wrapper after initial textarea */\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\n\n /** Append block with notifications to the document */\n notifications = codex.draw.alertsHolder();\n codex.nodes.notifications = document.body.appendChild(notifications);\n\n /** Make toolbar and content-editable redactor */\n toolbar = codex.draw.toolbar();\n toolbarContent = codex.draw.toolbarContent();\n inlineToolbar = codex.draw.inlineToolbar();\n plusButton = codex.draw.plusButton();\n showSettingsButton = codex.draw.settingsButton();\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\n blockSettings = codex.draw.blockSettings();\n blockButtons = codex.draw.blockButtons();\n toolbox = codex.draw.toolbox();\n redactor = codex.draw.redactor();\n\n /** settings */\n var defaultSettings = codex.draw.defaultSettings(),\n pluginSettings = codex.draw.pluginsSettings();\n\n /** Add default and plugins settings */\n blockSettings.appendChild(pluginSettings);\n blockSettings.appendChild(defaultSettings);\n\n /** Make blocks buttons\n * This block contains settings button and remove block button\n */\n blockButtons.appendChild(showSettingsButton);\n blockButtons.appendChild(showTrashButton);\n blockButtons.appendChild(blockSettings);\n\n /** Append plus button */\n toolbarContent.appendChild(plusButton);\n\n /** Appending toolbar tools */\n toolbarContent.appendChild(toolbox);\n\n /** Appending first-level block buttons */\n toolbar.appendChild(blockButtons);\n\n /** Append toolbarContent to toolbar */\n toolbar.appendChild(toolbarContent);\n\n wrapper.appendChild(toolbar);\n\n wrapper.appendChild(redactor);\n\n /** Save created ui-elements to static nodes state */\n codex.nodes.wrapper = wrapper;\n codex.nodes.toolbar = toolbar;\n codex.nodes.plusButton = plusButton;\n codex.nodes.toolbox = toolbox;\n codex.nodes.blockSettings = blockSettings;\n codex.nodes.pluginSettings = pluginSettings;\n codex.nodes.defaultSettings = defaultSettings;\n codex.nodes.showSettingsButton = showSettingsButton;\n codex.nodes.showTrashButton = showTrashButton;\n\n codex.nodes.redactor = redactor;\n\n codex.ui.makeInlineToolbar(inlineToolbar);\n\n /** fill in default settings */\n codex.toolbar.settings.addDefaultSettings();\n };\n\n ui.makeInlineToolbar = function(container) {\n\n /** Append to redactor new inline block */\n codex.nodes.inlineToolbar.wrapper = container;\n\n /** Draw toolbar buttons */\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\n\n /** Buttons action or settings */\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\n\n /** Append to inline toolbar buttons as part of it */\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\n\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\n };\n\n /**\n * @private\n * Append tools passed in codex.tools\n */\n ui.addTools = function () {\n\n var tool,\n tool_button;\n\n for(var name in codex.settings.tools) {\n tool = codex.settings.tools[name];\n codex.tools[name] = tool;;\n }\n\n /** Make toolbar buttons */\n for (var name in codex.tools){\n\n tool = codex.tools[name];\n\n if (tool.displayInToolbox == false) {\n continue;\n }\n\n if (!tool.iconClassname) {\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n if (typeof tool.make != 'function') {\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\n continue;\n }\n\n /**\n * if tools is for toolbox\n */\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\n\n codex.nodes.toolbox.appendChild(tool_button);\n\n /** Save tools to static nodes */\n codex.nodes.toolbarButtons[name] = tool_button;\n }\n\n\n /**\n * Add inline toolbar tools\n */\n codex.ui.addInlineToolbarTools();\n\n\n };\n\n ui.addInlineToolbarTools = function() {\n\n var tools = {\n\n bold: {\n icon : 'ce-icon-bold',\n command : 'bold'\n },\n\n italic: {\n icon : 'ce-icon-italic',\n command : 'italic'\n },\n\n underline: {\n icon : 'ce-icon-underline',\n command : 'underline'\n },\n\n link: {\n icon : 'ce-icon-link',\n command : 'createLink',\n }\n };\n\n var toolButton,\n tool;\n\n for(var name in tools) {\n\n tool = tools[name];\n\n toolButton = codex.draw.toolbarButtonInline(name, tool.icon);\n\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\n /**\n * Add callbacks to this buttons\n */\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\n }\n\n };\n\n /**\n * @private\n * Bind editor UI events\n */\n ui.bindEvents = function () {\n\n codex.core.log('ui.bindEvents fired', 'info');\n\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\n codex.notifications.errorThrown(errorMsg, event);\n }, false );\n\n /** All keydowns on Document */\n codex.nodes.redactor.addEventListener('keydown', codex.callback.globalKeydown, false );\n\n /** All keydowns on Document */\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\n\n /**\n * Mouse click to radactor\n */\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\n\n /**\n * Clicks to the Plus button\n */\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\n\n /**\n * Clicks to SETTINGS button in toolbar\n */\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\n /**\n * @deprecated ( but now in use for syncronization );\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\n */\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\n\n /** Bind click listeners on toolbar buttons */\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\n }\n\n };\n\n /**\n * Initialize plugins before using\n * Ex. Load scripts or call some internal methods\n */\n ui.preparePlugins = function() {\n\n for(var tool in codex.tools) {\n\n if (typeof codex.tools[tool].prepare != 'function')\n continue;\n\n codex.tools[tool].prepare();\n }\n },\n\n ui.addBlockHandlers = function(block) {\n\n if (!block) return;\n\n /**\n * Block keydowns\n */\n block.addEventListener('keydown', function(event) {\n codex.callback.blockKeydown(event, block);\n }, false);\n\n /**\n * Pasting content from another source\n */\n block.addEventListener('paste', function (event) {\n codex.callback.blockPaste(event);\n }, false);\n\n block.addEventListener('mouseup', function(){\n codex.toolbar.inline.show();\n }, false);\n\n };\n\n /** getting all contenteditable elements */\n ui.saveInputs = function() {\n\n var redactor = codex.nodes.redactor,\n elements = [];\n\n /** Save all inputs in global variable state */\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\n };\n\n /**\n * Adds first initial block on empty redactor\n */\n ui.addInitialBlock = function(){\n\n var initialBlockType = codex.settings.initialBlockPlugin,\n initialBlock;\n\n if ( !codex.tools[initialBlockType] ){\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\n return;\n }\n\n initialBlock = codex.tools[initialBlockType].render();\n\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\n\n codex.content.insertBlock({\n type : initialBlockType,\n block : initialBlock\n });\n\n codex.content.workingNodeChanged(initialBlock);\n\n };\n\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\n\n button.addEventListener('mousedown', function(event) {\n\n codex.toolbar.inline.toolClicked(event, type);\n\n }, false);\n };\n\n return ui;\n\n})({});\n\ncodex.ui = ui;\nmodule.exports = codex;\n\n\n/** WEBPACK FOOTER **\n ** ./modules/ui.js\n **/","var codex = require('../editor');\n\nvar transport = (function(transport){\n\n transport.input = null;\n\n /**\n * @property {Object} arguments - keep plugin settings and defined callbacks\n */\n transport.arguments = null;\n\n transport.prepare = function(){\n\n var input = document.createElement('INPUT');\n\n input.type = 'file';\n input.addEventListener('change', codex.transport.fileSelected);\n\n codex.transport.input = input;\n\n };\n\n /** Clear input when files is uploaded */\n transport.clearInput = function() {\n\n /** Remove old input */\n this.input = null;\n\n /** Prepare new one */\n this.prepare();\n };\n\n /**\n * Callback for file selection\n */\n transport.fileSelected = function(event){\n\n var input = this,\n files = input.files,\n filesLength = files.length,\n formdData = new FormData(),\n file,\n i;\n\n formdData.append('files', files[0], files[0].name);\n\n codex.transport.ajax({\n data : formdData,\n beforeSend : codex.transport.arguments.beforeSend,\n success : codex.transport.arguments.success,\n error : codex.transport.arguments.error\n });\n };\n\n /**\n * Use plugin callbacks\n * @protected\n */\n transport.selectAndUpload = function (args) {\n\n this.arguments = args;\n this.input.click();\n\n };\n\n /**\n * Ajax requests module\n */\n transport.ajax = function(params){\n\n var xhr = new XMLHttpRequest(),\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\n success = typeof params.success == 'function' ? params.success : function(){},\n error = typeof params.error == 'function' ? params.error : function(){};\n\n beforeSend();\n\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\n\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n success(xhr.responseText);\n } else {\n console.log(\"request error: %o\", xhr);\n error();\n }\n };\n\n xhr.send(params.data);\n this.clearInput();\n\n };\n\n return transport;\n\n})({});\n\ncodex.transport = transport;\nmodule.exports = transport;\n\n\n/** WEBPACK FOOTER **\n ** ./modules/transport.js\n **/","var codex = require('../editor');\n\nvar renderer = (function(renderer) {\n\n /**\n * Asyncronously parses input JSON to redactor blocks\n */\n renderer.makeBlocksFromData = function () {\n\n /**\n * If redactor is empty, add first paragraph to start writing\n */\n if (!codex.state.blocks.items.length) {\n\n codex.ui.addInitialBlock();\n return;\n\n }\n\n Promise.resolve()\n\n /** First, get JSON from state */\n .then(function() {\n return codex.state.blocks;\n })\n\n /** Then, start to iterate they */\n .then(codex.renderer.appendBlocks)\n\n /** Write log if something goes wrong */\n .catch(function(error) {\n codex.core.log('Error while parsing JSON: %o', 'error', error);\n });\n\n };\n\n /**\n * Parses JSON to blocks\n * @param {object} data\n * @return Primise -> nodeList\n */\n renderer.appendBlocks = function (data) {\n\n var blocks = data.items;\n\n /**\n * Sequence of one-by-one blocks appending\n * Uses to save blocks order after async-handler\n */\n var nodeSequence = Promise.resolve();\n\n for (var index = 0; index < blocks.length ; index++ ) {\n\n /** Add node to sequence at specified index */\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\n\n }\n\n };\n\n /**\n * Append node at specified index\n */\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\n\n /** We need to append node to sequence */\n nodeSequence\n\n /** first, get node async-aware */\n .then(function() {\n\n return codex.renderer.getNodeAsync(blocks , index);\n\n })\n\n /**\n * second, compose editor-block from JSON object\n */\n .then(codex.renderer.createBlockFromData)\n\n /**\n * now insert block to redactor\n */\n .then(function(blockData){\n\n /**\n * blockData has 'block', 'type' and 'stretched' information\n */\n codex.content.insertBlock(blockData);\n\n /** Pass created block to next step */\n return blockData.block;\n\n })\n\n /** Log if something wrong with node */\n .catch(function(error) {\n codex.core.log('Node skipped while parsing because %o', 'error', error);\n });\n\n };\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n renderer.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n /**\n * Creates editor block by JSON-data\n *\n * @uses render method of each plugin\n *\n * @param {object} blockData looks like\n * { header : {\n * text: '',\n * type: 'H3', ...\n * }\n * }\n * @return {object} with type and Element\n */\n renderer.createBlockFromData = function (blockData) {\n\n /** New parser */\n var pluginName = blockData.type;\n\n /** Get first key of object that stores plugin name */\n // for (var pluginName in blockData) break;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].render != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have «render» method`);\n }\n\n /** New Parser */\n var block = codex.tools[pluginName].render(blockData.data);\n\n /** Fire the render method with data */\n // var block = codex.tools[pluginName].render(blockData[pluginName]);\n\n /** is first-level block stretched */\n var stretched = codex.tools[pluginName].isStretched || false;\n\n /** Retrun type and block */\n return {\n type : pluginName,\n block : block,\n stretched : stretched\n };\n\n };\n\n return renderer;\n\n})({});\n\ncodex.renderer = renderer;\nmodule.exports = renderer;\n\n\n/** WEBPACK FOOTER **\n ** ./modules/renderer.js\n **/","var codex = require('../editor');\n\nvar saver = (function(saver) {\n\n /**\n * Saves blocks\n * @private\n */\n saver.saveBlocks = function () {\n\n /** Save html content of redactor to memory */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n /** Empty jsonOutput state */\n codex.state.jsonOutput = [];\n\n Promise.resolve()\n\n .then(function() {\n return codex.nodes.redactor.childNodes;\n })\n /** Making a sequence from separate blocks */\n .then(codex.saver.makeQueue)\n\n .then(function() {\n // codex.nodes.textarea.innerHTML = codex.state.html;\n })\n\n .catch( function(error) {\n console.log('Something happend');\n });\n\n };\n\n saver.makeQueue = function(blocks) {\n\n var queue = Promise.resolve();\n\n for(var index = 0; index < blocks.length; index++) {\n\n /** Add node to sequence at specified index */\n codex.saver.getBlockData(queue, blocks, index);\n\n }\n\n };\n\n /** Gets every block and makes From Data */\n saver.getBlockData = function(queue, blocks, index) {\n\n queue.then(function() {\n return codex.saver.getNodeAsync(blocks, index);\n })\n\n .then(codex.saver.makeFormDataFromBlocks);\n\n };\n\n\n /**\n * Asynchronously returns block data from blocksList by index\n * @return Promise to node\n */\n saver.getNodeAsync = function (blocksList, index) {\n\n return Promise.resolve().then(function() {\n\n return blocksList[index];\n\n });\n };\n\n saver.makeFormDataFromBlocks = function(block) {\n\n var pluginName = block.dataset.tool;\n\n /** Check for plugin existance */\n if (!codex.tools[pluginName]) {\n throw Error(`Plugin «${pluginName}» not found`);\n }\n\n /** Check for plugin having render method */\n if (typeof codex.tools[pluginName].save != 'function') {\n\n throw Error(`Plugin «${pluginName}» must have save method`);\n }\n\n /** Result saver */\n var blockContent = block.childNodes[0],\n pluginsContent = blockContent.childNodes[0],\n savedData = codex.tools[pluginName].save(pluginsContent),\n output;\n\n\n output = {\n type: pluginName,\n data: savedData\n };\n\n /** Marks Blocks that will be in main page */\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.state.jsonOutput.push(output);\n };\n\n return saver;\n\n})({});\n\ncodex.saver = saver;\nmodule.exports = saver;\n\n\n/** WEBPACK FOOTER **\n ** ./modules/saver.js\n **/","var codex = require('../editor');\n\nvar content = (function(content) {\n\n content.currentNode = null;\n\n /**\n * Synchronizes redactor with original textarea\n */\n content.sync = function () {\n\n codex.core.log('syncing...');\n\n /**\n * Save redactor content to codex.state\n */\n codex.state.html = codex.nodes.redactor.innerHTML;\n\n };\n\n /**\n * @deprecated\n */\n content.getNodeFocused = function() {\n\n var selection = window.getSelection(),\n focused;\n\n if (selection.anchorNode === null) {\n return null;\n }\n\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\n focused = selection.anchorNode;\n } else {\n focused = selection.focusNode.parentElement;\n }\n\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\n\n /** Iterate with parent nodes to find first-level*/\n var parent = focused.parentNode;\n\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\n parent = parent.parentNode;\n }\n\n focused = parent;\n }\n\n if (focused != codex.nodes.redactor){\n return focused;\n }\n\n return null;\n\n };\n\n /**\n * Appends background to the block\n */\n content.markBlock = function() {\n\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\n };\n\n /**\n * Clear background\n */\n content.clearMark = function() {\n\n if (codex.content.currentNode) {\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\n }\n\n };\n\n /**\n * @private\n *\n * Finds first-level block\n * @param {Element} node - selected or clicked in redactors area node\n */\n content.getFirstLevelBlock = function(node) {\n\n if (!codex.core.isDomNode(node)) {\n node = node.parentNode;\n }\n\n if (node === codex.nodes.redactor || node === document.body) {\n\n return null;\n\n } else {\n\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n node = node.parentNode;\n }\n\n return node;\n }\n\n };\n\n /**\n * Trigger this event when working node changed\n * @param {Element} targetNode - first-level of this node will be current\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\n */\n content.workingNodeChanged = function (targetNode) {\n\n /** Clear background from previous marked block before we change */\n codex.content.clearMark();\n\n if (!targetNode) {\n return;\n }\n\n this.currentNode = this.getFirstLevelBlock(targetNode);\n\n };\n\n /**\n * Replaces one redactor block with another\n * @protected\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\n * @param {Element} newBlock\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\n *\n * [!] Function does not saves old block content.\n * You can get it manually and pass with newBlock.innerHTML\n */\n content.replaceBlock = function function_name(targetBlock, newBlock) {\n\n if (!targetBlock || !newBlock){\n codex.core.log('replaceBlock: missed params');\n return;\n }\n\n /** If target-block is not a frist-level block, then we iterate parents to find it */\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\n targetBlock = targetBlock.parentNode;\n }\n\n /** Replacing */\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Add block handlers\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n };\n\n /**\n * @private\n *\n * Inserts new block to redactor\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\n *\n * @param blockData {object}\n * @param blockData.block {Element} element with block content\n * @param blockData.type {string} block plugin\n * @param needPlaceCaret {bool} pass true to set caret in new block\n *\n */\n content.insertBlock = function( blockData, needPlaceCaret ) {\n\n var workingBlock = codex.content.currentNode,\n newBlockContent = blockData.block,\n blockType = blockData.type,\n isStretched = blockData.stretched;\n\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\n\n if (workingBlock) {\n\n codex.core.insertAfter(workingBlock, newBlock);\n\n } else {\n /**\n * If redactor is empty, append as first child\n */\n codex.nodes.redactor.appendChild(newBlock);\n\n }\n\n /**\n * Block handler\n */\n codex.ui.addBlockHandlers(newBlock);\n\n /**\n * Set new node as current\n */\n codex.content.workingNodeChanged(newBlock);\n\n /**\n * Save changes\n */\n codex.ui.saveInputs();\n\n\n if ( needPlaceCaret ) {\n\n /**\n * If we don't know input index then we set default value -1\n */\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\n\n\n if (currentInputIndex == -1) {\n\n\n var editableElement = newBlock.querySelector('[contenteditable]'),\n emptyText = document.createTextNode('');\n\n editableElement.appendChild(emptyText);\n codex.caret.set(editableElement, 0, 0);\n\n codex.toolbar.move();\n codex.toolbar.showPlusButton();\n\n\n } else {\n\n /** Timeout for browsers execution */\n setTimeout(function () {\n\n /** Setting to the new input */\n codex.caret.setToNextBlock(currentInputIndex);\n codex.toolbar.move();\n codex.toolbar.open();\n\n }, 10);\n\n }\n\n }\n\n };\n\n /**\n * Replaces blocks with saving content\n * @protected\n * @param {Element} noteToReplace\n * @param {Element} newNode\n * @param {Element} blockType\n */\n content.switchBlock = function(blockToReplace, newBlock, tool){\n\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\n\n /** Replacing */\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\n\n /** Save new Inputs when block is changed */\n codex.ui.saveInputs();\n };\n\n /**\n * Iterates between child noted and looking for #text node on deepest level\n * @private\n * @param {Element} block - node where find\n * @param {int} postiton - starting postion\n * Example: childNodex.length to find from the end\n * or 0 to find from the start\n * @return {Text} block\n * @uses DFS\n */\n content.getDeepestTextNodeFromPosition = function (block, position) {\n\n /**\n * Clear Block from empty and useless spaces with trim.\n * Such nodes we should remove\n */\n var blockChilds = block.childNodes,\n index,\n node,\n text;\n\n for(index = 0; index < blockChilds.length; index++)\n {\n node = blockChilds[index];\n\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\n\n text = node.textContent.trim();\n\n /** Text is empty. We should remove this child from node before we start DFS\n * decrease the quantity of childs.\n */\n if (text === '') {\n\n block.removeChild(node);\n position--;\n }\n }\n }\n\n if (block.childNodes.length === 0) {\n return document.createTextNode('');\n }\n\n /** Setting default position when we deleted all empty nodes */\n if ( position < 0 )\n position = 1;\n\n var looking_from_start = false;\n\n /** For looking from START */\n if (position === 0) {\n looking_from_start = true;\n position = 1;\n }\n\n while ( position ) {\n\n /** initial verticle of node. */\n if ( looking_from_start ) {\n block = block.childNodes[0];\n } else {\n block = block.childNodes[position - 1];\n }\n\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\n\n position = block.childNodes.length;\n\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\n\n position = 0;\n }\n\n }\n\n return block;\n };\n\n /**\n * @private\n */\n content.composeNewBlock = function (block, tool, isStretched) {\n\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\n\n blockContent.appendChild(block);\n newBlock.appendChild(blockContent);\n\n if (isStretched) {\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\n }\n\n newBlock.dataset.tool = tool;\n return newBlock;\n };\n\n /**\n * Returns Range object of current selection\n */\n content.getRange = function() {\n\n var selection = window.getSelection().getRangeAt(0);\n\n return selection;\n };\n\n /**\n * Divides block in two blocks (after and before caret)\n * @private\n * @param {Int} inputIndex - target input index\n */\n content.splitBlock = function(inputIndex) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n anchorNodeText = anchorNode.textContent,\n caretOffset = selection.anchorOffset,\n textBeforeCaret,\n textNodeBeforeCaret,\n textAfterCaret,\n textNodeAfterCaret;\n\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\n\n\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\n textAfterCaret = anchorNodeText.substring(caretOffset);\n\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\n\n if (textAfterCaret) {\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\n }\n\n var previousChilds = [],\n nextChilds = [],\n reachedCurrent = false;\n\n if (textNodeAfterCaret) {\n nextChilds.push(textNodeAfterCaret);\n }\n\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\n\n if ( child != anchorNode ) {\n if ( !reachedCurrent ){\n previousChilds.push(child);\n } else {\n nextChilds.push(child);\n }\n } else {\n reachedCurrent = true;\n }\n\n }\n\n /** Clear current input */\n codex.state.inputs[inputIndex].innerHTML = '';\n\n /**\n * Append all childs founded before anchorNode\n */\n var previousChildsLength = previousChilds.length;\n\n for(i = 0; i < previousChildsLength; i++) {\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\n }\n\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\n\n /**\n * Append text node which is after caret\n */\n var nextChildsLength = nextChilds.length,\n newNode = document.createElement('div');\n\n for(i = 0; i < nextChildsLength; i++) {\n newNode.appendChild(nextChilds[i]);\n }\n\n newNode = newNode.innerHTML;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * Make new paragraph with text after caret\n */\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render({\n text : newNode,\n })\n }, true );\n\n };\n\n /**\n * Merges two blocks — current and target\n * If target index is not exist, then previous will be as target\n */\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\n\n /** If current input index is zero, then prevent method execution */\n if (currentInputIndex === 0) {\n return;\n }\n\n var targetInput,\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\n\n if (!targetInputIndex) {\n\n targetInput = codex.state.inputs[currentInputIndex - 1];\n\n } else {\n\n targetInput = codex.state.inputs[targetInputIndex];\n\n }\n\n targetInput.innerHTML += currentInputContent;\n };\n\n /**\n * @private\n *\n * Callback for HTML Mutations\n * @param {Array} mutation - Mutation Record\n */\n content.paste = function(mutation) {\n\n var workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool;\n\n if (codex.tools[tool].allowedToPaste) {\n codex.content.sanitize(mutation.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode = document.createTextNode(node.textContent);\n\n if (codex.core.isDomNode(node)) {\n node.parentNode.replaceChild(textNode, node);\n }\n };\n\n /**\n * @private\n *\n * Sanitizes HTML content\n * @param {Element} target - inserted element\n * @uses DFS function for deep searching\n */\n content.sanitize = function(target) {\n\n if (!target) {\n return;\n }\n\n for (var i = 0; i < target.childNodes.length; i++) {\n this.dfs(target.childNodes[i]);\n }\n };\n\n /**\n * Clears styles\n * @param {Element|Text}\n */\n content.clearStyles = function(target) {\n\n var href,\n newNode = null,\n blockTags = ['P', 'BLOCKQUOTE', 'UL', 'CODE', 'OL', 'LI', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'DIV', 'PRE', 'HEADER', 'SECTION'],\n allowedTags = ['P', 'B', 'I', 'A', 'U', 'BR'],\n needReplace = !allowedTags.includes(target.tagName),\n isDisplayedAsBlock = blockTags.includes(target.tagName);\n\n if (!codex.core.isDomNode(target)){\n return target;\n }\n\n if (!target.parentNode){\n return target;\n }\n\n if (needReplace) {\n\n if (isDisplayedAsBlock) {\n\n newNode = document.createElement('P');\n newNode.innerHTML = target.innerHTML;\n target.parentNode.replaceChild(newNode, target);\n target = newNode;\n\n } else {\n\n newNode = document.createTextNode(` ${target.textContent} `);\n newNode.textContent = newNode.textContent.replace(/\\s{2,}/g, ' ');\n target.parentNode.replaceChild(newNode, target);\n\n }\n }\n\n /** keep href attributes of tag A */\n if (target.tagName == 'A') {\n href = target.getAttribute('href');\n }\n\n /** Remove all tags */\n while(target.attributes.length > 0) {\n target.removeAttribute(target.attributes[0].name);\n }\n\n /** return href */\n if (href) {\n target.setAttribute('href', href);\n }\n\n return target;\n\n };\n\n /**\n * Depth-first search Algorithm\n * returns all childs\n * @param {Element}\n */\n content.dfs = function(el) {\n\n if (!codex.core.isDomNode(el))\n return;\n\n var sanitized = this.clearStyles(el);\n\n for(var i = 0; i < sanitized.childNodes.length; i++) {\n this.dfs(sanitized.childNodes[i]);\n }\n\n };\n\n return content;\n\n})({});\n\ncodex.content = content;\nmodule.exports = content;\n\n\n/** WEBPACK FOOTER **\n ** ./modules/content.js\n **/","var codex = require('../../editor');\n\nvar toolbar = (function(toolbar) {\n\n toolbar.init = function() {\n toolbar.settings = require('./settings');\n toolbar.inline = require('./inline');\n toolbar.toolbox = require('./toolbox');\n };\n\n /**\n * Margin between focused node and toolbar\n */\n toolbar.defaultToolbarHeight = 49;\n\n toolbar.defaultOffset = 34;\n\n toolbar.opened = false;\n\n toolbar.current = null;\n\n /**\n * @protected\n */\n toolbar.open = function (){\n\n codex.nodes.toolbar.classList.add('opened');\n this.opened = true;\n\n };\n\n /**\n * @protected\n */\n toolbar.close = function(){\n\n codex.nodes.toolbar.classList.remove('opened');\n this.opened = false;\n\n this.current = null;\n\n for (var button in codex.nodes.toolbarButtons){\n codex.nodes.toolbarButtons[button].classList.remove('selected');\n }\n\n /** Close toolbox when toolbar is not displayed */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n toolbar.toggle = function(){\n\n if ( !this.opened ){\n\n this.open();\n\n } else {\n\n this.close();\n\n }\n\n };\n\n toolbar.hidePlusButton = function() {\n codex.nodes.plusButton.classList.add('hide');\n };\n\n toolbar.showPlusButton = function() {\n codex.nodes.plusButton.classList.remove('hide');\n };\n\n /**\n * Moving toolbar to the specified node\n */\n toolbar.move = function() {\n\n /** Close Toolbox when we move toolbar */\n codex.toolbar.toolbox.close();\n\n if (!codex.content.currentNode) {\n return;\n }\n\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\n\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\n\n /** Close trash actions */\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return toolbar;\n\n})({});\n\ntoolbar.init();\n\ncodex.toolbar = toolbar;\nmodule.exports = toolbar;\n\n\n\n\n/** WEBPACK FOOTER **\n ** ./modules/toolbar/toolbar.js\n **/","var codex = require('../../editor');\n\nvar settings = (function(settings) {\n\n settings.init = function() {\n require('../content');\n };\n\n settings.opened = false;\n\n settings.setting = null;\n settings.actions = null;\n\n settings.cover = null;\n\n /**\n * Append and open settings\n */\n settings.open = function(toolType){\n\n /**\n * Append settings content\n * It's stored in tool.settings\n */\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\n\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\n\n } else {\n\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\n\n }\n\n var currentBlock = codex.content.currentNode;\n\n /** Open settings block */\n codex.nodes.blockSettings.classList.add('opened');\n codex.toolbar.settings.addDefaultSettings();\n this.opened = true;\n };\n\n /**\n * Close and clear settings\n */\n settings.close = function(){\n\n codex.nodes.blockSettings.classList.remove('opened');\n codex.nodes.pluginSettings.innerHTML = '';\n\n this.opened = false;\n\n };\n\n /**\n * @param {string} toolType - plugin type\n */\n settings.toggle = function( toolType ){\n\n if ( !this.opened ){\n\n this.open(toolType);\n\n } else {\n\n this.close();\n\n }\n\n };\n\n /**\n * This function adds default core settings\n */\n settings.addDefaultSettings = function() {\n\n /** list of default settings */\n var feedModeToggler;\n\n /** Clear block and append initialized settings */\n codex.nodes.defaultSettings.innerHTML = '';\n\n\n /** Init all default setting buttons */\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\n\n /**\n * Fill defaultSettings\n */\n\n /**\n * Button that enables/disables Feed-mode\n * Feed-mode means that block will be showed in articles-feed like cover\n */\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\n\n };\n\n /**\n * Cover setting.\n * This tune highlights block, so that it may be used for showing target block on main page\n * Draw different setting when block is marked for main page\n * If TRUE, then we show button that removes this selection\n * Also defined setting \"Click\" events will be listened and have separate callbacks\n *\n * @return {Element} node/button that we place in default settings block\n */\n settings.makeFeedModeToggler = function() {\n\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\n setting,\n data;\n\n if (!isFeedModeActivated) {\n\n data = {\n innerHTML : 'Вывести в ленте'\n };\n\n } else {\n\n data = {\n innerHTML : 'Не выводить в ленте'\n };\n\n }\n\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\n\n return setting;\n };\n\n /**\n * Updates Feed-mode\n */\n settings.updateFeedMode = function() {\n\n var currentNode = codex.content.currentNode;\n\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\n\n codex.toolbar.settings.close();\n };\n\n settings.isFeedModeActivated = function() {\n\n var currentBlock = codex.content.currentNode;\n\n if (currentBlock) {\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\n } else {\n return false;\n }\n };\n\n /**\n * Here we will draw buttons and add listeners to components\n */\n settings.makeRemoveBlockButton = function() {\n\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\n\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\n\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\n\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\n\n actionWrapper.appendChild(confirmAction);\n actionWrapper.appendChild(cancelAction);\n\n removeBlockWrapper.appendChild(settingButton);\n removeBlockWrapper.appendChild(actionWrapper);\n\n /** Save setting */\n codex.toolbar.settings.setting = settingButton;\n codex.toolbar.settings.actions = actionWrapper;\n\n return removeBlockWrapper;\n\n };\n\n settings.removeButtonClicked = function() {\n\n var action = codex.toolbar.settings.actions;\n\n if (action.classList.contains('opened')) {\n codex.toolbar.settings.hideRemoveActions();\n } else {\n codex.toolbar.settings.showRemoveActions();\n }\n\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.close();\n\n };\n\n settings.cancelRemovingRequest = function() {\n\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n settings.confirmRemovingRequest = function() {\n\n var currentBlock = codex.content.currentNode,\n firstLevelBlocksCount;\n\n currentBlock.remove();\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n }\n\n codex.ui.saveInputs();\n\n codex.toolbar.close();\n };\n\n settings.showRemoveActions = function() {\n codex.toolbar.settings.actions.classList.add('opened');\n };\n\n settings.hideRemoveActions = function() {\n codex.toolbar.settings.actions.classList.remove('opened');\n };\n\n return settings;\n\n})({});\n\nsettings.init();\n\nmodule.exports = settings;\n\n\n/** WEBPACK FOOTER **\n ** ./modules/toolbar/settings.js\n **/","var codex = require('../../editor');\n\nvar inline = (function(inline) {\n\n inline.init = function() {\n\n };\n\n inline.buttonsOpened = null;\n inline.actionsOpened = null;\n inline.wrappersOffset = null;\n\n /**\n * saving selection that need for execCommand for styling\n *\n */\n inline.storedSelection = null,\n\n /**\n * @protected\n *\n * Open inline toobar\n */\n inline.show = function() {\n\n var selectedText = this.getSelectionText(),\n toolbar = codex.nodes.inlineToolbar.wrapper,\n buttons = codex.nodes.inlineToolbar.buttons;\n\n if (selectedText.length > 0) {\n\n /** Move toolbar and open */\n codex.toolbar.inline.move();\n\n /** Open inline toolbar */\n toolbar.classList.add('opened');\n\n /** show buttons of inline toolbar */\n codex.toolbar.inline.showButtons();\n }\n\n };\n\n /**\n * @protected\n *\n * Closes inline toolbar\n */\n inline.close = function() {\n var toolbar = codex.nodes.inlineToolbar.wrapper;\n toolbar.classList.remove('opened');\n };\n\n /**\n * @private\n *\n * Moving toolbar\n */\n inline.move = function() {\n\n if (!this.wrappersOffset) {\n this.wrappersOffset = this.getWrappersOffset();\n }\n\n var coords = this.getSelectionCoords(),\n defaultOffset = 0,\n toolbar = codex.nodes.inlineToolbar.wrapper,\n newCoordinateX,\n newCoordinateY;\n\n if (toolbar.offsetHeight === 0) {\n defaultOffset = 40;\n }\n\n newCoordinateX = coords.x - this.wrappersOffset.left;\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\n\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\n\n /** Close everything */\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.closeAction();\n\n };\n\n /**\n * @private\n *\n * Tool Clicked\n */\n\n inline.toolClicked = function(event, type) {\n\n /**\n * For simple tools we use default browser function\n * For more complicated tools, we should write our own behavior\n */\n switch (type) {\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\n default : codex.toolbar.inline.defaultToolAction(type); break;\n }\n\n /**\n * highlight buttons\n * after making some action\n */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n };\n\n /**\n * @private\n *\n * Saving wrappers offset in DOM\n */\n inline.getWrappersOffset = function() {\n\n var wrapper = codex.nodes.wrapper,\n offset = this.getOffset(wrapper);\n\n this.wrappersOffset = offset;\n return offset;\n\n };\n\n /**\n * @private\n *\n * Calculates offset of DOM element\n *\n * @param el\n * @returns {{top: number, left: number}}\n */\n inline.getOffset = function ( el ) {\n\n var _x = 0;\n var _y = 0;\n\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\n _x += (el.offsetLeft + el.clientLeft);\n _y += (el.offsetTop + el.clientTop);\n el = el.offsetParent;\n }\n return { top: _y, left: _x };\n };\n\n /**\n * @private\n *\n * Calculates position of selected text\n * @returns {{x: number, y: number}}\n */\n inline.getSelectionCoords = function() {\n\n var sel = document.selection, range;\n var x = 0, y = 0;\n\n if (sel) {\n\n if (sel.type != \"Control\") {\n range = sel.createRange();\n range.collapse(true);\n x = range.boundingLeft;\n y = range.boundingTop;\n }\n\n } else if (window.getSelection) {\n\n sel = window.getSelection();\n\n if (sel.rangeCount) {\n\n range = sel.getRangeAt(0).cloneRange();\n if (range.getClientRects) {\n range.collapse(true);\n var rect = range.getClientRects()[0];\n x = rect.left;\n y = rect.top;\n }\n\n }\n }\n return { x: x, y: y };\n };\n\n /**\n * @private\n *\n * Returns selected text as String\n * @returns {string}\n */\n inline.getSelectionText = function getSelectionText(){\n\n var selectedText = \"\";\n\n if (window.getSelection){ // all modern browsers and IE9+\n selectedText = window.getSelection().toString();\n }\n\n return selectedText;\n };\n\n /** Opens buttons block */\n inline.showButtons = function() {\n\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.add('opened');\n\n codex.toolbar.inline.buttonsOpened = true;\n\n /** highlight buttons */\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\n\n };\n\n /** Makes buttons disappear */\n inline.closeButtons = function() {\n var buttons = codex.nodes.inlineToolbar.buttons;\n buttons.classList.remove('opened');\n\n codex.toolbar.inline.buttonsOpened = false;\n };\n\n /** Open buttons defined action if exist */\n inline.showActions = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.classList.add('opened');\n\n codex.toolbar.inline.actionsOpened = true;\n };\n\n /** Close actions block */\n inline.closeAction = function() {\n var action = codex.nodes.inlineToolbar.actions;\n action.innerHTML = '';\n action.classList.remove('opened');\n codex.toolbar.inline.actionsOpened = false;\n };\n\n /** Action for link creation or for setting anchor */\n inline.createLinkAction = function(event, type) {\n\n var isActive = this.isLinkActive();\n\n var editable = codex.content.currentNode,\n storedSelection = codex.toolbar.inline.storedSelection;\n\n if (isActive) {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode;\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * Changing stored selection. if we want to remove anchor from word\n * we should remove anchor from whole word, not only selected part.\n * The solution is than we get the length of current link\n * Change start position to - end of selection minus length of anchor\n */\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n\n codex.toolbar.inline.defaultToolAction('unlink');\n\n } else {\n\n /** Create input and close buttons */\n var action = codex.draw.inputForLink();\n codex.nodes.inlineToolbar.actions.appendChild(action);\n\n codex.toolbar.inline.closeButtons();\n codex.toolbar.inline.showActions();\n\n storedSelection = codex.toolbar.inline.saveSelection(editable);\n\n /**\n * focus to input\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\n */\n action.focus();\n event.preventDefault();\n\n /** Callback to link action */\n action.addEventListener('keydown', function(event){\n\n if (event.keyCode == codex.core.keys.ENTER) {\n\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\n codex.toolbar.inline.setAnchor(action.value);\n\n /**\n * Preventing events that will be able to happen\n */\n event.preventDefault();\n event.stopImmediatePropagation();\n\n codex.toolbar.inline.clearRange();\n }\n\n }, false);\n }\n };\n\n inline.isLinkActive = function() {\n\n var isActive = false;\n\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\n var dataType = tool.dataset.type;\n\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\n isActive = true;\n }\n });\n\n return isActive;\n };\n\n /** default action behavior of tool */\n inline.defaultToolAction = function(type) {\n document.execCommand(type, false, null);\n };\n\n /**\n * @private\n *\n * Sets URL\n *\n * @param {String} url - URL\n */\n inline.setAnchor = function(url) {\n\n document.execCommand('createLink', false, url);\n\n /** Close after URL inserting */\n codex.toolbar.inline.closeAction();\n };\n\n /**\n * @private\n *\n * Saves selection\n */\n inline.saveSelection = function(containerEl) {\n\n var range = window.getSelection().getRangeAt(0),\n preSelectionRange = range.cloneRange(),\n start;\n\n preSelectionRange.selectNodeContents(containerEl);\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n\n start = preSelectionRange.toString().length;\n\n return {\n start: start,\n end: start + range.toString().length\n };\n };\n\n /**\n * @private\n *\n * Sets to previous selection (Range)\n *\n * @param {Element} containerEl - editable element where we restore range\n * @param {Object} savedSel - range basic information to restore\n */\n inline.restoreSelection = function(containerEl, savedSel) {\n\n var range = document.createRange(),\n charIndex = 0;\n\n range.setStart(containerEl, 0);\n range.collapse(true);\n\n var nodeStack = [containerEl],\n node,\n foundStart = false,\n stop = false,\n nextCharIndex;\n\n while (!stop && (node = nodeStack.pop())) {\n\n if (node.nodeType == 3) {\n\n nextCharIndex = charIndex + node.length;\n\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\n range.setStart(node, savedSel.start - charIndex);\n foundStart = true;\n }\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\n range.setEnd(node, savedSel.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n var i = node.childNodes.length;\n while (i--) {\n nodeStack.push(node.childNodes[i]);\n }\n }\n }\n\n var sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n };\n\n /**\n * @private\n *\n * Removes all ranges from window selection\n */\n inline.clearRange = function() {\n var selection = window.getSelection();\n selection.removeAllRanges();\n };\n\n /**\n * @private\n *\n * sets or removes hightlight\n */\n inline.hightlight = function(tool) {\n var dataType = tool.dataset.type;\n\n if (document.queryCommandState(dataType)) {\n codex.toolbar.inline.setButtonHighlighted(tool);\n } else {\n codex.toolbar.inline.removeButtonsHighLight(tool);\n }\n\n /**\n *\n * hightlight for anchors\n */\n var selection = window.getSelection(),\n tag = selection.anchorNode.parentNode;\n\n if (tag.tagName == 'A' && dataType == 'link') {\n codex.toolbar.inline.setButtonHighlighted(tool);\n }\n };\n\n /**\n * @private\n *\n * Mark button if text is already executed\n */\n inline.setButtonHighlighted = function(button) {\n button.classList.add('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-link');\n icon.classList.add('ce-icon-unlink');\n }\n };\n\n /**\n * @private\n *\n * Removes hightlight\n */\n inline.removeButtonsHighLight = function(button) {\n button.classList.remove('hightlighted');\n\n /** At link tool we also change icon */\n if (button.dataset.type == 'link') {\n var icon = button.childNodes[0];\n icon.classList.remove('ce-icon-unlink');\n icon.classList.add('ce-icon-link');\n }\n };\n\n\n return inline;\n})({});\n\ninline.init();\n\nmodule.exports = inline;\n\n\n/** WEBPACK FOOTER **\n ** ./modules/toolbar/inline.js\n **/","var codex = require('../../editor');\n\nvar toolbox = (function(toolbox) {\n\n toolbox.init = function() {\n require('./toolbar');\n };\n\n toolbox.opened = false;\n\n /** Shows toolbox */\n toolbox.open = function() {\n\n /** Close setting if toolbox is opened */\n if (codex.toolbar.settings.opened) {\n codex.toolbar.settings.close();\n }\n\n /** display toolbox */\n codex.nodes.toolbox.classList.add('opened');\n\n /** Animate plus button */\n codex.nodes.plusButton.classList.add('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = true;\n\n };\n\n /** Closes toolbox */\n toolbox.close = function() {\n\n /** Makes toolbox disapear */\n codex.nodes.toolbox.classList.remove('opened');\n\n /** Rotate plus button */\n codex.nodes.plusButton.classList.remove('clicked');\n\n /** toolbox state */\n codex.toolbar.toolbox.opened = false;\n\n };\n\n toolbox.leaf = function(){\n\n var currentTool = codex.toolbar.current,\n tools = Object.keys(codex.tools),\n barButtons = codex.nodes.toolbarButtons,\n nextToolIndex,\n toolToSelect;\n\n if ( !currentTool ) {\n\n /** Get first tool from object*/\n for (toolToSelect in barButtons) break;\n\n } else {\n\n nextToolIndex = tools.indexOf(currentTool) + 1;\n\n if ( nextToolIndex == tools.length) nextToolIndex = 0;\n\n toolToSelect = tools[nextToolIndex];\n\n }\n\n for (var button in barButtons) barButtons[button].classList.remove('selected');\n\n barButtons[toolToSelect].classList.add('selected');\n\n codex.toolbar.current = toolToSelect;\n\n };\n\n /**\n * Transforming selected node type into selected toolbar element type\n * @param {event} event\n */\n toolbox.toolClicked = function() {\n\n /**\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\n */\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter'],\n tool = codex.tools[codex.toolbar.current],\n workingNode = codex.content.currentNode,\n currentInputIndex = codex.caret.inputIndex,\n newBlockContent,\n appendCallback,\n blockData;\n\n /** Make block from plugin */\n newBlockContent = tool.make();\n\n /** information about block */\n blockData = {\n block : newBlockContent,\n type : tool.type,\n stretched : false\n };\n\n if (\n workingNode &&\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\n workingNode.textContent.trim() === ''\n ){\n /** Replace current block */\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\n\n } else {\n\n /** Insert new Block from plugin */\n codex.content.insertBlock(blockData);\n\n /** increase input index */\n currentInputIndex++;\n\n }\n\n /** Fire tool append callback */\n appendCallback = tool.appendCallback;\n\n if (appendCallback && typeof appendCallback == 'function') {\n appendCallback.call(event);\n }\n\n setTimeout(function() {\n\n /** Set caret to current block */\n codex.caret.setToBlock(currentInputIndex);\n\n }, 10);\n\n\n /**\n * Changing current Node\n */\n codex.content.workingNodeChanged();\n\n /**\n * Move toolbar when node is changed\n */\n codex.toolbar.move();\n };\n\n return toolbox;\n\n})({});\n\ntoolbox.init();\n\nmodule.exports = toolbox;\n\n\n/** WEBPACK FOOTER **\n ** ./modules/toolbar/toolbox.js\n **/","var codex = require('../editor');\n\nvar tools = (function(tools) {\n\n return tools;\n\n})({});\n\ncodex.tools = tools;\nmodule.exports = tools;\n\n\n\n/** WEBPACK FOOTER **\n ** ./modules/tools.js\n **/","var codex = require('../editor');\n\nvar callbacks = (function(callbacks) {\n\n callbacks.redactorSyncTimeout = null;\n\n callbacks.globalKeydown = function(event){\n switch (event.keyCode){\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\n default : codex.callback.defaultKeyPressed(event); break;\n }\n };\n\n callbacks.globalKeyup = function(event){\n switch (event.keyCode){\n case codex.core.keys.UP :\n case codex.core.keys.LEFT :\n case codex.core.keys.RIGHT :\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\n }\n };\n\n callbacks.tabKeyPressed = function(event){\n\n if ( !codex.toolbar.opened ) {\n codex.toolbar.open();\n }\n\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\n codex.toolbar.toolbox.open();\n } else {\n codex.toolbar.toolbox.leaf();\n }\n\n event.preventDefault();\n };\n\n /**\n * ENTER key handler\n * Makes new paragraph block\n */\n callbacks.enterKeyPressed = function(event){\n\n /** Set current node */\n var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea();\n\n if (firstLevelBlocksArea) {\n event.preventDefault();\n\n /**\n * it means that we lose input index, saved index before is not correct\n * therefore we need to set caret when we insert new block\n */\n codex.caret.inputIndex = -1;\n\n codex.callback.enterPressedOnBlock();\n return;\n }\n\n if (event.target.contentEditable == 'true') {\n\n /** Update input index */\n codex.caret.saveCurrentInputIndex();\n }\n\n if (!codex.content.currentNode) {\n /**\n * Enter key pressed in first-level block area\n */\n codex.callback.enterPressedOnBlock(event);\n return;\n }\n\n\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\n workingNode = codex.content.currentNode,\n tool = workingNode.dataset.tool,\n isEnterPressedOnToolbar = codex.toolbar.opened &&\n codex.toolbar.current &&\n event.target == codex.state.inputs[currentInputIndex];\n\n /** The list of tools which needs the default browser behaviour */\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\n\n /** This type of block creates when enter is pressed */\n var NEW_BLOCK_TYPE = 'paragraph';\n\n /**\n * When toolbar is opened, select tool instead of making new paragraph\n */\n if ( isEnterPressedOnToolbar ) {\n\n event.preventDefault();\n\n codex.toolbar.toolbox.toolClicked(event);\n\n codex.toolbar.close();\n\n return;\n\n }\n\n /**\n * Allow making new

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

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

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

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

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

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

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

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

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

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

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

tag */\n parentBlock = cEditor.draw.block('P');\n\n if (isPlainTextNode){\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\n } else {\n parentBlock.appendChild(node);\n }\n\n /** Save plugin type in data-type */\n parentBlock = this.storeBlockType(parentBlock);\n\n return parentBlock;\n\n };\n\n /**\n * It's a crutch\n * - - - - - - -\n * We need block type stored as data-attr\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\n * Remove it after updating parser module for the block-oriented structure:\n * - each block must have stored type\n * @param {Element} node\n */\n parser.storeBlockType = function (node) {\n\n switch (node.tagName) {\n case 'P' : node.dataset.tool = 'paragraph'; break;\n case 'H1':\n case 'H2':\n case 'H3':\n case 'H4':\n case 'H5':\n case 'H6': node.dataset.tool = 'header'; break;\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\n case 'CODE': node.dataset.tool = 'code'; break;\n }\n\n return node;\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nparser.init();\n\ncodex.parser = parser;\nmodule.exports = parser;\n\n\n\n/** WEBPACK FOOTER **\n ** ./modules/parser.js\n **/"],"sourceRoot":""} \ No newline at end of file diff --git a/modules/toolbar/toolbox.js b/modules/toolbar/toolbox.js index 8dde203f..a89815c7 100644 --- a/modules/toolbar/toolbox.js +++ b/modules/toolbar/toolbox.js @@ -44,11 +44,19 @@ var toolbox = (function(toolbox) { toolbox.leaf = function(){ var currentTool = codex.toolbar.current, + tool, tools = Object.keys(codex.tools), barButtons = codex.nodes.toolbarButtons, nextToolIndex, + hiddenToolsAmount = 0, toolToSelect; + /** Count toolbox hidden tools */ + for( tool in codex.tools ) { + if (!codex.tools[tool].displayInToolbox) + hiddenToolsAmount ++; + } + if ( !currentTool ) { /** Get first tool from object*/ @@ -58,16 +66,30 @@ var toolbox = (function(toolbox) { nextToolIndex = tools.indexOf(currentTool) + 1; - if ( nextToolIndex == tools.length) nextToolIndex = 0; + var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 1); + + if ( toolIsLastInToolbox ) { + + nextToolIndex = 0; + + /** getting first displayed tool */ + for( tool in codex.tools ) { + + nextToolIndex ++; + + if (!codex.tools[tool].displayInToolbox){ + break; + } + } + + } toolToSelect = tools[nextToolIndex]; } for (var button in barButtons) barButtons[button].classList.remove('selected'); - barButtons[toolToSelect].classList.add('selected'); - codex.toolbar.current = toolToSelect; }; diff --git a/package.json b/package.json index 0b7b30f5..25cf020e 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,21 @@ { - "name": "webpack", + "name": "codex.editor", "version": "1.0.0", - "description": "", + "description": "Codex Editor. Native JS, based on API and Open Source", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "build": "webpack" }, - "author": "", + "author": "Codex Team", "license": "ISC", - "dependencies": { + "dependencies": {}, + "devDependencies": { + "babel-core": "^6.21.0", + "babel-loader": "^6.2.10", + "babel-polyfill": "^6.20.0", + "babel-runtime": "^6.20.0", "css-loader": "^0.26.1", - "lodash": "^4.17.2", - "style-loader": "^0.13.1" + "extract-text-webpack-plugin": "^1.0.1", + "webpack": "^1.14.0" } }