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

in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.detectWhenClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.content.currentNode === null) {\n\n /**\n * If inputs in redactor does not exits, then we put input index 0 not -1\n */\n var indexOfLastInput = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.detectWhenClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorAreaHightlighted = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorAreaHightlighted = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n /**\n * @deprecated\n *\n * @param event\n */\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n /**\n * This method is used to observe pasted dirty data.\n *\n * Mutation handlers send to separate observers each mutation (added, changed and so on), which will be\n * passed from handler that sanitizes and replaces data.\n *\n * Probably won't be used\n *\n * @deprecated\n *\n * @param event\n * @private\n */\n callbacks._blockPasteCallback = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handleMutationsOnPaste);\n\n /**\n * configuration of the observer:\n */\n var config = {\n attributes: true,\n childList: false,\n characterData: false,\n subtree : true\n };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * This method prevents default behaviour.\n *\n * We get from clipboard pasted data, sanitize, make a fragment that contains of this sanitized nodes.\n * Firstly, we need to memorize the caret position. We can do that by getting the range of selection.\n * After all, we insert clear fragment into caret placed position. Then, we should move the caret to the last node\n *\n * @param event\n */\n callbacks.blockPasteCallback = function(event) {\n\n /** Prevent default behaviour */\n event.preventDefault();\n\n /** get html pasted data - dirty data */\n var data = event.clipboardData.getData('text/html');\n\n /** Temporary DIV that is used to work with childs as arrays item */\n var div = codex.draw.node('DIV', '', {}),\n cleaner = new codex.sanitizer.init(codex.sanitizer.Config.BASIC),\n cleanData,\n fragment;\n\n /** Create fragment, that we paste to range after proccesing */\n fragment = document.createDocumentFragment();\n\n cleanData = cleaner.clean(data);\n\n div.innerHTML = cleanData;\n\n var node, lastNode;\n\n /**\n * and fill in fragment\n */\n while (( node = div.firstChild) ) {\n lastNode = fragment.appendChild(node);\n }\n\n /**\n * work with selection and range\n */\n var selection, range;\n selection = window.getSelection();\n\n range = selection.getRangeAt(0);\n range.deleteContents();\n\n range.insertNode(fragment);\n\n /** Preserve the selection */\n if (lastNode) {\n range = range.cloneRange();\n range.setStartAfter(lastNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handleMutationsOnPaste = function(mutations) {\n\n var self = this;\n\n /**\n * Calling function with context of this function.\n * Also, we should sanitize pasted or changed data one time and ignore\n * changings which makes sanitize method.\n * For that, we need to send Context, MutationObserver.__proto__ that contains\n * observer disconnect method.\n */\n mutations.forEach(function(mutation) {\n codex.content.paste.call(self, mutation);\n });\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n };\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Codex Sanitizer\n */\n\nvar janitor = require('html-janitor');\n\nvar sanitizer = (function(sanitizer) {\n\n /**\n * Basic config\n */\n var Config = {\n\n BASIC : {\n\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: 'nofollow'\n },\n ul: {},\n i: {},\n b: {},\n strong: {},\n em: {},\n span: {}\n }\n }\n };\n\n sanitizer.Config = Config;\n\n sanitizer.init = janitor;\n\n return sanitizer;\n\n})({});\n\nmodule.exports = sanitizer;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/sanitizer.js","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('html-janitor', factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.HTMLJanitor = factory();\n }\n}(this, function () {\n\n /**\n * @param {Object} config.tags Dictionary of allowed tags.\n * @param {boolean} config.keepNestedBlockElements Default false.\n */\n function HTMLJanitor(config) {\n\n var tagDefinitions = config['tags'];\n var tags = Object.keys(tagDefinitions);\n\n var validConfigValues = tags\n .map(function(k) { return typeof tagDefinitions[k]; })\n .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });\n\n if(!validConfigValues) {\n throw new Error(\"The configuration was invalid\");\n }\n\n this.config = config;\n }\n\n // TODO: not exhaustive?\n var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];\n function isBlockElement(node) {\n return blockElementNames.indexOf(node.nodeName) !== -1;\n }\n\n var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];\n function isInlineElement(node) {\n return inlineElementNames.indexOf(node.nodeName) !== -1;\n }\n\n HTMLJanitor.prototype.clean = function (html) {\n var sandbox = document.createElement('div');\n sandbox.innerHTML = html;\n\n this._sanitize(sandbox);\n\n return sandbox.innerHTML;\n };\n\n HTMLJanitor.prototype._sanitize = function (parentNode) {\n var treeWalker = createTreeWalker(parentNode);\n var node = treeWalker.firstChild();\n if (!node) { return; }\n\n do {\n // Ignore nodes that have already been sanitized\n if (node._sanitized) {\n continue;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // If this text node is just whitespace and the previous or next element\n // sibling is a block element, remove it\n // N.B.: This heuristic could change. Very specific to a bug with\n // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output\n // FIXME: make this an option?\n if (node.data.trim() === ''\n && ((node.previousElementSibling && isBlockElement(node.previousElementSibling))\n || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n } else {\n continue;\n }\n }\n\n // Remove all comments\n if (node.nodeType === Node.COMMENT_NODE) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n }\n\n var isInline = isInlineElement(node);\n var containsBlockElement;\n if (isInline) {\n containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);\n }\n\n // Block elements should not be nested (e.g.

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

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\n */\n if ( event.shiftKey && !enableLineBreaks) {\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\n event.preventDefault();\n\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\n /** XOR */\n return;\n }\n\n var isLastTextNode = false,\n currentSelection = window.getSelection(),\n currentSelectedNode = currentSelection.anchorNode,\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\n isTextNodeHasParentBetweenContenteditable = false;\n\n /**\n * Workaround situation when caret at the Text node that has some wrapper Elements\n * Split block cant handle this.\n * We need to save default behavior\n */\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\n\n /**\n * Split blocks when input has several nodes and caret placed in textNode\n */\n if (\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\n !isTextNodeHasParentBetweenContenteditable &&\n !caretAtTheEndOfText\n ){\n\n event.preventDefault();\n\n codex.core.log('Splitting Text node...');\n\n codex.content.splitBlock(currentInputIndex);\n\n /** Show plus button when next input after split is empty*/\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\n codex.toolbar.showPlusButton();\n }\n\n } else {\n\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\n\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\n\n }\n\n if ( isLastTextNode && caretAtTheEndOfText ) {\n\n event.preventDefault();\n\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n /** Show plus button with empty block */\n codex.toolbar.showPlusButton();\n\n } else {\n\n codex.core.log('Default ENTER behavior.');\n\n }\n\n }\n\n /** get all inputs after new appending block */\n codex.ui.saveInputs();\n\n };\n\n callbacks.escapeKeyPressed = function(event){\n\n /** Close all toolbar */\n codex.toolbar.close();\n\n /** Close toolbox */\n codex.toolbar.toolbox.close();\n\n event.preventDefault();\n\n };\n\n callbacks.arrowKeyPressed = function(event){\n\n codex.content.workingNodeChanged();\n\n /* Closing toolbar */\n codex.toolbar.close();\n codex.toolbar.move();\n\n };\n\n callbacks.defaultKeyPressed = function(event) {\n\n codex.toolbar.close();\n\n if (!codex.toolbar.inline.actionsOpened) {\n codex.toolbar.inline.close();\n codex.content.clearMark();\n }\n };\n\n callbacks.redactorClicked = function (event) {\n\n callbacks.detectWhenClickedOnFirstLevelBlockArea();\n\n codex.content.workingNodeChanged(event.target);\n\n codex.ui.saveInputs();\n\n var selectedText = codex.toolbar.inline.getSelectionText();\n\n /**\n * If selection range took off, then we hide inline toolbar\n */\n if (selectedText.length === 0) {\n codex.toolbar.inline.close();\n }\n\n /** Update current input index in memory when caret focused into existed input */\n if (event.target.contentEditable == 'true') {\n\n codex.caret.saveCurrentInputIndex();\n\n }\n\n if (codex.content.currentNode === null) {\n\n /**\n * If inputs in redactor does not exits, then we put input index 0 not -1\n */\n var indexOfLastInput = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\n\n /** If we have any inputs */\n if (codex.state.inputs.length) {\n\n /** getting firstlevel parent of input */\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\n }\n\n /** If input is empty, then we set caret to the last input */\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Create new input when caret clicked in redactors area */\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n });\n\n /** If there is no inputs except inserted */\n if (codex.state.inputs.length === 1) {\n\n codex.caret.setToBlock(indexOfLastInput);\n\n } else {\n\n /** Set caret to this appended input */\n codex.caret.setToNextBlock(indexOfLastInput);\n }\n }\n\n /**\n * Move toolbar to the right position and open\n */\n codex.toolbar.move();\n\n\n codex.toolbar.open();\n\n } else {\n\n /**\n * Move toolbar to the new position and open\n */\n codex.toolbar.move();\n\n codex.toolbar.open();\n\n /** Close all panels */\n codex.toolbar.settings.close();\n codex.toolbar.toolbox.close();\n }\n\n\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\n\n if (inputIsEmpty) {\n\n /** Show plus button */\n codex.toolbar.showPlusButton();\n\n } else {\n\n /** Hide plus buttons */\n codex.toolbar.hidePlusButton();\n\n }\n\n var currentNodeType = codex.content.currentNode.dataset.tool;\n\n /** Mark current block*/\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\n\n codex.content.markBlock();\n\n }\n\n };\n\n /**\n * This method allows to define, is caret in contenteditable element or not.\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\n * specifies to the first-level block. Other cases we just ignore.\n */\n callbacks.detectWhenClickedOnFirstLevelBlockArea = function() {\n\n var selection = window.getSelection(),\n anchorNode = selection.anchorNode,\n flag = false;\n\n if (selection.rangeCount == 0) {\n\n codex.content.editorAreaHightlighted = true;\n\n } else {\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n /** Already founded, without loop */\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n while (anchorNode.contentEditable != 'true') {\n anchorNode = anchorNode.parentNode;\n\n if (anchorNode.contentEditable == 'true') {\n flag = true;\n }\n\n if (anchorNode == document.body) {\n break;\n }\n }\n\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\n codex.content.editorAreaHightlighted = flag ? false : true;\n }\n\n };\n\n /**\n * Toolbar button click handler\n * @param this - cursor to the button\n */\n callbacks.toolbarButtonClicked = function (event) {\n\n var button = this;\n\n codex.toolbar.current = button.dataset.type;\n\n codex.toolbar.toolbox.toolClicked(event);\n codex.toolbar.close();\n\n };\n\n callbacks.redactorInputEvent = function (event) {\n\n /**\n * Clear previous sync-timeout\n */\n if (this.redactorSyncTimeout){\n clearTimeout(this.redactorSyncTimeout);\n }\n\n /**\n * Start waiting to input finish and sync redactor\n */\n this.redactorSyncTimeout = setTimeout(function() {\n\n codex.content.sync();\n\n }, 500);\n\n };\n\n /** Show or Hide toolbox when plus button is clicked */\n callbacks.plusButtonClicked = function() {\n\n if (!codex.nodes.toolbox.classList.contains('opened')) {\n\n codex.toolbar.toolbox.open();\n\n } else {\n\n codex.toolbar.toolbox.close();\n\n }\n };\n\n /**\n * Block handlers for KeyDown events\n */\n callbacks.blockKeydown = function(event, block) {\n\n switch (event.keyCode){\n\n case codex.core.keys.DOWN:\n case codex.core.keys.RIGHT:\n codex.callback.blockRightOrDownArrowPressed(block);\n break;\n\n case codex.core.keys.BACKSPACE:\n codex.callback.backspacePressed(block);\n break;\n\n case codex.core.keys.UP:\n case codex.core.keys.LEFT:\n codex.callback.blockLeftOrUpArrowPressed(block);\n break;\n\n }\n };\n\n /**\n * RIGHT or DOWN keydowns on block\n */\n callbacks.blockRightOrDownArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /** Looking for closest (parent) contentEditable element of focused node */\n while (focusedNode.contentEditable != 'true') {\n\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent)\n {\n codex.caret.setToNextBlock(editableElementIndex);\n return;\n }\n\n /**\n * Do nothing when caret doesn not reaches the end of last child\n */\n var caretInLastChild = false,\n caretAtTheEndOfText = false;\n\n var lastChild,\n deepestTextnode;\n\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\n\n if (codex.core.isDomNode(lastChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\n\n } else {\n\n deepestTextnode = lastChild;\n\n }\n\n caretInLastChild = selection.anchorNode == deepestTextnode;\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\n\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\n codex.core.log('arrow [down|right] : caret does not reached the end');\n return false;\n }\n\n codex.caret.setToNextBlock(editableElementIndex);\n\n };\n\n /**\n * LEFT or UP keydowns on block\n */\n callbacks.blockLeftOrUpArrowPressed = function (block) {\n\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n /** Check for caret existance */\n if (!focusedNode){\n return false;\n }\n\n /**\n * LEFT or UP not at the beginning\n */\n if ( selection.anchorOffset !== 0) {\n return false;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n /**\n * Do nothing if caret is not at the beginning of first child\n */\n var caretInFirstChild = false,\n caretAtTheBeginning = false;\n\n var firstChild,\n deepestTextnode;\n\n /**\n * Founded contentEditable element doesn't have childs\n * Or maybe New created block\n */\n if (!focusedNode.textContent) {\n codex.caret.setToPreviousBlock(editableElementIndex);\n return;\n }\n\n firstChild = focusedNode.childNodes[0];\n\n if (codex.core.isDomNode(firstChild)) {\n\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\n\n } else {\n\n deepestTextnode = firstChild;\n\n }\n\n caretInFirstChild = selection.anchorNode == deepestTextnode;\n caretAtTheBeginning = selection.anchorOffset === 0;\n\n if ( caretInFirstChild && caretAtTheBeginning ) {\n\n codex.caret.setToPreviousBlock(editableElementIndex);\n\n }\n\n };\n\n /**\n * Callback for enter key pressing in first-level block area\n */\n callbacks.enterPressedOnBlock = function (event) {\n\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\n\n codex.content.insertBlock({\n type : NEW_BLOCK_TYPE,\n block : codex.tools[NEW_BLOCK_TYPE].render()\n }, true );\n\n codex.toolbar.move();\n codex.toolbar.open();\n\n };\n\n callbacks.backspacePressed = function (block) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n range,\n selectionLength,\n firstLevelBlocksCount;\n\n if (block.textContent.trim()) {\n\n range = codex.content.getRange();\n selectionLength = range.endOffset - range.startOffset;\n\n\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\n\n codex.content.mergeBlocks(currentInputIndex);\n\n } else {\n\n return;\n\n }\n }\n\n if (!selectionLength) {\n block.remove();\n }\n\n\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\n\n /**\n * If all blocks are removed\n */\n if (firstLevelBlocksCount === 0) {\n\n /** update currentNode variable */\n codex.content.currentNode = null;\n\n /** Inserting new empty initial block */\n codex.ui.addInitialBlock();\n\n /** Updating inputs state after deleting last block */\n codex.ui.saveInputs();\n\n /** Set to current appended block */\n setTimeout(function () {\n\n codex.caret.setToPreviousBlock(1);\n\n }, 10);\n\n } else {\n\n if (codex.caret.inputIndex !== 0) {\n\n /** Target block is not first */\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\n\n } else {\n\n /** If we try to delete first block */\n codex.caret.setToNextBlock(codex.caret.inputIndex);\n\n }\n }\n\n codex.toolbar.move();\n\n if (!codex.toolbar.opened) {\n codex.toolbar.open();\n }\n\n /** Updating inputs state */\n codex.ui.saveInputs();\n\n /** Prevent default browser behaviour */\n event.preventDefault();\n\n };\n\n /**\n * @deprecated\n *\n * @param event\n */\n callbacks.blockPaste = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\n node = codex.state.inputs[currentInputIndex];\n\n setTimeout(function() {\n\n codex.content.sanitize(node);\n\n event.preventDefault();\n\n }, 10);\n\n event.stopImmediatePropagation();\n\n };\n\n /**\n * This method is used to observe pasted dirty data.\n *\n * Mutation handlers send to separate observers each mutation (added, changed and so on), which will be\n * passed from handler that sanitizes and replaces data.\n *\n * Probably won't be used\n *\n * @deprecated\n *\n * @param event\n * @private\n */\n callbacks._blockPasteCallback = function(event) {\n\n var currentInputIndex = codex.caret.getCurrentInputIndex();\n\n /**\n * create an observer instance\n */\n var observer = new MutationObserver(codex.callback.handleMutationsOnPaste);\n\n /**\n * configuration of the observer:\n */\n var config = {\n attributes: true,\n childList: false,\n characterData: false,\n subtree : true\n };\n\n // pass in the target node, as well as the observer options\n observer.observe(codex.state.inputs[currentInputIndex], config);\n };\n\n /**\n * This method prevents default behaviour.\n *\n * We get from clipboard pasted data, sanitize, make a fragment that contains of this sanitized nodes.\n * Firstly, we need to memorize the caret position. We can do that by getting the range of selection.\n * After all, we insert clear fragment into caret placed position. Then, we should move the caret to the last node\n *\n * @param event\n */\n callbacks.blockPasteCallback = function(event) {\n\n /** Prevent default behaviour */\n event.preventDefault();\n\n /** get html pasted data - dirty data */\n var data = event.clipboardData.getData('text/html');\n\n /** Temporary DIV that is used to work with childs as arrays item */\n var div = codex.draw.node('DIV', '', {}),\n cleaner = new codex.sanitizer.init(codex.sanitizer.Config.BASIC),\n cleanData,\n fragment;\n\n /** Create fragment, that we paste to range after proccesing */\n fragment = document.createDocumentFragment();\n\n cleanData = cleaner.clean(data);\n\n div.innerHTML = cleanData;\n\n var node, lastNode;\n\n /**\n * and fill in fragment\n */\n while (( node = div.firstChild) ) {\n lastNode = fragment.appendChild(node);\n }\n\n /**\n * work with selection and range\n */\n var selection, range;\n selection = window.getSelection();\n\n range = selection.getRangeAt(0);\n range.deleteContents();\n\n range.insertNode(fragment);\n\n /** Preserve the selection */\n if (lastNode) {\n range = range.cloneRange();\n range.setStartAfter(lastNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n };\n\n /**\n * Sends all mutations to paste handler\n */\n callbacks.handleMutationsOnPaste = function(mutations) {\n\n var self = this;\n\n /**\n * Calling function with context of this function.\n * Also, we should sanitize pasted or changed data one time and ignore\n * changings which makes sanitize method.\n * For that, we need to send Context, MutationObserver.__proto__ that contains\n * observer disconnect method.\n */\n mutations.forEach(function(mutation) {\n codex.content.paste.call(self, mutation);\n });\n };\n\n /**\n * Clicks on block settings button\n */\n callbacks.showSettingsButtonClicked = function(){\n\n /**\n * Get type of current block\n * It uses to append settings from tool.settings property.\n * ...\n * Type is stored in data-type attribute on block\n */\n var currentToolType = codex.content.currentNode.dataset.tool;\n\n codex.toolbar.settings.toggle(currentToolType);\n\n /** Close toolbox when settings button is active */\n codex.toolbar.toolbox.close();\n codex.toolbar.settings.hideRemoveActions();\n\n };\n\n return callbacks;\n\n})({});\n\nmodule.exports = callbacks;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\n * Codex Editor Draw module\n *\n * @author Codex Team\n * @version 1.0.\n */\n\nvar draw = (function(draw) {\n\n /**\n * Base editor wrapper\n */\n draw.wrapper = function () {\n\n var wrapper = document.createElement('div');\n\n wrapper.className += 'codex-editor';\n\n return wrapper;\n\n };\n\n /**\n * Content-editable holder\n */\n draw.redactor = function () {\n\n var redactor = document.createElement('div');\n\n redactor.className += 'ce-redactor';\n\n return redactor;\n\n };\n\n draw.ceBlock = function() {\n\n var block = document.createElement('DIV');\n\n block.className += 'ce_block';\n\n return block;\n\n };\n\n /**\n * Empty toolbar with toggler\n */\n draw.toolbar = function () {\n\n var bar = document.createElement('div');\n\n bar.className += 'ce-toolbar';\n\n return bar;\n };\n\n draw.toolbarContent = function() {\n\n var wrapper = document.createElement('DIV');\n wrapper.classList.add('ce-toolbar__content');\n\n return wrapper;\n };\n\n /**\n * Inline toolbar\n */\n draw.inlineToolbar = function() {\n\n var bar = document.createElement('DIV');\n\n bar.className += 'ce-toolbar-inline';\n\n return bar;\n\n };\n\n /**\n * Wrapper for inline toobar buttons\n */\n draw.inlineToolbarButtons = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__buttons';\n\n return wrapper;\n };\n\n /**\n * For some actions\n */\n draw.inlineToolbarActions = function() {\n\n var wrapper = document.createElement('DIV');\n\n wrapper.className += 'ce-toolbar-inline__actions';\n\n return wrapper;\n\n };\n\n draw.inputForLink = function() {\n\n var input = document.createElement('INPUT');\n\n input.type = 'input';\n input.className += 'inputForLink';\n input.placeholder = 'Type URL ...';\n input.setAttribute('form', 'defaultForm');\n\n input.setAttribute('autofocus', 'autofocus');\n\n return input;\n\n };\n\n /**\n * Block with notifications\n */\n draw.alertsHolder = function() {\n\n var block = document.createElement('div');\n\n block.classList.add('ce_notifications-block');\n\n return block;\n\n };\n\n /**\n * @todo Desc\n */\n draw.blockButtons = function() {\n\n var block = document.createElement('div');\n\n block.className += 'ce-toolbar__actions';\n\n return block;\n };\n\n /**\n * Block settings panel\n */\n draw.blockSettings = function () {\n\n var settings = document.createElement('div');\n\n settings.className += 'ce-settings';\n\n return settings;\n };\n\n draw.defaultSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_default');\n\n return div;\n };\n\n draw.pluginsSettings = function() {\n\n var div = document.createElement('div');\n\n div.classList.add('ce-settings_plugin');\n\n return div;\n\n };\n\n draw.plusButton = function() {\n\n var button = document.createElement('span');\n\n button.className = 'ce-toolbar__plus';\n // button.innerHTML = '';\n\n return button;\n };\n\n /**\n * Settings button in toolbar\n */\n draw.settingsButton = function () {\n\n var toggler = document.createElement('span');\n\n toggler.className = 'ce-toolbar__settings-btn';\n\n /** Toggler button*/\n toggler.innerHTML = '';\n\n return toggler;\n };\n\n /**\n * Redactor tools wrapper\n */\n\n draw.toolbox = function() {\n\n var wrapper = document.createElement('div');\n\n wrapper.className = 'ce-toolbar__tools';\n\n return wrapper;\n };\n\n /**\n * @protected\n *\n * Draws tool buttons for toolbox\n *\n * @param {String} type\n * @param {String} classname\n * @returns {Element}\n */\n draw.toolbarButton = function (type, classname) {\n\n var button = document.createElement(\"li\"),\n tool_icon = document.createElement(\"i\"),\n tool_title = document.createElement(\"span\");\n\n button.dataset.type = type;\n button.setAttribute('title', type);\n\n tool_icon.classList.add(classname);\n tool_title.classList.add('ce_toolbar_tools--title');\n\n\n button.appendChild(tool_icon);\n button.appendChild(tool_title);\n\n return button;\n\n };\n\n /**\n * @protected\n *\n * Draws tools for inline toolbar\n *\n * @param {String} type\n * @param {String} classname\n */\n draw.toolbarButtonInline = function(type, classname) {\n var button = document.createElement(\"BUTTON\"),\n tool_icon = document.createElement(\"I\");\n\n button.type = \"button\";\n button.dataset.type = type;\n tool_icon.classList.add(classname);\n\n button.appendChild(tool_icon);\n\n return button;\n };\n\n /**\n * Redactor block\n */\n draw.block = function (tagName, content) {\n\n var node = document.createElement(tagName);\n\n node.innerHTML = content || '';\n\n return node;\n\n };\n\n /**\n * Creates Node with passed tagName and className\n * @param {string} tagName\n * @param {string} className\n * @param {object} properties - allow to assign properties\n */\n draw.node = function( tagName , className , properties ){\n\n var el = document.createElement( tagName );\n\n if ( className ) el.className = className;\n\n if ( properties ) {\n\n for (var name in properties){\n el[name] = properties[name];\n }\n }\n\n return el;\n };\n\n draw.pluginsRender = function(type, content) {\n\n return {\n type : type,\n block : cEditor.tools[type].render({\n text : content\n })\n };\n };\n\n return draw;\n\n})({});\n\nmodule.exports = draw;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\n * Codex Editor Caret Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar caret = (function(caret) {\n\n /**\n * @var {int} InputIndex - editable element in DOM\n */\n caret.inputIndex = null;\n\n /**\n * @var {int} offset - caret position in a text node.\n */\n caret.offset = null;\n\n /**\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\n */\n caret.focusedNodeIndex = null;\n\n /**\n * Creates Document Range and sets caret to the element.\n * @protected\n * @uses caret.save — if you need to save caret position\n * @param {Element} el - Changed Node.\n */\n caret.set = function( el , index, offset) {\n\n offset = offset || this.offset || 0;\n index = index || this.focusedNodeIndex || 0;\n\n var childs = el.childNodes,\n nodeToSet;\n\n if ( childs.length === 0 ) {\n\n nodeToSet = el;\n\n } else {\n\n nodeToSet = childs[index];\n\n }\n\n /** If Element is INPUT */\n if (el.tagName == 'INPUT') {\n el.focus();\n return;\n }\n\n if (codex.core.isDomNode(nodeToSet)) {\n\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\n }\n\n var range = document.createRange(),\n selection = window.getSelection();\n\n setTimeout(function() {\n\n range.setStart(nodeToSet, offset);\n range.setEnd(nodeToSet, offset);\n\n selection.removeAllRanges();\n selection.addRange(range);\n\n codex.caret.saveCurrentInputIndex();\n\n }, 20);\n };\n\n /**\n * @protected\n * Updates index of input and saves it in caret object\n */\n caret.saveCurrentInputIndex = function () {\n\n /** Index of Input that we paste sanitized content */\n var selection = window.getSelection(),\n inputs = codex.state.inputs,\n focusedNode = selection.anchorNode,\n focusedNodeHolder;\n\n if (!focusedNode){\n return;\n }\n\n /** Looking for parent contentEditable block */\n while (focusedNode.contentEditable != 'true') {\n focusedNodeHolder = focusedNode.parentNode;\n focusedNode = focusedNodeHolder;\n }\n\n /** Input index in DOM level */\n var editableElementIndex = 0;\n\n while (focusedNode != inputs[editableElementIndex]) {\n editableElementIndex ++;\n }\n\n this.inputIndex = editableElementIndex;\n };\n\n /**\n * Returns current input index (caret object)\n */\n caret.getCurrentInputIndex = function() {\n return this.inputIndex;\n };\n\n /**\n * @param {int} index - index of first-level block after that we set caret into next input\n */\n caret.setToNextBlock = function(index) {\n\n var inputs = codex.state.inputs,\n nextInput = inputs[index + 1];\n\n if (!nextInput) {\n codex.core.log('We are reached the end');\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!nextInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n nextInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index + 1;\n codex.caret.set(nextInput, 0, 0);\n codex.content.workingNodeChanged(nextInput);\n\n };\n\n /**\n * @param {int} index - index of target input.\n * Sets caret to input with this index\n */\n caret.setToBlock = function(index) {\n\n var inputs = codex.state.inputs,\n targetInput = inputs[index];\n\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\n\n if ( !targetInput ) {\n return;\n }\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!targetInput.childNodes.length) {\n var emptyTextElement = document.createTextNode('');\n targetInput.appendChild(emptyTextElement);\n }\n\n codex.caret.inputIndex = index;\n codex.caret.set(targetInput, 0, 0);\n codex.content.workingNodeChanged(targetInput);\n\n };\n\n /**\n * @param {int} index - index of input\n */\n caret.setToPreviousBlock = function(index) {\n\n index = index || 0;\n\n var inputs = codex.state.inputs,\n previousInput = inputs[index - 1],\n lastChildNode,\n lengthOfLastChildNode,\n emptyTextElement;\n\n\n if (!previousInput) {\n codex.core.log('We are reached first node');\n return;\n }\n\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\n lengthOfLastChildNode = lastChildNode.length;\n\n /**\n * When new Block created or deleted content of input\n * We should add some text node to set caret\n */\n if (!previousInput.childNodes.length) {\n\n emptyTextElement = document.createTextNode('');\n previousInput.appendChild(emptyTextElement);\n }\n codex.caret.inputIndex = index - 1;\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\n codex.content.workingNodeChanged(inputs[index - 1]);\n };\n\n caret.position = {\n\n atStart : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode,\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\n pluginsRender = firstLevelBlock.childNodes[0];\n\n if (!codex.core.isDomNode(anchorNode)) {\n anchorNode = anchorNode.parentNode;\n }\n\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\n isOffsetZero = anchorOffset === 0;\n\n return isFirstNode && isOffsetZero;\n\n },\n\n atTheEnd : function() {\n\n var selection = window.getSelection(),\n anchorOffset = selection.anchorOffset,\n anchorNode = selection.anchorNode;\n\n /** Caret is at the end of input */\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\n }\n };\n\n return caret;\n\n})({});\n\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\n * Codex Editor Notification Module\n *\n * @author Codex Team\n * @version 1.0\n */\n\nvar notifications = (function(notifications) {\n\n /**\n * Error notificator. Shows block with message\n * @protected\n */\n notifications.errorThrown = function(errorMsg, event) {\n\n codex.notifications.send('This action is not available currently', event.type, false);\n\n };\n\n /**\n * Appends notification with different types\n * @param message {string} - Error or alert message\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\n * @param append {boolean} - can be True or False when notification should be inserted after\n */\n notifications.send = function(message, type, append) {\n\n var notification = codex.draw.block('div');\n\n notification.textContent = message;\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\n\n if (!append) {\n codex.nodes.notifications.innerHTML = '';\n }\n\n codex.nodes.notifications.appendChild(notification);\n\n setTimeout(function () {\n notification.remove();\n }, 3000);\n\n };\n\n return notifications;\n\n})({});\n\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\n * Codex Editor Parser Module\n *\n * @author Codex Team\n * @version 1.1\n */\n\nvar parser = (function(parser) {\n\n /** inserting text */\n parser.insertPastedContent = function(blockType, tag) {\n\n codex.content.insertBlock({\n type : blockType.type,\n block : blockType.render({\n text : tag.innerHTML\n })\n });\n\n };\n\n /**\n * Check DOM node for display style: separated block or child-view\n */\n parser.isFirstLevelBlock = function (node) {\n\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\n\n };\n\n return parser;\n\n})({});\n\nmodule.exports = parser;\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js","/**\n * Codex Sanitizer\n */\n\nvar janitor = require('html-janitor');\n\nvar sanitizer = (function(sanitizer) {\n\n /**\n * Basic config\n */\n var Config = {\n\n BASIC : {\n\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: 'nofollow'\n },\n ul: {},\n i: {},\n b: {},\n strong: {},\n em: {},\n span: {}\n }\n }\n };\n\n sanitizer.Config = Config;\n\n sanitizer.init = janitor;\n\n return sanitizer;\n\n})({});\n\nmodule.exports = sanitizer;\n\n\n\n\n\n// WEBPACK FOOTER //\n// ./modules/sanitizer.js","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('html-janitor', factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.HTMLJanitor = factory();\n }\n}(this, function () {\n\n /**\n * @param {Object} config.tags Dictionary of allowed tags.\n * @param {boolean} config.keepNestedBlockElements Default false.\n */\n function HTMLJanitor(config) {\n\n var tagDefinitions = config['tags'];\n var tags = Object.keys(tagDefinitions);\n\n var validConfigValues = tags\n .map(function(k) { return typeof tagDefinitions[k]; })\n .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });\n\n if(!validConfigValues) {\n throw new Error(\"The configuration was invalid\");\n }\n\n this.config = config;\n }\n\n // TODO: not exhaustive?\n var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];\n function isBlockElement(node) {\n return blockElementNames.indexOf(node.nodeName) !== -1;\n }\n\n var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];\n function isInlineElement(node) {\n return inlineElementNames.indexOf(node.nodeName) !== -1;\n }\n\n HTMLJanitor.prototype.clean = function (html) {\n var sandbox = document.createElement('div');\n sandbox.innerHTML = html;\n\n this._sanitize(sandbox);\n\n return sandbox.innerHTML;\n };\n\n HTMLJanitor.prototype._sanitize = function (parentNode) {\n var treeWalker = createTreeWalker(parentNode);\n var node = treeWalker.firstChild();\n if (!node) { return; }\n\n do {\n // Ignore nodes that have already been sanitized\n if (node._sanitized) {\n continue;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // If this text node is just whitespace and the previous or next element\n // sibling is a block element, remove it\n // N.B.: This heuristic could change. Very specific to a bug with\n // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output\n // FIXME: make this an option?\n if (node.data.trim() === ''\n && ((node.previousElementSibling && isBlockElement(node.previousElementSibling))\n || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n } else {\n continue;\n }\n }\n\n // Remove all comments\n if (node.nodeType === Node.COMMENT_NODE) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n }\n\n var isInline = isInlineElement(node);\n var containsBlockElement;\n if (isInline) {\n containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);\n }\n\n // Block elements should not be nested (e.g.

  • ...); if\n // they are, we want to unwrap the inner block element.\n var isNotTopContainer = !! parentNode.parentNode;\n var isNestedBlockElement =\n isBlockElement(parentNode) &&\n isBlockElement(node) &&\n isNotTopContainer;\n\n var nodeName = node.nodeName.toLowerCase();\n\n var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);\n\n var isInvalid = isInline && containsBlockElement;\n\n // Drop tag entirely according to the whitelist *and* if the markup\n // is invalid.\n if (isInvalid || shouldRejectNode(node, allowedAttrs)\n || (!this.config.keepNestedBlockElements && isNestedBlockElement)) {\n // Do not keep the inner text of SCRIPT/STYLE elements.\n if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {\n while (node.childNodes.length > 0) {\n parentNode.insertBefore(node.childNodes[0], node);\n }\n }\n parentNode.removeChild(node);\n\n this._sanitize(parentNode);\n break;\n }\n\n // Sanitize attributes\n for (var a = 0; a < node.attributes.length; a += 1) {\n var attr = node.attributes[a];\n\n if (shouldRejectAttr(attr, allowedAttrs, node)) {\n node.removeAttribute(attr.name);\n // Shift the array to continue looping.\n a = a - 1;\n }\n }\n\n // Sanitize children\n this._sanitize(node);\n\n // Mark node as sanitized so it's ignored in future runs\n node._sanitized = true;\n } while ((node = treeWalker.nextSibling()));\n };\n\n function createTreeWalker(node) {\n return document.createTreeWalker(node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,\n null, false);\n }\n\n function getAllowedAttrs(config, nodeName, node){\n if (typeof config.tags[nodeName] === 'function') {\n return config.tags[nodeName](node);\n } else {\n return config.tags[nodeName];\n }\n }\n\n function shouldRejectNode(node, allowedAttrs){\n if (typeof allowedAttrs === 'undefined') {\n return true;\n } else if (typeof allowedAttrs === 'boolean') {\n return !allowedAttrs;\n }\n\n return false;\n }\n\n function shouldRejectAttr(attr, allowedAttrs, node){\n var attrName = attr.name.toLowerCase();\n\n if (allowedAttrs === true){\n return false;\n } else if (typeof allowedAttrs[attrName] === 'function'){\n return !allowedAttrs[attrName](attr.value, node);\n } else if (typeof allowedAttrs[attrName] === 'undefined'){\n return true;\n } else if (allowedAttrs[attrName] === false) {\n return true;\n } else if (typeof allowedAttrs[attrName] === 'string') {\n return (allowedAttrs[attrName] !== attr.value);\n }\n\n return false;\n }\n\n return HTMLJanitor;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/html-janitor/src/html-janitor.js\n// module id = 19\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file diff --git a/example.html b/example.html index d4fbebbf..a7f4c8ed 100644 --- a/example.html +++ b/example.html @@ -53,11 +53,12 @@ paragraph: { type: 'paragraph', iconClassname: 'ce-icon-paragraph', - make: paragraphTool.make, + make: paragraph.make, appendCallback: null, settings: null, - render: paragraphTool.render, - save: paragraphTool.save, + render: paragraph.render, + validate: paragraph.validate, + save: paragraph.save, enableLineBreaks: false, allowedToPaste: true, showInlineToolbar: true @@ -79,43 +80,47 @@ header: { type: 'header', iconClassname: 'ce-icon-header', - make: headerTool.make, - appendCallback: headerTool.appendCallback, - settings: headerTool.makeSettings(), - render: headerTool.render, - save: headerTool.save, - displayInToolbox: true, + make: header.make, + appendCallback: header.appendCallback, + settings: header.makeSettings, + render: header.render, + validate: header.validate, + save: header.save, + displayInToolbox: true // handleTagOnPaste : ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'] }, code: { type: 'code', iconClassname: 'ce-icon-code', - make: codeTool.make, + make: code.make, appendCallback: null, settings: null, - render: codeTool.render, - save: codeTool.save, + render: code.render, + validate: code.validate, + save: code.save, displayInToolbox: true, enableLineBreaks: true }, link: { type: 'link', iconClassname: 'ce-icon-link', - make: linkTool.makeNewBlock, - appendCallback: linkTool.appendCallback, - render: linkTool.render, - save: linkTool.save, + make: link.makeNewBlock, + appendCallback: link.appendCallback, + render: link.render, + validate: link.validate, + save: link.save, displayInToolbox: true, enableLineBreaks: true }, list: { type: 'list', iconClassname: 'ce-icon-list-bullet', - make: listTool.make, + make: list.make, appendCallback: null, - settings: listTool.makeSettings(), - render: listTool.render, - save: listTool.save, + settings: list.makeSettings, + render: list.render, + validate: list.validate, + save: list.save, displayInToolbox: true, showInlineToolbar: true, enableLineBreaks: true @@ -123,11 +128,12 @@ quote: { type: 'quote', iconClassname: 'ce-icon-quote', - make: quoteTools.makeBlockToAppend, + make: quote.makeBlockToAppend, appendCallback: null, - settings: quoteTools.makeSettings(), - render: quoteTools.render, - save: quoteTools.save, + settings: quote.makeSettings, + render: quote.render, + validate: quote.validate, + save: quote.save, displayInToolbox: true, enableLineBreaks: true, showInlineToolbar: true, @@ -136,11 +142,11 @@ image: { type: 'image', iconClassname: 'ce-icon-picture', - make: ceImage.make, - appendCallback: ceImage.appendCallback, - settings: ceImage.makeSettings(), - render: ceImage.render, - save: ceImage.save, + make: image.make, + appendCallback: image.appendCallback, + settings: image.makeSettings, + render: image.render, + save: image.save, isStretched: true, displayInToolbox: true, enableLineBreaks: false @@ -148,12 +154,13 @@ instagram: { type: 'instagram', iconClassname: 'ce-icon-instagram', - prepare: instagramTool.prepare, - make: instagramTool.make, + prepare: instagram.prepare, + make: instagram.make, appendCallback: null, settings: null, - render: instagramTool.reneder, - save: instagramTool.save, + render: instagram.reneder, + validate: instagram.validate, + save: instagram.save, displayInToolbox: false, enableLineBreaks: false, allowedToPaste: false @@ -161,12 +168,13 @@ twitter: { type: 'twitter', iconClassname: 'ce-icon-twitter', - prepare: twitterTool.prepare, - make: twitterTool.make, + prepare: twitter.prepare, + make: twitter.make, appendCallback: null, settings: null, - render: twitterTool.render, - save: twitterTool.save, + render: twitter.render, + validate: twitter.validate, + save: twitter.save, displayInToolbox: false, enableLineBreaks: false, allowedToPaste: false diff --git a/modules/saver.js b/modules/saver.js index c95a7177..b99efa44 100644 --- a/modules/saver.js +++ b/modules/saver.js @@ -102,12 +102,16 @@ var saver = (function(saver) { data: savedData }; - /** - * Do not allow empty initial plugins block - */ - if (savedData.text.trim() == '' && pluginName == codex.settings.initialBlockPlugin) - return; + if (codex.tools[pluginName].validate) { + var result = codex.tools[pluginName].validate(savedData); + /** + * Do not allow invalid data + */ + if (!result) + return; + } + /** Marks Blocks that will be in main page */ output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE); diff --git a/modules/toolbar/settings.js b/modules/toolbar/settings.js index 5b9a3c6c..ebe7194f 100644 --- a/modules/toolbar/settings.js +++ b/modules/toolbar/settings.js @@ -1,3 +1,9 @@ +/** + * Toolbar settings + * + * @version 1.0.3 + */ + var settings = (function(settings) { settings.init = function() { @@ -20,15 +26,18 @@ var settings = (function(settings) { * Append settings content * It's stored in tool.settings */ - if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) { + if (!codex.tools[toolType] || !codex.tools[toolType].settings ) { codex.core.log(`Plugin «${toolType}» has no settings`, 'warn'); // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`; } else { - codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings); - + /** + * Draw settings block + */ + var settingsBlock = codex.tools[toolType].settings(); + codex.nodes.pluginSettings.appendChild(settingsBlock); } var currentBlock = codex.content.currentNode; diff --git a/package.json b/package.json index f936afce..e3f06e63 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codex.editor", - "version": "1.2.8", + "version": "1.3.0", "description": "Codex Editor. Native JS, based on API and Open Source", "main": "index.js", "scripts": { diff --git a/plugins/code/code.js b/plugins/code/code.js index 3feabcde..ed933856 100644 --- a/plugins/code/code.js +++ b/plugins/code/code.js @@ -2,20 +2,19 @@ * Code Plugin\ * Creates code tag and adds content to this tag */ -var codeTool = { - baseClass : "ce-code", +var code = (function(code) { + + var baseClass = "ce-code"; /** * Make initial header block * @param {object} JSON with block data * @return {Element} element to append */ - make : function (data) { + code.make = function (data) { - var tag = document.createElement('code'); - - tag.classList.add(codeTool.baseClass); + var tag = codex.draw.node('CODE', [baseClass], {}); if (data && data.text) { tag.innerHTML = data.text; @@ -24,31 +23,36 @@ var codeTool = { tag.contentEditable = true; return tag; - - }, + }; /** * Method to render HTML block from JSON */ - render : function (data) { + code.render = function (data) { return codeTool.make(data); - - }, + }; /** * Method to extract JSON data from HTML block */ - save : function (blockContent){ + code.save = function (blockContent){ var data = { - text : null, - }; - - data.text = blockContent.innerHTML; - + text : blockContent.innerHTML + }; return data; - } + }; -}; + code.validate = function(data) { + + if (data.text.trim() == '') + return; + + return true; + }; + + return code; + +})({}); diff --git a/plugins/header/header.js b/plugins/header/header.js index 9b780545..88033566 100644 --- a/plugins/header/header.js +++ b/plugins/header/header.js @@ -2,31 +2,71 @@ * Example of making plugin * H e a d e r */ -var headerTool = { + +var header = (function(header) { + + var methods = { + + /** + * Binds click event to passed button + */ + addSelectTypeClickListener : function (el, type) { + + el.addEventListener('click', function () { + + methods.selectTypeClicked(type); + + }, false); + }, + + /** + * Replaces old header with new type + * @params {string} type - new header tagName: H1—H6 + */ + selectTypeClicked : function (type) { + + var old_header, new_header; + + /** Now current header stored as a currentNode */ + old_header = codex.content.currentNode.querySelector('[contentEditable]'); + + /** Making new header */ + new_header = codex.draw.node(type, ['ce-header'], { innerHTML : old_header.innerHTML }); + new_header.contentEditable = true; + new_header.setAttribute('data-placeholder', 'Heading'); + new_header.dataset.headerData = type; + + codex.content.switchBlock(old_header, new_header, 'header'); + + /** Close settings after replacing */ + codex.toolbar.settings.close(); + } + + }; /** - * Make initial header block - * @param {object} JSON with block data - * @return {Element} element to append - */ - make : function (data) { + * Make initial header block + * @param {object} JSON with block data + * @return {Element} element to append + */ + header.make = function (data) { var availableTypes = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'], tag; if (data && data.type && availableTypes.includes(data.type)) { - tag = document.createElement( data.type ); + tag = codex.draw.node( data.type, [], {} ); /** - * Save header type in data-attr. - * We need it in save method to extract type from HTML to JSON - */ + * Save header type in data-attr. + * We need it in save method to extract type from HTML to JSON + */ tag.dataset.headerData = data.type; } else { - tag = document.createElement( 'H2' ); + tag = codex.draw.node( 'H2', [], {} ); tag.dataset.headerData = 'H2'; } @@ -45,120 +85,76 @@ var headerTool = { return tag; - }, + }; /** - * Method to render HTML block from JSON - */ - render : function (data) { + * Method to render HTML block from JSON + */ + header.render = function (data) { - return headerTool.make(data); + return this.make(data); - }, + }; /** - * Method to extract JSON data from HTML block - */ - save : function (blockContent) { + * Method to extract JSON data from HTML block + */ + header.save = function (blockContent) { var data = { - "heading-styles": blockContent.dataset.headerData, - format:"html", - text : null, - - }; - - data.text = blockContent.textContent; + "heading-styles": blockContent.dataset.headerData, + "format": "html", + "text": blockContent.textContent + }; return data; - - }, + }; /** - * Block appending callback - */ - appendCallback : function (argument) { - + * Block appending callback + */ + header.appendCallback = function (argument) { console.log('header appended...'); - - }, + }; /** - * Settings panel content - * - - - - - - - - - - - - - - * | настройки H1 H2 H3 | - * - - - - - - - - - - - - - - * @return {Element} element contains all settings - */ - makeSettings : function () { + * Settings panel content + * - - - - - - - - - - - - - + * | настройки H1 H2 H3 | + * - - - - - - - - - - - - - + * @return {Element} element contains all settings + */ + header.makeSettings = function () { - var holder = document.createElement('DIV'), + var holder = codex.draw.node('DIV', ['ce_plugin_header--settings'], {} ), types = { - H2: 'Заголовок раздела', - H3: 'Подзаголовок', - H4: 'Заголовок 3-его уровня' - }, + H2: 'Заголовок раздела', + H3: 'Подзаголовок', + H4: 'Заголовок 3-его уровня' + }, selectTypeButton; - /** Add holder classname */ - holder.className = 'ce_plugin_header--settings'; - /** Now add type selectors */ for (var type in types){ - selectTypeButton = document.createElement('SPAN'); - - selectTypeButton.textContent = types[type]; - selectTypeButton.className = 'ce_plugin_header--select_button'; - - this.addSelectTypeClickListener(selectTypeButton, type); - + selectTypeButton = codex.draw.node('SPAN', ['ce_plugin_header--select_button'], { textContent : types[type] }); + methods.addSelectTypeClickListener(selectTypeButton, type); holder.appendChild(selectTypeButton); } return holder; + }; - }, + header.validate = function(data) { - /** - * Binds click event to passed button - */ - addSelectTypeClickListener : function (el, type) { + if (data.text.trim() == '' || data['heading-styles'].trim() == '') + return; - el.addEventListener('click', function () { + return true; + }; - headerTool.selectTypeClicked(type); + return header; - }, false); - }, - - /** - * Replaces old header with new type - * @params {string} type - new header tagName: H1—H6 - */ - selectTypeClicked : function (type) { - - var old_header, new_header; - - /** Now current header stored as a currentNode */ - old_header = codex.content.currentNode.querySelector('[contentEditable]'); - - /** Making new header */ - new_header = document.createElement(type); - - new_header.innerHTML = old_header.innerHTML; - new_header.contentEditable = true; - new_header.setAttribute('data-placeholder', 'Heading'); - new_header.classList.add('ce-header'); - - new_header.dataset.headerData = type; - - codex.content.switchBlock(old_header, new_header, 'header'); - - /** Close settings after replacing */ - codex.toolbar.settings.close(); - } - -}; +})({}); diff --git a/plugins/image/image.js b/plugins/image/image.js index a7d4cfb5..1403babc 100644 --- a/plugins/image/image.js +++ b/plugins/image/image.js @@ -4,72 +4,350 @@ * * @version 1.1.3 */ -var ceImage = { - elementClasses : { +var image = (function(image) { + + var elementClasses = { ce_image : 'ce-image', loading : 'ce-plugin-image__loader', blockStretched: 'ce-block--stretched', uploadedImage : { - centered : 'ce-plugin-image__uploaded--centered', - stretched : 'ce-plugin-image__uploaded--stretched', + centered : 'ce-plugin-image__uploaded--centered', + stretched : 'ce-plugin-image__uploaded--stretched' }, imageCaption : 'ce-plugin-image__caption', imageWrapper : 'ce-plugin-image__wrapper', formHolder : 'ce-plugin-image__holder', - uploadButton : 'ce-plugin-image__button', + uploadButton : 'ce-plugin-image__button' + }; - }, - - holder : null, + var holder = null; /** Default path to redactors images */ - path : '/upload/redactor_images/', + var path = '/upload/redactor_images/'; - make : function ( data ) { + var ui = { - var holder; + holder : function(){ + + var element = document.createElement('DIV'); + + element.classList.add(elementClasses.formHolder); + element.classList.add(elementClasses.ce_image); + + return element; + }, + + uploadButton : function(){ + + var button = document.createElement('SPAN'); + + button.classList.add(elementClasses.uploadButton); + + button.innerHTML = ' '; + button.innerHTML += 'Загрузить фотографию'; + + return button; + + }, + + /** + * @param {string} source - file path + * @param {string} style - css class + * @return {object} image - document IMG tag + */ + image : function(source, style) { + + var image = document.createElement('IMG'); + + image.classList.add(style); + + image.src = source; + + return image; + }, + + wrapper : function() { + + var div = document.createElement('div'); + + div.classList.add(elementClasses.imageWrapper); + + return div; + }, + + caption : function() { + + var div = document.createElement('div'); + + div.classList.add(elementClasses.imageCaption); + div.contentEditable = true; + + return div; + }, + /** + * Draws form for image upload + */ + makeForm : function() { + + var holder = ui.holder(), + uploadButton = ui.uploadButton(); + + holder.appendChild(uploadButton); + + uploadButton.addEventListener('click', methods.uploadButtonClicked, false ); + + holder = holder; + + return holder; + }, + + + /** + * wraps image and caption + * @param {object} data - image information + * @param {string} imageTypeClass - plugin's style + * @param {boolean} stretched - stretched or not + * @return wrapped block with image and caption + */ + makeImage : function(data, imageTypeClass, stretched) { + + var file = data.file.url, + text = data.caption, + type = data.type, + image = ui.image(file, imageTypeClass), + caption = ui.caption(), + wrapper = ui.wrapper(); + + caption.textContent = text; + + wrapper.dataset.stretched = stretched; + /** Appeding to the wrapper */ + wrapper.appendChild(image); + wrapper.appendChild(caption); + + return wrapper; + }, + + /** + * @param {HTML} data - Rendered block with image + */ + getImage : function(data) { + + var image = data.querySelector('.' + elementClasses.uploadedImage.centered) || + data.querySelector('.' + elementClasses.uploadedImage.stretched); + + return image; + }, + + /** + * wraps image and caption + * @deprecated + * @param {object} data - image information + * @return wrapped block with image and caption + */ + centeredImage : function(data) { + + var file = data.file.url, + text = data.caption, + type = data.type, + image = ui.image(file, elementClasses.uploadedImage.centered), + caption = ui.caption(), + wrapper = ui.wrapper(); + + caption.textContent = text; + + wrapper.dataset.stretched = 'false'; + + /** Appeding to the wrapper */ + wrapper.appendChild(image); + wrapper.appendChild(caption); + + return wrapper; + }, + + /** + * wraps image and caption + * @deprecated + * @param {object} data - image information + * @return stretched image + */ + stretchedImage : function(data) { + + var file = data.file.url, + text = data.caption, + type = data.type, + image = ui.image(file, elementClasses.uploadedImage.stretched), + caption = ui.caption(), + wrapper = ui.wrapper(); + + caption.textContent = text; + + wrapper.dataset.stretched = 'true'; + /** Appeding to the wrapper */ + wrapper.appendChild(image); + wrapper.appendChild(caption); + + return wrapper; + + } + }; + + var methods = { + + uploadButtonClicked : function(event) { + + /** Define callbacks */ + codex.transport.selectAndUpload({ + beforeSend: photoUploadingCallbacks.beforeSend, + success: photoUploadingCallbacks.success, + error: photoUploadingCallbacks.error + }); + }, + + addSelectTypeClickListener : function(el, type) { + + el.addEventListener('click', function() { + + methods.selectTypeClicked(type); + + }, false); + + }, + + selectTypeClicked : function(type) { + + var current = codex.content.currentNode, + blockContent = current.childNodes[0], + image = ui.getImage(current), + wrapper = current.querySelector('.' + elementClasses.imageWrapper); + + /** Clear classList */ + current.className = ''; + image.className = ''; + + /** Add important first-level class ce_block */ + current.classList.add(codex.ui.className.BLOCK_CLASSNAME); + + if (type === 'stretched') { + + image.classList.add(elementClasses.uploadedImage.stretched); + + blockContent.classList.add(elementClasses.blockStretched); + + /** Setting dataset for saver */ + wrapper.dataset.stretched = true; + + } else if (type === 'centered') { + + image.classList.add(elementClasses.uploadedImage.centered); + + blockContent.classList.remove(elementClasses.blockStretched); + + /** Setting dataset for saver */ + wrapper.dataset.stretched = false; + } + } + }; + + var photoUploadingCallbacks = { + + /** Before sending ajax request */ + beforeSend : function() { + holder.classList.add(elementClasses.loading); + }, + + /** Photo was uploaded successfully */ + success : function(result) { + + var parsed = JSON.parse(result), + data, + currentBlock = codex.content.currentNode, + imageReady; + + /** + * Preparing {Object} data to draw an image + * @uses make method + */ + data = { + background : false, + border : false, + isStretch : false, + file : { + url : path + 'o_' + parsed.filename, + bigUrl : null, + width : null, + height : null, + additionalData : null + }, + caption : '', + cover : null + }; + + imageReady = image.make(data); + + /** + * If current block is empty, we can replace it to uploaded image + * Or insert new block + */ + codex.content.switchBlock(holder, imageReady, 'image'); + }, + + /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ + error : function(result) { + console.log('Choosen file is not an image or image is corrupted'); + codex.notifications.errorThrown(); + } + + }; + + /** + * Public method + */ + image.make = function ( data ) { + + var imageHolder; if (data) { if ( data.isStretch !== 'true') { - holder = ceImage.ui.makeImage(data, ceImage.elementClasses.uploadedImage.centered, 'false'); + imageHolder = ui.makeImage(data, elementClasses.uploadedImage.centered, 'false'); } else { - holder = ceImage.ui.makeImage(data, ceImage.elementClasses.uploadedImage.stretched, 'true'); + imageHolder = ui.makeImage(data, elementClasses.uploadedImage.stretched, 'true'); } - return holder; - } else { - holder = ceImage.ui.makeForm(); + imageHolder = ui.makeForm(); - return holder; } - }, + + holder = imageHolder; + return imageHolder; + }; /** * this tool works when tool is clicked in toolbox */ - appendCallback : function(event) { + image.appendCallback = function(event) { /** Upload image and call success callback*/ - ceImage.uploadButtonClicked(event); + methods.uploadButtonClicked(event); - }, + }; /** - * Settings panel content - * @return {Element} element contains all settings - */ - makeSettings : function () { + * Settings panel content + * @return {Element} element contains all settings + */ + image.makeSettings = function () { var holder = document.createElement('DIV'), types = { - centered : 'По центру', - stretched : 'На всю ширину', - }, + centered : 'По центру', + stretched : 'На всю ширину' + }, selectTypeButton; /** Add holder classname */ @@ -83,7 +361,7 @@ var ceImage = { selectTypeButton.textContent = types[type]; selectTypeButton.className = 'ce_plugin_image--select_button'; - this.addSelectTypeClickListener(selectTypeButton, type); + methods.addSelectTypeClickListener(selectTypeButton, type); holder.appendChild(selectTypeButton); @@ -91,62 +369,18 @@ var ceImage = { return holder; - }, + }; - addSelectTypeClickListener : function(el, type) { + image.render = function( data ) { - el.addEventListener('click', function() { + return image.make(data); + }; - ceImage.selectTypeClicked(type); - - }, false); - - }, - - selectTypeClicked : function(type) { - - var current = codex.content.currentNode, - blockContent = current.childNodes[0], - image = ceImage.ui.getImage(current), - wrapper = current.querySelector('.' + ceImage.elementClasses.imageWrapper); - - /** Clear classList */ - current.className = ''; - image.className = ''; - - /** Add important first-level class ce_block */ - current.classList.add(codex.ui.className.BLOCK_CLASSNAME); - - if (type === 'stretched') { - - image.classList.add(ceImage.elementClasses.uploadedImage.stretched); - - blockContent.classList.add(ceImage.elementClasses.blockStretched); - - /** Setting dataset for saver */ - wrapper.dataset.stretched = true; - - } else if (type === 'centered') { - - image.classList.add(ceImage.elementClasses.uploadedImage.centered); - - blockContent.classList.remove(ceImage.elementClasses.blockStretched); - - /** Setting dataset for saver */ - wrapper.dataset.stretched = false; - } - }, - - render : function( data ) { - - return this.make(data); - }, - - save : function ( block ) { + image.save = function ( block ) { var content = block, - image = ceImage.ui.getImage(content), - caption = content.querySelector('.' + ceImage.elementClasses.imageCaption); + image = ui.getImage(content), + caption = content.querySelector('.' + elementClasses.imageCaption); var data = { background : false, @@ -157,246 +391,15 @@ var ceImage = { bigUrl : null, width : image.width, height : image.height, - additionalData :null, + additionalData :null }, caption : caption.textContent, - cover : null, + cover : null }; return data; - }, + }; - uploadButtonClicked : function(event) { + return image; - var beforeSend = ceImage.photoUploadingCallbacks.beforeSend, - success = ceImage.photoUploadingCallbacks.success, - error = ceImage.photoUploadingCallbacks.error; - - /** Define callbacks */ - codex.transport.selectAndUpload({ - beforeSend, - success, - error, - }); - }, - -}; - -ceImage.ui = { - - holder : function(){ - - var element = document.createElement('DIV'); - - element.classList.add(ceImage.elementClasses.formHolder); - element.classList.add(ceImage.elementClasses.ce_image); - - return element; - }, - - uploadButton : function(){ - - var button = document.createElement('SPAN'); - - button.classList.add(ceImage.elementClasses.uploadButton); - - button.innerHTML = ' '; - button.innerHTML += 'Загрузить фотографию'; - - return button; - - }, - - /** - * @param {string} source - file path - * @param {string} style - css class - * @return {object} image - document IMG tag - */ - image : function(source, style) { - - var image = document.createElement('IMG'); - - image.classList.add(style); - - image.src = source; - - return image; - }, - - wrapper : function() { - - var div = document.createElement('div'); - - div.classList.add(ceImage.elementClasses.imageWrapper); - - return div; - }, - - caption : function() { - - var div = document.createElement('div'); - - div.classList.add(ceImage.elementClasses.imageCaption); - div.contentEditable = true; - - return div; - }, - /** - * Draws form for image upload - */ - makeForm : function() { - - var holder = ceImage.ui.holder(), - uploadButton = ceImage.ui.uploadButton(); - - holder.appendChild(uploadButton); - - uploadButton.addEventListener('click', ceImage.uploadButtonClicked, false ); - - ceImage.holder = holder; - - return holder; - }, - - - /** - * wraps image and caption - * @param {object} data - image information - * @param {string} imageTypeClass - plugin's style - * @param {boolean} stretched - stretched or not - * @return wrapped block with image and caption - */ - makeImage : function(data, imageTypeClass, stretched) { - - var file = data.file.url, - text = data.caption, - type = data.type, - image = ceImage.ui.image(file, imageTypeClass), - caption = ceImage.ui.caption(), - wrapper = ceImage.ui.wrapper(); - - caption.textContent = text; - - wrapper.dataset.stretched = stretched; - /** Appeding to the wrapper */ - wrapper.appendChild(image); - wrapper.appendChild(caption); - - return wrapper; - }, - - /** - * @param {HTML} data - Rendered block with image - */ - getImage : function(data) { - - var image = data.querySelector('.' + ceImage.elementClasses.uploadedImage.centered) || - data.querySelector('.' + ceImage.elementClasses.uploadedImage.stretched); - - return image; - }, - - /** - * wraps image and caption - * @deprecated - * @param {object} data - image information - * @return wrapped block with image and caption - */ - centeredImage : function(data) { - - var file = data.file.url, - text = data.caption, - type = data.type, - image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.centered), - caption = ceImage.ui.caption(), - wrapper = ceImage.ui.wrapper(); - - caption.textContent = text; - - wrapper.dataset.stretched = 'false'; - - /** Appeding to the wrapper */ - wrapper.appendChild(image); - wrapper.appendChild(caption); - - return wrapper; - }, - - /** - * wraps image and caption - * @deprecated - * @param {object} data - image information - * @return stretched image - */ - stretchedImage : function(data) { - - var file = data.file.url, - text = data.caption, - type = data.type, - image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.stretched), - caption = ceImage.ui.caption(), - wrapper = ceImage.ui.wrapper(); - - caption.textContent = text; - - wrapper.dataset.stretched = 'true'; - /** Appeding to the wrapper */ - wrapper.appendChild(image); - wrapper.appendChild(caption); - - return wrapper; - - } - -}; - -ceImage.photoUploadingCallbacks = { - - /** Before sending ajax request */ - beforeSend : function() { - ceImage.holder.classList.add(ceImage.elementClasses.loading); - }, - - /** Photo was uploaded successfully */ - success : function(result) { - - var parsed = JSON.parse(result), - data, - currentBlock = codex.content.currentNode, - image; - - /** - * Preparing {Object} data to draw an image - * @uses ceImage.make method - */ - data = { - background : false, - border : false, - isStretch : false, - file : { - url : ceImage.path + 'o_' + parsed.filename, - bigUrl : null, - width : null, - height : null, - additionalData : null, - }, - caption : '', - cover : null, - }; - - image = ceImage.make(data); - - /** - * If current block is empty, we can replace it to uploaded image - * Or insert new block - */ - codex.content.switchBlock(ceImage.holder, image, 'image'); - }, - - /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ - error : function(result) { - console.log('Choosen file is not an image or image is corrupted'); - codex.notifications.errorThrown(); - } - -}; \ No newline at end of file +})({}); \ No newline at end of file diff --git a/plugins/images/images.css b/plugins/images/images.css deleted file mode 100644 index b382f6bd..00000000 --- a/plugins/images/images.css +++ /dev/null @@ -1,106 +0,0 @@ -/** -* Image plugin for codex-editor -* @author CodeX Team -* -* @version 0.0.1 -*/ -.ce-image { - max-width: 700px; - margin: 20px auto !important; -} - -.ce-plugin-image__holder{ - position: relative; - background: #FEFEFE; - border: 2px dashed #E8EBF5; - border-radius: 55px; - margin: 30px 0; - padding: 30px 110px 30px 40px; -} - .ce-plugin-image__holder input{ - border: 0; - background: transparent; - outline: none; - -webkit-appearance: none; - font-size: 1.2em; - color: #A5ABBC; - } - /* Placeholder color for Chrome */ - .ce-plugin-image__holder input::-webkit-input-placeholder { - color: #A5ABBC; - } - /* Placeholder color for IE 10+ */ - .ce-plugin-image__holder input:-ms-input-placeholder { - color: #A5ABBC; - } - /* Placeholder color for Firefox 19+ */ - .ce-plugin-image__holder input::-moz-placeholder { - color: #A5ABBC; - opacity: 1; - } -.ce-plugin-image__button{ - position: absolute; - z-index: 2; - right: 40px; - cursor: pointer; - font-family: "codex_editor"; - font-size: 1.5em; - color: #8990AA; -} - .ce-plugin-image__button:hover{ - color: #393F52; - } - -.ce-plugin-image__wrapper { - margin : 3em 0; -} -.ce-plugin-image__uploaded--centered { - max-width: 700px; - display:block; - margin: 0 auto; -} - -.ce-plugin-image__uploaded--stretched { - width: 100%; -} - .ce-plugin-image__firstlevel--stretch { - margin: 0 !important; - max-width: none !important; - padding: 0 !important; - } - -.ce-plugin-image__caption { - max-width: 700px; - margin: 1em auto; - text-align: center; - color: #898a8c; -} - - .ce-plugin-image__caption:empty::before { - content: 'Введите подпись'; - text-align: center; - font-weight: normal; - color: #a1a5b3;; - opacity: .9; - transition: opacity 200ms ease; - } - - .ce-plugin-image__caption:focus::before { - opacity: .1; - text-align: center; - } - -/** Settings */ -.ce_plugin_image--settings{ - white-space: nowrap; - /*padding-right: 10px; */ -} -.ce_plugin_image--select_button{ - display: inline-block; - margin-left: 15px; - color: #70a1ff; - cursor: pointer; -} - .ce_plugin_image--select_button:hover{ - color: #8da8dc; - } diff --git a/plugins/images/images.js b/plugins/images/images.js deleted file mode 100644 index ae619629..00000000 --- a/plugins/images/images.js +++ /dev/null @@ -1,446 +0,0 @@ -/** -* Image plugin for codex-editor -* @author CodeX Team -* -* @version 0.0.2 -*/ -var ceImage = { - - elementClasses : { - - ce_image : 'ce-image', - uploadedImage : { - centered : 'ce-plugin-image__uploaded--centered', - stretched : 'ce-plugin-image__uploaded--stretched', - }, - stretch : 'ce_block--stretched', - imageCaption : 'ce-plugin-image__caption', - imageWrapper : 'ce-plugin-image__wrapper', - formHolder : 'ce-plugin-image__holder', - uploadButton : 'ce-plugin-image__button', - - }, - - /** Default path to redactors images */ - path : '/upload/redactor_images/', - - make : function ( data ) { - - /** - * If we can't find image or we've got some problems with image path, we show plugin uploader - */ - if (!data || !data.file.url) { - - holder = ceImage.ui.formView(); - holder.classList.add(ceImage.elementClasses.ce_image); - - } else { - - if ( data.isStretch !== 'true') { - holder = ceImage.ui.imageView(data, ceImage.elementClasses.uploadedImage.centered, 'false'); - } else { - holder = ceImage.ui.imageView(data, ceImage.elementClasses.uploadedImage.stretched, 'true'); - } - } - - return holder; - }, - - /** - * Settings panel content - * @return {Element} element contains all settings - */ - makeSettings : function () { - - var holder = document.createElement('DIV'), - caption = document.createElement('SPAN'), - types = { - centered : 'По центру', - stretched : 'На всю ширину', - }, - selectTypeButton; - - /** Add holder classname */ - holder.className = 'ce_plugin_image--settings'; - - /** Add settings helper caption */ - caption.textContent = 'Настройки плагина'; - caption.className = 'ce_plugin_image--caption'; - - holder.appendChild(caption); - - /** Now add type selectors */ - for (var type in types){ - - selectTypeButton = document.createElement('SPAN'); - - selectTypeButton.textContent = types[type]; - selectTypeButton.className = 'ce_plugin_image--select_button'; - - this.addSelectTypeClickListener(selectTypeButton, type); - - holder.appendChild(selectTypeButton); - - } - - return holder; - - }, - - addSelectTypeClickListener : function(el, type) { - - el.addEventListener('click', function() { - - ceImage.selectTypeClicked(type); - - }, false); - - }, - - selectTypeClicked : function(type) { - - var current = cEditor.content.currentNode, - image = ceImage.ui.getImage(current), - wrapper = current.querySelector('.' + ceImage.elementClasses.imageWrapper); - - /** Clear classList */ - current.className = ''; - image.className = ''; - - /** Add important first-level class ce_block */ - current.classList.add(cEditor.ui.className.BLOCK_CLASSNAME); - - if (type === 'stretched') { - - image.classList.add(ceImage.elementClasses.uploadedImage.stretched); - current.classList.add(ceImage.elementClasses.stretch); - - /** Setting dataset for saver */ - wrapper.dataset.stretched = true; - - } else if (type === 'centered') { - - image.classList.add(ceImage.elementClasses.uploadedImage.centered); - - /** Setting dataset for saver */ - wrapper.dataset.stretched = false; - } - }, - - render : function( data ) { - - return this.make(data); - - }, - - save : function ( block ) { - - var data = block[0], - image = ceImage.ui.getImage(data), - caption = data.querySelector('.' + ceImage.elementClasses.imageCaption); - - var json = { - type : 'image', - data : { - background : false, - border : false, - isStretch : data.dataset.stretched, - file : { - url : image.src, - bigUrl : null, - width : image.width, - height : image.height, - additionalData :null, - }, - caption : caption.textContent, - cover : null, - } - }; - - return json; - }, - - uploadButtonClicked : function(event) { - - var success = ceImage.photoUploadingCallbacks.success, - error = ceImage.photoUploadingCallbacks.error; - - /** Define callbacks */ - cEditor.transport.selectAndUpload({ - success, - error, - }); - }, - - pastedImageURL : function(event) { - - var clipboardData = event.clipboardData || window.clipboardData, - pastedData = clipboardData.getData('Text'), - block = event.target.parentNode; - - ceImage.renderURL(pastedData, block); - - event.stopPropagation(); - }, - - renderURL : function(pastedData, block) { - - Promise.resolve() - - .then(function() { - return pastedData; - }) - - .then(ceImage.urlify) - - .then(function(url) { - - /* Show loader gif **/ - // block.classList.add(linkTool.elementClasses.loader); - - return fetch('/editor/transport?files=' + encodeURI(url)) - }) - - .then(function(response) { - console.log(response); - }); - - }, - - urlify : function (text) { - - var urlRegex = /(https?:\/\/\S+)/g; - - var links = text.match(urlRegex); - - if (links) { - console.log(links[0]); - return links[0]; - } - - return Promise.reject(Error("Url is not matched")); - - }, -}; - -ceImage.ui = { - - holder : function(){ - - var element = document.createElement('DIV'); - - element.classList.add(ceImage.elementClasses.formHolder); - - return element; - }, - - input : function(){ - - var input = document.createElement('INPUT'); - - return input; - - }, - - uploadButton : function(){ - - var button = document.createElement('SPAN'); - - button.classList.add(ceImage.elementClasses.uploadButton); - - button.innerHTML = ''; - - return button; - - }, - - /** - * @param {string} source - file path - * @param {string} style - css class - * @return {object} image - document IMG tag - */ - image : function(source, style) { - - var image = document.createElement('IMG'); - - image.classList.add(style); - - image.src = source; - - return image; - }, - - wrapper : function() { - - var div = document.createElement('div'); - - div.classList.add(ceImage.elementClasses.imageWrapper); - - return div; - }, - - caption : function() { - - var div = document.createElement('div'); - - div.classList.add(ceImage.elementClasses.imageCaption); - div.contentEditable = true; - - return div; - }, - - /** - * Draws form for image upload - */ - formView : function() { - - var holder = ceImage.ui.holder(), - uploadButton = ceImage.ui.uploadButton(), - input = ceImage.ui.input(); - - input.placeholder = 'Paste image URL or file'; - - holder.appendChild(uploadButton); - holder.appendChild(input); - - input.addEventListener('paste', ceImage.pastedImageURL, false); - - uploadButton.addEventListener('click', ceImage.uploadButtonClicked, false ); - - return holder; - }, - - /** - * wraps image and caption - * @param {object} data - image information - * @param {string} imageTypeClass - plugin's style - * @param {boolean} stretched - stretched or not - * @return wrapped block with image and caption - */ - imageView : function(data, imageTypeClass, stretched) { - - var file = data.file.url, - text = data.caption, - type = data.type, - image = ceImage.ui.image(file, imageTypeClass), - caption = ceImage.ui.caption(), - wrapper = ceImage.ui.wrapper(); - - caption.textContent = text; - - wrapper.dataset.stretched = stretched, - /** Appeding to the wrapper */ - wrapper.appendChild(image); - wrapper.appendChild(caption); - - return wrapper; - }, - - /** - * @param {HTML} data - Rendered block with image - */ - getImage : function(data) { - - var image = data.querySelector('.' + ceImage.elementClasses.uploadedImage.centered) || - data.querySelector('.' + ceImage.elementClasses.uploadedImage.stretched); - - return image; - }, - - /** - * wraps image and caption - * @deprecated - * @param {object} data - image information - * @return wrapped block with image and caption - */ - centeredImage : function(data) { - - var file = data.file.url, - text = data.caption, - type = data.type, - image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.centered), - caption = ceImage.ui.caption(), - wrapper = ceImage.ui.wrapper(); - - caption.textContent = text; - - wrapper.dataset.stretched = 'false', - /** Appeding to the wrapper */ - wrapper.appendChild(image); - wrapper.appendChild(caption); - - return wrapper; - }, - - /** - * wraps image and caption - * @deprecated - * @param {object} data - image information - * @return stretched image - */ - stretchedImage : function(data) { - - var file = data.file.url, - text = data.caption, - type = data.type, - image = ceImage.ui.image(file, ceImage.elementClasses.uploadedImage.stretched), - caption = ceImage.ui.caption(), - wrapper = ceImage.ui.wrapper(); - - caption.textContent = text; - - wrapper.dataset.stretched = 'true', - /** Appeding to the wrapper */ - wrapper.appendChild(image); - wrapper.appendChild(caption); - - return wrapper; - - } - -}; - -ceImage.photoUploadingCallbacks = { - - /** Photo was uploaded successfully */ - success : function(result) { - - var parsed = JSON.parse(result), - data, - image; - - /** - * Preparing {Object} data to draw an image - * @uses ceImage.make method - */ - data = { - background : false, - border : false, - isStrech : false, - file : { - url : ceImage.path + 'o_' + parsed.filename, - bigUrl : null, - width : null, - height : null, - additionalData : null, - }, - caption : '', - cover : null, - }; - - image = ceImage.make(data); - - /** Replace form to image */ - var form = cEditor.content.currentNode.querySelector('.' + ceImage.elementClasses.formHolder); - - cEditor.content.switchBlock(form, image, 'image'); - - }, - - /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ - error : function(result) { - console.log('Choosen file is not an image or image is corrupted'); - cEditor.notifications.errorThrown(); - } - -}; diff --git a/plugins/instagram/instagram.js b/plugins/instagram/instagram.js index 8acb162d..e238085e 100644 --- a/plugins/instagram/instagram.js +++ b/plugins/instagram/instagram.js @@ -2,13 +2,53 @@ * Instagram plugin * @version 1.0.0 */ -var instagramTool = { +var instagram = (function(instagram) { + + var methods = { + + render : function(content) { + + codex.content.switchBlock(codex.content.currentNode, content, 'instagram'); + + var blockContent = codex.content.currentNode.childNodes[0]; + blockContent.classList.add('instagram__loader'); + + window.instgrm.Embeds.process(); + + setTimeout(function(){ + blockContent.classList.remove('instagram__loader'); + }, 500); + }, + + /** + * Drawing html content. + * + * @param url + * @returns {Element} blockquote - HTML template for Instagram Embed JS + */ + instagramBlock : function(url) { + + var blockquote = codex.draw.node('BLOCKQUOTE', 'instagram-media instagram', {}), + div = codex.draw.node('DIV', '', {}), + paragraph = codex.draw.node('P', 'ce-paste__instagram--p', {}), + anchor = codex.draw.node('A', '', { href : url }); + + blockquote.dataset.instgrmVersion = 4; + + paragraph.appendChild(anchor); + div.appendChild(paragraph); + blockquote.appendChild(div); + + return blockquote; + + } + }; /** * Prepare before usage * Load important scripts to render embed */ - prepare : function() { + instagram.prepare = function() { var script = "//platform.instagram.com/en_US/embeds.js"; @@ -16,41 +56,44 @@ var instagramTool = { * Load widget */ codex.core.importScript(script, 'instagramAPI'); - }, + }; /** * Make instagram embed via Widgets method */ - make : function(data, isInternal) { + instagram.make = function(data, isInternal) { if (!data.instagram_url) return; - var block = instagramTool.content.instagramBlock(data.instagram_url); + var block = methods.instagramBlock(data.instagram_url); if (isInternal) { setTimeout(function() { /** Render block */ - instagramTool.content.render(block); + methods.render(block); }, 200); } + if (!isInternal) { + methods.render(block); + } return block; + }; - if (!isInternal) { - instagramTool.content.render(block); - } - }, + instagram.validate = function(data) { + return true; + }; /** * Saving JSON output. * Upload data via ajax */ - save : function(blockContent) { + instagram.save = function(blockContent) { var data; @@ -64,54 +107,25 @@ var instagramTool = { return data; - }, + }; + + instagram.validate = function(data) { + + var checkUrl = new RegExp("http?.+instagram.com\/p?."); + + if (!data.instagram_url || checkUrl.exec(data.instagram_url).length == 0) + return; + + return true; + }; /** * Render data */ - render : function(data) { - return instagramTool.make(data); - } + instagram.render = function(data) { + return instagram.make(data); + }; -}; + return instagram; -instagramTool.content = { - - render : function(content) { - - codex.content.switchBlock(codex.content.currentNode, content, 'instagram'); - - var blockContent = codex.content.currentNode.childNodes[0]; - blockContent.classList.add('instagram__loader'); - - window.instgrm.Embeds.process(); - - setTimeout(function(){ - blockContent.classList.remove('instagram__loader'); - }, 500); - }, - - /** - * Drawing html content. - * - * @param url - * @returns {Element} blockquote - HTML template for Instagram Embed JS - */ - instagramBlock : function(url) { - - var blockquote = codex.draw.node('BLOCKQUOTE', 'instagram-media instagram', {}), - div = codex.draw.node('DIV', '', {}), - paragraph = codex.draw.node('P', 'ce-paste__instagram--p', {}), - anchor = codex.draw.node('A', '', { href : url }); - - blockquote.dataset.instgrmVersion = 4; - - paragraph.appendChild(anchor); - div.appendChild(paragraph); - blockquote.appendChild(div); - - return blockquote; - - } - -}; +})({}); diff --git a/plugins/link/link.js b/plugins/link/link.js index 14c2ba42..43d6a413 100644 --- a/plugins/link/link.js +++ b/plugins/link/link.js @@ -5,304 +5,313 @@ /** * Link tool plugin */ -var linkTool = { - defaultText : 'Insert link here ...', - ENTER_KEY : 13, +var link = (function(link) { - currentBlock : null, - currentInput : null, - elementClasses : { - link : "tool-link-link", - image : "tool-link-image", - title : "tool-link-title", - description : "tool-link-description", - loader : "tool-link-loader", - error : "tool-link-error" - }, + var settings = { + defaultText : 'Insert link here ...', + ENTER_KEY : 13, + currentBlock : null, + currentInput : null, + elementClasses : { + link: "tool-link-link", + image: "tool-link-image", + title: "tool-link-title", + description: "tool-link-description", + loader: "tool-link-loader", + error: "tool-link-error" + } + }; + + var ui = { + + make : function (json) { + + var wrapper = ui.wrapper(), + siteImage = ui.image(json.image, settings.elementClasses.image), + siteTitle = ui.title(json.title), + siteDescription = ui.description(json.description), + siteLink = ui.link(json.url, json.url); + + wrapper.appendChild(siteImage); + wrapper.appendChild(siteTitle); + wrapper.appendChild(siteLink); + wrapper.appendChild(siteDescription); + + siteTitle.contentEditable = true; + siteDescription.contentEditable = true; + + return wrapper; + + }, + + mainBlock : function () { + + var wrapper = document.createElement('div'); + + wrapper.classList.add("ceditor-tool-link"); + + return wrapper; + + }, + + input : function () { + + var inputTag = document.createElement('input'); + + inputTag.classList.add("ceditor-tool-link-input"); + + inputTag.placeholder = settings.defaultText; + + inputTag.contentEditable = false; + + return inputTag; + + }, + + wrapper : function () { + + var wrapper = document.createElement('div'); + + wrapper.className += 'tool-link-panel clearfix'; + + return wrapper; + + }, + + image : function (imageSrc, imageClass) { + + var imageTag = document.createElement('img'); + + imageTag.classList.add(imageClass); + + imageTag.setAttribute('src', imageSrc); + + return imageTag; + + }, + + link : function (linkUrl, linkText) { + + var linkTag = document.createElement('a'); + + linkTag.classList.add(settings.elementClasses.link); + + linkTag.href = linkUrl; + + linkTag.target = "_blank"; + + linkTag.innerText = linkText; + + return linkTag; + + }, + + title : function (titleText) { + + var titleTag = document.createElement('div'); + + titleTag.classList.add("tool-link-content", settings.elementClasses.title); + + titleTag.innerHTML = titleText; + + return titleTag; + }, + + description : function (descriptionText) { + + var descriptionTag = document.createElement('div'); + + descriptionTag.classList.add("tool-link-content", settings.elementClasses.description); + + descriptionTag.innerHTML = descriptionText; + + return descriptionTag; + } + + }; + + var methods = { + + blockPasteCallback : function (event) { + + var clipboardData = event.clipboardData || window.clipboardData, + pastedData = clipboardData.getData('Text'), + block = event.target.parentNode; + + methods.renderLink(pastedData, block); + + event.stopPropagation(); + + }, + + blockKeyDownCallback : function (event) { + + var inputTag = event.target, + block = inputTag.parentNode, + url; + + if ( block.classList.contains(settings.elementClasses.error) ) { + block.classList.remove(settings.elementClasses.error); + } + + if (event.keyCode == settings.ENTER_KEY) { + + url = inputTag.value; + + methods.renderLink(url, block); + + event.preventDefault(); + } + }, + + /** + * @todo move request-url to accepted settings + */ + renderLink : function (url, block) { + + Promise.resolve() + + .then(function () { + return methods.urlify(url); + }) + + .then(function (url) { + + /* Show loader gif **/ + block.classList.add(settings.elementClasses.loader); + + return fetch('/club/linkInfo?url=' + encodeURI(url)); + }) + + .then(function (response) { + + if (response.status == "200"){ + + return response.json(); + + } else { + + return Error("Invalid response status: %o", response); + + } + + }) + + .then(function (json) { + methods.composeLinkPreview(json, block); + }) + + .catch(function(error) { + + /* Hide loader gif **/ + block.classList.remove(settings.elementClasses.loader); + + block.classList.add(settings.elementClasses.error); + + codex.core.log('Error while doing things with link paste: %o', 'error', error); + }); + + }, + + urlify : function (text) { + + var urlRegex = /(https?:\/\/\S+)/g; + + var links = text.match(urlRegex); + + if (links) { + return links[0]; + } + + return Promise.reject(Error("Url is not matched")); + + }, + + composeLinkPreview : function (json, currentBlock) { + + if (json == {}) { + return; + } + + var previewBlock = ui.make(json); + + settings.currentInput.remove(); + + currentBlock.appendChild(previewBlock); + + currentBlock.classList.remove(settings.elementClasses.loader); + + } + }; /** * Make initial header block * @param {object} JSON with block data * @return {Element} element to append */ - makeNewBlock : function (data) { + link.makeNewBlock = function (data) { - var wrapper = linkTool.ui.mainBlock(), - tag = linkTool.ui.input(); + var wrapper = ui.mainBlock(), + tag = ui.input(); - linkTool.currentInput = tag; + settings.currentInput = tag; wrapper.appendChild(tag); wrapper.classList.add('ce-link'); /** - * Bind callbacks - **/ - tag.addEventListener('paste', linkTool.blockPasteCallback, false); - tag.addEventListener('keydown', linkTool.blockKeyDownCallback, false); + * Bind callbacks + **/ + tag.addEventListener('paste', methods.blockPasteCallback, false); + tag.addEventListener('keydown', methods.blockKeyDownCallback, false); return wrapper; - }, + }; /** * Method to render HTML block from JSON */ - render : function (json) { + link.render = function (json) { - var block = linkTool.ui.mainBlock(), - tag = linkTool.ui.make(json); + var block = ui.mainBlock(), + tag = ui.make(json); block.classList.add('ce-link'); block.appendChild(tag); return block; - }, + }; + + link.validate = function (data) { + + if (data.url.trim() == '' || data.title.trim() == '' || data.description.trim() == '') + return; + + return true; + }; /** * Method to extract JSON data from HTML block */ - save : function (blockContent){ + link.save = function (blockContent){ - var linkElement = linkTool.elementClasses.link; + var linkElement = settings.elementClasses.link; var data = { - url : blockContent.querySelector("." + linkElement).href, - shortLink : blockContent.querySelector("." + linkElement).textContent, - image : blockContent.querySelector("." + linkTool.elementClasses.image).src, - title : blockContent.querySelector("." + linkTool.elementClasses.title).textContent, - description : blockContent.querySelector("." + linkTool.elementClasses.description).textContent - }; + url : blockContent.querySelector("." + linkElement).href, + shortLink : blockContent.querySelector("." + linkElement).textContent, + image : blockContent.querySelector("." + settings.elementClasses.image).src, + title : blockContent.querySelector("." + settings.elementClasses.title).textContent, + description : blockContent.querySelector("." + settings.elementClasses.description).textContent + }; return data; - }, + }; - blockPasteCallback : function (event) { + return link; - var clipboardData = event.clipboardData || window.clipboardData, - pastedData = clipboardData.getData('Text'), - block = event.target.parentNode; - - linkTool.renderLink(pastedData, block); - - event.stopPropagation(); - - }, - - blockKeyDownCallback : function (event) { - - var inputTag = event.target, - block = inputTag.parentNode, - url; - - if ( block.classList.contains(linkTool.elementClasses.error) ) - { - block.classList.remove(linkTool.elementClasses.error); - } - - if (event.keyCode == linkTool.ENTER_KEY) { - - url = inputTag.value; - - linkTool.renderLink(url, block); - - event.preventDefault(); - - } - - }, - - /** - * @todo move request-url to accepted settings - */ - renderLink : function (url, block) { - - Promise.resolve() - - .then(function () { - return linkTool.urlify(url); - }) - - .then(function (url) { - - /* Show loader gif **/ - block.classList.add(linkTool.elementClasses.loader); - - return fetch('/club/linkInfo?url=' + encodeURI(url)); - }) - - .then(function (response) { - - if (response.status == "200"){ - - return response.json(); - - } else { - - return Error("Invalid response status: %o", response); - - } - - }) - - .then(function (json) { - console.log(json); - linkTool.composeLinkPreview(json, block); - }) - - .catch(function(error) { - - /* Hide loader gif **/ - block.classList.remove(linkTool.elementClasses.loader); - - block.classList.add(linkTool.elementClasses.error); - - codex.core.log('Error while doing things with link paste: %o', 'error', error); - }); - - }, - - urlify : function (text) { - - var urlRegex = /(https?:\/\/\S+)/g; - - var links = text.match(urlRegex); - - if (links) { - return links[0]; - } - - return Promise.reject(Error("Url is not matched")); - - }, - - composeLinkPreview : function (json, currentBlock) { - - if (json == {}) { - - return; - - } - - var previewBlock = linkTool.ui.make(json); - - linkTool.currentInput.remove(); - - currentBlock.appendChild(previewBlock); - - currentBlock.classList.remove(linkTool.elementClasses.loader); - - } - -}; - -linkTool.ui = { - - make : function (json) { - - var wrapper = this.wrapper(), - siteImage = this.image(json.image, linkTool.elementClasses.image), - siteTitle = this.title(json.title), - siteDescription = this.description(json.description), - siteLink = this.link(json.url, json.url); - - wrapper.appendChild(siteImage); - wrapper.appendChild(siteTitle); - wrapper.appendChild(siteLink); - wrapper.appendChild(siteDescription); - - siteTitle.contentEditable = true; - siteDescription.contentEditable = true; - - return wrapper; - - }, - - mainBlock : function () { - - var wrapper = document.createElement('div'); - - wrapper.classList.add("ceditor-tool-link"); - - return wrapper; - - }, - - input : function () { - - var inputTag = document.createElement('input'); - - inputTag.classList.add("ceditor-tool-link-input"); - - inputTag.placeholder = linkTool.defaultText; - - inputTag.contentEditable = false; - - return inputTag; - - }, - - wrapper : function () { - - var wrapper = document.createElement('div'); - - wrapper.className += 'tool-link-panel clearfix'; - - return wrapper; - - }, - - image : function (imageSrc, imageClass) { - - var imageTag = document.createElement('img'); - - imageTag.classList.add(imageClass); - - imageTag.setAttribute('src', imageSrc); - - return imageTag; - - }, - - link : function (linkUrl, linkText) { - - var linkTag = document.createElement('a'); - - linkTag.classList.add(linkTool.elementClasses.link); - - linkTag.href = linkUrl; - - linkTag.target = "_blank"; - - linkTag.innerText = linkText; - - return linkTag; - - }, - - title : function (titleText) { - - var titleTag = document.createElement('div'); - - titleTag.classList.add("tool-link-content", linkTool.elementClasses.title); - - titleTag.innerHTML = titleText; - - return titleTag; - }, - - description : function (descriptionText) { - - var descriptionTag = document.createElement('div'); - - descriptionTag.classList.add("tool-link-content", linkTool.elementClasses.description); - - descriptionTag.innerHTML = descriptionText; - - return descriptionTag; - } - -}; +})({}); diff --git a/plugins/list/list.js b/plugins/list/list.js index d563ea62..250aa0d7 100644 --- a/plugins/list/list.js +++ b/plugins/list/list.js @@ -2,22 +2,83 @@ * Code Plugin\ * Creates code tag and adds content to this tag */ -var listTool = { +var list = (function(list) { - baseClass : "tool-list", - elementClasses : { + var baseClass = "tool-list"; + + var elementClasses = { li : "tool-list-li" - }, + }; + + var ui = { + + make: function (blockType) { + + var wrapper = this.block(blockType || 'UL', baseClass); + + wrapper.dataset.type = 'UL'; + wrapper.contentEditable = true; + + return wrapper; + + }, + + block: function (blockType, blockClass) { + + var block = document.createElement(blockType); + + if (blockClass) block.classList.add(blockClass); + + return block; + + }, + + button: function (buttonType) { + + var types = { + unordered: 'Обычный список', + ordered: 'Нумерованный список' + }, + button = document.createElement('SPAN'); + + button.innerHTML = types[buttonType]; + + button.className = 'ce_plugin_list--select_button'; + + return button; + } + }; + + var methods = { + + /** + * Changes block type => OL or UL + * @param event + * @param blockType + */ + changeBlockStyle : function (event, blockType) { + + var currentBlock = codex.content.currentNode, + newEditable = ui.make(blockType), + oldEditable = currentBlock.querySelector("[contenteditable]"); + + newEditable.dataset.type = blockType; + newEditable.innerHTML = oldEditable.innerHTML; + newEditable.classList.add('ce-list'); + + codex.content.switchBlock(currentBlock, newEditable, 'list'); + } + }; /** * Make initial header block * @param {object} JSON with block data * @return {Element} element to append */ - make : function () { + list.make = function () { - var tag = listTool.ui.make(), - li = listTool.ui.block("li", "tool-link-li"); + var tag = ui.make(), + li = ui.block("li", "tool-link-li"); var br = document.createElement("br"); @@ -28,21 +89,21 @@ var listTool = { return tag; - }, + }; /** * Method to render HTML block from JSON */ - render : function (data) { + list.render = function (data) { var type = data.type == 'ordered' ? 'OL' : 'UL', - tag = listTool.ui.make(type); + tag = ui.make(type); tag.classList.add('ce-list'); data.items.forEach(function (element, index, array) { - var newLi = listTool.ui.block("li", listTool.elementClasses.li); + var newLi = ui.block("li", listTool.elementClasses.li); newLi.innerHTML = element; @@ -53,17 +114,32 @@ var listTool = { return tag; - }, + }; + + list.validate = function(data) { + + var items = data.items.every(function(item){ + return item.trim() != ''; + }); + + if (!items) + return; + + if (data.type != 'UL' && data.type != 'OL') + return; + + return true; + }; /** * Method to extract JSON data from HTML block */ - save : function (blockContent){ + list.save = function (blockContent){ var data = { - type : null, - items : [], - }; + type : null, + items : [] + }; for(var index = 0; index < blockContent.childNodes.length; index++) data.items[index] = blockContent.childNodes[index].textContent; @@ -72,9 +148,9 @@ var listTool = { return data; - }, + }; - makeSettings : function(data) { + list.makeSettings = function(data) { var holder = document.createElement('DIV'), selectTypeButton; @@ -82,16 +158,16 @@ var listTool = { /** Add holder classname */ holder.className = 'ce_plugin_list--settings'; - var orderedButton = listTool.ui.button("ordered"), - unorderedButton = listTool.ui.button("unordered"); + var orderedButton = ui.button("ordered"), + unorderedButton = ui.button("unordered"); orderedButton.addEventListener('click', function (event) { - listTool.changeBlockStyle(event, 'ol'); + methods.changeBlockStyle(event, 'OL'); codex.toolbar.settings.close(); }); unorderedButton.addEventListener('click', function (event) { - listTool.changeBlockStyle(event, 'ul'); + methods.changeBlockStyle(event, 'UL'); codex.toolbar.settings.close(); }); @@ -100,58 +176,8 @@ var listTool = { return holder; - }, + }; - changeBlockStyle : function (event, blockType) { + return list; - var currentBlock = codex.content.currentNode, - newEditable = listTool.ui.make(blockType), - oldEditable = currentBlock.querySelector("[contenteditable]"); - - newEditable.dataset.type = blockType; - newEditable.innerHTML = oldEditable.innerHTML; - newEditable.classList.add('ce-list'); - - codex.content.switchBlock(currentBlock, newEditable, 'list'); - }, - -}; - -listTool.ui = { - - make : function (blockType) { - - var wrapper = this.block(blockType || 'UL', listTool.baseClass); - - wrapper.dataset.type = 'ul'; - wrapper.contentEditable = true; - - return wrapper; - - }, - - block : function (blockType, blockClass) { - - var block = document.createElement(blockType); - - if ( blockClass ) block.classList.add(blockClass); - - return block; - - }, - - button : function (buttonType) { - - var types = { - unordered : 'Обычный список', - ordered : 'Нумерованный список' - }, - button = document.createElement('SPAN'); - - button.innerHTML = types[buttonType]; - - button.className = 'ce_plugin_list--select_button'; - - return button; - } -}; +})({}); diff --git a/plugins/paragraph/paragraph.js b/plugins/paragraph/paragraph.js index ab5ce5b9..0684ec27 100644 --- a/plugins/paragraph/paragraph.js +++ b/plugins/paragraph/paragraph.js @@ -1,21 +1,19 @@ /** -* Paragraph Plugin\ +* Paragraph Plugin * Creates P tag and adds content to this tag */ -// var tools = require('./../plugins'); -var paragraphTool = { +var paragraph = (function(paragraph) { /** - * Make initial header block - * @param {object} JSON with block data - * @return {Element} element to append - */ - make : function (data) { + * Make initial header block + * @param {object} JSON with block data + * @return {Element} element to append + */ + paragraph.make = function (data) { - var tag = document.createElement('DIV'); - - tag.classList.add('ce-paragraph'); + /** Create Empty DIV */ + var tag = codex.draw.node('DIV', ['ce-paragraph'], {}); if (data && data.text) { tag.innerHTML = data.text; @@ -38,32 +36,55 @@ var paragraphTool = { return tag; - }, + }; /** - * Method to render HTML block from JSON - */ - render : function (data) { + * Method to render HTML block from JSON + */ + paragraph.render = function (data) { - return paragraphTool.make(data); + return this.make(data); - }, + }; /** - * Method to extract JSON data from HTML block - */ - save : function (blockContent){ + * Method to extract JSON data from HTML block + */ + paragraph.save = function (blockContent){ var data = { - text : null, - format: "html", - introText: '<>' - }; + text : null, + format: "html", + introText: '<>' + }; data.text = blockContent.innerHTML; return data; - } + }; -}; + /** + * Validate data. + * Define which objects are important and which are not + * + * @param data + * + * @return [Boolean] + */ + paragraph.validate = function(data) { + + /** + * Do not allow: + * - Empty text + */ + if (data.text.trim() == '') + return; + + return true; + + }; + + return paragraph; + +})({}); diff --git a/plugins/paste/paste.js b/plugins/paste/paste.js index 73e3d1f7..d556ee70 100644 --- a/plugins/paste/paste.js +++ b/plugins/paste/paste.js @@ -76,7 +76,12 @@ pasteTool.callbacks = { var clipBoardData = event.clipboardData || window.clipboardData, content = clipBoardData.getData('Text'); - pasteTool.callbacks.analize(content); + var result = pasteTool.callbacks.analize(content); + + if (result) { + event.preventDefault(); + event.stopImmediatePropagation(); + } }, /** @@ -101,25 +106,32 @@ pasteTool.callbacks = { if (image) { pasteTool.callbacks.uploadImage(string); + return true; } else if (instagram) { pasteTool.callbacks.instagramMedia(instagram); + return true; } else if (twitter) { pasteTool.callbacks.twitterMedia(twitter); + return true; } else if (facebook) { pasteTool.callbacks.facebookMedia(string); + return true; } else if (vk) { pasteTool.callbacks.vkMedia(string); + return true; } + return false; + }, /** @@ -194,7 +206,7 @@ pasteTool.callbacks = { */ twitterMedia : function(url) { - var fullUrl = url.input, + var fullUrl = Array.isArray(url) ? url.input : url, tweetId, arr, data; @@ -204,19 +216,9 @@ pasteTool.callbacks = { /** Example */ data = { - media:true, - conversation:false, - user:{ - profile_image_url:"http:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", - profile_image_url_https:"https:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", - screen_name:"Niketas", - name:"Никита Лихачёв" - }, id: tweetId, - text:"ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\/\/t.co\/iWyOHf4xr2", - created_at:"Tue Jun 28 14:09:12 +0000 2016", - status_url:"https:\/\/twitter.com\/Niketas\/status\/747793978511101953", - caption:"Caption" + id_str: tweetId, + status_url: fullUrl }; codex.tools.twitter.make(data); diff --git a/plugins/quote/quote.js b/plugins/quote/quote.js index 772e8c49..2ddf39da 100644 --- a/plugins/quote/quote.js +++ b/plugins/quote/quote.js @@ -3,36 +3,360 @@ * @author Khaydarov Murod */ -var quoteTools = { +var quote = (function(quote) { /** Default path to redactors images */ - path : '/upload/redactor_images/', + var path = '/upload/redactor_images/'; /** - * Default quote style - */ - defaultStyle : 'withPhoto', + * Default quote style + */ + var defaultStyle = 'withPhoto'; + + var styles = { + + ce_quote : 'ce-quote', + quoteText : 'ce_quote--text', + quoteAuthor : 'ce_quote--author', + authorsJob : 'ce_quote--job', + authorsPhoto : 'authorsPhoto', + authorsPhotoWrapper : 'authorsPhoto-wrapper', + + simple : { + text : 'quoteStyle-simple--text' + }, + + withCaption : { + blockquote : 'quoteStyle-withCaption--blockquote', + author : 'quoteStyle-withCaption--author' + }, + + withPhoto : { + photo : 'quoteStyle-withPhoto--photo', + author : 'quoteStyle-withPhoto--author', + job : 'quoteStyle-withPhoto--job', + quote : 'quoteStyle-withPhoto--quote', + wrapper : 'quoteStyle-withPhoto--wrapper', + authorHolder : 'quoteStyle-withPhoto--authorWrapper' + }, + + settings : { + holder : 'ce_plugin_quote--settings', + caption : 'ce_plugin_quote--caption', + buttons : 'ce_plugin_quote--select_button', + selectedType : 'ce-quote-settings--selected' + } + }; + + var photoUploadingCallbacks = { + + /** + * Success callbacks for uploaded photo. + * Replace upload icon with uploaded photo + */ + success : function(result) { + + var parsed = JSON.parse(result), + filename = parsed.filename, + uploadImageWrapper = codex.content.currentNode.querySelector('.' + styles.withPhoto.photo), + authorsPhoto = ui.img(styles.authorsPhoto); + + authorsPhoto.src = path + 'b_' + filename; + + /** Remove icon from image wrapper */ + uploadImageWrapper.innerHTML = ''; + + /** Appending uploaded image */ + uploadImageWrapper.classList.add(styles.authorsPhotoWrapper); + uploadImageWrapper.appendChild(authorsPhoto); + }, + + /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ + error : function(result) { + + console.log('Can\'t upload an image'); + codex.notifications.errorThrown(); + + } + + }; + + var ui = { + + wrapper : function($classList) { + + var el = document.createElement('DIV'); + + el.classList.add($classList); + + return el; + + }, + + blockquote : function() { + + var el = document.createElement('BLOCKQUOTE'); + + return el; + + }, + + img : function(attribute) { + var imageTag = document.createElement('IMG'); + imageTag.classList.add(attribute); + + return imageTag; + }, + + makeBlock : function(tag, classList) { + + var el = document.createElement(tag); + + + if ( classList ) { + + for( var i = 0; i < classList.length; i++) + el.className += ' ' + classList[i]; + + } + return el; + + } + + }; + + var methods = { + + changeStyleClicked : function() { + + var changeStyleButton = this, + quote = codex.content.currentNode.querySelector('.' + styles.ce_quote), + newStyle = changeStyleButton.dataset.style, + styleSelectors = this.parentNode.childNodes; + + quote.dataset.quoteStyle = newStyle; + + /** + * Mark selected style button + */ + for (var i = styleSelectors.length - 1; i >= 0; i--) { + styleSelectors[i].classList.remove(styles.settings.selectedType); + } + + this.classList.add(styles.settings.selectedType); + + }, + + /** + * @deprecated + */ + selectTypeQuoteStyle : function(type) { + + /** + * Choose Quote style to replace + */ + switch (type) { + case 'simple': + quoteStyleFunction = makeSimpleQuote; + break; + case 'withCaption': + quoteStyleFunction = makeQuoteWithCaption; + break; + case 'withPhoto': + quoteStyleFunction = makeQuoteWithPhoto; + break; + } + return quoteStyleFunction; + }, + + /** + * @deprecated + */ + addSelectTypeClickListener : function(el, quoteStyle) { + + el.addEventListener('click', function () { + + /** + * Parsing currentNode to JSON. + */ + var parsedOldQuote = methods.parseBlockQuote(), + newStyledQuote = quoteStyle(parsedOldQuote); + + var wrapper = codex.content.composeNewBlock(newStyledQuote, 'quote'); + wrapper.appendChild(newStyledQuote); + + codex.content.switchBlock(codex.content.currentNode, newStyledQuote, 'quote'); + + /** Close settings after replacing */ + codex.toolbar.settings.close(); + + }, false); + + }, + + /** + * @deprecated + */ + makeSimpleQuote : function(data) { + + var wrapper = ui.makeBlock('BLOCKQUOTE', [styles.simple.text, styles.quoteText]); + + wrapper.innerHTML = data.text || ''; + + wrapper.dataset.quoteStyle = 'simple'; + wrapper.classList.add(styles.ce_quote); + wrapper.contentEditable = 'true'; + + return wrapper; + }, + + /** + * @deprecated + */ + makeQuoteWithCaption : function(data) { + + var wrapper = ui.blockquote(), + text = ui.makeBlock('DIV', [styles.withCaption.blockquote, styles.quoteText]), + author = ui.makeBlock('DIV', [styles.withCaption.author, styles.quoteAuthor]); + + /* make text block ontentEditable */ + text.contentEditable = 'true'; + + text.innerHTML = data.text; + + /* make Author contentEditable */ + author.contentEditable = 'true'; + + author.textContent = data.cite; + + /* Appending created components */ + wrapper.dataset.quoteStyle = 'withCaption'; + wrapper.classList.add(styles.ce_quote); + + wrapper.appendChild(text); + wrapper.appendChild(author); + + return wrapper; + + }, + + makeQuoteWithPhoto : function(data) { + + var wrapper = ui.blockquote(), + photo = ui.makeBlock('DIV', [styles.withPhoto.photo]), + author = ui.makeBlock('DIV', [styles.withPhoto.author, styles.quoteAuthor]), + job = ui.makeBlock('DIV', [styles.withPhoto.job, styles.authorsJob]), + quote = ui.makeBlock('DIV', [styles.withPhoto.quote, styles.quoteText]); + + /* Default Image src */ + if (!data.photo) { + + var icon = ui.makeBlock('SPAN', ['ce-icon-picture']); + photo.appendChild(icon); + + } else { + + var authorsPhoto = ui.img(styles.authorsPhoto); + authorsPhoto.src = data.photo; + + photo.classList.add(styles.authorsPhotoWrapper); + photo.appendChild(authorsPhoto); + } + + + photo.addEventListener('click', methods.fileUploadClicked, false); + + /* make author block contentEditable */ + author.contentEditable = 'true'; + author.textContent = data.cite; + + /* Author's position and job */ + job.contentEditable = 'true'; + job.textContent = data.job; + + var authorsWrapper = ui.makeBlock('DIV', [styles.withPhoto.authorHolder]); + authorsWrapper.appendChild(author); + authorsWrapper.appendChild(job); + + /* make quote text contentEditable */ + quote.contentEditable = 'true'; + quote.innerHTML = data.text; + + wrapper.classList.add(styles.ce_quote); + wrapper.classList.add(styles.withPhoto.wrapper); + wrapper.dataset.quoteStyle = 'withPhoto'; + + wrapper.appendChild(quote); + wrapper.appendChild(photo); + wrapper.appendChild(authorsWrapper); + + return wrapper; + }, + + parseBlockQuote : function(block) { + + var currentNode = block || codex.content.currentNode, + photo = currentNode.getElementsByTagName('img')[0], + author = currentNode.querySelector('.' + styles.quoteAuthor), + job = currentNode.querySelector('.' + styles.authorsJob), + quote ; + + /** Simple quote text placed in Blockquote tag*/ + if ( currentNode.dataset.quoteStyle == 'simple' ) + quote = currentNode.innerHTML; + else + quote = currentNode.querySelector('.' + styles.quoteText).innerHTML; + + if (job) + job = job.textContent; + + if (author) + author = author.textContent; + + if (photo) + photo = photo.src; + + var data = { + style : currentNode.dataset.quoteStyle, + text : quote, + author : author, + job : job, + photo : photo + }; + + return data; + }, + + fileUploadClicked : function() { + + codex.transport.selectAndUpload({ + sucess: photoUploadingCallbacks.success, + error: photoUploadingCallbacks.error + }); + + } + }; /** - * Make Quote from JSON datasets - */ - makeBlockToAppend : function(data) { + * Make Quote from JSON datasets + */ + quote.makeBlockToAppend = function(data) { var tag; if (data && data.size) { data.style = 'withPhoto'; - + switch (data.style) { case 'simple': - tag = quoteTools.makeSimpleQuote(data); + tag = methods.makeSimpleQuote(data); break; case 'withCaption': - tag = quoteTools.makeQuoteWithCaption(data); + tag = methods.makeQuoteWithCaption(data); break; case 'withPhoto': - tag = quoteTools.makeQuoteWithPhoto(data); + tag = methods.makeQuoteWithPhoto(data); break; } } else { @@ -45,50 +369,61 @@ var quoteTools = { photo : '' }; - tag = quoteTools.makeQuoteWithPhoto(settings); - + tag = methods.makeQuoteWithPhoto(settings); } return tag; - }, + }; - render : function(data) { - return quoteTools.makeBlockToAppend(data); - }, + quote.validate = function(data) { - save : function(blockContent) { + console.log(data); + if (data.style.trim() == '' || data.text.trim() == '' || data.cite.trim() == '' + || data.size.trim() == '') + return; + + return true; + }; + + quote.render = function(data) { + return quote.makeBlockToAppend(data); + }; + + quote.save = function(blockContent) { /** - * Extracts JSON quote data from HTML block - * @param {Text} text, {Text} author, {Object} photo - */ - var parsedblock = quoteTools.parseBlockQuote(blockContent); - data = { - style : parsedblock.style, - text : parsedblock.text, - author : parsedblock.author, - job : parsedblock.job, - photo : parsedblock.photo, - "format":"html", - "cite": parsedblock.author, - "size": "small" - }; + * Extracts JSON quote data from HTML block + * @param {Text} text, {Text} author, {Object} photo + */ + var parsedblock = methods.parseBlockQuote(blockContent); + + if (parsedblock.style == 'withPhoto') { + parsedblock.style = 'small'; + } + var data = { + "text" : parsedblock.text, + "format" : "html", + "cite" : parsedblock.author, + "size" : parsedblock.style + }; return data; - }, + }; - makeSettings : function(data) { + quote.makeSettings = function(data) { var holder = document.createElement('DIV'), types = { - simple : 'Простая цитата', - withCaption : 'Цитата с подписью', - withPhoto : 'Цитата с фото и ФИО' - }, + big : 'По центру', + small : 'Врезка' + // simple : 'Простая цитата', + // withCaption : 'Цитата с подписью', + // withPhoto : 'Цитата с фото и ФИО' + }, selectTypeButton; /** Add holder classname */ - holder.className = quoteTools.styles.settings.holder; + holder.className = styles.settings.holder; /** Now add type selectors */ for (var type in types){ @@ -96,17 +431,17 @@ var quoteTools = { selectTypeButton = document.createElement('SPAN'); selectTypeButton.textContent = types[type]; - selectTypeButton.className = quoteTools.styles.settings.buttons; + selectTypeButton.className = styles.settings.buttons; selectTypeButton.dataset.style = type; - if ( type == quoteTools.defaultStyle ){ - selectTypeButton.classList.add(quoteTools.styles.settings.selectedType); + if ( type == defaultStyle ){ + selectTypeButton.classList.add(styles.settings.selectedType); } // var quoteStyle = quoteTools.selectTypeQuoteStyle(type); - selectTypeButton.addEventListener('click', quoteTools.changeStyleClicked, false); + selectTypeButton.addEventListener('click', methods.changeStyleClicked, false); // quoteTools.addSelectTypeClickListener(selectTypeButton, quoteStyle); holder.appendChild(selectTypeButton); @@ -115,332 +450,8 @@ var quoteTools = { return holder; - }, + }; - changeStyleClicked : function() { + return quote; - var changeStyleButton = this, - quote = codex.content.currentNode.querySelector('.' + quoteTools.styles.ce_quote), - newStyle = changeStyleButton.dataset.style, - styleSelectors = this.parentNode.childNodes; - - quote.dataset.quoteStyle = newStyle; - - /** - * Mark selected style button - */ - for (var i = styleSelectors.length - 1; i >= 0; i--) { - styleSelectors[i].classList.remove(quoteTools.styles.settings.selectedType); - } - - this.classList.add(quoteTools.styles.settings.selectedType); - - }, - - /** - * @deprecated - */ - selectTypeQuoteStyle : function(type) { - - /** - * Choose Quote style to replace - */ - switch (type) { - case 'simple': - quoteStyleFunction = quoteTools.makeSimpleQuote; - break; - case 'withCaption': - quoteStyleFunction = quoteTools.makeQuoteWithCaption; - break; - case 'withPhoto': - quoteStyleFunction = quoteTools.makeQuoteWithPhoto; - break; - } - - return quoteStyleFunction; - - }, - - /** - * @deprecated - */ - addSelectTypeClickListener : function(el, quoteStyle) { - - el.addEventListener('click', function () { - - /** - * Parsing currentNode to JSON. - */ - var parsedOldQuote = quoteTools.parseBlockQuote(), - newStyledQuote = quoteStyle(parsedOldQuote); - - var wrapper = codex.content.composeNewBlock(newStyledQuote, 'quote'); - wrapper.appendChild(newStyledQuote); - - codex.content.switchBlock(codex.content.currentNode, newStyledQuote, 'quote'); - - /** Close settings after replacing */ - codex.toolbar.settings.close(); - - }, false); - - }, - - /** - * @deprecated - */ - makeSimpleQuote : function(data) { - - var wrapper = quoteTools.ui.makeBlock('BLOCKQUOTE', [quoteTools.styles.simple.text, quoteTools.styles.quoteText]); - - wrapper.innerHTML = data.text || ''; - - wrapper.dataset.quoteStyle = 'simple'; - wrapper.classList.add(quoteTools.styles.ce_quote); - wrapper.contentEditable = 'true'; - - return wrapper; - }, - - /** - * @deprecated - */ - makeQuoteWithCaption : function(data) { - - var wrapper = quoteTools.ui.blockquote(), - text = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withCaption.blockquote, quoteTools.styles.quoteText]), - author = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withCaption.author, quoteTools.styles.quoteAuthor]); - - /* make text block ontentEditable */ - text.contentEditable = 'true'; - - text.innerHTML = data.text; - - /* make Author contentEditable */ - author.contentEditable = 'true'; - - author.textContent = data.cite; - - /* Appending created components */ - wrapper.dataset.quoteStyle = 'withCaption'; - wrapper.classList.add(quoteTools.styles.ce_quote); - - wrapper.appendChild(text); - wrapper.appendChild(author); - - return wrapper; - - }, - - makeQuoteWithPhoto : function(data) { - - var wrapper = quoteTools.ui.blockquote(), - photo = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.photo]), - author = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.author, quoteTools.styles.quoteAuthor]), - job = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.job, quoteTools.styles.authorsJob]), - quote = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.quote, quoteTools.styles.quoteText]); - - /* Default Image src */ - if (!data.photo) { - - var icon = quoteTools.ui.makeBlock('SPAN', ['ce-icon-picture']); - photo.appendChild(icon); - - } else { - - var authorsPhoto = quoteTools.ui.img(quoteTools.styles.authorsPhoto); - authorsPhoto.src = data.photo; - - photo.classList.add(quoteTools.styles.authorsPhotoWrapper); - photo.appendChild(authorsPhoto); - } - - - photo.addEventListener('click', quoteTools.fileUploadClicked, false); - - /* make author block contentEditable */ - author.contentEditable = 'true'; - author.textContent = data.cite; - - /* Author's position and job */ - job.contentEditable = 'true'; - job.textContent = data.job; - - var authorsWrapper = quoteTools.ui.makeBlock('DIV', [quoteTools.styles.withPhoto.authorHolder]); - authorsWrapper.appendChild(author); - authorsWrapper.appendChild(job); - - /* make quote text contentEditable */ - quote.contentEditable = 'true'; - quote.innerHTML = data.text; - - wrapper.classList.add(quoteTools.styles.ce_quote); - wrapper.classList.add(quoteTools.styles.withPhoto.wrapper); - wrapper.dataset.quoteStyle = 'withPhoto'; - - wrapper.appendChild(quote); - wrapper.appendChild(photo); - wrapper.appendChild(authorsWrapper); - - return wrapper; - }, - - parseBlockQuote : function(block) { - - var currentNode = block || codex.content.currentNode, - photo = currentNode.getElementsByTagName('img')[0], - author = currentNode.querySelector('.' + quoteTools.styles.quoteAuthor), - job = currentNode.querySelector('.' + quoteTools.styles.authorsJob), - quote ; - - /** Simple quote text placed in Blockquote tag*/ - if ( currentNode.dataset.quoteStyle == 'simple' ) - quote = currentNode.innerHTML; - else - quote = currentNode.querySelector('.' + quoteTools.styles.quoteText).innerHTML; - - if (job) - job = job.textContent; - - if (author) - author = author.textContent; - - if (photo) - photo = photo.src; - - var data = { - style : currentNode.dataset.quoteStyle, - text : quote, - author : author, - job : job, - photo : photo, - }; - - return data; - }, - - fileUploadClicked : function() { - - var success = quoteTools.photoUploadingCallbacks.success, - error = quoteTools.photoUploadingCallbacks.error; - - codex.transport.selectAndUpload({ - success, - error, - }); - - } - -}; - -quoteTools.styles = { - - ce_quote : 'ce-quote', - quoteText : 'ce_quote--text', - quoteAuthor : 'ce_quote--author', - authorsJob : 'ce_quote--job', - authorsPhoto : 'authorsPhoto', - authorsPhotoWrapper : 'authorsPhoto-wrapper', - - simple : { - text : 'quoteStyle-simple--text' - }, - - withCaption : { - blockquote : 'quoteStyle-withCaption--blockquote', - author : 'quoteStyle-withCaption--author' - }, - - withPhoto : { - photo : 'quoteStyle-withPhoto--photo', - author : 'quoteStyle-withPhoto--author', - job : 'quoteStyle-withPhoto--job', - quote : 'quoteStyle-withPhoto--quote', - wrapper : 'quoteStyle-withPhoto--wrapper', - authorHolder : 'quoteStyle-withPhoto--authorWrapper' - }, - - settings : { - holder : 'ce_plugin_quote--settings', - caption : 'ce_plugin_quote--caption', - buttons : 'ce_plugin_quote--select_button', - selectedType : 'ce-quote-settings--selected' - } -}; - -quoteTools.ui = { - - wrapper : function($classList) { - - var el = document.createElement('DIV'); - - el.classList.add($classList); - - return el; - - }, - - blockquote : function() { - - var el = document.createElement('BLOCKQUOTE'); - - return el; - - }, - - img : function(attribute) { - var imageTag = document.createElement('IMG'); - imageTag.classList.add(attribute); - - return imageTag; - }, - - makeBlock : function(tag, classList) { - - var el = document.createElement(tag); - - - if ( classList ) { - - for( var i = 0; i < classList.length; i++) - el.className += ' ' + classList[i]; - - } - return el; - - } - -}; - -quoteTools.photoUploadingCallbacks = { - - /** - * Success callbacks for uploaded photo. - * Replace upload icon with uploaded photo - */ - success : function(result) { - - var parsed = JSON.parse(result), - filename = parsed.filename, - uploadImageWrapper = codex.content.currentNode.querySelector('.' + quoteTools.styles.withPhoto.photo), - authorsPhoto = quoteTools.ui.img(quoteTools.styles.authorsPhoto); - - authorsPhoto.src = quoteTools.path + 'b_' + filename; - - /** Remove icon from image wrapper */ - uploadImageWrapper.innerHTML = ''; - - /** Appending uploaded image */ - uploadImageWrapper.classList.add(quoteTools.styles.authorsPhotoWrapper); - uploadImageWrapper.appendChild(authorsPhoto); - }, - - /** Error callback. Sends notification to user that something happend or plugin doesn't supports method */ - error : function(result) { - - console.log('Can\'t upload an image'); - codex.notifications.errorThrown(); - - } - -}; +})({}); \ No newline at end of file diff --git a/plugins/twitter/twitter.js b/plugins/twitter/twitter.js index 0d4cbb33..5cd10173 100644 --- a/plugins/twitter/twitter.js +++ b/plugins/twitter/twitter.js @@ -3,12 +3,94 @@ * @version 1.0.0 */ -var twitterTool = { +var twitter = (function(twitter) { + + var methods = { + + /** + * Twitter render method appends content after block + * @param tweetId + */ + twitter : function(data, tweet) { + + setTimeout(function() { + window.twttr.widgets.createTweet(data.id_str, tweet); + }, 1000); + + tweet.classList.add('twitter__loader'); + + if (codex.content.currentNode) { + tweet.dataset.statusUrl = data.status_url; + codex.content.switchBlock(codex.content.currentNode, tweet, 'twitter'); + } + + /** + * in case if we need extra data + */ + if (!data.user) { + + codex.core.ajax({ + url : '/writing/tweetInfo?tweetId=' + data.id_str, + type: "GET", + success: function(result) { + methods.saveTwitterData(result, tweet); + } + }); + + } else { + + tweet.dataset.profileImageUrl = data.user.profile_image_url; + tweet.dataset.profileImageUrlHttps = data.user.profile_image_url_https; + tweet.dataset.screenName = data.user.screen_name; + tweet.dataset.name = data.user.name; + tweet.dataset.id = data.id; + tweet.dataset.idStr = data.id_str; + tweet.dataset.text = data.text; + tweet.dataset.createdAt = data.created_at; + tweet.dataset.statusUrl = data.status_url; + tweet.dataset.media = data.media; + + tweet.classList.remove('twitter__loader'); + + } + + }, + + twitterBlock : function() { + var block = codex.draw.node('DIV', '', { height: "20px" }); + return block; + }, + + saveTwitterData : function(result, tweet) { + var data = JSON.parse(result), + twitterContent = tweet; + + setTimeout(function() { + + /** + * Save twitter data via data-attributes + */ + twitterContent.dataset.profileImageUrl = data.user.profile_image_url; + twitterContent.dataset.profileImageUrlHttps = data.user.profile_image_url_https; + twitterContent.dataset.screenName = data.user.screen_name; + twitterContent.dataset.name = data.user.name; + twitterContent.dataset.id = data.id; + twitterContent.dataset.idStr = data.id_str; + twitterContent.dataset.text = data.text; + twitterContent.dataset.createdAt = data.created_at; + twitterContent.dataset.media = data.entities.urls.length > 0 ? "false" : "true"; + + twitterContent.classList.remove('twitter__loader'); + + }, 50); + + } + }; /** * Prepare twitter scripts */ - prepare : function() { + twitter.prepare = function() { var script = "//platform.twitter.com/widgets.js"; @@ -17,74 +99,61 @@ var twitterTool = { */ codex.core.importScript(script, 'twitterAPI'); - }, + }; - make : function(data) { + twitter.make = function(data) { - if (!data.id) + if (!data.id || !data.status_url) return; - twitterTool.content.twitter(data.id); - }, + if (!data.id_str && typeof(data.id) === 'number') { + data.id_str = data.status_url.match(/[^\/]+$/)[0]; + } - save : function(blockContent) { + var blockContent = methods.twitterBlock(); + + methods.twitter(data, blockContent); + + return blockContent; + }; + + twitter.validate = function(data) { + return true; + }; + + twitter.save = function(blockContent) { var data; data = { - media:true, + media:blockContent.dataset.media, conversation:false, user:{ - profile_image_url:"http:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", - profile_image_url_https:"https:\/\/pbs.twimg.com\/profile_images\/1817165982\/nikita-likhachev-512_normal.jpg", - screen_name:"Niketas", - name:"Никита Лихачёв" + profile_image_url: blockContent.dataset.profileImageUrl, + profile_image_url_https: blockContent.dataset.profileImageUrlHttps, + screen_name: blockContent.dataset.screenName, + name: blockContent.dataset.name }, - id: blockContent.dataset.tweetId, - text:"ВНИМАНИЕ ЧИТАТЬ ВСЕМ НЕ ДАЙ БОГ ПРОПУСТИТЕ НУ ИЛИ ХОТЯ БЫ КЛИКНИ И ПОДОЖДИ 15 СЕКУНД https:\/\/t.co\/iWyOHf4xr2", - created_at:"Tue Jun 28 14:09:12 +0000 2016", - status_url:"https:\/\/twitter.com\/Niketas\/status\/747793978511101953", - caption:"Caption" + id: blockContent.dataset.id || blockContent.dataset.tweetId, + id_str : blockContent.dataset.idStr, + text: blockContent.dataset.text, + created_at: blockContent.dataset.createdAt, + status_url: blockContent.dataset.statusUrl, + caption: "" }; return data; + }; - }, + twitter.render = function(data) { + return twitter.make(data); + }; - render : function(data) { - return twitterTool.make(data); - } + return twitter; -}; +})({}); -twitterTool.content = { - /** - * Twitter render method appends content after block - * @param tweetId - */ - twitter : function(tweetId) { - var tweet = twitterTool.content.twitterBlock(); - codex.content.switchBlock(codex.content.currentNode, tweet, 'twitter'); - var blockContent = codex.content.currentNode.childNodes[0]; - blockContent.classList.add('twitter__loader'); - - window.twttr.widgets.createTweet(tweetId, blockContent); - - setTimeout(function() { - blockContent.classList.remove('twitter__loader'); - }, 500); - - /** Remove empty DIV */ - blockContent.childNodes[0].remove(); - - }, - - twitterBlock : function() { - var block = codex.draw.node('DIV', '', {}); - return block; - } -}; diff --git a/whatwg-fetch.js.map b/whatwg-fetch.js.map index 1b329b33..44f02376 100644 --- a/whatwg-fetch.js.map +++ b/whatwg-fetch.js.map @@ -1 +1,5 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 81b9a2fe5a907c1008c1?8fa0","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 81b9a2fe5a907c1008c1","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} \ No newline at end of file +<<<<<<< HEAD +{"version":3,"sources":["webpack:///webpack/bootstrap ee8a8ca17dfdf8861af0?ee51","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap ee8a8ca17dfdf8861af0","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} +======= +{"version":3,"sources":["webpack:///webpack/bootstrap 81b9a2fe5a907c1008c1?8fa0","webpack:///./~/whatwg-fetch/fetch.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA;AACA,MAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,iBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,QAAO;;AAEP,MAAK;AACL;AACA;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,yCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,mCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,yCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;;AAEA;AACA;AACA,wDAAuD;AACvD,UAAS;AACT;AACA,UAAS;AACT,+EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA,UAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,UAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA,QAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,+BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA,wCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,gCAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,QAAO;;AAEP;AACA,MAAK;AACL;AACA;AACA,EAAC","file":"whatwg-fetch.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 81b9a2fe5a907c1008c1","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (typeof input === 'string') {\n this.url = input\n } else {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split('\\r\\n').forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/whatwg-fetch/fetch.js\n// module id = 0\n// module chunks = 1"],"sourceRoot":""} +>>>>>>> master