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

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