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

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

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

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

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

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

tag */\r\n parentBlock = cEditor.draw.block('P');\r\n\r\n if (isPlainTextNode){\r\n parentBlock.textContent = nodeContent.replace(/(\\s){2,}/, '$1'); // remove double spaces\r\n } else {\r\n parentBlock.appendChild(node);\r\n }\r\n\r\n /** Save plugin type in data-type */\r\n parentBlock = this.storeBlockType(parentBlock);\r\n\r\n return parentBlock;\r\n\r\n };\r\n\r\n /**\r\n * It's a crutch\r\n * - - - - - - -\r\n * We need block type stored as data-attr\r\n * Now supports only simple blocks : P, HEADER, QUOTE, CODE\r\n * Remove it after updating parser module for the block-oriented structure:\r\n * - each block must have stored type\r\n * @param {Element} node\r\n */\r\n parser.storeBlockType = function (node) {\r\n\r\n switch (node.tagName) {\r\n case 'P' : node.dataset.tool = 'paragraph'; break;\r\n case 'H1':\r\n case 'H2':\r\n case 'H3':\r\n case 'H4':\r\n case 'H5':\r\n case 'H6': node.dataset.tool = 'header'; break;\r\n case 'BLOCKQUOTE': node.dataset.tool = 'quote'; break;\r\n case 'CODE': node.dataset.tool = 'code'; break;\r\n }\r\n\r\n return node;\r\n\r\n };\r\n\r\n /**\r\n * Check DOM node for display style: separated block or child-view\r\n */\r\n parser.isFirstLevelBlock = function (node) {\r\n\r\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\r\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\r\n\r\n };\r\n\r\n return parser;\r\n\r\n})({});\r\n\r\nmodule.exports = parser;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file diff --git a/example.html b/example.html index 9156a1aa..92ba4aa3 100644 --- a/example.html +++ b/example.html @@ -42,12 +42,13 @@ - - - + + + + ", - square: true - }, - gfycat: { - regex: /https?:\/\/gfycat\.com(?:\/detail)?\/([a-zA-Z]+)/, - html: "", - square: true - } - } - }, + pasteTool.patterns.map(function(pattern, i){ + if (pattern.regex.test(string)) { + pattern.callback.call(null, string, pattern); + } + }) - image = regexTemplates.image.test(string), - instagram = regexTemplates.instagram.exec(string), - twitter = regexTemplates.twitter.exec(string), - facebook = regexTemplates.facebook.test(string), - vk = regexTemplates.vk.test(string); - - /** - * Video testing - */ - var youtube = regexTemplates.video.youtube.regex.test(string); - var vimeo = regexTemplates.video.vimeo.regex.test(string); - var coub = regexTemplates.video.coub.regex.test(string); - var vine = regexTemplates.video.vine.regex.test(string); - - if (image) { - - pasteTool.callbacks.uploadImage(string); - - } else if (instagram) { - - pasteTool.callbacks.instagramMedia(instagram); - - } else if (twitter) { - - pasteTool.callbacks.twitterMedia(twitter); - - } else if (facebook) { - - pasteTool.callbacks.facebookMedia(string); - - } else if (vk) { - - pasteTool.callbacks.vkMedia(string); - - } else if (youtube) { - - pasteTool.callbacks.youtubeMedia(string); - - } else if (vimeo) { - - - } else if (vine) { - - - } else if (coub) { - - - } - - }, - - /** - * Direct upload - * @param url - */ - uploadImage : function(path) { - - var ajaxUrl = location.protocol + '//' + location.hostname + ':32769', - file, - image, - current = codex.content.currentNode, - beforeSend, - success_callback; - - /** When image is uploaded to redactors folder */ - success_callback = function(data) { - - console.log(data); - return; - var file = JSON.parse(data); - image = pasteTool.ui.uploadedImage(file.filename); - codex.content.switchBlock(current, image, 'image'); - - }; - - /** Before sending XMLHTTP request */ - beforeSend = function() { - var content = current.querySelector('.ce-block__content'); - content.classList.add('ce-plugin-image__loader'); - }; - - /** Preparing data for XMLHTTP */ - var data = { - url: '/club/fetchImage', - type: "POST", - data : { - url: path - }, - beforeSend : beforeSend, - success : success_callback - }; - - codex.core.ajax(data); - }, - - /** - * callback for instagram url's - * Using instagram Embed Widgete to render - * @uses Instagram tool - * @param url - */ - instagramMedia : function(url) { - var fullUrl = url.input, - data; - - - data = { - instagram_url: fullUrl - }; - - codex.tools.instagram.make(data, true); - - }, - - /** - * callback for youtube url's - * Using iframe to render - * @uses video tool - * @param url - */ - youtubeMedia : function(url) { - var data = { - video_url: url - }; - - codex.tools.video.make(data, true); - }, - - /** - * callback for tweets - * Using Twittter Widget to render - * @uses Twitter tool - * @param url - */ - twitterMedia : function(url) { - - var fullUrl = url.input, - tweetId, - arr, - data; - - arr = fullUrl.split('/'); - tweetId = arr.pop(); - - /** 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" - }; - - codex.tools.twitter.make(data); } - }; + + diff --git a/plugins/paste/patterns.js b/plugins/paste/patterns.js new file mode 100644 index 00000000..361c48e6 --- /dev/null +++ b/plugins/paste/patterns.js @@ -0,0 +1,68 @@ +/** + * Patterns + * + */ + +pasteTool.patterns = [ + { + type: 'image', + regex: /(?:([^:\/?#]+):)?(?:\/\/([^\/?#]*))?([^?#]*\.(?:jpe?g|gif|png))(?:\?([^#]*))?(?:#(.*))?/i, + callback: ceImage.urlPastedCallbacks.uploadImage + }, + { + type: 'instagram', + regex: new RegExp("http?.+instagram.com\/p?."), + callback: instagramTool.urlPastedCallback + }, + { + type: 'twitter', + regex: new RegExp("http?.+twitter.com?.+\/"), + callback: twitterTool.urlPastedCallback + }, + { + type: 'facebook', + regex: /https?.+facebook.+\/\d+\?/, + callback: ''//pasteTool.callbacks.facebookMedia + }, + { + type: 'vk', + regex: /https?.+vk?.com\/feed\?w=wall\d+_\d+/, + callback: ''//pasteTool.callbacks.vkMedia + }, + { + type: 'youtube', + regex: /^.*(?:(?:youtu\.be\/)|(?:youtube\.com)\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*)(?:[\?\&]t\=(\d*)|)/, + callback: videoTool.urlPastedCallbacks.generalCallback + }, + { + type: 'vimeo', + regex: /(?:http[s]?:\/\/)?(?:www.)?vimeo\.co(?:.+\/([^\/]\d+)(?:#t=[\d]+)?s?$)/, + callback: videoTool.urlPastedCallbacks.generalCallback + }, + { + type: 'coub', + regex: /https?:\/\/coub\.com\/view\/([^\/\?\&]+)/, + callback: videoTool.urlPastedCallbacks.generalCallback + }, + { + type: 'vine', + regex: /https?:\/\/vine\.co\/v\/([^\/\?\&]+)/, + callback: videoTool.urlPastedCallbacks.generalCallback + }, + { + type: 'vk', + regex: /https?:\/\/vk\.com\/.*(?:video)([-_0-9]+)/, + callback: videoTool.urlPastedCallbacks.generalCallback + }, + { + type: 'imgur', + regex: /https?:\/\/(?:i\.)?imgur\.com.*\/([a-zA-Z0-9]+)(?:\.gifv)?/, + callback: videoTool.urlPastedCallbacks.generalCallback + }, + { + type: 'gfycat', + regex: /https?:\/\/gfycat\.com(?:\/detail)?\/([a-zA-Z]+)/, + callback: videoTool.urlPastedCallbacks.generalCallback + } + +]; \ No newline at end of file diff --git a/plugins/twitter/twitter.js b/plugins/twitter/twitter.js index 0d4cbb33..c586c582 100644 --- a/plugins/twitter/twitter.js +++ b/plugins/twitter/twitter.js @@ -88,3 +88,37 @@ twitterTool.content = { return block; } }; + +/** + * callback for twitter utl's coming from pasteTool + * Using Twittter Widget to render + * @param url + */ +twitterTool.urlPastedCallback = function(url) { + + var tweetId, + arr, + data; + + arr = url.split('/'); + tweetId = arr.pop(); + + /** 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" + }; + + codex.tools.twitter.make(data); +} \ No newline at end of file diff --git a/plugins/video/video.js b/plugins/video/video.js index ec4ca0d1..af2ced86 100644 --- a/plugins/video/video.js +++ b/plugins/video/video.js @@ -6,32 +6,26 @@ var videoTool = { make : function(data, isInternal) { - if (!data.video_url) + if (!data.video_id) return; - var properties = { - width: '560', - height: '315', - src: data.video_url, - frameborder: '0', - allowfullscreen: true - }; + var html = videoTool.content.getHtmlWithVideoId(data.service, data.video_id), + block = videoTool.content.makeElementFromHtml(html); - var frame = codex.draw.node('IFRAME', 'video', properties); + block.dataset.id = data.video_id; + block.dataset.videoSeirvice = data.service; if (isInternal) { - frame.src = videoTool.content.makeEmbedUrl(data.video_url); - setTimeout(function() { /** Render block */ - videoTool.content.render(frame); + videoTool.content.render(block); }, 200); } - return frame; + return block; }, @@ -47,7 +41,8 @@ var videoTool = { return; data = { - video_url: blockContent.src + video_id: blockContent.dataset.id, + service: blockContent.dataset.videoService }; return data; @@ -59,7 +54,8 @@ var videoTool = { */ render : function(data) { return videoTool.make(data); - } + }, + }; @@ -77,9 +73,59 @@ videoTool.content = { }, - makeEmbedUrl: function (url) { + getHtmlWithVideoId: function (type, id) { + return videoTool.content.services[type].html.replace("<%= remote_id %>", id); + }, - return url.replace(/watch\?v=/, 'embed/'); + makeElementFromHtml: function(html) { + var wrapper = document.createElement('DIV'); + wrapper.innerHTML = html; + return wrapper.firstElementChild; + }, + services: { + vimeo: { + regex: /(?:http[s]?:\/\/)?(?:www.)?vimeo\.co(?:.+\/([^\/]\d+)(?:#t=[\d]+)?s?$)/, + html: "" + }, + youtube: { + regex: /^.*(?:(?:youtu\.be\/)|(?:youtube\.com)\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*)(?:[\?\&]t\=(\d*)|)/, + html: "", + timestamp: '?t=' + }, + coub: { + regex: /https?:\/\/coub\.com\/view\/([^\/\?\&]+)/, + html: "" + }, + vine: { + regex: /https?:\/\/vine\.co\/v\/([^\/\?\&]+)/, + html: "" + }, + vk: { + regex: /https?:\/\/vk\.com\/.*(?:video)([-_0-9]+)/, + html: "" + }, + imgur: { + regex: /https?:\/\/(?:i\.)?imgur\.com.*\/([a-zA-Z0-9]+)(?:\.gifv)?/, + html: "

\" data-context=\"false\">
" + }, + gfycat: { + regex: /https?:\/\/gfycat\.com(?:\/detail)?\/([a-zA-Z]+)/, + html: "", + } } }; + +videoTool.urlPastedCallbacks = { + generalCallback: function(url, pattern) { + + var id = pattern.regex.exec(url)[1]; + + var data = { + video_id: id, + service: pattern.type + }; + + videoTool.make(data, true); + } +}; \ No newline at end of file diff --git a/whatwg-fetch.js.map b/whatwg-fetch.js.map index 692336eb..fd85ad99 100644 --- a/whatwg-fetch.js.map +++ b/whatwg-fetch.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 3ad68690caed808ff875?3ec4","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 3ad68690caed808ff875","(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 +{"version":3,"sources":["webpack:///webpack/bootstrap f9691fefd54fa5e18e44?dce6","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 f9691fefd54fa5e18e44","(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 From fa40959f2b9d1c1574b3a3ed959fe91201cc07de Mon Sep 17 00:00:00 2001 From: George Berezhnoy Date: Thu, 12 Jan 2017 17:42:10 +0300 Subject: [PATCH 09/23] Comments for paste tool added --- plugins/paste/paste.js | 1 + plugins/paste/patterns.js | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/plugins/paste/paste.js b/plugins/paste/paste.js index 96ed4581..a8584f7f 100644 --- a/plugins/paste/paste.js +++ b/plugins/paste/paste.js @@ -1,6 +1,7 @@ /** * Paste plugin. * + * Listen to clipboard paste event and analize pasted text whit patterns in pattern.js */ /** diff --git a/plugins/paste/patterns.js b/plugins/paste/patterns.js index 361c48e6..a8e7a2a4 100644 --- a/plugins/paste/patterns.js +++ b/plugins/paste/patterns.js @@ -1,6 +1,13 @@ /** * Patterns * + * To add plugin create callback function in one and add here this object: + * { + * type : '', - type of pasted text (for example, 'image', 'url' or your plugin name) + * regex : /regex/, - regex for pasted text + * callback : yourPlugin.smthPastedCallback - callback function in your plugin which is called when pasted text matches regex + * } + * */ pasteTool.patterns = [ From c7598927669a830efab06a0bbe0f6d0172927b4b Mon Sep 17 00:00:00 2001 From: George Berezhnoy Date: Thu, 12 Jan 2017 18:19:22 +0300 Subject: [PATCH 10/23] Imgur now available --- plugins/paste/patterns.js | 2 +- plugins/video/video.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/paste/patterns.js b/plugins/paste/patterns.js index a8e7a2a4..b78a7748 100644 --- a/plugins/paste/patterns.js +++ b/plugins/paste/patterns.js @@ -58,7 +58,7 @@ pasteTool.patterns = [ }, { type: 'vk', - regex: /https?:\/\/vk\.com\/.*(?:video)([-_0-9]+)/, + regex: /https?:\/\/vk\.com\/.*(?:video)[-0-9]+_([0-9]+)/, callback: videoTool.urlPastedCallbacks.generalCallback }, { diff --git a/plugins/video/video.js b/plugins/video/video.js index af2ced86..4701b3aa 100644 --- a/plugins/video/video.js +++ b/plugins/video/video.js @@ -103,11 +103,11 @@ videoTool.content = { }, vk: { regex: /https?:\/\/vk\.com\/.*(?:video)([-_0-9]+)/, - html: "" + html: "" }, imgur: { regex: /https?:\/\/(?:i\.)?imgur\.com.*\/([a-zA-Z0-9]+)(?:\.gifv)?/, - html: "
\" data-context=\"false\">
" + html: "" }, gfycat: { regex: /https?:\/\/gfycat\.com(?:\/detail)?\/([a-zA-Z]+)/, From 37d21f62871e743fea86667bd10ddaade36721f4 Mon Sep 17 00:00:00 2001 From: George Berezhnoy Date: Thu, 12 Jan 2017 21:04:22 +0300 Subject: [PATCH 11/23] global flag added in url comoposition --- plugins/video/video.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/video/video.js b/plugins/video/video.js index 4701b3aa..29fe60c3 100644 --- a/plugins/video/video.js +++ b/plugins/video/video.js @@ -74,7 +74,7 @@ videoTool.content = { }, getHtmlWithVideoId: function (type, id) { - return videoTool.content.services[type].html.replace("<%= remote_id %>", id); + return videoTool.content.services[type].html.replace(/<\%\= remote\_id \%\>/g, id); }, makeElementFromHtml: function(html) { From d3e9b573247636019fea206ee067510e0f673266 Mon Sep 17 00:00:00 2001 From: George Berezhnoy Date: Thu, 12 Jan 2017 21:31:18 +0300 Subject: [PATCH 12/23] Webpack re-build --- codex-editor.js | 908 +++++++++++++++++++++++++++----------------- codex-editor.js.map | 2 +- whatwg-fetch.js.map | 2 +- 3 files changed, 565 insertions(+), 347 deletions(-) diff --git a/codex-editor.js b/codex-editor.js index 0a4fa543..913a03bb 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -61,8 +61,11 @@ var codex = 'use strict'; /** + * + * Codex Editor + * * @author Codex Team - * @version 1.0.6 + * @version 1.2.5 */ var codex = function (codex) { @@ -75,15 +78,17 @@ var codex = codex.renderer = __webpack_require__(5); codex.saver = __webpack_require__(6); codex.content = __webpack_require__(7); - codex.toolbar = __webpack_require__(8); - codex.tools = __webpack_require__(12); - codex.callback = __webpack_require__(13); - codex.draw = __webpack_require__(14); - codex.caret = __webpack_require__(15); - codex.notifications = __webpack_require__(16); - codex.parser = __webpack_require__(17); + codex.toolbar = __webpack_require__(9); + codex.tools = __webpack_require__(13); + codex.callback = __webpack_require__(14); + codex.draw = __webpack_require__(15); + codex.caret = __webpack_require__(16); + codex.notifications = __webpack_require__(17); + codex.parser = __webpack_require__(18); }; + codex.version = ("1.2.8"); + /** * @public * @@ -191,6 +196,13 @@ var codex = var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + /** + * Codex Editor Core + * + * @author Codex Team + * @version 1.1.2 + */ + var core = function (core) { /** @@ -212,6 +224,14 @@ var codex = codex.state.blocks = userSettings.data; } + if (userSettings.initialBlockPlugin) { + codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin; + } + + if (userSettings.uploadImagesUrl) { + codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl; + } + codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId); if (_typeof(codex.nodes.textarea) === undefined || codex.nodes.textarea === null) { @@ -364,6 +384,13 @@ var codex = 'use strict'; + /** + * Codex Editor UI module + * + * @author Codex Team + * @version 1.1 + */ + var ui = function (ui) { /** @@ -605,7 +632,10 @@ var codex = }, false); /** All keydowns on Document */ - codex.nodes.redactor.addEventListener('keydown', codex.callback.globalKeydown, false); + document.addEventListener('keydown', codex.callback.globalKeydown, false); + + /** All keydowns on Redactor zone */ + codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false); /** All keydowns on Document */ document.addEventListener('keyup', codex.callback.globalKeyup, false); @@ -648,7 +678,9 @@ var codex = codex.tools[tool].prepare(); } - }, ui.addBlockHandlers = function (block) { + }; + + ui.addBlockHandlers = function (block) { if (!block) return; @@ -661,10 +693,24 @@ var codex = /** * Pasting content from another source + * We have two type of sanitization + * First - uses deep-first search algorithm to get sub nodes, + * sanitizes whole Block_content and replaces cleared nodes + * This method is deprecated + * Method is used in codex.callback.blockPaste(event) + * + * Secont - uses Mutation observer. + * Observer "observe" DOM changes and send changings to callback. + * Callback gets changed node, not whole Block_content. + * Inserted or changed node, which we've gotten have been cleared and replaced with diry node + * + * Method is used in codex.callback.blockPasteViaSanitize(event) + * + * @uses html-janitor + * @example codex.callback.blockPasteViaSanitize(event), the second method. + * */ - block.addEventListener('paste', function (event) { - codex.callback.blockPaste(event); - }, false); + block.addEventListener('paste', codex.callback.blockPasteCallback, false); block.addEventListener('mouseup', function () { codex.toolbar.inline.show(); @@ -730,7 +776,7 @@ var codex = * Codex.Editor Transport Module * * @author Codex Team - * @version 1.0.0 + * @version 1.0 */ var transport = function (transport) { @@ -834,6 +880,13 @@ var codex = 'use strict'; + /** + * Codex Editor Renderer Module + * + * @author Codex Team + * @version 1.0 + */ + var renderer = function (renderer) { /** @@ -998,6 +1051,13 @@ var codex = 'use strict'; + /** + * Codex Editor Saver + * + * @author Codex Team + * @version 1.0.2 + */ + var saver = function (saver) { /** @@ -1080,6 +1140,11 @@ var codex = data: savedData }; + /** + * Do not allow empty initial plugins block + */ + if (savedData.text.trim() == '' && pluginName == codex.settings.initialBlockPlugin) return; + /** Marks Blocks that will be in main page */ output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE); @@ -1093,14 +1158,55 @@ var codex = /***/ }, /* 7 */ -/***/ function(module, exports) { +/***/ function(module, exports, __webpack_require__) { 'use strict'; + /** + * Codex Editor Content Module + * Works with DOM + * + * @author Codex Team + * @version 1.3.1 + */ + + var janitor = __webpack_require__(8); + + /** + * Default settings for sane. + * @uses html-janitor + */ + var Config = { + + tags: { + p: {}, + a: { + href: true, + target: '_blank', + rel: 'nofollow' + }, + i: {}, + b: {}, + strong: {}, + em: {}, + span: {} + } + }; + var content = function (content) { + /** + * Links to current active block + * @type {null | Element} + */ content.currentNode = null; + /** + * clicked in redactor area + * @type {null | Boolean} + */ + content.editorAreaHightlighted = null; + /** * Synchronizes redactor with original textarea */ @@ -1334,6 +1440,12 @@ var codex = }, 10); } } + + /** + * Block is inserted, wait for new click that defined focusing on editors area + * @type {boolean} + */ + content.editorAreaHightlighted = false; }; /** @@ -1533,7 +1645,7 @@ var codex = newNode = newNode.innerHTML; /** This type of block creates when enter is pressed */ - var NEW_BLOCK_TYPE = 'paragraph'; + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; /** * Make new paragraph with text after caret @@ -1583,7 +1695,7 @@ var codex = tool = workingNode.dataset.tool; if (codex.tools[tool].allowedToPaste) { - codex.content.sanitize(mutation.addedNodes); + codex.content.sanitize.call(this, mutation.addedNodes); } else { codex.content.pasteTextContent(mutation.addedNodes); } @@ -1598,7 +1710,17 @@ var codex = content.pasteTextContent = function (nodes) { var node = nodes[0], + textNode; + + if (!node) { + return; + } + + if (node.nodeType == codex.core.nodeTypes.TEXT) { + textNode = document.createTextNode(node); + } else { textNode = document.createTextNode(node.textContent); + } if (codex.core.isDomNode(node)) { node.parentNode.replaceChild(textNode, node); @@ -1610,7 +1732,7 @@ var codex = * * Sanitizes HTML content * @param {Element} target - inserted element - * @uses DFS function for deep searching + * @uses Sanitize library html-janitor */ content.sanitize = function (target) { @@ -1618,80 +1740,59 @@ var codex = return; } - for (var i = 0; i < target.childNodes.length; i++) { - this.dfs(target.childNodes[i]); - } - }; + var node = target[0]; - /** - * Clears styles - * @param {Element|Text} - */ - content.clearStyles = function (target) { - - var href, - newNode = null, - blockTags = ['P', 'BLOCKQUOTE', 'UL', 'CODE', 'OL', 'LI', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'DIV', 'PRE', 'HEADER', 'SECTION'], - allowedTags = ['P', 'B', 'I', 'A', 'U', 'BR'], - needReplace = !allowedTags.includes(target.tagName), - isDisplayedAsBlock = blockTags.includes(target.tagName); - - if (!codex.core.isDomNode(target)) { - return target; + if (!node) { + return; } - if (!target.parentNode) { - return target; + /** + * Disconnect Observer + * hierarchy of function calls inherits context of observer + */ + this.disconnect(); + + /** + * Don't sanitize text node + */ + if (node.nodeType == codex.core.nodeTypes.TEXT) { + return; } - if (needReplace) { + /** + * Clear dirty content + */ + var sanitizer = new janitor(Config), + clear = sanitizer.clean(node.outerHTML); - if (isDisplayedAsBlock) { + var div = codex.draw.node('DIV', [], { innerHTML: clear }); + node.replaceWith(div.childNodes[0]); - newNode = document.createElement('P'); - newNode.innerHTML = target.innerHTML; - target.parentNode.replaceChild(newNode, target); - target = newNode; - } else { - - newNode = document.createTextNode(' ' + target.textContent + ' '); - newNode.textContent = newNode.textContent.replace(/\s{2,}/g, ' '); - target.parentNode.replaceChild(newNode, target); - } - } - - /** keep href attributes of tag A */ - if (target.tagName == 'A') { - href = target.getAttribute('href'); - } - - /** Remove all tags */ - while (target.attributes.length > 0) { - target.removeAttribute(target.attributes[0].name); - } - - /** return href */ - if (href) { - target.setAttribute('href', href); - } - - return target; - }; - - /** - * Depth-first search Algorithm - * returns all childs - * @param {Element} - */ - content.dfs = function (el) { - - if (!codex.core.isDomNode(el)) return; - - var sanitized = this.clearStyles(el); - - for (var i = 0; i < sanitized.childNodes.length; i++) { - this.dfs(sanitized.childNodes[i]); - } + // for (i = 0; i < clearHTML.childNodes.length; i++) { + // + // var tag = clearHTML.childNodes[i], + // blockType = null; + // + // for (tool in codex.tools) { + // + // var handleTags = codex.tools[tool].handleTagOnPaste; + // + // if (!handleTags) { + // continue; + // } + // + // if (handleTags.indexOf(tag.tagName) !== -1) { + // blockType = codex.tools[tool]; + // break; + // } + // + // } + // + // if (blockType) { + // codex.parser.insertPastedContent(blockType, tag); + // } + // + // } }; return content; @@ -1701,16 +1802,218 @@ var codex = /***/ }, /* 8 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) { + if (true) { + !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else if (typeof exports === 'object') { + module.exports = factory(); + } else { + root.HTMLJanitor = factory(); + } + }(this, function () { + + /** + * @param {Object} config.tags Dictionary of allowed tags. + * @param {boolean} config.keepNestedBlockElements Default false. + */ + function HTMLJanitor(config) { + + var tagDefinitions = config['tags']; + var tags = Object.keys(tagDefinitions); + + var validConfigValues = tags + .map(function(k) { return typeof tagDefinitions[k]; }) + .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; }); + + if(!validConfigValues) { + throw new Error("The configuration was invalid"); + } + + this.config = config; + } + + // TODO: not exhaustive? + var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE']; + function isBlockElement(node) { + return blockElementNames.indexOf(node.nodeName) !== -1; + } + + var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE']; + function isInlineElement(node) { + return inlineElementNames.indexOf(node.nodeName) !== -1; + } + + HTMLJanitor.prototype.clean = function (html) { + var sandbox = document.createElement('div'); + sandbox.innerHTML = html; + + this._sanitize(sandbox); + + return sandbox.innerHTML; + }; + + HTMLJanitor.prototype._sanitize = function (parentNode) { + var treeWalker = createTreeWalker(parentNode); + var node = treeWalker.firstChild(); + if (!node) { return; } + + do { + // Ignore nodes that have already been sanitized + if (node._sanitized) { + continue; + } + + if (node.nodeType === Node.TEXT_NODE) { + // If this text node is just whitespace and the previous or next element + // sibling is a block element, remove it + // N.B.: This heuristic could change. Very specific to a bug with + // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output + // FIXME: make this an option? + if (node.data.trim() === '' + && ((node.previousElementSibling && isBlockElement(node.previousElementSibling)) + || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) { + parentNode.removeChild(node); + this._sanitize(parentNode); + break; + } else { + continue; + } + } + + // Remove all comments + if (node.nodeType === Node.COMMENT_NODE) { + parentNode.removeChild(node); + this._sanitize(parentNode); + break; + } + + var isInline = isInlineElement(node); + var containsBlockElement; + if (isInline) { + containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement); + } + + // Block elements should not be nested (e.g.
  • ...); if + // they are, we want to unwrap the inner block element. + var isNotTopContainer = !! parentNode.parentNode; + var isNestedBlockElement = + isBlockElement(parentNode) && + isBlockElement(node) && + isNotTopContainer; + + var nodeName = node.nodeName.toLowerCase(); + + var allowedAttrs = getAllowedAttrs(this.config, nodeName, node); + + var isInvalid = isInline && containsBlockElement; + + // Drop tag entirely according to the whitelist *and* if the markup + // is invalid. + if (isInvalid || shouldRejectNode(node, allowedAttrs) + || (!this.config.keepNestedBlockElements && isNestedBlockElement)) { + // Do not keep the inner text of SCRIPT/STYLE elements. + if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) { + while (node.childNodes.length > 0) { + parentNode.insertBefore(node.childNodes[0], node); + } + } + parentNode.removeChild(node); + + this._sanitize(parentNode); + break; + } + + // Sanitize attributes + for (var a = 0; a < node.attributes.length; a += 1) { + var attr = node.attributes[a]; + + if (shouldRejectAttr(attr, allowedAttrs, node)) { + node.removeAttribute(attr.name); + // Shift the array to continue looping. + a = a - 1; + } + } + + // Sanitize children + this._sanitize(node); + + // Mark node as sanitized so it's ignored in future runs + node._sanitized = true; + } while ((node = treeWalker.nextSibling())); + }; + + function createTreeWalker(node) { + return document.createTreeWalker(node, + NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT, + null, false); + } + + function getAllowedAttrs(config, nodeName, node){ + if (typeof config.tags[nodeName] === 'function') { + return config.tags[nodeName](node); + } else { + return config.tags[nodeName]; + } + } + + function shouldRejectNode(node, allowedAttrs){ + if (typeof allowedAttrs === 'undefined') { + return true; + } else if (typeof allowedAttrs === 'boolean') { + return !allowedAttrs; + } + + return false; + } + + function shouldRejectAttr(attr, allowedAttrs, node){ + var attrName = attr.name.toLowerCase(); + + if (allowedAttrs === true){ + return false; + } else if (typeof allowedAttrs[attrName] === 'function'){ + return !allowedAttrs[attrName](attr.value, node); + } else if (typeof allowedAttrs[attrName] === 'undefined'){ + return true; + } else if (allowedAttrs[attrName] === false) { + return true; + } else if (typeof allowedAttrs[attrName] === 'string') { + return (allowedAttrs[attrName] !== attr.value); + } + + return false; + } + + return HTMLJanitor; + + })); + + +/***/ }, +/* 9 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; + /** + * Codex Editor toolbar module + * + * Contains: + * - Inline toolbox + * - Toolbox within plus button + * - Settings section + * + * @author Codex Team + * @version 1.0 + */ var toolbar = function (toolbar) { toolbar.init = function () { - toolbar.settings = __webpack_require__(9); - toolbar.inline = __webpack_require__(10); - toolbar.toolbox = __webpack_require__(11); + toolbar.settings = __webpack_require__(10); + toolbar.inline = __webpack_require__(11); + toolbar.toolbox = __webpack_require__(12); }; /** @@ -1800,7 +2103,7 @@ var codex = module.exports = toolbar; /***/ }, -/* 9 */ +/* 10 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; @@ -2041,11 +2344,20 @@ var codex = module.exports = settings; /***/ }, -/* 10 */ +/* 11 */ /***/ function(module, exports) { 'use strict'; + /** + * Inline toolbar + * + * Contains from tools: + * Bold, Italic, Underline and Anchor + * + * @author Codex Team + * @version 1.0 + */ var inline = function (inline) { inline.init = function () {}; @@ -2058,7 +2370,7 @@ var codex = * saving selection that need for execCommand for styling * */ - inline.storedSelection = null, + inline.storedSelection = null; /** * @protected @@ -2067,6 +2379,17 @@ var codex = */ inline.show = function () { + var currentNode = codex.content.currentNode, + tool = currentNode.dataset.tool, + plugin; + + /** + * tool allowed to open inline toolbar + */ + plugin = codex.tools[tool]; + + if (!plugin.showInlineToolbar) return; + var selectedText = this.getSelectionText(), toolbar = codex.nodes.inlineToolbar.wrapper, buttons = codex.nodes.inlineToolbar.buttons; @@ -2217,6 +2540,11 @@ var codex = if (range.getClientRects) { range.collapse(true); var rect = range.getClientRects()[0]; + + if (!rect) { + return; + } + x = rect.left; y = rect.top; } @@ -2525,15 +2853,25 @@ var codex = module.exports = inline; /***/ }, -/* 11 */ +/* 12 */ /***/ function(module, exports, __webpack_require__) { 'use strict'; + /** + * Codex Editor toolbox + * + * All tools be able to appended here + * + * @author Codex Team + * @version 1.0 + */ + var toolbox = function (toolbox) { toolbox.init = function () { - __webpack_require__(8); + + __webpack_require__(9); }; toolbox.opened = false; @@ -2543,6 +2881,7 @@ var codex = /** Close setting if toolbox is opened */ if (codex.toolbar.settings.opened) { + codex.toolbar.settings.close(); } @@ -2580,7 +2919,11 @@ var codex = /** Count toolbox hidden tools */ for (var tool in codex.tools) { - if (!codex.tools[tool].displayInToolbox) hiddenToolsAmount++; + + if (!codex.tools[tool].displayInToolbox) { + + hiddenToolsAmount++; + } } if (!currentTool) { @@ -2603,6 +2946,7 @@ var codex = for (var tool in codex.tools) { if (codex.tools[tool].displayInToolbox) { + break; } @@ -2647,6 +2991,7 @@ var codex = }; if (workingNode && UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 && workingNode.textContent.trim() === '') { + /** Replace current block */ codex.content.switchBlock(workingNode, newBlockContent, tool.type); } else { @@ -2662,6 +3007,7 @@ var codex = appendCallback = tool.appendCallback; if (appendCallback && typeof appendCallback == 'function') { + appendCallback.call(event); } @@ -2690,34 +3036,56 @@ var codex = module.exports = toolbox; /***/ }, -/* 12 */ +/* 13 */ /***/ function(module, exports) { "use strict"; + /** + * Codex Editor tools + * This tools will be appended in toolbox + * + * @author Codex Team + * @version 1.0 + */ + var tools = function (tools) { - return tools; + return tools; }({}); module.exports = tools; /***/ }, -/* 13 */ +/* 14 */ /***/ function(module, exports) { 'use strict'; + /** + * Codex Editor callbacks module + * + * @author Codex Team + * @version 1.2.5 + */ + var callbacks = function (callbacks) { callbacks.redactorSyncTimeout = null; callbacks.globalKeydown = function (event) { + switch (event.keyCode) { + case codex.core.keys.ENTER: + codex.callback.enterKeyPressed(event);break; + } + }; + + callbacks.redactorKeyDown = function (event) { switch (event.keyCode) { case codex.core.keys.TAB: codex.callback.tabKeyPressed(event);break; case codex.core.keys.ENTER: - codex.callback.enterKeyPressed(event);break; + codex.callback.enterKeyPressedOnRedactorZone(event);break; case codex.core.keys.ESC: codex.callback.escapeKeyPressed(event);break; default: @@ -2750,17 +3118,9 @@ var codex = event.preventDefault(); }; - /** - * ENTER key handler - * Makes new paragraph block - */ callbacks.enterKeyPressed = function (event) { - /** Set current node */ - var firstLevelBlocksArea = codex.callback.clickedOnFirstLevelBlockArea(); - - if (firstLevelBlocksArea) { - event.preventDefault(); + if (codex.content.editorAreaHightlighted) { /** * it means that we lose input index, saved index before is not correct @@ -2769,8 +3129,14 @@ var codex = codex.caret.inputIndex = -1; codex.callback.enterPressedOnBlock(); - return; } + }; + + /** + * ENTER key handler + * Makes new paragraph block + */ + callbacks.enterKeyPressedOnRedactorZone = function (event) { if (event.target.contentEditable == 'true') { @@ -2795,7 +3161,7 @@ var codex = var enableLineBreaks = codex.tools[tool].enableLineBreaks; /** This type of block creates when enter is pressed */ - var NEW_BLOCK_TYPE = 'paragraph'; + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; /** * When toolbar is opened, select tool instead of making new paragraph @@ -2808,6 +3174,12 @@ var codex = codex.toolbar.close(); + /** + * Stop other listeners callback executions + */ + event.stopPropagation(); + event.stopImmediatePropagation(); + return; } @@ -2915,6 +3287,8 @@ var codex = callbacks.redactorClicked = function (event) { + callbacks.detectWhenClickedOnFirstLevelBlockArea(); + codex.content.workingNodeChanged(event.target); codex.ui.saveInputs(); @@ -2949,13 +3323,13 @@ var codex = } /** If input is empty, then we set caret to the last input */ - if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == 'paragraph') { + if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) { codex.caret.setToBlock(indexOfLastInput); } else { /** Create new input when caret clicked in redactors area */ - var NEW_BLOCK_TYPE = 'paragraph'; + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; codex.content.insertBlock({ type: NEW_BLOCK_TYPE, @@ -3008,7 +3382,7 @@ var codex = var currentNodeType = codex.content.currentNode.dataset.tool; /** Mark current block*/ - if (currentNodeType != 'paragraph' || !inputIsEmpty) { + if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) { codex.content.markBlock(); } @@ -3021,7 +3395,7 @@ var codex = * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always * specifies to the first-level block. Other cases we just ignore. */ - callbacks.clickedOnFirstLevelBlockArea = function () { + callbacks.detectWhenClickedOnFirstLevelBlockArea = function () { var selection = window.getSelection(), anchorNode = selection.anchorNode, @@ -3029,7 +3403,7 @@ var codex = if (selection.rangeCount == 0) { - return true; + codex.content.editorAreaHightlighted = true; } else { if (!codex.core.isDomNode(anchorNode)) { @@ -3054,7 +3428,7 @@ var codex = } /** If editable element founded, flag is "TRUE", Therefore we return "FALSE" */ - return flag ? false : true; + codex.content.editorAreaHightlighted = flag ? false : true; } }; @@ -3267,7 +3641,7 @@ var codex = */ callbacks.enterPressedOnBlock = function (event) { - var NEW_BLOCK_TYPE = 'paragraph'; + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; codex.content.insertBlock({ type: NEW_BLOCK_TYPE, @@ -3350,6 +3724,11 @@ var codex = event.preventDefault(); }; + /** + * @deprecated + * + * @param event + */ callbacks.blockPaste = function (event) { var currentInputIndex = codex.caret.getCurrentInputIndex(), @@ -3358,22 +3737,31 @@ var codex = setTimeout(function () { codex.content.sanitize(node); + + event.preventDefault(); }, 10); + + event.stopImmediatePropagation(); }; - callbacks._blockPaste = function (event) { + callbacks.blockPasteCallback = function (event) { var currentInputIndex = codex.caret.getCurrentInputIndex(); /** * create an observer instance */ - var observer = new MutationObserver(codex.callback.handlePasteEvents); + var observer = new MutationObserver(codex.callback.handleMutationsOnPaste); /** * configuration of the observer: */ - var config = { attributes: true, childList: true, characterData: false }; + var config = { + attributes: true, + childList: true, + characterData: false, + subtree: true + }; // pass in the target node, as well as the observer options observer.observe(codex.state.inputs[currentInputIndex], config); @@ -3382,8 +3770,20 @@ var codex = /** * Sends all mutations to paste handler */ - callbacks.handlePasteEvents = function (mutations) { - mutations.forEach(codex.content.paste); + callbacks.handleMutationsOnPaste = function (mutations) { + + var self = this; + + /** + * Calling function with context of this function. + * Also, we should sanitize pasted or changed data one time and ignore + * changings which makes sanitize method. + * For that, we need to send Context, MutationObserver.__proto__ that contains + * observer disconnect method. + */ + mutations.forEach(function (mutation) { + codex.content.paste.call(self, mutation); + }); }; /** @@ -3412,11 +3812,18 @@ var codex = module.exports = callbacks; /***/ }, -/* 14 */ +/* 15 */ /***/ function(module, exports) { 'use strict'; + /** + * Codex Editor Draw module + * + * @author Codex Team + * @version 1.0. + */ + var draw = function (draw) { /** @@ -3565,7 +3972,9 @@ var codex = div.classList.add('ce-settings_default'); return div; - }, draw.pluginsSettings = function () { + }; + + draw.pluginsSettings = function () { var div = document.createElement('div'); @@ -3710,11 +4119,18 @@ var codex = module.exports = draw; /***/ }, -/* 15 */ +/* 16 */ /***/ function(module, exports) { 'use strict'; + /** + * Codex Editor Caret Module + * + * @author Codex Team + * @version 1.0 + */ + var caret = function (caret) { /** @@ -3947,11 +4363,18 @@ var codex = module.exports = caret; /***/ }, -/* 16 */ +/* 17 */ /***/ function(module, exports) { 'use strict'; + /** + * Codex Editor Notification Module + * + * @author Codex Team + * @version 1.0 + */ + var notifications = function (notifications) { /** @@ -3993,236 +4416,31 @@ var codex = module.exports = notifications; /***/ }, -/* 17 */ +/* 18 */ /***/ function(module, exports) { - 'use strict'; + "use strict"; + + /** + * Codex Editor Parser Module + * + * @author Codex Team + * @version 1.1 + */ var parser = function (parser) { - /** - * Splits content by `\n` and returns blocks - */ - parser.getSeparatedTextFromContent = function (content) { - return content.split('\n'); - }; - /** inserting text */ - parser.insertPastedContent = function (content) { + parser.insertPastedContent = function (blockType, tag) { - var blocks = this.getSeparatedTextFromContent(content), - i, - inputIndex = cEditor.caret.getCurrentInputIndex(), - textNode, - parsedTextContent; - - for (i = 0; i < blocks.length; i++) { - - blocks[i].trim(); - - if (blocks[i]) { - var data = cEditor.draw.pluginsRender('paragraph', blocks[i]); - cEditor.content.insertBlock(data); - } - } - }; - - /** - * Asynchronously parses textarea input string to HTML editor blocks - */ - parser.parseTextareaContent = function () { - - var initialContent = cEditor.nodes.textarea.value; - - if (initialContent.trim().length === 0) return true; - - cEditor.parser - - /** Get child nodes async-aware */ - .getNodesFromString(initialContent) - - /** Then append nodes to the redactor */ - .then(cEditor.parser.appendNodesToRedactor) - - /** Write log if something goes wrong */ - .catch(function (error) { - cEditor.core.log('Error while parsing content: %o', 'warn', error); + codex.content.insertBlock({ + type: blockType.type, + block: blockType.render({ + text: tag.innerHTML + }) }); }; - /** - * Parses string to nodeList - * @param string inputString - * @return Primise -> nodeList - */ - parser.getNodesFromString = function (inputString) { - - return Promise.resolve().then(function () { - - var contentHolder = document.createElement('div'); - - contentHolder.innerHTML = inputString; - - /** - * Returning childNodes will include: - * - Elements (html-tags), - * - Texts (empty-spaces or non-wrapped strings ) - * - Comments and other - */ - return contentHolder.childNodes; - }); - }; - - /** - * Appends nodes to the redactor - * @param nodeList nodes - list for nodes to append - */ - parser.appendNodesToRedactor = function (nodes) { - - /** - * Sequence of one-by-one nodes appending - * Uses to save blocks order after async-handler - */ - var nodeSequence = Promise.resolve(); - - for (var index = 0; index < nodes.length; index++) { - - /** Add node to sequence at specified index */ - cEditor.parser.appendNodeAtIndex(nodeSequence, nodes, index); - } - }; - - /** - * Append node at specified index - */ - parser.appendNodeAtIndex = function (nodeSequence, nodes, index) { - - /** We need to append node to sequence */ - nodeSequence - - /** first, get node async-aware */ - .then(function () { - - return cEditor.parser.getNodeAsync(nodes, index); - }) - - /** - * second, compose editor-block from node - * and append it to redactor - */ - .then(function (node) { - - var block = cEditor.parser.createBlockByDomNode(node); - - if (cEditor.core.isDomNode(block)) { - - block.contentEditable = "true"; - - /** Mark node as redactor block*/ - block.classList.add('ce-block'); - - /** Append block to the redactor */ - cEditor.nodes.redactor.appendChild(block); - - /** Save block to the cEditor.state array */ - cEditor.state.blocks.push(block); - - return block; - } - return null; - }).then(cEditor.ui.addBlockHandlers) - - /** Log if something wrong with node */ - .catch(function (error) { - cEditor.core.log('Node skipped while parsing because %o', 'warn', error); - }); - }; - - /** - * Asynchronously returns node from nodeList by index - * @return Promise to node - */ - parser.getNodeAsync = function (nodeList, index) { - - return Promise.resolve().then(function () { - - return nodeList.item(index); - }); - }; - - /** - * Creates editor block by DOM node - * - * First-level blocks (see cEditor.settings.blockTags) saves as-is, - * other wrapps with

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

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

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

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

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

  • ...); if\n // they are, we want to unwrap the inner block element.\n var isNotTopContainer = !! parentNode.parentNode;\n var isNestedBlockElement =\n isBlockElement(parentNode) &&\n isBlockElement(node) &&\n isNotTopContainer;\n\n var nodeName = node.nodeName.toLowerCase();\n\n var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);\n\n var isInvalid = isInline && containsBlockElement;\n\n // Drop tag entirely according to the whitelist *and* if the markup\n // is invalid.\n if (isInvalid || shouldRejectNode(node, allowedAttrs)\n || (!this.config.keepNestedBlockElements && isNestedBlockElement)) {\n // Do not keep the inner text of SCRIPT/STYLE elements.\n if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {\n while (node.childNodes.length > 0) {\n parentNode.insertBefore(node.childNodes[0], node);\n }\n }\n parentNode.removeChild(node);\n\n this._sanitize(parentNode);\n break;\n }\n\n // Sanitize attributes\n for (var a = 0; a < node.attributes.length; a += 1) {\n var attr = node.attributes[a];\n\n if (shouldRejectAttr(attr, allowedAttrs, node)) {\n node.removeAttribute(attr.name);\n // Shift the array to continue looping.\n a = a - 1;\n }\n }\n\n // Sanitize children\n this._sanitize(node);\n\n // Mark node as sanitized so it's ignored in future runs\n node._sanitized = true;\n } while ((node = treeWalker.nextSibling()));\n };\n\n function createTreeWalker(node) {\n return document.createTreeWalker(node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,\n null, false);\n }\n\n function getAllowedAttrs(config, nodeName, node){\n if (typeof config.tags[nodeName] === 'function') {\n return config.tags[nodeName](node);\n } else {\n return config.tags[nodeName];\n }\n }\n\n function shouldRejectNode(node, allowedAttrs){\n if (typeof allowedAttrs === 'undefined') {\n return true;\n } else if (typeof allowedAttrs === 'boolean') {\n return !allowedAttrs;\n }\n\n return false;\n }\n\n function shouldRejectAttr(attr, allowedAttrs, node){\n var attrName = attr.name.toLowerCase();\n\n if (allowedAttrs === true){\n return false;\n } else if (typeof allowedAttrs[attrName] === 'function'){\n return !allowedAttrs[attrName](attr.value, node);\n } else if (typeof allowedAttrs[attrName] === 'undefined'){\n return true;\n } else if (allowedAttrs[attrName] === false) {\n return true;\n } else if (typeof allowedAttrs[attrName] === 'string') {\n return (allowedAttrs[attrName] !== attr.value);\n }\n\n return false;\n }\n\n return HTMLJanitor;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/html-janitor/src/html-janitor.js\n// module id = 8\n// module chunks = 0","/**\r\n * Codex Editor toolbar module\r\n *\r\n * Contains:\r\n * - Inline toolbox\r\n * - Toolbox within plus button\r\n * - Settings section\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\nvar toolbar = (function(toolbar) {\r\n\r\n toolbar.init = function() {\r\n toolbar.settings = require('./settings');\r\n toolbar.inline = require('./inline');\r\n toolbar.toolbox = require('./toolbox');\r\n };\r\n\r\n /**\r\n * Margin between focused node and toolbar\r\n */\r\n toolbar.defaultToolbarHeight = 49;\r\n\r\n toolbar.defaultOffset = 34;\r\n\r\n toolbar.opened = false;\r\n\r\n toolbar.current = null;\r\n\r\n /**\r\n * @protected\r\n */\r\n toolbar.open = function (){\r\n\r\n codex.nodes.toolbar.classList.add('opened');\r\n this.opened = true;\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n */\r\n toolbar.close = function(){\r\n\r\n codex.nodes.toolbar.classList.remove('opened');\r\n\r\n toolbar.opened = false;\r\n toolbar.current = null;\r\n\r\n for (var button in codex.nodes.toolbarButtons){\r\n codex.nodes.toolbarButtons[button].classList.remove('selected');\r\n }\r\n\r\n /** Close toolbox when toolbar is not displayed */\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.close();\r\n\r\n };\r\n\r\n toolbar.toggle = function(){\r\n\r\n if ( !this.opened ){\r\n\r\n this.open();\r\n\r\n } else {\r\n\r\n this.close();\r\n\r\n }\r\n\r\n };\r\n\r\n toolbar.hidePlusButton = function() {\r\n codex.nodes.plusButton.classList.add('hide');\r\n };\r\n\r\n toolbar.showPlusButton = function() {\r\n codex.nodes.plusButton.classList.remove('hide');\r\n };\r\n\r\n /**\r\n * Moving toolbar to the specified node\r\n */\r\n toolbar.move = function() {\r\n\r\n /** Close Toolbox when we move toolbar */\r\n codex.toolbar.toolbox.close();\r\n\r\n if (!codex.content.currentNode) {\r\n return;\r\n }\r\n\r\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\r\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\r\n\r\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\r\n\r\n /** Close trash actions */\r\n codex.toolbar.settings.hideRemoveActions();\r\n\r\n };\r\n\r\n return toolbar;\r\n\r\n})({});\r\n\r\ntoolbar.init();\r\n\r\nmodule.exports = toolbar;\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\r\n\r\n settings.init = function() {\r\n require('../content');\r\n };\r\n\r\n settings.opened = false;\r\n\r\n settings.setting = null;\r\n settings.actions = null;\r\n\r\n settings.cover = null;\r\n\r\n /**\r\n * Append and open settings\r\n */\r\n settings.open = function(toolType){\r\n\r\n /**\r\n * Append settings content\r\n * It's stored in tool.settings\r\n */\r\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\r\n\r\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\r\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\r\n\r\n } else {\r\n\r\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\r\n\r\n }\r\n\r\n var currentBlock = codex.content.currentNode;\r\n\r\n /** Open settings block */\r\n codex.nodes.blockSettings.classList.add('opened');\r\n codex.toolbar.settings.addDefaultSettings();\r\n this.opened = true;\r\n };\r\n\r\n /**\r\n * Close and clear settings\r\n */\r\n settings.close = function(){\r\n\r\n codex.nodes.blockSettings.classList.remove('opened');\r\n codex.nodes.pluginSettings.innerHTML = '';\r\n\r\n this.opened = false;\r\n\r\n };\r\n\r\n /**\r\n * @param {string} toolType - plugin type\r\n */\r\n settings.toggle = function( toolType ){\r\n\r\n if ( !this.opened ){\r\n\r\n this.open(toolType);\r\n\r\n } else {\r\n\r\n this.close();\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * This function adds default core settings\r\n */\r\n settings.addDefaultSettings = function() {\r\n\r\n /** list of default settings */\r\n var feedModeToggler;\r\n\r\n /** Clear block and append initialized settings */\r\n codex.nodes.defaultSettings.innerHTML = '';\r\n\r\n\r\n /** Init all default setting buttons */\r\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\r\n\r\n /**\r\n * Fill defaultSettings\r\n */\r\n\r\n /**\r\n * Button that enables/disables Feed-mode\r\n * Feed-mode means that block will be showed in articles-feed like cover\r\n */\r\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\r\n\r\n };\r\n\r\n /**\r\n * Cover setting.\r\n * This tune highlights block, so that it may be used for showing target block on main page\r\n * Draw different setting when block is marked for main page\r\n * If TRUE, then we show button that removes this selection\r\n * Also defined setting \"Click\" events will be listened and have separate callbacks\r\n *\r\n * @return {Element} node/button that we place in default settings block\r\n */\r\n settings.makeFeedModeToggler = function() {\r\n\r\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\r\n setting,\r\n data;\r\n\r\n if (!isFeedModeActivated) {\r\n\r\n data = {\r\n innerHTML : 'Вывести в ленте'\r\n };\r\n\r\n } else {\r\n\r\n data = {\r\n innerHTML : 'Не выводить в ленте'\r\n };\r\n\r\n }\r\n\r\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\r\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\r\n\r\n return setting;\r\n };\r\n\r\n /**\r\n * Updates Feed-mode\r\n */\r\n settings.updateFeedMode = function() {\r\n\r\n var currentNode = codex.content.currentNode;\r\n\r\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n\r\n codex.toolbar.settings.close();\r\n };\r\n\r\n settings.isFeedModeActivated = function() {\r\n\r\n var currentBlock = codex.content.currentNode;\r\n\r\n if (currentBlock) {\r\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * Here we will draw buttons and add listeners to components\r\n */\r\n settings.makeRemoveBlockButton = function() {\r\n\r\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\r\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\r\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\r\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\r\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\r\n\r\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\r\n\r\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\r\n\r\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\r\n\r\n actionWrapper.appendChild(confirmAction);\r\n actionWrapper.appendChild(cancelAction);\r\n\r\n removeBlockWrapper.appendChild(settingButton);\r\n removeBlockWrapper.appendChild(actionWrapper);\r\n\r\n /** Save setting */\r\n codex.toolbar.settings.setting = settingButton;\r\n codex.toolbar.settings.actions = actionWrapper;\r\n\r\n return removeBlockWrapper;\r\n\r\n };\r\n\r\n settings.removeButtonClicked = function() {\r\n\r\n var action = codex.toolbar.settings.actions;\r\n\r\n if (action.classList.contains('opened')) {\r\n codex.toolbar.settings.hideRemoveActions();\r\n } else {\r\n codex.toolbar.settings.showRemoveActions();\r\n }\r\n\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.close();\r\n\r\n };\r\n\r\n settings.cancelRemovingRequest = function() {\r\n\r\n codex.toolbar.settings.actions.classList.remove('opened');\r\n };\r\n\r\n settings.confirmRemovingRequest = function() {\r\n\r\n var currentBlock = codex.content.currentNode,\r\n firstLevelBlocksCount;\r\n\r\n currentBlock.remove();\r\n\r\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\r\n\r\n /**\r\n * If all blocks are removed\r\n */\r\n if (firstLevelBlocksCount === 0) {\r\n\r\n /** update currentNode variable */\r\n codex.content.currentNode = null;\r\n\r\n /** Inserting new empty initial block */\r\n codex.ui.addInitialBlock();\r\n }\r\n\r\n codex.ui.saveInputs();\r\n\r\n codex.toolbar.close();\r\n };\r\n\r\n settings.showRemoveActions = function() {\r\n codex.toolbar.settings.actions.classList.add('opened');\r\n };\r\n\r\n settings.hideRemoveActions = function() {\r\n codex.toolbar.settings.actions.classList.remove('opened');\r\n };\r\n\r\n return settings;\r\n\r\n})({});\r\n\r\nsettings.init();\r\n\r\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\r\n * Inline toolbar\r\n *\r\n * Contains from tools:\r\n * Bold, Italic, Underline and Anchor\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\nvar inline = (function(inline) {\r\n\r\n inline.init = function() {\r\n\r\n };\r\n\r\n inline.buttonsOpened = null;\r\n inline.actionsOpened = null;\r\n inline.wrappersOffset = null;\r\n\r\n /**\r\n * saving selection that need for execCommand for styling\r\n *\r\n */\r\n inline.storedSelection = null;\r\n\r\n /**\r\n * @protected\r\n *\r\n * Open inline toobar\r\n */\r\n inline.show = function() {\r\n\r\n var currentNode = codex.content.currentNode,\r\n tool = currentNode.dataset.tool,\r\n plugin;\r\n\r\n /**\r\n * tool allowed to open inline toolbar\r\n */\r\n plugin = codex.tools[tool];\r\n\r\n if (!plugin.showInlineToolbar)\r\n return;\r\n\r\n var selectedText = this.getSelectionText(),\r\n toolbar = codex.nodes.inlineToolbar.wrapper,\r\n buttons = codex.nodes.inlineToolbar.buttons;\r\n\r\n if (selectedText.length > 0) {\r\n\r\n /** Move toolbar and open */\r\n codex.toolbar.inline.move();\r\n\r\n /** Open inline toolbar */\r\n toolbar.classList.add('opened');\r\n\r\n /** show buttons of inline toolbar */\r\n codex.toolbar.inline.showButtons();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Closes inline toolbar\r\n */\r\n inline.close = function() {\r\n var toolbar = codex.nodes.inlineToolbar.wrapper;\r\n toolbar.classList.remove('opened');\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Moving toolbar\r\n */\r\n inline.move = function() {\r\n\r\n if (!this.wrappersOffset) {\r\n this.wrappersOffset = this.getWrappersOffset();\r\n }\r\n\r\n var coords = this.getSelectionCoords(),\r\n defaultOffset = 0,\r\n toolbar = codex.nodes.inlineToolbar.wrapper,\r\n newCoordinateX,\r\n newCoordinateY;\r\n\r\n if (toolbar.offsetHeight === 0) {\r\n defaultOffset = 40;\r\n }\r\n\r\n newCoordinateX = coords.x - this.wrappersOffset.left;\r\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\r\n\r\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\r\n\r\n /** Close everything */\r\n codex.toolbar.inline.closeButtons();\r\n codex.toolbar.inline.closeAction();\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Tool Clicked\r\n */\r\n\r\n inline.toolClicked = function(event, type) {\r\n\r\n /**\r\n * For simple tools we use default browser function\r\n * For more complicated tools, we should write our own behavior\r\n */\r\n switch (type) {\r\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\r\n default : codex.toolbar.inline.defaultToolAction(type); break;\r\n }\r\n\r\n /**\r\n * highlight buttons\r\n * after making some action\r\n */\r\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Saving wrappers offset in DOM\r\n */\r\n inline.getWrappersOffset = function() {\r\n\r\n var wrapper = codex.nodes.wrapper,\r\n offset = this.getOffset(wrapper);\r\n\r\n this.wrappersOffset = offset;\r\n return offset;\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Calculates offset of DOM element\r\n *\r\n * @param el\r\n * @returns {{top: number, left: number}}\r\n */\r\n inline.getOffset = function ( el ) {\r\n\r\n var _x = 0;\r\n var _y = 0;\r\n\r\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\r\n _x += (el.offsetLeft + el.clientLeft);\r\n _y += (el.offsetTop + el.clientTop);\r\n el = el.offsetParent;\r\n }\r\n return { top: _y, left: _x };\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Calculates position of selected text\r\n * @returns {{x: number, y: number}}\r\n */\r\n inline.getSelectionCoords = function() {\r\n\r\n var sel = document.selection, range;\r\n var x = 0, y = 0;\r\n\r\n if (sel) {\r\n\r\n if (sel.type != \"Control\") {\r\n range = sel.createRange();\r\n range.collapse(true);\r\n x = range.boundingLeft;\r\n y = range.boundingTop;\r\n }\r\n\r\n } else if (window.getSelection) {\r\n\r\n sel = window.getSelection();\r\n\r\n if (sel.rangeCount) {\r\n\r\n range = sel.getRangeAt(0).cloneRange();\r\n if (range.getClientRects) {\r\n range.collapse(true);\r\n var rect = range.getClientRects()[0];\r\n\r\n if (!rect) {\r\n return;\r\n }\r\n\r\n x = rect.left;\r\n y = rect.top;\r\n }\r\n\r\n }\r\n }\r\n return { x: x, y: y };\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Returns selected text as String\r\n * @returns {string}\r\n */\r\n inline.getSelectionText = function getSelectionText(){\r\n\r\n var selectedText = \"\";\r\n\r\n if (window.getSelection){ // all modern browsers and IE9+\r\n selectedText = window.getSelection().toString();\r\n }\r\n\r\n return selectedText;\r\n };\r\n\r\n /** Opens buttons block */\r\n inline.showButtons = function() {\r\n\r\n var buttons = codex.nodes.inlineToolbar.buttons;\r\n buttons.classList.add('opened');\r\n\r\n codex.toolbar.inline.buttonsOpened = true;\r\n\r\n /** highlight buttons */\r\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\r\n\r\n };\r\n\r\n /** Makes buttons disappear */\r\n inline.closeButtons = function() {\r\n var buttons = codex.nodes.inlineToolbar.buttons;\r\n buttons.classList.remove('opened');\r\n\r\n codex.toolbar.inline.buttonsOpened = false;\r\n };\r\n\r\n /** Open buttons defined action if exist */\r\n inline.showActions = function() {\r\n var action = codex.nodes.inlineToolbar.actions;\r\n action.classList.add('opened');\r\n\r\n codex.toolbar.inline.actionsOpened = true;\r\n };\r\n\r\n /** Close actions block */\r\n inline.closeAction = function() {\r\n var action = codex.nodes.inlineToolbar.actions;\r\n action.innerHTML = '';\r\n action.classList.remove('opened');\r\n codex.toolbar.inline.actionsOpened = false;\r\n };\r\n\r\n /** Action for link creation or for setting anchor */\r\n inline.createLinkAction = function(event, type) {\r\n\r\n var isActive = this.isLinkActive();\r\n\r\n var editable = codex.content.currentNode,\r\n storedSelection = codex.toolbar.inline.storedSelection;\r\n\r\n if (isActive) {\r\n\r\n var selection = window.getSelection(),\r\n anchorNode = selection.anchorNode;\r\n\r\n storedSelection = codex.toolbar.inline.saveSelection(editable);\r\n\r\n /**\r\n * Changing stored selection. if we want to remove anchor from word\r\n * we should remove anchor from whole word, not only selected part.\r\n * The solution is than we get the length of current link\r\n * Change start position to - end of selection minus length of anchor\r\n */\r\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\r\n\r\n codex.toolbar.inline.defaultToolAction('unlink');\r\n\r\n } else {\r\n\r\n /** Create input and close buttons */\r\n var action = codex.draw.inputForLink();\r\n codex.nodes.inlineToolbar.actions.appendChild(action);\r\n\r\n codex.toolbar.inline.closeButtons();\r\n codex.toolbar.inline.showActions();\r\n\r\n storedSelection = codex.toolbar.inline.saveSelection(editable);\r\n\r\n /**\r\n * focus to input\r\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\r\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\r\n */\r\n action.focus();\r\n event.preventDefault();\r\n\r\n /** Callback to link action */\r\n action.addEventListener('keydown', function(event){\r\n\r\n if (event.keyCode == codex.core.keys.ENTER) {\r\n\r\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\r\n codex.toolbar.inline.setAnchor(action.value);\r\n\r\n /**\r\n * Preventing events that will be able to happen\r\n */\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n\r\n codex.toolbar.inline.clearRange();\r\n }\r\n\r\n }, false);\r\n }\r\n };\r\n\r\n inline.isLinkActive = function() {\r\n\r\n var isActive = false;\r\n\r\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\r\n var dataType = tool.dataset.type;\r\n\r\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\r\n isActive = true;\r\n }\r\n });\r\n\r\n return isActive;\r\n };\r\n\r\n /** default action behavior of tool */\r\n inline.defaultToolAction = function(type) {\r\n document.execCommand(type, false, null);\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Sets URL\r\n *\r\n * @param {String} url - URL\r\n */\r\n inline.setAnchor = function(url) {\r\n\r\n document.execCommand('createLink', false, url);\r\n\r\n /** Close after URL inserting */\r\n codex.toolbar.inline.closeAction();\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Saves selection\r\n */\r\n inline.saveSelection = function(containerEl) {\r\n\r\n var range = window.getSelection().getRangeAt(0),\r\n preSelectionRange = range.cloneRange(),\r\n start;\r\n\r\n preSelectionRange.selectNodeContents(containerEl);\r\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\r\n\r\n start = preSelectionRange.toString().length;\r\n\r\n return {\r\n start: start,\r\n end: start + range.toString().length\r\n };\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Sets to previous selection (Range)\r\n *\r\n * @param {Element} containerEl - editable element where we restore range\r\n * @param {Object} savedSel - range basic information to restore\r\n */\r\n inline.restoreSelection = function(containerEl, savedSel) {\r\n\r\n var range = document.createRange(),\r\n charIndex = 0;\r\n\r\n range.setStart(containerEl, 0);\r\n range.collapse(true);\r\n\r\n var nodeStack = [containerEl],\r\n node,\r\n foundStart = false,\r\n stop = false,\r\n nextCharIndex;\r\n\r\n while (!stop && (node = nodeStack.pop())) {\r\n\r\n if (node.nodeType == 3) {\r\n\r\n nextCharIndex = charIndex + node.length;\r\n\r\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\r\n range.setStart(node, savedSel.start - charIndex);\r\n foundStart = true;\r\n }\r\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\r\n range.setEnd(node, savedSel.end - charIndex);\r\n stop = true;\r\n }\r\n charIndex = nextCharIndex;\r\n } else {\r\n var i = node.childNodes.length;\r\n while (i--) {\r\n nodeStack.push(node.childNodes[i]);\r\n }\r\n }\r\n }\r\n\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Removes all ranges from window selection\r\n */\r\n inline.clearRange = function() {\r\n var selection = window.getSelection();\r\n selection.removeAllRanges();\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * sets or removes hightlight\r\n */\r\n inline.hightlight = function(tool) {\r\n var dataType = tool.dataset.type;\r\n\r\n if (document.queryCommandState(dataType)) {\r\n codex.toolbar.inline.setButtonHighlighted(tool);\r\n } else {\r\n codex.toolbar.inline.removeButtonsHighLight(tool);\r\n }\r\n\r\n /**\r\n *\r\n * hightlight for anchors\r\n */\r\n var selection = window.getSelection(),\r\n tag = selection.anchorNode.parentNode;\r\n\r\n if (tag.tagName == 'A' && dataType == 'link') {\r\n codex.toolbar.inline.setButtonHighlighted(tool);\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Mark button if text is already executed\r\n */\r\n inline.setButtonHighlighted = function(button) {\r\n button.classList.add('hightlighted');\r\n\r\n /** At link tool we also change icon */\r\n if (button.dataset.type == 'link') {\r\n var icon = button.childNodes[0];\r\n icon.classList.remove('ce-icon-link');\r\n icon.classList.add('ce-icon-unlink');\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Removes hightlight\r\n */\r\n inline.removeButtonsHighLight = function(button) {\r\n button.classList.remove('hightlighted');\r\n\r\n /** At link tool we also change icon */\r\n if (button.dataset.type == 'link') {\r\n var icon = button.childNodes[0];\r\n icon.classList.remove('ce-icon-unlink');\r\n icon.classList.add('ce-icon-link');\r\n }\r\n };\r\n\r\n\r\n return inline;\r\n})({});\r\n\r\ninline.init();\r\n\r\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\r\n * Codex Editor toolbox\r\n *\r\n * All tools be able to appended here\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\n \r\nvar toolbox = (function(toolbox) {\r\n\r\n toolbox.init = function () {\r\n\r\n require('./toolbar');\r\n\r\n };\r\n\r\n toolbox.opened = false;\r\n\r\n /** Shows toolbox */\r\n toolbox.open = function() {\r\n\r\n /** Close setting if toolbox is opened */\r\n if (codex.toolbar.settings.opened) {\r\n\r\n codex.toolbar.settings.close();\r\n\r\n }\r\n\r\n /** display toolbox */\r\n codex.nodes.toolbox.classList.add('opened');\r\n\r\n /** Animate plus button */\r\n codex.nodes.plusButton.classList.add('clicked');\r\n\r\n /** toolbox state */\r\n codex.toolbar.toolbox.opened = true;\r\n\r\n };\r\n\r\n /** Closes toolbox */\r\n toolbox.close = function() {\r\n\r\n /** Makes toolbox disapear */\r\n codex.nodes.toolbox.classList.remove('opened');\r\n\r\n /** Rotate plus button */\r\n codex.nodes.plusButton.classList.remove('clicked');\r\n\r\n /** toolbox state */\r\n codex.toolbar.toolbox.opened = false;\r\n\r\n };\r\n\r\n toolbox.leaf = function(){\r\n\r\n var currentTool = codex.toolbar.current,\r\n tools = Object.keys(codex.tools),\r\n barButtons = codex.nodes.toolbarButtons,\r\n nextToolIndex,\r\n hiddenToolsAmount = 0,\r\n toolToSelect;\r\n\r\n /** Count toolbox hidden tools */\r\n for( var tool in codex.tools ) {\r\n\r\n if (!codex.tools[tool].displayInToolbox) {\r\n\r\n hiddenToolsAmount ++;\r\n\r\n }\r\n\r\n\r\n }\r\n\r\n if ( !currentTool ) {\r\n\r\n /** Get first tool from object*/\r\n for (toolToSelect in barButtons) break;\r\n\r\n } else {\r\n\r\n nextToolIndex = tools.indexOf(currentTool) + 1;\r\n\r\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\r\n\r\n if ( toolIsLastInToolbox ) {\r\n\r\n nextToolIndex = 0;\r\n\r\n /** getting first displayed tool */\r\n for( var tool in codex.tools ) {\r\n\r\n if (codex.tools[tool].displayInToolbox){\r\n\r\n break;\r\n\r\n }\r\n\r\n nextToolIndex ++;\r\n }\r\n\r\n }\r\n\r\n toolToSelect = tools[nextToolIndex];\r\n\r\n }\r\n\r\n for (var button in barButtons) barButtons[button].classList.remove('selected');\r\n barButtons[toolToSelect].classList.add('selected');\r\n codex.toolbar.current = toolToSelect;\r\n\r\n };\r\n\r\n /**\r\n * Transforming selected node type into selected toolbar element type\r\n * @param {event} event\r\n */\r\n toolbox.toolClicked = function() {\r\n\r\n /**\r\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\r\n */\r\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter', 'video'],\r\n tool = codex.tools[codex.toolbar.current],\r\n workingNode = codex.content.currentNode,\r\n currentInputIndex = codex.caret.inputIndex,\r\n newBlockContent,\r\n appendCallback,\r\n blockData;\r\n\r\n /** Make block from plugin */\r\n newBlockContent = tool.make();\r\n\r\n /** information about block */\r\n blockData = {\r\n block : newBlockContent,\r\n type : tool.type,\r\n stretched : false\r\n };\r\n\r\n if (\r\n workingNode &&\r\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\r\n workingNode.textContent.trim() === ''\r\n ){\r\n\r\n /** Replace current block */\r\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\r\n\r\n } else {\r\n\r\n /** Insert new Block from plugin */\r\n codex.content.insertBlock(blockData);\r\n\r\n /** increase input index */\r\n currentInputIndex++;\r\n\r\n }\r\n\r\n /** Fire tool append callback */\r\n appendCallback = tool.appendCallback;\r\n\r\n if (appendCallback && typeof appendCallback == 'function') {\r\n\r\n appendCallback.call(event);\r\n\r\n }\r\n\r\n setTimeout(function() {\r\n\r\n /** Set caret to current block */\r\n codex.caret.setToBlock(currentInputIndex);\r\n\r\n }, 10);\r\n\r\n\r\n /**\r\n * Changing current Node\r\n */\r\n codex.content.workingNodeChanged();\r\n\r\n /**\r\n * Move toolbar when node is changed\r\n */\r\n codex.toolbar.move();\r\n };\r\n\r\n return toolbox;\r\n\r\n})({});\r\n\r\ntoolbox.init();\r\n\r\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\r\n * Codex Editor tools\r\n * This tools will be appended in toolbox\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\n\r\nvar tools = (function(tools) {\r\n\r\n return tools;\r\n\r\n})({});\r\n\r\nmodule.exports = tools;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\r\n * Codex Editor callbacks module\r\n *\r\n * @author Codex Team\r\n * @version 1.2.5\r\n */\r\n\r\nvar callbacks = (function(callbacks) {\r\n\r\n callbacks.redactorSyncTimeout = null;\r\n\r\n callbacks.globalKeydown = function(event){\r\n switch (event.keyCode){\r\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\r\n }\r\n };\r\n\r\n callbacks.redactorKeyDown = function(event) {\r\n switch (event.keyCode){\r\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\r\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\r\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\r\n default : codex.callback.defaultKeyPressed(event); break;\r\n }\r\n };\r\n\r\n callbacks.globalKeyup = function(event){\r\n switch (event.keyCode){\r\n case codex.core.keys.UP :\r\n case codex.core.keys.LEFT :\r\n case codex.core.keys.RIGHT :\r\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\r\n }\r\n };\r\n\r\n callbacks.tabKeyPressed = function(event){\r\n\r\n if ( !codex.toolbar.opened ) {\r\n codex.toolbar.open();\r\n }\r\n\r\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\r\n codex.toolbar.toolbox.open();\r\n } else {\r\n codex.toolbar.toolbox.leaf();\r\n }\r\n\r\n event.preventDefault();\r\n };\r\n\r\n callbacks.enterKeyPressed = function(event) {\r\n\r\n if (codex.content.editorAreaHightlighted) {\r\n\r\n /**\r\n * it means that we lose input index, saved index before is not correct\r\n * therefore we need to set caret when we insert new block\r\n */\r\n codex.caret.inputIndex = -1;\r\n\r\n codex.callback.enterPressedOnBlock();\r\n }\r\n };\r\n\r\n /**\r\n * ENTER key handler\r\n * Makes new paragraph block\r\n */\r\n callbacks.enterKeyPressedOnRedactorZone = function(event){\r\n\r\n if (event.target.contentEditable == 'true') {\r\n\r\n /** Update input index */\r\n codex.caret.saveCurrentInputIndex();\r\n }\r\n\r\n if (!codex.content.currentNode) {\r\n /**\r\n * Enter key pressed in first-level block area\r\n */\r\n codex.callback.enterPressedOnBlock(event);\r\n return;\r\n }\r\n\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\r\n workingNode = codex.content.currentNode,\r\n tool = workingNode.dataset.tool,\r\n isEnterPressedOnToolbar = codex.toolbar.opened &&\r\n codex.toolbar.current &&\r\n event.target == codex.state.inputs[currentInputIndex];\r\n\r\n /** The list of tools which needs the default browser behaviour */\r\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\r\n\r\n /** This type of block creates when enter is pressed */\r\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\r\n\r\n /**\r\n * When toolbar is opened, select tool instead of making new paragraph\r\n */\r\n if ( isEnterPressedOnToolbar ) {\r\n\r\n event.preventDefault();\r\n\r\n codex.toolbar.toolbox.toolClicked(event);\r\n\r\n codex.toolbar.close();\r\n\r\n /**\r\n * Stop other listeners callback executions\r\n */\r\n event.stopPropagation();\r\n event.stopImmediatePropagation();\r\n\r\n return;\r\n\r\n }\r\n\r\n /**\r\n * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\r\n */\r\n if ( event.shiftKey && !enableLineBreaks) {\r\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\r\n event.preventDefault();\r\n\r\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\r\n /** XOR */\r\n return;\r\n }\r\n\r\n var isLastTextNode = false,\r\n currentSelection = window.getSelection(),\r\n currentSelectedNode = currentSelection.anchorNode,\r\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\r\n isTextNodeHasParentBetweenContenteditable = false;\r\n\r\n /**\r\n * Workaround situation when caret at the Text node that has some wrapper Elements\r\n * Split block cant handle this.\r\n * We need to save default behavior\r\n */\r\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\r\n\r\n /**\r\n * Split blocks when input has several nodes and caret placed in textNode\r\n */\r\n if (\r\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\r\n !isTextNodeHasParentBetweenContenteditable &&\r\n !caretAtTheEndOfText\r\n ){\r\n\r\n event.preventDefault();\r\n\r\n codex.core.log('Splitting Text node...');\r\n\r\n codex.content.splitBlock(currentInputIndex);\r\n\r\n /** Show plus button when next input after split is empty*/\r\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\r\n codex.toolbar.showPlusButton();\r\n }\r\n\r\n } else {\r\n\r\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\r\n\r\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\r\n\r\n }\r\n\r\n if ( isLastTextNode && caretAtTheEndOfText ) {\r\n\r\n event.preventDefault();\r\n\r\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\r\n\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render()\r\n }, true );\r\n\r\n codex.toolbar.move();\r\n codex.toolbar.open();\r\n\r\n /** Show plus button with empty block */\r\n codex.toolbar.showPlusButton();\r\n\r\n } else {\r\n\r\n codex.core.log('Default ENTER behavior.');\r\n\r\n }\r\n\r\n }\r\n\r\n /** get all inputs after new appending block */\r\n codex.ui.saveInputs();\r\n\r\n };\r\n\r\n callbacks.escapeKeyPressed = function(event){\r\n\r\n /** Close all toolbar */\r\n codex.toolbar.close();\r\n\r\n /** Close toolbox */\r\n codex.toolbar.toolbox.close();\r\n\r\n event.preventDefault();\r\n\r\n };\r\n\r\n callbacks.arrowKeyPressed = function(event){\r\n\r\n codex.content.workingNodeChanged();\r\n\r\n /* Closing toolbar */\r\n codex.toolbar.close();\r\n codex.toolbar.move();\r\n\r\n };\r\n\r\n callbacks.defaultKeyPressed = function(event) {\r\n\r\n codex.toolbar.close();\r\n\r\n if (!codex.toolbar.inline.actionsOpened) {\r\n codex.toolbar.inline.close();\r\n codex.content.clearMark();\r\n }\r\n };\r\n\r\n callbacks.redactorClicked = function (event) {\r\n\r\n callbacks.detectWhenClickedOnFirstLevelBlockArea();\r\n\r\n codex.content.workingNodeChanged(event.target);\r\n\r\n codex.ui.saveInputs();\r\n\r\n var selectedText = codex.toolbar.inline.getSelectionText();\r\n\r\n /**\r\n * If selection range took off, then we hide inline toolbar\r\n */\r\n if (selectedText.length === 0) {\r\n codex.toolbar.inline.close();\r\n }\r\n\r\n /** Update current input index in memory when caret focused into existed input */\r\n if (event.target.contentEditable == 'true') {\r\n\r\n codex.caret.saveCurrentInputIndex();\r\n\r\n }\r\n\r\n if (codex.content.currentNode === null) {\r\n\r\n /**\r\n * If inputs in redactor does not exits, then we put input index 0 not -1\r\n */\r\n var indexOfLastInput = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\r\n\r\n /** If we have any inputs */\r\n if (codex.state.inputs.length) {\r\n\r\n /** getting firstlevel parent of input */\r\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\r\n }\r\n\r\n /** If input is empty, then we set caret to the last input */\r\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\r\n\r\n codex.caret.setToBlock(indexOfLastInput);\r\n\r\n } else {\r\n\r\n /** Create new input when caret clicked in redactors area */\r\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\r\n\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render()\r\n });\r\n\r\n /** If there is no inputs except inserted */\r\n if (codex.state.inputs.length === 1) {\r\n\r\n codex.caret.setToBlock(indexOfLastInput);\r\n\r\n } else {\r\n\r\n /** Set caret to this appended input */\r\n codex.caret.setToNextBlock(indexOfLastInput);\r\n }\r\n }\r\n\r\n /**\r\n * Move toolbar to the right position and open\r\n */\r\n codex.toolbar.move();\r\n\r\n\r\n codex.toolbar.open();\r\n\r\n } else {\r\n\r\n /**\r\n * Move toolbar to the new position and open\r\n */\r\n codex.toolbar.move();\r\n\r\n codex.toolbar.open();\r\n\r\n /** Close all panels */\r\n codex.toolbar.settings.close();\r\n codex.toolbar.toolbox.close();\r\n }\r\n\r\n\r\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\r\n\r\n if (inputIsEmpty) {\r\n\r\n /** Show plus button */\r\n codex.toolbar.showPlusButton();\r\n\r\n } else {\r\n\r\n /** Hide plus buttons */\r\n codex.toolbar.hidePlusButton();\r\n\r\n }\r\n\r\n var currentNodeType = codex.content.currentNode.dataset.tool;\r\n\r\n /** Mark current block*/\r\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\r\n\r\n codex.content.markBlock();\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * This method allows to define, is caret in contenteditable element or not.\r\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\r\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\r\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\r\n * specifies to the first-level block. Other cases we just ignore.\r\n */\r\n callbacks.detectWhenClickedOnFirstLevelBlockArea = function() {\r\n\r\n var selection = window.getSelection(),\r\n anchorNode = selection.anchorNode,\r\n flag = false;\r\n\r\n if (selection.rangeCount == 0) {\r\n\r\n codex.content.editorAreaHightlighted = true;\r\n\r\n } else {\r\n\r\n if (!codex.core.isDomNode(anchorNode)) {\r\n anchorNode = anchorNode.parentNode;\r\n }\r\n\r\n /** Already founded, without loop */\r\n if (anchorNode.contentEditable == 'true') {\r\n flag = true;\r\n }\r\n\r\n while (anchorNode.contentEditable != 'true') {\r\n anchorNode = anchorNode.parentNode;\r\n\r\n if (anchorNode.contentEditable == 'true') {\r\n flag = true;\r\n }\r\n\r\n if (anchorNode == document.body) {\r\n break;\r\n }\r\n }\r\n\r\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\r\n codex.content.editorAreaHightlighted = flag ? false : true;\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Toolbar button click handler\r\n * @param this - cursor to the button\r\n */\r\n callbacks.toolbarButtonClicked = function (event) {\r\n\r\n var button = this;\r\n\r\n codex.toolbar.current = button.dataset.type;\r\n\r\n codex.toolbar.toolbox.toolClicked(event);\r\n codex.toolbar.close();\r\n\r\n };\r\n\r\n callbacks.redactorInputEvent = function (event) {\r\n\r\n /**\r\n * Clear previous sync-timeout\r\n */\r\n if (this.redactorSyncTimeout){\r\n clearTimeout(this.redactorSyncTimeout);\r\n }\r\n\r\n /**\r\n * Start waiting to input finish and sync redactor\r\n */\r\n this.redactorSyncTimeout = setTimeout(function() {\r\n\r\n codex.content.sync();\r\n\r\n }, 500);\r\n\r\n };\r\n\r\n /** Show or Hide toolbox when plus button is clicked */\r\n callbacks.plusButtonClicked = function() {\r\n\r\n if (!codex.nodes.toolbox.classList.contains('opened')) {\r\n\r\n codex.toolbar.toolbox.open();\r\n\r\n } else {\r\n\r\n codex.toolbar.toolbox.close();\r\n\r\n }\r\n };\r\n\r\n /**\r\n * Block handlers for KeyDown events\r\n */\r\n callbacks.blockKeydown = function(event, block) {\r\n\r\n switch (event.keyCode){\r\n\r\n case codex.core.keys.DOWN:\r\n case codex.core.keys.RIGHT:\r\n codex.callback.blockRightOrDownArrowPressed(block);\r\n break;\r\n\r\n case codex.core.keys.BACKSPACE:\r\n codex.callback.backspacePressed(block);\r\n break;\r\n\r\n case codex.core.keys.UP:\r\n case codex.core.keys.LEFT:\r\n codex.callback.blockLeftOrUpArrowPressed(block);\r\n break;\r\n\r\n }\r\n };\r\n\r\n /**\r\n * RIGHT or DOWN keydowns on block\r\n */\r\n callbacks.blockRightOrDownArrowPressed = function (block) {\r\n\r\n var selection = window.getSelection(),\r\n inputs = codex.state.inputs,\r\n focusedNode = selection.anchorNode,\r\n focusedNodeHolder;\r\n\r\n /** Check for caret existance */\r\n if (!focusedNode){\r\n return false;\r\n }\r\n\r\n /** Looking for closest (parent) contentEditable element of focused node */\r\n while (focusedNode.contentEditable != 'true') {\r\n\r\n focusedNodeHolder = focusedNode.parentNode;\r\n focusedNode = focusedNodeHolder;\r\n }\r\n\r\n /** Input index in DOM level */\r\n var editableElementIndex = 0;\r\n while (focusedNode != inputs[editableElementIndex]) {\r\n editableElementIndex ++;\r\n }\r\n\r\n /**\r\n * Founded contentEditable element doesn't have childs\r\n * Or maybe New created block\r\n */\r\n if (!focusedNode.textContent)\r\n {\r\n codex.caret.setToNextBlock(editableElementIndex);\r\n return;\r\n }\r\n\r\n /**\r\n * Do nothing when caret doesn not reaches the end of last child\r\n */\r\n var caretInLastChild = false,\r\n caretAtTheEndOfText = false;\r\n\r\n var lastChild,\r\n deepestTextnode;\r\n\r\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\r\n\r\n if (codex.core.isDomNode(lastChild)) {\r\n\r\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\r\n\r\n } else {\r\n\r\n deepestTextnode = lastChild;\r\n\r\n }\r\n\r\n caretInLastChild = selection.anchorNode == deepestTextnode;\r\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\r\n\r\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\r\n codex.core.log('arrow [down|right] : caret does not reached the end');\r\n return false;\r\n }\r\n\r\n codex.caret.setToNextBlock(editableElementIndex);\r\n\r\n };\r\n\r\n /**\r\n * LEFT or UP keydowns on block\r\n */\r\n callbacks.blockLeftOrUpArrowPressed = function (block) {\r\n\r\n var selection = window.getSelection(),\r\n inputs = codex.state.inputs,\r\n focusedNode = selection.anchorNode,\r\n focusedNodeHolder;\r\n\r\n /** Check for caret existance */\r\n if (!focusedNode){\r\n return false;\r\n }\r\n\r\n /**\r\n * LEFT or UP not at the beginning\r\n */\r\n if ( selection.anchorOffset !== 0) {\r\n return false;\r\n }\r\n\r\n /** Looking for parent contentEditable block */\r\n while (focusedNode.contentEditable != 'true') {\r\n focusedNodeHolder = focusedNode.parentNode;\r\n focusedNode = focusedNodeHolder;\r\n }\r\n\r\n /** Input index in DOM level */\r\n var editableElementIndex = 0;\r\n while (focusedNode != inputs[editableElementIndex]) {\r\n editableElementIndex ++;\r\n }\r\n\r\n /**\r\n * Do nothing if caret is not at the beginning of first child\r\n */\r\n var caretInFirstChild = false,\r\n caretAtTheBeginning = false;\r\n\r\n var firstChild,\r\n deepestTextnode;\r\n\r\n /**\r\n * Founded contentEditable element doesn't have childs\r\n * Or maybe New created block\r\n */\r\n if (!focusedNode.textContent) {\r\n codex.caret.setToPreviousBlock(editableElementIndex);\r\n return;\r\n }\r\n\r\n firstChild = focusedNode.childNodes[0];\r\n\r\n if (codex.core.isDomNode(firstChild)) {\r\n\r\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\r\n\r\n } else {\r\n\r\n deepestTextnode = firstChild;\r\n\r\n }\r\n\r\n caretInFirstChild = selection.anchorNode == deepestTextnode;\r\n caretAtTheBeginning = selection.anchorOffset === 0;\r\n\r\n if ( caretInFirstChild && caretAtTheBeginning ) {\r\n\r\n codex.caret.setToPreviousBlock(editableElementIndex);\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Callback for enter key pressing in first-level block area\r\n */\r\n callbacks.enterPressedOnBlock = function (event) {\r\n\r\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\r\n\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render()\r\n }, true );\r\n\r\n codex.toolbar.move();\r\n codex.toolbar.open();\r\n\r\n };\r\n\r\n callbacks.backspacePressed = function (block) {\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\r\n range,\r\n selectionLength,\r\n firstLevelBlocksCount;\r\n\r\n if (block.textContent.trim()) {\r\n\r\n range = codex.content.getRange();\r\n selectionLength = range.endOffset - range.startOffset;\r\n\r\n\r\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\r\n\r\n codex.content.mergeBlocks(currentInputIndex);\r\n\r\n } else {\r\n\r\n return;\r\n\r\n }\r\n }\r\n\r\n if (!selectionLength) {\r\n block.remove();\r\n }\r\n\r\n\r\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\r\n\r\n /**\r\n * If all blocks are removed\r\n */\r\n if (firstLevelBlocksCount === 0) {\r\n\r\n /** update currentNode variable */\r\n codex.content.currentNode = null;\r\n\r\n /** Inserting new empty initial block */\r\n codex.ui.addInitialBlock();\r\n\r\n /** Updating inputs state after deleting last block */\r\n codex.ui.saveInputs();\r\n\r\n /** Set to current appended block */\r\n setTimeout(function () {\r\n\r\n codex.caret.setToPreviousBlock(1);\r\n\r\n }, 10);\r\n\r\n } else {\r\n\r\n if (codex.caret.inputIndex !== 0) {\r\n\r\n /** Target block is not first */\r\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\r\n\r\n } else {\r\n\r\n /** If we try to delete first block */\r\n codex.caret.setToNextBlock(codex.caret.inputIndex);\r\n\r\n }\r\n }\r\n\r\n codex.toolbar.move();\r\n\r\n if (!codex.toolbar.opened) {\r\n codex.toolbar.open();\r\n }\r\n\r\n /** Updating inputs state */\r\n codex.ui.saveInputs();\r\n\r\n /** Prevent default browser behaviour */\r\n event.preventDefault();\r\n\r\n };\r\n\r\n /**\r\n * @deprecated\r\n *\r\n * @param event\r\n */\r\n callbacks.blockPaste = function(event) {\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\r\n node = codex.state.inputs[currentInputIndex];\r\n\r\n setTimeout(function() {\r\n\r\n codex.content.sanitize(node);\r\n\r\n event.preventDefault();\r\n\r\n }, 10);\r\n\r\n event.stopImmediatePropagation();\r\n\r\n };\r\n\r\n callbacks.blockPasteCallback = function(event) {\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex();\r\n\r\n /**\r\n * create an observer instance\r\n */\r\n var observer = new MutationObserver(codex.callback.handleMutationsOnPaste);\r\n\r\n /**\r\n * configuration of the observer:\r\n */\r\n var config = {\r\n attributes: true,\r\n childList: true,\r\n characterData: false,\r\n subtree : true\r\n };\r\n\r\n // pass in the target node, as well as the observer options\r\n observer.observe(codex.state.inputs[currentInputIndex], config);\r\n };\r\n\r\n /**\r\n * Sends all mutations to paste handler\r\n */\r\n callbacks.handleMutationsOnPaste = function(mutations) {\r\n\r\n var self = this;\r\n\r\n /**\r\n * Calling function with context of this function.\r\n * Also, we should sanitize pasted or changed data one time and ignore\r\n * changings which makes sanitize method.\r\n * For that, we need to send Context, MutationObserver.__proto__ that contains\r\n * observer disconnect method.\r\n */\r\n mutations.forEach(function(mutation) {\r\n codex.content.paste.call(self, mutation);\r\n });\r\n };\r\n\r\n /**\r\n * Clicks on block settings button\r\n */\r\n callbacks.showSettingsButtonClicked = function(){\r\n\r\n /**\r\n * Get type of current block\r\n * It uses to append settings from tool.settings property.\r\n * ...\r\n * Type is stored in data-type attribute on block\r\n */\r\n var currentToolType = codex.content.currentNode.dataset.tool;\r\n\r\n codex.toolbar.settings.toggle(currentToolType);\r\n\r\n /** Close toolbox when settings button is active */\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.hideRemoveActions();\r\n\r\n };\r\n\r\n return callbacks;\r\n\r\n})({});\r\n\r\nmodule.exports = callbacks;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\r\n * Codex Editor Draw module\r\n *\r\n * @author Codex Team\r\n * @version 1.0.\r\n */\r\n\r\nvar draw = (function(draw) {\r\n\r\n /**\r\n * Base editor wrapper\r\n */\r\n draw.wrapper = function () {\r\n\r\n var wrapper = document.createElement('div');\r\n\r\n wrapper.className += 'codex-editor';\r\n\r\n return wrapper;\r\n\r\n };\r\n\r\n /**\r\n * Content-editable holder\r\n */\r\n draw.redactor = function () {\r\n\r\n var redactor = document.createElement('div');\r\n\r\n redactor.className += 'ce-redactor';\r\n\r\n return redactor;\r\n\r\n };\r\n\r\n draw.ceBlock = function() {\r\n\r\n var block = document.createElement('DIV');\r\n\r\n block.className += 'ce_block';\r\n\r\n return block;\r\n\r\n };\r\n\r\n /**\r\n * Empty toolbar with toggler\r\n */\r\n draw.toolbar = function () {\r\n\r\n var bar = document.createElement('div');\r\n\r\n bar.className += 'ce-toolbar';\r\n\r\n return bar;\r\n };\r\n\r\n draw.toolbarContent = function() {\r\n\r\n var wrapper = document.createElement('DIV');\r\n wrapper.classList.add('ce-toolbar__content');\r\n\r\n return wrapper;\r\n };\r\n\r\n /**\r\n * Inline toolbar\r\n */\r\n draw.inlineToolbar = function() {\r\n\r\n var bar = document.createElement('DIV');\r\n\r\n bar.className += 'ce-toolbar-inline';\r\n\r\n return bar;\r\n\r\n };\r\n\r\n /**\r\n * Wrapper for inline toobar buttons\r\n */\r\n draw.inlineToolbarButtons = function() {\r\n\r\n var wrapper = document.createElement('DIV');\r\n\r\n wrapper.className += 'ce-toolbar-inline__buttons';\r\n\r\n return wrapper;\r\n };\r\n\r\n /**\r\n * For some actions\r\n */\r\n draw.inlineToolbarActions = function() {\r\n\r\n var wrapper = document.createElement('DIV');\r\n\r\n wrapper.className += 'ce-toolbar-inline__actions';\r\n\r\n return wrapper;\r\n\r\n };\r\n\r\n draw.inputForLink = function() {\r\n\r\n var input = document.createElement('INPUT');\r\n\r\n input.type = 'input';\r\n input.className += 'inputForLink';\r\n input.placeholder = 'Type URL ...';\r\n input.setAttribute('form', 'defaultForm');\r\n\r\n input.setAttribute('autofocus', 'autofocus');\r\n\r\n return input;\r\n\r\n };\r\n\r\n /**\r\n * Block with notifications\r\n */\r\n draw.alertsHolder = function() {\r\n\r\n var block = document.createElement('div');\r\n\r\n block.classList.add('ce_notifications-block');\r\n\r\n return block;\r\n\r\n };\r\n\r\n /**\r\n * @todo Desc\r\n */\r\n draw.blockButtons = function() {\r\n\r\n var block = document.createElement('div');\r\n\r\n block.className += 'ce-toolbar__actions';\r\n\r\n return block;\r\n };\r\n\r\n /**\r\n * Block settings panel\r\n */\r\n draw.blockSettings = function () {\r\n\r\n var settings = document.createElement('div');\r\n\r\n settings.className += 'ce-settings';\r\n\r\n return settings;\r\n };\r\n\r\n draw.defaultSettings = function() {\r\n\r\n var div = document.createElement('div');\r\n\r\n div.classList.add('ce-settings_default');\r\n\r\n return div;\r\n };\r\n\r\n draw.pluginsSettings = function() {\r\n\r\n var div = document.createElement('div');\r\n\r\n div.classList.add('ce-settings_plugin');\r\n\r\n return div;\r\n\r\n };\r\n\r\n draw.plusButton = function() {\r\n\r\n var button = document.createElement('span');\r\n\r\n button.className = 'ce-toolbar__plus';\r\n // button.innerHTML = '';\r\n\r\n return button;\r\n };\r\n\r\n /**\r\n * Settings button in toolbar\r\n */\r\n draw.settingsButton = function () {\r\n\r\n var toggler = document.createElement('span');\r\n\r\n toggler.className = 'ce-toolbar__settings-btn';\r\n\r\n /** Toggler button*/\r\n toggler.innerHTML = '';\r\n\r\n return toggler;\r\n };\r\n\r\n /**\r\n * Redactor tools wrapper\r\n */\r\n\r\n draw.toolbox = function() {\r\n\r\n var wrapper = document.createElement('div');\r\n\r\n wrapper.className = 'ce-toolbar__tools';\r\n\r\n return wrapper;\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Draws tool buttons for toolbox\r\n *\r\n * @param {String} type\r\n * @param {String} classname\r\n * @returns {Element}\r\n */\r\n draw.toolbarButton = function (type, classname) {\r\n\r\n var button = document.createElement(\"li\"),\r\n tool_icon = document.createElement(\"i\"),\r\n tool_title = document.createElement(\"span\");\r\n\r\n button.dataset.type = type;\r\n button.setAttribute('title', type);\r\n\r\n tool_icon.classList.add(classname);\r\n tool_title.classList.add('ce_toolbar_tools--title');\r\n\r\n\r\n button.appendChild(tool_icon);\r\n button.appendChild(tool_title);\r\n\r\n return button;\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Draws tools for inline toolbar\r\n *\r\n * @param {String} type\r\n * @param {String} classname\r\n */\r\n draw.toolbarButtonInline = function(type, classname) {\r\n var button = document.createElement(\"BUTTON\"),\r\n tool_icon = document.createElement(\"I\");\r\n\r\n button.type = \"button\";\r\n button.dataset.type = type;\r\n tool_icon.classList.add(classname);\r\n\r\n button.appendChild(tool_icon);\r\n\r\n return button;\r\n };\r\n\r\n /**\r\n * Redactor block\r\n */\r\n draw.block = function (tagName, content) {\r\n\r\n var node = document.createElement(tagName);\r\n\r\n node.innerHTML = content || '';\r\n\r\n return node;\r\n\r\n };\r\n\r\n /**\r\n * Creates Node with passed tagName and className\r\n * @param {string} tagName\r\n * @param {string} className\r\n * @param {object} properties - allow to assign properties\r\n */\r\n draw.node = function( tagName , className , properties ){\r\n\r\n var el = document.createElement( tagName );\r\n\r\n if ( className ) el.className = className;\r\n\r\n if ( properties ) {\r\n\r\n for (var name in properties){\r\n el[name] = properties[name];\r\n }\r\n }\r\n\r\n return el;\r\n };\r\n\r\n draw.pluginsRender = function(type, content) {\r\n\r\n return {\r\n type : type,\r\n block : cEditor.tools[type].render({\r\n text : content\r\n })\r\n };\r\n };\r\n\r\n return draw;\r\n\r\n})({});\r\n\r\nmodule.exports = draw;\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\r\n * Codex Editor Caret Module\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\n\r\nvar caret = (function(caret) {\r\n\r\n /**\r\n * @var {int} InputIndex - editable element in DOM\r\n */\r\n caret.inputIndex = null;\r\n\r\n /**\r\n * @var {int} offset - caret position in a text node.\r\n */\r\n caret.offset = null;\r\n\r\n /**\r\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\r\n */\r\n caret.focusedNodeIndex = null;\r\n\r\n /**\r\n * Creates Document Range and sets caret to the element.\r\n * @protected\r\n * @uses caret.save — if you need to save caret position\r\n * @param {Element} el - Changed Node.\r\n */\r\n caret.set = function( el , index, offset) {\r\n\r\n offset = offset || this.offset || 0;\r\n index = index || this.focusedNodeIndex || 0;\r\n\r\n var childs = el.childNodes,\r\n nodeToSet;\r\n\r\n if ( childs.length === 0 ) {\r\n\r\n nodeToSet = el;\r\n\r\n } else {\r\n\r\n nodeToSet = childs[index];\r\n\r\n }\r\n\r\n /** If Element is INPUT */\r\n if (el.tagName == 'INPUT') {\r\n el.focus();\r\n return;\r\n }\r\n\r\n if (codex.core.isDomNode(nodeToSet)) {\r\n\r\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\r\n }\r\n\r\n var range = document.createRange(),\r\n selection = window.getSelection();\r\n\r\n setTimeout(function() {\r\n\r\n range.setStart(nodeToSet, offset);\r\n range.setEnd(nodeToSet, offset);\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n\r\n codex.caret.saveCurrentInputIndex();\r\n\r\n }, 20);\r\n };\r\n\r\n /**\r\n * @protected\r\n * Updates index of input and saves it in caret object\r\n */\r\n caret.saveCurrentInputIndex = function () {\r\n\r\n /** Index of Input that we paste sanitized content */\r\n var selection = window.getSelection(),\r\n inputs = codex.state.inputs,\r\n focusedNode = selection.anchorNode,\r\n focusedNodeHolder;\r\n\r\n if (!focusedNode){\r\n return;\r\n }\r\n\r\n /** Looking for parent contentEditable block */\r\n while (focusedNode.contentEditable != 'true') {\r\n focusedNodeHolder = focusedNode.parentNode;\r\n focusedNode = focusedNodeHolder;\r\n }\r\n\r\n /** Input index in DOM level */\r\n var editableElementIndex = 0;\r\n\r\n while (focusedNode != inputs[editableElementIndex]) {\r\n editableElementIndex ++;\r\n }\r\n\r\n this.inputIndex = editableElementIndex;\r\n };\r\n\r\n /**\r\n * Returns current input index (caret object)\r\n */\r\n caret.getCurrentInputIndex = function() {\r\n return this.inputIndex;\r\n };\r\n\r\n /**\r\n * @param {int} index - index of first-level block after that we set caret into next input\r\n */\r\n caret.setToNextBlock = function(index) {\r\n\r\n var inputs = codex.state.inputs,\r\n nextInput = inputs[index + 1];\r\n\r\n if (!nextInput) {\r\n codex.core.log('We are reached the end');\r\n return;\r\n }\r\n\r\n /**\r\n * When new Block created or deleted content of input\r\n * We should add some text node to set caret\r\n */\r\n if (!nextInput.childNodes.length) {\r\n var emptyTextElement = document.createTextNode('');\r\n nextInput.appendChild(emptyTextElement);\r\n }\r\n\r\n codex.caret.inputIndex = index + 1;\r\n codex.caret.set(nextInput, 0, 0);\r\n codex.content.workingNodeChanged(nextInput);\r\n\r\n };\r\n\r\n /**\r\n * @param {int} index - index of target input.\r\n * Sets caret to input with this index\r\n */\r\n caret.setToBlock = function(index) {\r\n\r\n var inputs = codex.state.inputs,\r\n targetInput = inputs[index];\r\n\r\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\r\n\r\n if ( !targetInput ) {\r\n return;\r\n }\r\n\r\n /**\r\n * When new Block created or deleted content of input\r\n * We should add some text node to set caret\r\n */\r\n if (!targetInput.childNodes.length) {\r\n var emptyTextElement = document.createTextNode('');\r\n targetInput.appendChild(emptyTextElement);\r\n }\r\n\r\n codex.caret.inputIndex = index;\r\n codex.caret.set(targetInput, 0, 0);\r\n codex.content.workingNodeChanged(targetInput);\r\n\r\n };\r\n\r\n /**\r\n * @param {int} index - index of input\r\n */\r\n caret.setToPreviousBlock = function(index) {\r\n\r\n index = index || 0;\r\n\r\n var inputs = codex.state.inputs,\r\n previousInput = inputs[index - 1],\r\n lastChildNode,\r\n lengthOfLastChildNode,\r\n emptyTextElement;\r\n\r\n\r\n if (!previousInput) {\r\n codex.core.log('We are reached first node');\r\n return;\r\n }\r\n\r\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\r\n lengthOfLastChildNode = lastChildNode.length;\r\n\r\n /**\r\n * When new Block created or deleted content of input\r\n * We should add some text node to set caret\r\n */\r\n if (!previousInput.childNodes.length) {\r\n\r\n emptyTextElement = document.createTextNode('');\r\n previousInput.appendChild(emptyTextElement);\r\n }\r\n codex.caret.inputIndex = index - 1;\r\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\r\n codex.content.workingNodeChanged(inputs[index - 1]);\r\n };\r\n\r\n caret.position = {\r\n\r\n atStart : function() {\r\n\r\n var selection = window.getSelection(),\r\n anchorOffset = selection.anchorOffset,\r\n anchorNode = selection.anchorNode,\r\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\r\n pluginsRender = firstLevelBlock.childNodes[0];\r\n\r\n if (!codex.core.isDomNode(anchorNode)) {\r\n anchorNode = anchorNode.parentNode;\r\n }\r\n\r\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\r\n isOffsetZero = anchorOffset === 0;\r\n\r\n return isFirstNode && isOffsetZero;\r\n\r\n },\r\n\r\n atTheEnd : function() {\r\n\r\n var selection = window.getSelection(),\r\n anchorOffset = selection.anchorOffset,\r\n anchorNode = selection.anchorNode;\r\n\r\n /** Caret is at the end of input */\r\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\r\n }\r\n };\r\n\r\n return caret;\r\n\r\n})({});\r\n\r\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\r\n * Codex Editor Notification Module\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\n\r\nvar notifications = (function(notifications) {\r\n\r\n /**\r\n * Error notificator. Shows block with message\r\n * @protected\r\n */\r\n notifications.errorThrown = function(errorMsg, event) {\r\n\r\n codex.notifications.send('This action is not available currently', event.type, false);\r\n\r\n };\r\n\r\n /**\r\n * Appends notification with different types\r\n * @param message {string} - Error or alert message\r\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\r\n * @param append {boolean} - can be True or False when notification should be inserted after\r\n */\r\n notifications.send = function(message, type, append) {\r\n\r\n var notification = codex.draw.block('div');\r\n\r\n notification.textContent = message;\r\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\r\n\r\n if (!append) {\r\n codex.nodes.notifications.innerHTML = '';\r\n }\r\n\r\n codex.nodes.notifications.appendChild(notification);\r\n\r\n setTimeout(function () {\r\n notification.remove();\r\n }, 3000);\r\n\r\n };\r\n\r\n return notifications;\r\n\r\n})({});\r\n\r\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\r\n * Codex Editor Parser Module\r\n *\r\n * @author Codex Team\r\n * @version 1.1\r\n */\r\n\r\nvar parser = (function(parser) {\r\n\r\n /** inserting text */\r\n parser.insertPastedContent = function(blockType, tag) {\r\n\r\n codex.content.insertBlock({\r\n type : blockType.type,\r\n block : blockType.render({\r\n text : tag.innerHTML\r\n })\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Check DOM node for display style: separated block or child-view\r\n */\r\n parser.isFirstLevelBlock = function (node) {\r\n\r\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\r\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\r\n\r\n };\r\n\r\n return parser;\r\n\r\n})({});\r\n\r\nmodule.exports = parser;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file diff --git a/whatwg-fetch.js.map b/whatwg-fetch.js.map index fd85ad99..dbcdf299 100644 --- a/whatwg-fetch.js.map +++ b/whatwg-fetch.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap f9691fefd54fa5e18e44?dce6","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 f9691fefd54fa5e18e44","(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 +{"version":3,"sources":["webpack:///webpack/bootstrap 685c3b69d4372899a8c1?27da","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 685c3b69d4372899a8c1","(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 From 7439c5aa38287ecf847fab497f6a678fe24f6082 Mon Sep 17 00:00:00 2001 From: George Berezhnoy Date: Fri, 13 Jan 2017 00:16:17 +0300 Subject: [PATCH 13/23] Rewrite plugin with function closure --- example.html | 6 +- plugins/paste/patterns.js | 14 ++-- plugins/video/video.js | 154 ++++++++++++++++++-------------------- 3 files changed, 84 insertions(+), 90 deletions(-) diff --git a/example.html b/example.html index b8dd39b2..c02bd669 100644 --- a/example.html +++ b/example.html @@ -177,11 +177,11 @@ }, video: { type: 'video', - make: videoTool.make, + make: video.make, appendCallback: null, settings: null, - render: videoTool.render, - save: videoTool.save, + render: video.render, + save: video.save, displayInToolbox: false, enableLineBreaks: false, allowedToPaste: false diff --git a/plugins/paste/patterns.js b/plugins/paste/patterns.js index b78a7748..8b32017a 100644 --- a/plugins/paste/patterns.js +++ b/plugins/paste/patterns.js @@ -39,37 +39,37 @@ pasteTool.patterns = [ { type: 'youtube', regex: /^.*(?:(?:youtu\.be\/)|(?:youtube\.com)\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*)(?:[\?\&]t\=(\d*)|)/, - callback: videoTool.urlPastedCallbacks.generalCallback + callback: video.urlPastedCallback }, { type: 'vimeo', regex: /(?:http[s]?:\/\/)?(?:www.)?vimeo\.co(?:.+\/([^\/]\d+)(?:#t=[\d]+)?s?$)/, - callback: videoTool.urlPastedCallbacks.generalCallback + callback: video.urlPastedCallback }, { type: 'coub', regex: /https?:\/\/coub\.com\/view\/([^\/\?\&]+)/, - callback: videoTool.urlPastedCallbacks.generalCallback + callback: video.urlPastedCallback }, { type: 'vine', regex: /https?:\/\/vine\.co\/v\/([^\/\?\&]+)/, - callback: videoTool.urlPastedCallbacks.generalCallback + callback: video.urlPastedCallback }, { type: 'vk', regex: /https?:\/\/vk\.com\/.*(?:video)[-0-9]+_([0-9]+)/, - callback: videoTool.urlPastedCallbacks.generalCallback + callback: video.urlPastedCallback }, { type: 'imgur', regex: /https?:\/\/(?:i\.)?imgur\.com.*\/([a-zA-Z0-9]+)(?:\.gifv)?/, - callback: videoTool.urlPastedCallbacks.generalCallback + callback: video.urlPastedCallback }, { type: 'gfycat', regex: /https?:\/\/gfycat\.com(?:\/detail)?\/([a-zA-Z]+)/, - callback: videoTool.urlPastedCallbacks.generalCallback + callback: video.urlPastedCallback } ]; \ No newline at end of file diff --git a/plugins/video/video.js b/plugins/video/video.js index 29fe60c3..e2f34a87 100644 --- a/plugins/video/video.js +++ b/plugins/video/video.js @@ -2,88 +2,34 @@ * Video plugin by gohabereg * @version 1.0.0 */ -var videoTool = { +var video = function(video){ - make : function(data, isInternal) { + var methods = { - if (!data.video_id) - return; + addInternal: function (content) { + codex.content.switchBlock(codex.content.currentNode, content, 'video'); - var html = videoTool.content.getHtmlWithVideoId(data.service, data.video_id), - block = videoTool.content.makeElementFromHtml(html); + var blockContent = codex.content.currentNode.childNodes[0]; + blockContent.classList.add('video__loader'); - block.dataset.id = data.video_id; - block.dataset.videoSeirvice = data.service; + setTimeout(function(){ + blockContent.classList.remove('video__loader'); + }, 1000); - if (isInternal) { + }, - setTimeout(function() { + getHtmlWithVideoId: function (type, id) { + return services[type].html.replace(/<\%\= remote\_id \%\>/g, id); + }, - /** Render block */ - videoTool.content.render(block); - - }, 200); + makeElementFromHtml: function(html) { + var wrapper = document.createElement('DIV'); + wrapper.innerHTML = html; + return wrapper.firstElementChild; } + }; - return block; - - }, - - /** - * Saving JSON output. - * Upload data via ajax - */ - save : function(blockContent) { - - var data; - - if (!blockContent) - return; - - data = { - video_id: blockContent.dataset.id, - service: blockContent.dataset.videoService - }; - - return data; - - }, - - /** - * Render data - */ - render : function(data) { - return videoTool.make(data); - }, - - -}; - -videoTool.content = { - - render: function (content) { - codex.content.switchBlock(codex.content.currentNode, content, 'video'); - - var blockContent = codex.content.currentNode.childNodes[0]; - blockContent.classList.add('video__loader'); - - setTimeout(function(){ - blockContent.classList.remove('video__loader'); - }, 1000); - - }, - - getHtmlWithVideoId: function (type, id) { - return videoTool.content.services[type].html.replace(/<\%\= remote\_id \%\>/g, id); - }, - - makeElementFromHtml: function(html) { - var wrapper = document.createElement('DIV'); - wrapper.innerHTML = html; - return wrapper.firstElementChild; - }, - - services: { + var services = { vimeo: { regex: /(?:http[s]?:\/\/)?(?:www.)?vimeo\.co(?:.+\/([^\/]\d+)(?:#t=[\d]+)?s?$)/, html: "" @@ -113,11 +59,56 @@ videoTool.content = { regex: /https?:\/\/gfycat\.com(?:\/detail)?\/([a-zA-Z]+)/, html: "", } - } -}; + }; -videoTool.urlPastedCallbacks = { - generalCallback: function(url, pattern) { + + video.make = function(data, isInternal) { + + if (!data.video_id) + return; + + var html = methods.getHtmlWithVideoId(data.service, data.video_id), + block = methods.makeElementFromHtml(html); + + block.dataset.id = data.video_id; + block.dataset.videoSeirvice = data.service; + + if (isInternal) { + methods.addInternal(block); + } + + return block; + + }; + + /** + * Saving JSON output. + * Upload data via ajax + */ + video.save = function(blockContent) { + + var data; + + if (!blockContent) + return; + + data = { + video_id: blockContent.dataset.id, + service: blockContent.dataset.videoService + }; + + return data; + + }; + + /** + * Render data + */ + video.render = function(data) { + return video.make(data); + }; + + video.urlPastedCallback = function(url, pattern) { var id = pattern.regex.exec(url)[1]; @@ -126,6 +117,9 @@ videoTool.urlPastedCallbacks = { service: pattern.type }; - videoTool.make(data, true); - } -}; \ No newline at end of file + video.make(data, true); + }; + + return video; + +}({}); \ No newline at end of file From 3125b05fc4a59184421f73a76becbc6fdae04e6f Mon Sep 17 00:00:00 2001 From: George Berezhnoy Date: Mon, 23 Jan 2017 22:05:45 +0300 Subject: [PATCH 14/23] Twitch support added and plugin renamed --- example.html | 14 ++++---- plugins/paste/patterns.js | 26 +++++++++----- plugins/video/{video.css => embed.css} | 4 +-- plugins/video/{video.js => embed.js} | 48 +++++++++++++++----------- 4 files changed, 55 insertions(+), 37 deletions(-) rename plugins/video/{video.css => embed.css} (84%) rename plugins/video/{video.js => embed.js} (68%) diff --git a/example.html b/example.html index c02bd669..076739a2 100644 --- a/example.html +++ b/example.html @@ -42,8 +42,8 @@ - - + + @@ -175,13 +175,13 @@ enableLineBreaks: false, allowedToPaste: false }, - video: { - type: 'video', - make: video.make, + embed: { + type: 'embed', + make: embed.make, appendCallback: null, settings: null, - render: video.render, - save: video.save, + render: embed.render, + save: embed.save, displayInToolbox: false, enableLineBreaks: false, allowedToPaste: false diff --git a/plugins/paste/patterns.js b/plugins/paste/patterns.js index 8b32017a..acbe3390 100644 --- a/plugins/paste/patterns.js +++ b/plugins/paste/patterns.js @@ -39,37 +39,47 @@ pasteTool.patterns = [ { type: 'youtube', regex: /^.*(?:(?:youtu\.be\/)|(?:youtube\.com)\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*)(?:[\?\&]t\=(\d*)|)/, - callback: video.urlPastedCallback + callback: embed.urlPastedCallback }, { type: 'vimeo', regex: /(?:http[s]?:\/\/)?(?:www.)?vimeo\.co(?:.+\/([^\/]\d+)(?:#t=[\d]+)?s?$)/, - callback: video.urlPastedCallback + callback: embed.urlPastedCallback }, { type: 'coub', regex: /https?:\/\/coub\.com\/view\/([^\/\?\&]+)/, - callback: video.urlPastedCallback + callback: embed.urlPastedCallback }, { type: 'vine', regex: /https?:\/\/vine\.co\/v\/([^\/\?\&]+)/, - callback: video.urlPastedCallback + callback: embed.urlPastedCallback }, { type: 'vk', regex: /https?:\/\/vk\.com\/.*(?:video)[-0-9]+_([0-9]+)/, - callback: video.urlPastedCallback + callback: embed.urlPastedCallback }, { type: 'imgur', regex: /https?:\/\/(?:i\.)?imgur\.com.*\/([a-zA-Z0-9]+)(?:\.gifv)?/, - callback: video.urlPastedCallback + callback: embed.urlPastedCallback }, { type: 'gfycat', regex: /https?:\/\/gfycat\.com(?:\/detail)?\/([a-zA-Z]+)/, - callback: video.urlPastedCallback - } + callback: embed.urlPastedCallback + }, + { + type: 'twitch-channel', + regex: /https?:\/\/www.twitch.tv\/([^\/\?\&]*)/, + callback: embed.urlPastedCallback + }, + { + type: 'twitch-video', + regex: /https?:\/\/www.twitch.tv\/[^\/\?\&]*\/v\/([0-9]*)/, + callback: embed.urlPastedCallback + }, ]; \ No newline at end of file diff --git a/plugins/video/video.css b/plugins/video/embed.css similarity index 84% rename from plugins/video/video.css rename to plugins/video/embed.css index 4a1e4be8..cf666d67 100644 --- a/plugins/video/video.css +++ b/plugins/video/embed.css @@ -1,10 +1,10 @@ -.ce-redactor .video { +.ce-redactor .embed { width: 100%; max-width: 650px; margin: 10px auto; } -.video__loader { +.embed__loader { background-image: url("loading.gif") !important; background-repeat: no-repeat; background-position: center center; diff --git a/plugins/video/video.js b/plugins/video/embed.js similarity index 68% rename from plugins/video/video.js rename to plugins/video/embed.js index e2f34a87..ebc33b6c 100644 --- a/plugins/video/video.js +++ b/plugins/video/embed.js @@ -1,24 +1,24 @@ /** - * Video plugin by gohabereg + * Embed plugin by gohabereg * @version 1.0.0 */ -var video = function(video){ +var embed = function(embed){ var methods = { addInternal: function (content) { - codex.content.switchBlock(codex.content.currentNode, content, 'video'); + codex.content.switchBlock(codex.content.currentNode, content, 'embed'); var blockContent = codex.content.currentNode.childNodes[0]; - blockContent.classList.add('video__loader'); + blockContent.classList.add('embed__loader'); setTimeout(function(){ - blockContent.classList.remove('video__loader'); + blockContent.classList.remove('embed__loader'); }, 1000); }, - getHtmlWithVideoId: function (type, id) { + getHtmlWithEmbedId: function (type, id) { return services[type].html.replace(/<\%\= remote\_id \%\>/g, id); }, @@ -58,20 +58,28 @@ var video = function(video){ gfycat: { regex: /https?:\/\/gfycat\.com(?:\/detail)?\/([a-zA-Z]+)/, html: "", + }, + 'twitch-channel': { + regex: /https?:\/\/twitch.tv\/([^\/\?\&]*)/, + html: "" + }, + 'twitch-video': { + regex: /https?:\/\/www.twitch.tv\/[^\/\?\&]*\/v\/([0-9]*)/, + html: "" } }; - video.make = function(data, isInternal) { + embed.make = function(data, isInternal) { - if (!data.video_id) + if (!data.embed_id) return; - var html = methods.getHtmlWithVideoId(data.service, data.video_id), + var html = methods.getHtmlWithEmbedId(data.service, data.embed_id), block = methods.makeElementFromHtml(html); - block.dataset.id = data.video_id; - block.dataset.videoSeirvice = data.service; + block.dataset.id = data.embed_id; + block.dataset.embedSeirvice = data.service; if (isInternal) { methods.addInternal(block); @@ -85,7 +93,7 @@ var video = function(video){ * Saving JSON output. * Upload data via ajax */ - video.save = function(blockContent) { + embed.save = function(blockContent) { var data; @@ -93,8 +101,8 @@ var video = function(video){ return; data = { - video_id: blockContent.dataset.id, - service: blockContent.dataset.videoService + embed_id: blockContent.dataset.id, + service: blockContent.dataset.embedService }; return data; @@ -104,22 +112,22 @@ var video = function(video){ /** * Render data */ - video.render = function(data) { - return video.make(data); + embed.render = function(data) { + return embed.make(data); }; - video.urlPastedCallback = function(url, pattern) { + embed.urlPastedCallback = function(url, pattern) { var id = pattern.regex.exec(url)[1]; var data = { - video_id: id, + embed_id: id, service: pattern.type }; - video.make(data, true); + embed.make(data, true); }; - return video; + return embed; }({}); \ No newline at end of file From 9efee13871973d87d8c537a844a0e4132705e358 Mon Sep 17 00:00:00 2001 From: George Berezhnoy Date: Mon, 23 Jan 2017 22:09:45 +0300 Subject: [PATCH 15/23] Youtube regex updated --- plugins/paste/patterns.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/paste/patterns.js b/plugins/paste/patterns.js index acbe3390..09f2f642 100644 --- a/plugins/paste/patterns.js +++ b/plugins/paste/patterns.js @@ -38,7 +38,7 @@ pasteTool.patterns = [ }, { type: 'youtube', - regex: /^.*(?:(?:youtu\.be\/)|(?:youtube\.com)\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*)(?:[\?\&]t\=(\d*)|)/, + regex: /(?:https?:\/{2})?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)(?:\/watch\?v=|\/)([^\s&]+)/, callback: embed.urlPastedCallback }, { From f5b9bb7fe6b03160f3ae20d736424a696b8914ae Mon Sep 17 00:00:00 2001 From: George Berezhnoy Date: Mon, 23 Jan 2017 22:13:21 +0300 Subject: [PATCH 16/23] Small fix --- codex-editor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codex-editor.js b/codex-editor.js index 913a03bb..5486608f 100644 --- a/codex-editor.js +++ b/codex-editor.js @@ -2972,7 +2972,7 @@ var codex = /** * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty */ - var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter', 'video'], + var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter', 'embed'], tool = codex.tools[codex.toolbar.current], workingNode = codex.content.currentNode, currentInputIndex = codex.caret.inputIndex, From b4663c010047966102551806b9a18057b8cac935 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Wed, 25 Jan 2017 19:59:17 +0300 Subject: [PATCH 17/23] new bundle --- codex-editor.js | 4459 ------------------------------------------- codex-editor.js.map | 2 +- result-sample.json | 2 +- whatwg-fetch.js | 510 ----- whatwg-fetch.js.map | 2 +- 5 files changed, 3 insertions(+), 4972 deletions(-) delete mode 100644 codex-editor.js delete mode 100644 whatwg-fetch.js diff --git a/codex-editor.js b/codex-editor.js deleted file mode 100644 index 5486608f..00000000 --- a/codex-editor.js +++ /dev/null @@ -1,4459 +0,0 @@ -var codex = -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; -/******/ -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports, __webpack_require__) { - - /** - * - */ - - 'use strict'; - - var editor = __webpack_require__(1); - module.exports = editor; - -/***/ }, -/* 1 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - /** - * - * Codex Editor - * - * @author Codex Team - * @version 1.2.5 - */ - - var codex = function (codex) { - - var init = function init() { - - codex.core = __webpack_require__(2); - codex.ui = __webpack_require__(3); - codex.transport = __webpack_require__(4); - codex.renderer = __webpack_require__(5); - codex.saver = __webpack_require__(6); - codex.content = __webpack_require__(7); - codex.toolbar = __webpack_require__(9); - codex.tools = __webpack_require__(13); - codex.callback = __webpack_require__(14); - codex.draw = __webpack_require__(15); - codex.caret = __webpack_require__(16); - codex.notifications = __webpack_require__(17); - codex.parser = __webpack_require__(18); - }; - - codex.version = ("1.2.8"); - - /** - * @public - * - * holds initial settings - */ - codex.settings = { - tools: ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'], - textareaId: 'codex-editor', - uploadImagesUrl: '/editor/transport/', - - // Type of block showing on empty editor - initialBlockPlugin: "paragraph" - }; - - /** - * public - * - * Static nodes - */ - codex.nodes = { - textarea: null, - wrapper: null, - toolbar: null, - inlineToolbar: { - wrapper: null, - buttons: null, - actions: null - }, - toolbox: null, - notifications: null, - plusButton: null, - showSettingsButton: null, - showTrashButton: null, - blockSettings: null, - pluginSettings: null, - defaultSettings: null, - toolbarButtons: {}, // { type : DomEl, ... } - redactor: null - }; - - /** - * @public - * - * Output state - */ - codex.state = { - jsonOutput: [], - blocks: [], - inputs: [] - }; - - /** - * Initialization - * @uses Promise cEditor.core.prepare - * @param {} userSettings are : - * - tools [], - * - textareaId String - * ... - * - * Load user defined tools - * Tools must contain this important objects : - * @param {String} type - this is a type of plugin. It can be used as plugin name - * @param {String} iconClassname - this a icon in toolbar - * @param {Object} make - what should plugin do, when it is clicked - * @param {Object} appendCallback - callback after clicking - * @param {Element} settings - what settings does it have - * @param {Object} render - plugin get JSON, and should return HTML - * @param {Object} save - plugin gets HTML content, returns JSON - * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE - * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE - * - * @example - * - type : 'header', - * - iconClassname : 'ce-icon-header', - * - make : headerTool.make, - * - appendCallback : headerTool.appendCallback, - * - settings : headerTool.makeSettings(), - * - render : headerTool.render, - * - save : headerTool.save, - * - displayInToolbox : true, - * - enableLineBreaks : false - */ - codex.start = function (userSettings) { - - init(); - - this.core.prepare(userSettings) - - // If all ok, make UI, bind events and parse initial-content - .then(this.ui.make).then(this.ui.addTools).then(this.ui.bindEvents).then(this.ui.preparePlugins).then(this.transport.prepare).then(this.renderer.makeBlocksFromData).then(this.ui.saveInputs).catch(function (error) { - codex.core.log('Initialization failed with error: %o', 'warn', error); - }); - }; - - return codex; - }({}); - - module.exports = codex; - -/***/ }, -/* 2 */ -/***/ function(module, exports) { - - 'use strict'; - - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - - /** - * Codex Editor Core - * - * @author Codex Team - * @version 1.1.2 - */ - - var core = function (core) { - - /** - * @public - * - * Editor preparing method - * @return Promise - */ - core.prepare = function (userSettings) { - - return new Promise(function (resolve, reject) { - - if (userSettings) { - - codex.settings.tools = userSettings.tools || codex.settings.tools; - } - - if (userSettings.data) { - codex.state.blocks = userSettings.data; - } - - if (userSettings.initialBlockPlugin) { - codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin; - } - - if (userSettings.uploadImagesUrl) { - codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl; - } - - codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId); - - if (_typeof(codex.nodes.textarea) === undefined || codex.nodes.textarea === null) { - reject(Error("Textarea wasn't found by ID: #" + userSettings.textareaId)); - } else { - resolve(); - } - }); - }; - - /** - * Logging method - * @param type = ['log', 'info', 'warn'] - */ - core.log = function (msg, type, arg) { - - type = type || 'log'; - - if (!arg) { - arg = msg || 'undefined'; - msg = '[codex-editor]: %o'; - } else { - msg = '[codex-editor]: ' + msg; - } - - try { - if ('console' in window && console[type]) { - if (arg) console[type](msg, arg);else console[type](msg); - } - } catch (e) {} - }; - - /** - * @protected - * - * Helper for insert one element after another - */ - core.insertAfter = function (target, element) { - target.parentNode.insertBefore(element, target.nextSibling); - }; - - /** - * @const - * - * Readable DOM-node types map - */ - core.nodeTypes = { - TAG: 1, - TEXT: 3, - COMMENT: 8 - }; - - /** - * @const - * Readable keys map - */ - core.keys = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, LEFT: 37, UP: 38, DOWN: 40, RIGHT: 39, DELETE: 46, META: 91 }; - - /** - * @protected - * - * Check object for DOM node - */ - core.isDomNode = function (el) { - return el && (typeof el === 'undefined' ? 'undefined' : _typeof(el)) === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG; - }; - - /** - * Native Ajax - */ - core.ajax = function (data) { - - if (!data || !data.url) { - return; - } - - var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"), - success_function = function success_function() {}, - params = '', - obj; - - data.async = true; - data.type = data.type || 'GET'; - data.data = data.data || ''; - data['content-type'] = data['content-type'] || 'application/json; charset=utf-8'; - success_function = data.success || success_function; - - if (data.type == 'GET' && data.data) { - - data.url = /\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data; - } else { - - for (obj in data.data) { - params += obj + '=' + encodeURIComponent(data.data[obj]) + '&'; - } - } - - if (data.withCredentials) { - XMLHTTP.withCredentials = true; - } - - if (data.beforeSend && typeof data.beforeSend == 'function') { - data.beforeSend.call(); - } - - XMLHTTP.open(data.type, data.url, data.async); - XMLHTTP.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - XMLHTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); - - XMLHTTP.onreadystatechange = function () { - if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) { - success_function(XMLHTTP.responseText); - } - }; - - XMLHTTP.send(params); - }; - - /** Appends script to head of document */ - core.importScript = function (scriptPath, instanceName) { - - /** Script is already loaded */ - if (!instanceName || instanceName && document.getElementById('ce-script-' + instanceName)) { - codex.core.log("Instance name of script is missed or script is already loaded", "warn"); - return; - } - - var script = document.createElement('SCRIPT'); - script.type = "text/javascript"; - script.src = scriptPath; - script.async = true; - script.defer = true; - - if (instanceName) { - script.id = "ce-script-" + instanceName; - } - - document.head.appendChild(script); - return script; - }; - - return core; - }({}); - - module.exports = core; - -/***/ }, -/* 3 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Codex Editor UI module - * - * @author Codex Team - * @version 1.1 - */ - - var ui = function (ui) { - - /** - * Basic editor classnames - */ - ui.className = { - - /** - * @const {string} BLOCK_CLASSNAME - redactor blocks name - */ - BLOCK_CLASSNAME: 'ce-block', - - /** - * @const {String} wrapper for plugins content - */ - BLOCK_CONTENT: 'ce-block__content', - - /** - * @const {String} BLOCK_STRETCHED - makes block stretched - */ - BLOCK_STRETCHED: 'ce-block--stretched', - - /** - * @const {String} BLOCK_HIGHLIGHTED - adds background - */ - BLOCK_HIGHLIGHTED: 'ce-block--focused', - - /** - * @const {String} - highlights covered blocks - */ - BLOCK_IN_FEED_MODE: 'ce-block--feed-mode', - - /** - * @const {String} - for all default settings - */ - SETTINGS_ITEM: 'ce-settings__item' - - }; - - /** - * @protected - * - * Making main interface - */ - ui.make = function () { - - var wrapper, toolbar, toolbarContent, inlineToolbar, redactor, ceBlock, notifications, blockButtons, blockSettings, showSettingsButton, showTrashButton, toolbox, plusButton; - - /** Make editor wrapper */ - wrapper = codex.draw.wrapper(); - - /** Append editor wrapper after initial textarea */ - codex.core.insertAfter(codex.nodes.textarea, wrapper); - - /** Append block with notifications to the document */ - notifications = codex.draw.alertsHolder(); - codex.nodes.notifications = document.body.appendChild(notifications); - - /** Make toolbar and content-editable redactor */ - toolbar = codex.draw.toolbar(); - toolbarContent = codex.draw.toolbarContent(); - inlineToolbar = codex.draw.inlineToolbar(); - plusButton = codex.draw.plusButton(); - showSettingsButton = codex.draw.settingsButton(); - showTrashButton = codex.toolbar.settings.makeRemoveBlockButton(); - blockSettings = codex.draw.blockSettings(); - blockButtons = codex.draw.blockButtons(); - toolbox = codex.draw.toolbox(); - redactor = codex.draw.redactor(); - - /** settings */ - var defaultSettings = codex.draw.defaultSettings(), - pluginSettings = codex.draw.pluginsSettings(); - - /** Add default and plugins settings */ - blockSettings.appendChild(pluginSettings); - blockSettings.appendChild(defaultSettings); - - /** Make blocks buttons - * This block contains settings button and remove block button - */ - blockButtons.appendChild(showSettingsButton); - blockButtons.appendChild(showTrashButton); - blockButtons.appendChild(blockSettings); - - /** Append plus button */ - toolbarContent.appendChild(plusButton); - - /** Appending toolbar tools */ - toolbarContent.appendChild(toolbox); - - /** Appending first-level block buttons */ - toolbar.appendChild(blockButtons); - - /** Append toolbarContent to toolbar */ - toolbar.appendChild(toolbarContent); - - wrapper.appendChild(toolbar); - - wrapper.appendChild(redactor); - - /** Save created ui-elements to static nodes state */ - codex.nodes.wrapper = wrapper; - codex.nodes.toolbar = toolbar; - codex.nodes.plusButton = plusButton; - codex.nodes.toolbox = toolbox; - codex.nodes.blockSettings = blockSettings; - codex.nodes.pluginSettings = pluginSettings; - codex.nodes.defaultSettings = defaultSettings; - codex.nodes.showSettingsButton = showSettingsButton; - codex.nodes.showTrashButton = showTrashButton; - - codex.nodes.redactor = redactor; - - codex.ui.makeInlineToolbar(inlineToolbar); - - /** fill in default settings */ - codex.toolbar.settings.addDefaultSettings(); - }; - - ui.makeInlineToolbar = function (container) { - - /** Append to redactor new inline block */ - codex.nodes.inlineToolbar.wrapper = container; - - /** Draw toolbar buttons */ - codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons(); - - /** Buttons action or settings */ - codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions(); - - /** Append to inline toolbar buttons as part of it */ - codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons); - codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions); - - codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper); - }; - - /** - * @private - * Append tools passed in codex.tools - */ - ui.addTools = function () { - - var tool, tool_button; - - for (var name in codex.settings.tools) { - tool = codex.settings.tools[name]; - codex.tools[name] = tool;; - } - - /** Make toolbar buttons */ - for (var name in codex.tools) { - - tool = codex.tools[name]; - - if (!tool.displayInToolbox) { - continue; - } - - if (!tool.iconClassname) { - codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name); - continue; - } - - if (typeof tool.make != 'function') { - codex.core.log('make method missed. Tool %o skipped', 'warn', name); - continue; - } - - /** - * if tools is for toolbox - */ - tool_button = codex.draw.toolbarButton(name, tool.iconClassname); - - codex.nodes.toolbox.appendChild(tool_button); - - /** Save tools to static nodes */ - codex.nodes.toolbarButtons[name] = tool_button; - } - - /** - * Add inline toolbar tools - */ - codex.ui.addInlineToolbarTools(); - }; - - ui.addInlineToolbarTools = function () { - - var tools = { - - bold: { - icon: 'ce-icon-bold', - command: 'bold' - }, - - italic: { - icon: 'ce-icon-italic', - command: 'italic' - }, - - underline: { - icon: 'ce-icon-underline', - command: 'underline' - }, - - link: { - icon: 'ce-icon-link', - command: 'createLink' - } - }; - - var toolButton, tool; - - for (var name in tools) { - - tool = tools[name]; - - toolButton = codex.draw.toolbarButtonInline(name, tool.icon); - - codex.nodes.inlineToolbar.buttons.appendChild(toolButton); - /** - * Add callbacks to this buttons - */ - codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command); - } - }; - - /** - * @private - * Bind editor UI events - */ - ui.bindEvents = function () { - - codex.core.log('ui.bindEvents fired', 'info'); - - window.addEventListener('error', function (errorMsg, url, lineNumber) { - codex.notifications.errorThrown(errorMsg, event); - }, false); - - /** All keydowns on Document */ - document.addEventListener('keydown', codex.callback.globalKeydown, false); - - /** All keydowns on Redactor zone */ - codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false); - - /** All keydowns on Document */ - document.addEventListener('keyup', codex.callback.globalKeyup, false); - - /** - * Mouse click to radactor - */ - codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false); - - /** - * Clicks to the Plus button - */ - codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false); - - /** - * Clicks to SETTINGS button in toolbar - */ - codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false); - /** - * @deprecated ( but now in use for syncronization ); - * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text - */ - codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false); - - /** Bind click listeners on toolbar buttons */ - for (var button in codex.nodes.toolbarButtons) { - codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false); - } - }; - - /** - * Initialize plugins before using - * Ex. Load scripts or call some internal methods - */ - ui.preparePlugins = function () { - - for (var tool in codex.tools) { - - if (typeof codex.tools[tool].prepare != 'function') continue; - - codex.tools[tool].prepare(); - } - }; - - ui.addBlockHandlers = function (block) { - - if (!block) return; - - /** - * Block keydowns - */ - block.addEventListener('keydown', function (event) { - codex.callback.blockKeydown(event, block); - }, false); - - /** - * Pasting content from another source - * We have two type of sanitization - * First - uses deep-first search algorithm to get sub nodes, - * sanitizes whole Block_content and replaces cleared nodes - * This method is deprecated - * Method is used in codex.callback.blockPaste(event) - * - * Secont - uses Mutation observer. - * Observer "observe" DOM changes and send changings to callback. - * Callback gets changed node, not whole Block_content. - * Inserted or changed node, which we've gotten have been cleared and replaced with diry node - * - * Method is used in codex.callback.blockPasteViaSanitize(event) - * - * @uses html-janitor - * @example codex.callback.blockPasteViaSanitize(event), the second method. - * - */ - block.addEventListener('paste', codex.callback.blockPasteCallback, false); - - block.addEventListener('mouseup', function () { - codex.toolbar.inline.show(); - }, false); - }; - - /** getting all contenteditable elements */ - ui.saveInputs = function () { - - var redactor = codex.nodes.redactor, - elements = []; - - /** Save all inputs in global variable state */ - codex.state.inputs = redactor.querySelectorAll('[contenteditable], input'); - }; - - /** - * Adds first initial block on empty redactor - */ - ui.addInitialBlock = function () { - - var initialBlockType = codex.settings.initialBlockPlugin, - initialBlock; - - if (!codex.tools[initialBlockType]) { - codex.core.log('Plugin %o was not implemented and can\'t be used as initial block', 'warn', initialBlockType); - return; - } - - initialBlock = codex.tools[initialBlockType].render(); - - initialBlock.setAttribute('data-placeholder', 'Write your story...'); - - codex.content.insertBlock({ - type: initialBlockType, - block: initialBlock - }); - - codex.content.workingNodeChanged(initialBlock); - }; - - ui.setInlineToolbarButtonBehaviour = function (button, type) { - - button.addEventListener('mousedown', function (event) { - - codex.toolbar.inline.toolClicked(event, type); - }, false); - }; - - return ui; - }({}); - - module.exports = ui; - -/***/ }, -/* 4 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * - * Codex.Editor Transport Module - * - * @author Codex Team - * @version 1.0 - */ - - var transport = function (transport) { - - transport.input = null; - - /** - * @property {Object} arguments - keep plugin settings and defined callbacks - */ - transport.arguments = null; - - transport.prepare = function () { - - var input = document.createElement('INPUT'); - - input.type = 'file'; - input.addEventListener('change', codex.transport.fileSelected); - - codex.transport.input = input; - }; - - /** Clear input when files is uploaded */ - transport.clearInput = function () { - - /** Remove old input */ - this.input = null; - - /** Prepare new one */ - this.prepare(); - }; - - /** - * Callback for file selection - */ - transport.fileSelected = function (event) { - - var input = this, - files = input.files, - filesLength = files.length, - formdData = new FormData(), - file, - i; - - formdData.append('files', files[0], files[0].name); - - codex.transport.ajax({ - data: formdData, - beforeSend: codex.transport.arguments.beforeSend, - success: codex.transport.arguments.success, - error: codex.transport.arguments.error - }); - }; - - /** - * Use plugin callbacks - * @protected - */ - transport.selectAndUpload = function (args) { - - this.arguments = args; - this.input.click(); - }; - - /** - * Ajax requests module - */ - transport.ajax = function (params) { - - var xhr = new XMLHttpRequest(), - beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function () {}, - success = typeof params.success == 'function' ? params.success : function () {}, - error = typeof params.error == 'function' ? params.error : function () {}; - - beforeSend(); - - xhr.open('POST', codex.settings.uploadImagesUrl, true); - - xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - - xhr.onload = function () { - if (xhr.status === 200) { - success(xhr.responseText); - } else { - console.log("request error: %o", xhr); - error(); - } - }; - - xhr.send(params.data); - this.clearInput(); - }; - - return transport; - }({}); - - module.exports = transport; - -/***/ }, -/* 5 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Codex Editor Renderer Module - * - * @author Codex Team - * @version 1.0 - */ - - var renderer = function (renderer) { - - /** - * Asyncronously parses input JSON to redactor blocks - */ - renderer.makeBlocksFromData = function () { - - /** - * If redactor is empty, add first paragraph to start writing - */ - if (!codex.state.blocks.items.length) { - - codex.ui.addInitialBlock(); - return; - } - - Promise.resolve() - - /** First, get JSON from state */ - .then(function () { - return codex.state.blocks; - }) - - /** Then, start to iterate they */ - .then(codex.renderer.appendBlocks) - - /** Write log if something goes wrong */ - .catch(function (error) { - codex.core.log('Error while parsing JSON: %o', 'error', error); - }); - }; - - /** - * Parses JSON to blocks - * @param {object} data - * @return Primise -> nodeList - */ - renderer.appendBlocks = function (data) { - - var blocks = data.items; - - /** - * Sequence of one-by-one blocks appending - * Uses to save blocks order after async-handler - */ - var nodeSequence = Promise.resolve(); - - for (var index = 0; index < blocks.length; index++) { - - /** Add node to sequence at specified index */ - codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index); - } - }; - - /** - * Append node at specified index - */ - renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) { - - /** We need to append node to sequence */ - nodeSequence - - /** first, get node async-aware */ - .then(function () { - - return codex.renderer.getNodeAsync(blocks, index); - }) - - /** - * second, compose editor-block from JSON object - */ - .then(codex.renderer.createBlockFromData) - - /** - * now insert block to redactor - */ - .then(function (blockData) { - - /** - * blockData has 'block', 'type' and 'stretched' information - */ - codex.content.insertBlock(blockData); - - /** Pass created block to next step */ - return blockData.block; - }) - - /** Log if something wrong with node */ - .catch(function (error) { - codex.core.log('Node skipped while parsing because %o', 'error', error); - }); - }; - - /** - * Asynchronously returns block data from blocksList by index - * @return Promise to node - */ - renderer.getNodeAsync = function (blocksList, index) { - - return Promise.resolve().then(function () { - - return blocksList[index]; - }); - }; - - /** - * Creates editor block by JSON-data - * - * @uses render method of each plugin - * - * @param {object} blockData looks like - * { header : { - * text: '', - * type: 'H3', ... - * } - * } - * @return {object} with type and Element - */ - renderer.createBlockFromData = function (blockData) { - - /** New parser */ - var pluginName = blockData.type, - cover = blockData.cover; - - /** Get first key of object that stores plugin name */ - // for (var pluginName in blockData) break; - - /** Check for plugin existance */ - if (!codex.tools[pluginName]) { - throw Error('Plugin \xAB' + pluginName + '\xBB not found'); - } - - /** Check for plugin having render method */ - if (typeof codex.tools[pluginName].render != 'function') { - - throw Error('Plugin \xAB' + pluginName + '\xBB must have \xABrender\xBB method'); - } - - /** New Parser */ - var block = codex.tools[pluginName].render(blockData.data); - - /** is first-level block stretched */ - var stretched = codex.tools[pluginName].isStretched || false; - - /** Retrun type and block */ - return { - type: pluginName, - block: block, - stretched: stretched, - cover: cover - }; - }; - - return renderer; - }({}); - - module.exports = renderer; - -/***/ }, -/* 6 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Codex Editor Saver - * - * @author Codex Team - * @version 1.0.2 - */ - - var saver = function (saver) { - - /** - * Saves blocks - * @private - */ - saver.saveBlocks = function () { - - /** Save html content of redactor to memory */ - codex.state.html = codex.nodes.redactor.innerHTML; - - /** Empty jsonOutput state */ - codex.state.jsonOutput = []; - - Promise.resolve().then(function () { - return codex.nodes.redactor.childNodes; - }) - /** Making a sequence from separate blocks */ - .then(codex.saver.makeQueue).then(function () { - // codex.nodes.textarea.innerHTML = codex.state.html; - }).catch(function (error) { - console.log('Something happend'); - }); - }; - - saver.makeQueue = function (blocks) { - - var queue = Promise.resolve(); - - for (var index = 0; index < blocks.length; index++) { - - /** Add node to sequence at specified index */ - codex.saver.getBlockData(queue, blocks, index); - } - }; - - /** Gets every block and makes From Data */ - saver.getBlockData = function (queue, blocks, index) { - - queue.then(function () { - return codex.saver.getNodeAsync(blocks, index); - }).then(codex.saver.makeFormDataFromBlocks); - }; - - /** - * Asynchronously returns block data from blocksList by index - * @return Promise to node - */ - saver.getNodeAsync = function (blocksList, index) { - - return Promise.resolve().then(function () { - - return blocksList[index]; - }); - }; - - saver.makeFormDataFromBlocks = function (block) { - - var pluginName = block.dataset.tool; - - /** Check for plugin existance */ - if (!codex.tools[pluginName]) { - throw Error('Plugin \xAB' + pluginName + '\xBB not found'); - } - - /** Check for plugin having render method */ - if (typeof codex.tools[pluginName].save != 'function') { - - throw Error('Plugin \xAB' + pluginName + '\xBB must have save method'); - } - - /** Result saver */ - var blockContent = block.childNodes[0], - pluginsContent = blockContent.childNodes[0], - savedData = codex.tools[pluginName].save(pluginsContent), - output; - - output = { - type: pluginName, - data: savedData - }; - - /** - * Do not allow empty initial plugins block - */ - if (savedData.text.trim() == '' && pluginName == codex.settings.initialBlockPlugin) return; - - /** Marks Blocks that will be in main page */ - output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE); - - codex.state.jsonOutput.push(output); - }; - - return saver; - }({}); - - module.exports = saver; - -/***/ }, -/* 7 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - /** - * Codex Editor Content Module - * Works with DOM - * - * @author Codex Team - * @version 1.3.1 - */ - - var janitor = __webpack_require__(8); - - /** - * Default settings for sane. - * @uses html-janitor - */ - var Config = { - - tags: { - p: {}, - a: { - href: true, - target: '_blank', - rel: 'nofollow' - }, - i: {}, - b: {}, - strong: {}, - em: {}, - span: {} - } - }; - - var content = function (content) { - - /** - * Links to current active block - * @type {null | Element} - */ - content.currentNode = null; - - /** - * clicked in redactor area - * @type {null | Boolean} - */ - content.editorAreaHightlighted = null; - - /** - * Synchronizes redactor with original textarea - */ - content.sync = function () { - - codex.core.log('syncing...'); - - /** - * Save redactor content to codex.state - */ - codex.state.html = codex.nodes.redactor.innerHTML; - }; - - /** - * @deprecated - */ - content.getNodeFocused = function () { - - var selection = window.getSelection(), - focused; - - if (selection.anchorNode === null) { - return null; - } - - if (selection.anchorNode.nodeType == codex.core.nodeTypes.TAG) { - focused = selection.anchorNode; - } else { - focused = selection.focusNode.parentElement; - } - - if (!codex.parser.isFirstLevelBlock(focused)) { - - /** Iterate with parent nodes to find first-level*/ - var parent = focused.parentNode; - - while (parent && !codex.parser.isFirstLevelBlock(parent)) { - parent = parent.parentNode; - } - - focused = parent; - } - - if (focused != codex.nodes.redactor) { - return focused; - } - - return null; - }; - - /** - * Appends background to the block - */ - content.markBlock = function () { - - codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED); - }; - - /** - * Clear background - */ - content.clearMark = function () { - - if (codex.content.currentNode) { - codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED); - } - }; - - /** - * @private - * - * Finds first-level block - * @param {Element} node - selected or clicked in redactors area node - */ - content.getFirstLevelBlock = function (node) { - - if (!codex.core.isDomNode(node)) { - node = node.parentNode; - } - - if (node === codex.nodes.redactor || node === document.body) { - - return null; - } else { - - while (!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) { - node = node.parentNode; - } - - return node; - } - }; - - /** - * Trigger this event when working node changed - * @param {Element} targetNode - first-level of this node will be current - * If targetNode is first-level then we set it as current else we look for parents to find first-level - */ - content.workingNodeChanged = function (targetNode) { - - /** Clear background from previous marked block before we change */ - codex.content.clearMark(); - - if (!targetNode) { - return; - } - - this.currentNode = this.getFirstLevelBlock(targetNode); - }; - - /** - * Replaces one redactor block with another - * @protected - * @param {Element} targetBlock - block to replace. Mostly currentNode. - * @param {Element} newBlock - * @param {string} newBlockType - type of new block; we need to store it to data-attribute - * - * [!] Function does not saves old block content. - * You can get it manually and pass with newBlock.innerHTML - */ - content.replaceBlock = function function_name(targetBlock, newBlock) { - - if (!targetBlock || !newBlock) { - codex.core.log('replaceBlock: missed params'); - return; - } - - /** If target-block is not a frist-level block, then we iterate parents to find it */ - while (!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) { - targetBlock = targetBlock.parentNode; - } - - /** Replacing */ - codex.nodes.redactor.replaceChild(newBlock, targetBlock); - - /** - * Set new node as current - */ - codex.content.workingNodeChanged(newBlock); - - /** - * Add block handlers - */ - codex.ui.addBlockHandlers(newBlock); - - /** - * Save changes - */ - codex.ui.saveInputs(); - }; - - /** - * @private - * - * Inserts new block to redactor - * Wrapps block into a DIV with BLOCK_CLASSNAME class - * - * @param blockData {object} - * @param blockData.block {Element} element with block content - * @param blockData.type {string} block plugin - * @param needPlaceCaret {bool} pass true to set caret in new block - * - */ - content.insertBlock = function (blockData, needPlaceCaret) { - - var workingBlock = codex.content.currentNode, - newBlockContent = blockData.block, - blockType = blockData.type, - cover = blockData.cover, - isStretched = blockData.stretched; - - var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched); - - if (cover === true) { - newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE); - } - - if (workingBlock) { - - codex.core.insertAfter(workingBlock, newBlock); - } else { - /** - * If redactor is empty, append as first child - */ - codex.nodes.redactor.appendChild(newBlock); - } - - /** - * Block handler - */ - codex.ui.addBlockHandlers(newBlock); - - /** - * Set new node as current - */ - codex.content.workingNodeChanged(newBlock); - - /** - * Save changes - */ - codex.ui.saveInputs(); - - if (needPlaceCaret) { - - /** - * If we don't know input index then we set default value -1 - */ - var currentInputIndex = codex.caret.getCurrentInputIndex() || -1; - - if (currentInputIndex == -1) { - - var editableElement = newBlock.querySelector('[contenteditable]'), - emptyText = document.createTextNode(''); - - editableElement.appendChild(emptyText); - codex.caret.set(editableElement, 0, 0); - - codex.toolbar.move(); - codex.toolbar.showPlusButton(); - } else { - - if (currentInputIndex === codex.state.inputs.length - 1) return; - - /** Timeout for browsers execution */ - setTimeout(function () { - - /** Setting to the new input */ - codex.caret.setToNextBlock(currentInputIndex); - codex.toolbar.move(); - codex.toolbar.open(); - }, 10); - } - } - - /** - * Block is inserted, wait for new click that defined focusing on editors area - * @type {boolean} - */ - content.editorAreaHightlighted = false; - }; - - /** - * Replaces blocks with saving content - * @protected - * @param {Element} noteToReplace - * @param {Element} newNode - * @param {Element} blockType - */ - content.switchBlock = function (blockToReplace, newBlock, tool) { - - var newBlockComposed = codex.content.composeNewBlock(newBlock, tool); - - /** Replacing */ - codex.content.replaceBlock(blockToReplace, newBlockComposed); - - /** Save new Inputs when block is changed */ - codex.ui.saveInputs(); - }; - - /** - * Iterates between child noted and looking for #text node on deepest level - * @private - * @param {Element} block - node where find - * @param {int} postiton - starting postion - * Example: childNodex.length to find from the end - * or 0 to find from the start - * @return {Text} block - * @uses DFS - */ - content.getDeepestTextNodeFromPosition = function (block, position) { - - /** - * Clear Block from empty and useless spaces with trim. - * Such nodes we should remove - */ - var blockChilds = block.childNodes, - index, - node, - text; - - for (index = 0; index < blockChilds.length; index++) { - node = blockChilds[index]; - - if (node.nodeType == codex.core.nodeTypes.TEXT) { - - text = node.textContent.trim(); - - /** Text is empty. We should remove this child from node before we start DFS - * decrease the quantity of childs. - */ - if (text === '') { - - block.removeChild(node); - position--; - } - } - } - - if (block.childNodes.length === 0) { - return document.createTextNode(''); - } - - /** Setting default position when we deleted all empty nodes */ - if (position < 0) position = 1; - - var looking_from_start = false; - - /** For looking from START */ - if (position === 0) { - looking_from_start = true; - position = 1; - } - - while (position) { - - /** initial verticle of node. */ - if (looking_from_start) { - block = block.childNodes[0]; - } else { - block = block.childNodes[position - 1]; - } - - if (block.nodeType == codex.core.nodeTypes.TAG) { - - position = block.childNodes.length; - } else if (block.nodeType == codex.core.nodeTypes.TEXT) { - - position = 0; - } - } - - return block; - }; - - /** - * @private - */ - content.composeNewBlock = function (block, tool, isStretched) { - - var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}), - blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {}); - - blockContent.appendChild(block); - newBlock.appendChild(blockContent); - - if (isStretched) { - blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED); - } - - newBlock.dataset.tool = tool; - return newBlock; - }; - - /** - * Returns Range object of current selection - */ - content.getRange = function () { - - var selection = window.getSelection().getRangeAt(0); - - return selection; - }; - - /** - * Divides block in two blocks (after and before caret) - * @private - * @param {Int} inputIndex - target input index - */ - content.splitBlock = function (inputIndex) { - - var selection = window.getSelection(), - anchorNode = selection.anchorNode, - anchorNodeText = anchorNode.textContent, - caretOffset = selection.anchorOffset, - textBeforeCaret, - textNodeBeforeCaret, - textAfterCaret, - textNodeAfterCaret; - - var currentBlock = codex.content.currentNode.querySelector('[contentEditable]'); - - textBeforeCaret = anchorNodeText.substring(0, caretOffset); - textAfterCaret = anchorNodeText.substring(caretOffset); - - textNodeBeforeCaret = document.createTextNode(textBeforeCaret); - - if (textAfterCaret) { - textNodeAfterCaret = document.createTextNode(textAfterCaret); - } - - var previousChilds = [], - nextChilds = [], - reachedCurrent = false; - - if (textNodeAfterCaret) { - nextChilds.push(textNodeAfterCaret); - } - - for (var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) { - - if (child != anchorNode) { - if (!reachedCurrent) { - previousChilds.push(child); - } else { - nextChilds.push(child); - } - } else { - reachedCurrent = true; - } - } - - /** Clear current input */ - codex.state.inputs[inputIndex].innerHTML = ''; - - /** - * Append all childs founded before anchorNode - */ - var previousChildsLength = previousChilds.length; - - for (i = 0; i < previousChildsLength; i++) { - codex.state.inputs[inputIndex].appendChild(previousChilds[i]); - } - - codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret); - - /** - * Append text node which is after caret - */ - var nextChildsLength = nextChilds.length, - newNode = document.createElement('div'); - - for (i = 0; i < nextChildsLength; i++) { - newNode.appendChild(nextChilds[i]); - } - - newNode = newNode.innerHTML; - - /** This type of block creates when enter is pressed */ - var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; - - /** - * Make new paragraph with text after caret - */ - codex.content.insertBlock({ - type: NEW_BLOCK_TYPE, - block: codex.tools[NEW_BLOCK_TYPE].render({ - text: newNode - }) - }, true); - }; - - /** - * Merges two blocks — current and target - * If target index is not exist, then previous will be as target - */ - content.mergeBlocks = function (currentInputIndex, targetInputIndex) { - - /** If current input index is zero, then prevent method execution */ - if (currentInputIndex === 0) { - return; - } - - var targetInput, - currentInputContent = codex.state.inputs[currentInputIndex].innerHTML; - - if (!targetInputIndex) { - - targetInput = codex.state.inputs[currentInputIndex - 1]; - } else { - - targetInput = codex.state.inputs[targetInputIndex]; - } - - targetInput.innerHTML += currentInputContent; - }; - - /** - * @private - * - * Callback for HTML Mutations - * @param {Array} mutation - Mutation Record - */ - content.paste = function (mutation) { - - var workingNode = codex.content.currentNode, - tool = workingNode.dataset.tool; - - if (codex.tools[tool].allowedToPaste) { - codex.content.sanitize.call(this, mutation.addedNodes); - } else { - codex.content.pasteTextContent(mutation.addedNodes); - } - }; - - /** - * @private - * - * gets only text/plain content of node - * @param {Element} target - HTML node - */ - content.pasteTextContent = function (nodes) { - - var node = nodes[0], - textNode; - - if (!node) { - return; - } - - if (node.nodeType == codex.core.nodeTypes.TEXT) { - textNode = document.createTextNode(node); - } else { - textNode = document.createTextNode(node.textContent); - } - - if (codex.core.isDomNode(node)) { - node.parentNode.replaceChild(textNode, node); - } - }; - - /** - * @private - * - * Sanitizes HTML content - * @param {Element} target - inserted element - * @uses Sanitize library html-janitor - */ - content.sanitize = function (target) { - - if (!target) { - return; - } - - var node = target[0]; - - if (!node) { - return; - } - - /** - * Disconnect Observer - * hierarchy of function calls inherits context of observer - */ - this.disconnect(); - - /** - * Don't sanitize text node - */ - if (node.nodeType == codex.core.nodeTypes.TEXT) { - return; - } - - /** - * Clear dirty content - */ - var sanitizer = new janitor(Config), - clear = sanitizer.clean(node.outerHTML); - - var div = codex.draw.node('DIV', [], { innerHTML: clear }); - node.replaceWith(div.childNodes[0]); - - // for (i = 0; i < clearHTML.childNodes.length; i++) { - // - // var tag = clearHTML.childNodes[i], - // blockType = null; - // - // for (tool in codex.tools) { - // - // var handleTags = codex.tools[tool].handleTagOnPaste; - // - // if (!handleTags) { - // continue; - // } - // - // if (handleTags.indexOf(tag.tagName) !== -1) { - // blockType = codex.tools[tool]; - // break; - // } - // - // } - // - // if (blockType) { - // codex.parser.insertPastedContent(blockType, tag); - // } - // - // } - }; - - return content; - }({}); - - module.exports = content; - -/***/ }, -/* 8 */ -/***/ function(module, exports, __webpack_require__) { - - var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) { - if (true) { - !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else if (typeof exports === 'object') { - module.exports = factory(); - } else { - root.HTMLJanitor = factory(); - } - }(this, function () { - - /** - * @param {Object} config.tags Dictionary of allowed tags. - * @param {boolean} config.keepNestedBlockElements Default false. - */ - function HTMLJanitor(config) { - - var tagDefinitions = config['tags']; - var tags = Object.keys(tagDefinitions); - - var validConfigValues = tags - .map(function(k) { return typeof tagDefinitions[k]; }) - .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; }); - - if(!validConfigValues) { - throw new Error("The configuration was invalid"); - } - - this.config = config; - } - - // TODO: not exhaustive? - var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE']; - function isBlockElement(node) { - return blockElementNames.indexOf(node.nodeName) !== -1; - } - - var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE']; - function isInlineElement(node) { - return inlineElementNames.indexOf(node.nodeName) !== -1; - } - - HTMLJanitor.prototype.clean = function (html) { - var sandbox = document.createElement('div'); - sandbox.innerHTML = html; - - this._sanitize(sandbox); - - return sandbox.innerHTML; - }; - - HTMLJanitor.prototype._sanitize = function (parentNode) { - var treeWalker = createTreeWalker(parentNode); - var node = treeWalker.firstChild(); - if (!node) { return; } - - do { - // Ignore nodes that have already been sanitized - if (node._sanitized) { - continue; - } - - if (node.nodeType === Node.TEXT_NODE) { - // If this text node is just whitespace and the previous or next element - // sibling is a block element, remove it - // N.B.: This heuristic could change. Very specific to a bug with - // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output - // FIXME: make this an option? - if (node.data.trim() === '' - && ((node.previousElementSibling && isBlockElement(node.previousElementSibling)) - || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) { - parentNode.removeChild(node); - this._sanitize(parentNode); - break; - } else { - continue; - } - } - - // Remove all comments - if (node.nodeType === Node.COMMENT_NODE) { - parentNode.removeChild(node); - this._sanitize(parentNode); - break; - } - - var isInline = isInlineElement(node); - var containsBlockElement; - if (isInline) { - containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement); - } - - // Block elements should not be nested (e.g.

  • ...); if - // they are, we want to unwrap the inner block element. - var isNotTopContainer = !! parentNode.parentNode; - var isNestedBlockElement = - isBlockElement(parentNode) && - isBlockElement(node) && - isNotTopContainer; - - var nodeName = node.nodeName.toLowerCase(); - - var allowedAttrs = getAllowedAttrs(this.config, nodeName, node); - - var isInvalid = isInline && containsBlockElement; - - // Drop tag entirely according to the whitelist *and* if the markup - // is invalid. - if (isInvalid || shouldRejectNode(node, allowedAttrs) - || (!this.config.keepNestedBlockElements && isNestedBlockElement)) { - // Do not keep the inner text of SCRIPT/STYLE elements. - if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) { - while (node.childNodes.length > 0) { - parentNode.insertBefore(node.childNodes[0], node); - } - } - parentNode.removeChild(node); - - this._sanitize(parentNode); - break; - } - - // Sanitize attributes - for (var a = 0; a < node.attributes.length; a += 1) { - var attr = node.attributes[a]; - - if (shouldRejectAttr(attr, allowedAttrs, node)) { - node.removeAttribute(attr.name); - // Shift the array to continue looping. - a = a - 1; - } - } - - // Sanitize children - this._sanitize(node); - - // Mark node as sanitized so it's ignored in future runs - node._sanitized = true; - } while ((node = treeWalker.nextSibling())); - }; - - function createTreeWalker(node) { - return document.createTreeWalker(node, - NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT, - null, false); - } - - function getAllowedAttrs(config, nodeName, node){ - if (typeof config.tags[nodeName] === 'function') { - return config.tags[nodeName](node); - } else { - return config.tags[nodeName]; - } - } - - function shouldRejectNode(node, allowedAttrs){ - if (typeof allowedAttrs === 'undefined') { - return true; - } else if (typeof allowedAttrs === 'boolean') { - return !allowedAttrs; - } - - return false; - } - - function shouldRejectAttr(attr, allowedAttrs, node){ - var attrName = attr.name.toLowerCase(); - - if (allowedAttrs === true){ - return false; - } else if (typeof allowedAttrs[attrName] === 'function'){ - return !allowedAttrs[attrName](attr.value, node); - } else if (typeof allowedAttrs[attrName] === 'undefined'){ - return true; - } else if (allowedAttrs[attrName] === false) { - return true; - } else if (typeof allowedAttrs[attrName] === 'string') { - return (allowedAttrs[attrName] !== attr.value); - } - - return false; - } - - return HTMLJanitor; - - })); - - -/***/ }, -/* 9 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - /** - * Codex Editor toolbar module - * - * Contains: - * - Inline toolbox - * - Toolbox within plus button - * - Settings section - * - * @author Codex Team - * @version 1.0 - */ - var toolbar = function (toolbar) { - - toolbar.init = function () { - toolbar.settings = __webpack_require__(10); - toolbar.inline = __webpack_require__(11); - toolbar.toolbox = __webpack_require__(12); - }; - - /** - * Margin between focused node and toolbar - */ - toolbar.defaultToolbarHeight = 49; - - toolbar.defaultOffset = 34; - - toolbar.opened = false; - - toolbar.current = null; - - /** - * @protected - */ - toolbar.open = function () { - - codex.nodes.toolbar.classList.add('opened'); - this.opened = true; - }; - - /** - * @protected - */ - toolbar.close = function () { - - codex.nodes.toolbar.classList.remove('opened'); - - toolbar.opened = false; - toolbar.current = null; - - for (var button in codex.nodes.toolbarButtons) { - codex.nodes.toolbarButtons[button].classList.remove('selected'); - } - - /** Close toolbox when toolbar is not displayed */ - codex.toolbar.toolbox.close(); - codex.toolbar.settings.close(); - }; - - toolbar.toggle = function () { - - if (!this.opened) { - - this.open(); - } else { - - this.close(); - } - }; - - toolbar.hidePlusButton = function () { - codex.nodes.plusButton.classList.add('hide'); - }; - - toolbar.showPlusButton = function () { - codex.nodes.plusButton.classList.remove('hide'); - }; - - /** - * Moving toolbar to the specified node - */ - toolbar.move = function () { - - /** Close Toolbox when we move toolbar */ - codex.toolbar.toolbox.close(); - - if (!codex.content.currentNode) { - return; - } - - var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight, - newYCoordinate = codex.content.currentNode.offsetTop - codex.toolbar.defaultToolbarHeight / 2 + codex.toolbar.defaultOffset; - - codex.nodes.toolbar.style.transform = 'translate3D(0, ' + Math.floor(newYCoordinate) + 'px, 0)'; - - /** Close trash actions */ - codex.toolbar.settings.hideRemoveActions(); - }; - - return toolbar; - }({}); - - toolbar.init(); - - module.exports = toolbar; - -/***/ }, -/* 10 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - var settings = function (settings) { - - settings.init = function () { - __webpack_require__(7); - }; - - settings.opened = false; - - settings.setting = null; - settings.actions = null; - - settings.cover = null; - - /** - * Append and open settings - */ - settings.open = function (toolType) { - - /** - * Append settings content - * It's stored in tool.settings - */ - if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings)) { - - codex.core.log('Plugin \xAB' + toolType + '\xBB has no settings', 'warn'); - // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`; - } else { - - codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings); - } - - var currentBlock = codex.content.currentNode; - - /** Open settings block */ - codex.nodes.blockSettings.classList.add('opened'); - codex.toolbar.settings.addDefaultSettings(); - this.opened = true; - }; - - /** - * Close and clear settings - */ - settings.close = function () { - - codex.nodes.blockSettings.classList.remove('opened'); - codex.nodes.pluginSettings.innerHTML = ''; - - this.opened = false; - }; - - /** - * @param {string} toolType - plugin type - */ - settings.toggle = function (toolType) { - - if (!this.opened) { - - this.open(toolType); - } else { - - this.close(); - } - }; - - /** - * This function adds default core settings - */ - settings.addDefaultSettings = function () { - - /** list of default settings */ - var feedModeToggler; - - /** Clear block and append initialized settings */ - codex.nodes.defaultSettings.innerHTML = ''; - - /** Init all default setting buttons */ - feedModeToggler = codex.toolbar.settings.makeFeedModeToggler(); - - /** - * Fill defaultSettings - */ - - /** - * Button that enables/disables Feed-mode - * Feed-mode means that block will be showed in articles-feed like cover - */ - codex.nodes.defaultSettings.appendChild(feedModeToggler); - }; - - /** - * Cover setting. - * This tune highlights block, so that it may be used for showing target block on main page - * Draw different setting when block is marked for main page - * If TRUE, then we show button that removes this selection - * Also defined setting "Click" events will be listened and have separate callbacks - * - * @return {Element} node/button that we place in default settings block - */ - settings.makeFeedModeToggler = function () { - - var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(), - setting, - data; - - if (!isFeedModeActivated) { - - data = { - innerHTML: 'Вывести в ленте' - }; - } else { - - data = { - innerHTML: 'Не выводить в ленте' - }; - } - - setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data); - setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false); - - return setting; - }; - - /** - * Updates Feed-mode - */ - settings.updateFeedMode = function () { - - var currentNode = codex.content.currentNode; - - currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE); - - codex.toolbar.settings.close(); - }; - - settings.isFeedModeActivated = function () { - - var currentBlock = codex.content.currentNode; - - if (currentBlock) { - return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE); - } else { - return false; - } - }; - - /** - * Here we will draw buttons and add listeners to components - */ - settings.makeRemoveBlockButton = function () { - - var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}), - settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML: '' }), - actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}), - confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent: 'Удалить блок' }), - cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent: 'Отменить удаление' }); - - settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false); - - confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false); - - cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false); - - actionWrapper.appendChild(confirmAction); - actionWrapper.appendChild(cancelAction); - - removeBlockWrapper.appendChild(settingButton); - removeBlockWrapper.appendChild(actionWrapper); - - /** Save setting */ - codex.toolbar.settings.setting = settingButton; - codex.toolbar.settings.actions = actionWrapper; - - return removeBlockWrapper; - }; - - settings.removeButtonClicked = function () { - - var action = codex.toolbar.settings.actions; - - if (action.classList.contains('opened')) { - codex.toolbar.settings.hideRemoveActions(); - } else { - codex.toolbar.settings.showRemoveActions(); - } - - codex.toolbar.toolbox.close(); - codex.toolbar.settings.close(); - }; - - settings.cancelRemovingRequest = function () { - - codex.toolbar.settings.actions.classList.remove('opened'); - }; - - settings.confirmRemovingRequest = function () { - - var currentBlock = codex.content.currentNode, - firstLevelBlocksCount; - - currentBlock.remove(); - - firstLevelBlocksCount = codex.nodes.redactor.childNodes.length; - - /** - * If all blocks are removed - */ - if (firstLevelBlocksCount === 0) { - - /** update currentNode variable */ - codex.content.currentNode = null; - - /** Inserting new empty initial block */ - codex.ui.addInitialBlock(); - } - - codex.ui.saveInputs(); - - codex.toolbar.close(); - }; - - settings.showRemoveActions = function () { - codex.toolbar.settings.actions.classList.add('opened'); - }; - - settings.hideRemoveActions = function () { - codex.toolbar.settings.actions.classList.remove('opened'); - }; - - return settings; - }({}); - - settings.init(); - - module.exports = settings; - -/***/ }, -/* 11 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Inline toolbar - * - * Contains from tools: - * Bold, Italic, Underline and Anchor - * - * @author Codex Team - * @version 1.0 - */ - var inline = function (inline) { - - inline.init = function () {}; - - inline.buttonsOpened = null; - inline.actionsOpened = null; - inline.wrappersOffset = null; - - /** - * saving selection that need for execCommand for styling - * - */ - inline.storedSelection = null; - - /** - * @protected - * - * Open inline toobar - */ - inline.show = function () { - - var currentNode = codex.content.currentNode, - tool = currentNode.dataset.tool, - plugin; - - /** - * tool allowed to open inline toolbar - */ - plugin = codex.tools[tool]; - - if (!plugin.showInlineToolbar) return; - - var selectedText = this.getSelectionText(), - toolbar = codex.nodes.inlineToolbar.wrapper, - buttons = codex.nodes.inlineToolbar.buttons; - - if (selectedText.length > 0) { - - /** Move toolbar and open */ - codex.toolbar.inline.move(); - - /** Open inline toolbar */ - toolbar.classList.add('opened'); - - /** show buttons of inline toolbar */ - codex.toolbar.inline.showButtons(); - } - }; - - /** - * @protected - * - * Closes inline toolbar - */ - inline.close = function () { - var toolbar = codex.nodes.inlineToolbar.wrapper; - toolbar.classList.remove('opened'); - }; - - /** - * @private - * - * Moving toolbar - */ - inline.move = function () { - - if (!this.wrappersOffset) { - this.wrappersOffset = this.getWrappersOffset(); - } - - var coords = this.getSelectionCoords(), - defaultOffset = 0, - toolbar = codex.nodes.inlineToolbar.wrapper, - newCoordinateX, - newCoordinateY; - - if (toolbar.offsetHeight === 0) { - defaultOffset = 40; - } - - newCoordinateX = coords.x - this.wrappersOffset.left; - newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight; - - toolbar.style.transform = 'translate3D(' + Math.floor(newCoordinateX) + 'px, ' + Math.floor(newCoordinateY) + 'px, 0)'; - - /** Close everything */ - codex.toolbar.inline.closeButtons(); - codex.toolbar.inline.closeAction(); - }; - - /** - * @private - * - * Tool Clicked - */ - - inline.toolClicked = function (event, type) { - - /** - * For simple tools we use default browser function - * For more complicated tools, we should write our own behavior - */ - switch (type) { - case 'createLink': - codex.toolbar.inline.createLinkAction(event, type);break; - default: - codex.toolbar.inline.defaultToolAction(type);break; - } - - /** - * highlight buttons - * after making some action - */ - codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight); - }; - - /** - * @private - * - * Saving wrappers offset in DOM - */ - inline.getWrappersOffset = function () { - - var wrapper = codex.nodes.wrapper, - offset = this.getOffset(wrapper); - - this.wrappersOffset = offset; - return offset; - }; - - /** - * @private - * - * Calculates offset of DOM element - * - * @param el - * @returns {{top: number, left: number}} - */ - inline.getOffset = function (el) { - - var _x = 0; - var _y = 0; - - while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) { - _x += el.offsetLeft + el.clientLeft; - _y += el.offsetTop + el.clientTop; - el = el.offsetParent; - } - return { top: _y, left: _x }; - }; - - /** - * @private - * - * Calculates position of selected text - * @returns {{x: number, y: number}} - */ - inline.getSelectionCoords = function () { - - var sel = document.selection, - range; - var x = 0, - y = 0; - - if (sel) { - - if (sel.type != "Control") { - range = sel.createRange(); - range.collapse(true); - x = range.boundingLeft; - y = range.boundingTop; - } - } else if (window.getSelection) { - - sel = window.getSelection(); - - if (sel.rangeCount) { - - range = sel.getRangeAt(0).cloneRange(); - if (range.getClientRects) { - range.collapse(true); - var rect = range.getClientRects()[0]; - - if (!rect) { - return; - } - - x = rect.left; - y = rect.top; - } - } - } - return { x: x, y: y }; - }; - - /** - * @private - * - * Returns selected text as String - * @returns {string} - */ - inline.getSelectionText = function getSelectionText() { - - var selectedText = ""; - - if (window.getSelection) { - // all modern browsers and IE9+ - selectedText = window.getSelection().toString(); - } - - return selectedText; - }; - - /** Opens buttons block */ - inline.showButtons = function () { - - var buttons = codex.nodes.inlineToolbar.buttons; - buttons.classList.add('opened'); - - codex.toolbar.inline.buttonsOpened = true; - - /** highlight buttons */ - codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight); - }; - - /** Makes buttons disappear */ - inline.closeButtons = function () { - var buttons = codex.nodes.inlineToolbar.buttons; - buttons.classList.remove('opened'); - - codex.toolbar.inline.buttonsOpened = false; - }; - - /** Open buttons defined action if exist */ - inline.showActions = function () { - var action = codex.nodes.inlineToolbar.actions; - action.classList.add('opened'); - - codex.toolbar.inline.actionsOpened = true; - }; - - /** Close actions block */ - inline.closeAction = function () { - var action = codex.nodes.inlineToolbar.actions; - action.innerHTML = ''; - action.classList.remove('opened'); - codex.toolbar.inline.actionsOpened = false; - }; - - /** Action for link creation or for setting anchor */ - inline.createLinkAction = function (event, type) { - - var isActive = this.isLinkActive(); - - var editable = codex.content.currentNode, - storedSelection = codex.toolbar.inline.storedSelection; - - if (isActive) { - - var selection = window.getSelection(), - anchorNode = selection.anchorNode; - - storedSelection = codex.toolbar.inline.saveSelection(editable); - - /** - * Changing stored selection. if we want to remove anchor from word - * we should remove anchor from whole word, not only selected part. - * The solution is than we get the length of current link - * Change start position to - end of selection minus length of anchor - */ - codex.toolbar.inline.restoreSelection(editable, storedSelection); - - codex.toolbar.inline.defaultToolAction('unlink'); - } else { - - /** Create input and close buttons */ - var action = codex.draw.inputForLink(); - codex.nodes.inlineToolbar.actions.appendChild(action); - - codex.toolbar.inline.closeButtons(); - codex.toolbar.inline.showActions(); - - storedSelection = codex.toolbar.inline.saveSelection(editable); - - /** - * focus to input - * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus - * Prevents event after showing input and when we need to focus an input which is in unexisted form - */ - action.focus(); - event.preventDefault(); - - /** Callback to link action */ - action.addEventListener('keydown', function (event) { - - if (event.keyCode == codex.core.keys.ENTER) { - - codex.toolbar.inline.restoreSelection(editable, storedSelection); - codex.toolbar.inline.setAnchor(action.value); - - /** - * Preventing events that will be able to happen - */ - event.preventDefault(); - event.stopImmediatePropagation(); - - codex.toolbar.inline.clearRange(); - } - }, false); - } - }; - - inline.isLinkActive = function () { - - var isActive = false; - - codex.nodes.inlineToolbar.buttons.childNodes.forEach(function (tool) { - var dataType = tool.dataset.type; - - if (dataType == 'link' && tool.classList.contains('hightlighted')) { - isActive = true; - } - }); - - return isActive; - }; - - /** default action behavior of tool */ - inline.defaultToolAction = function (type) { - document.execCommand(type, false, null); - }; - - /** - * @private - * - * Sets URL - * - * @param {String} url - URL - */ - inline.setAnchor = function (url) { - - document.execCommand('createLink', false, url); - - /** Close after URL inserting */ - codex.toolbar.inline.closeAction(); - }; - - /** - * @private - * - * Saves selection - */ - inline.saveSelection = function (containerEl) { - - var range = window.getSelection().getRangeAt(0), - preSelectionRange = range.cloneRange(), - start; - - preSelectionRange.selectNodeContents(containerEl); - preSelectionRange.setEnd(range.startContainer, range.startOffset); - - start = preSelectionRange.toString().length; - - return { - start: start, - end: start + range.toString().length - }; - }; - - /** - * @private - * - * Sets to previous selection (Range) - * - * @param {Element} containerEl - editable element where we restore range - * @param {Object} savedSel - range basic information to restore - */ - inline.restoreSelection = function (containerEl, savedSel) { - - var range = document.createRange(), - charIndex = 0; - - range.setStart(containerEl, 0); - range.collapse(true); - - var nodeStack = [containerEl], - node, - foundStart = false, - stop = false, - nextCharIndex; - - while (!stop && (node = nodeStack.pop())) { - - if (node.nodeType == 3) { - - nextCharIndex = charIndex + node.length; - - if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) { - range.setStart(node, savedSel.start - charIndex); - foundStart = true; - } - if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) { - range.setEnd(node, savedSel.end - charIndex); - stop = true; - } - charIndex = nextCharIndex; - } else { - var i = node.childNodes.length; - while (i--) { - nodeStack.push(node.childNodes[i]); - } - } - } - - var sel = window.getSelection(); - sel.removeAllRanges(); - sel.addRange(range); - }; - - /** - * @private - * - * Removes all ranges from window selection - */ - inline.clearRange = function () { - var selection = window.getSelection(); - selection.removeAllRanges(); - }; - - /** - * @private - * - * sets or removes hightlight - */ - inline.hightlight = function (tool) { - var dataType = tool.dataset.type; - - if (document.queryCommandState(dataType)) { - codex.toolbar.inline.setButtonHighlighted(tool); - } else { - codex.toolbar.inline.removeButtonsHighLight(tool); - } - - /** - * - * hightlight for anchors - */ - var selection = window.getSelection(), - tag = selection.anchorNode.parentNode; - - if (tag.tagName == 'A' && dataType == 'link') { - codex.toolbar.inline.setButtonHighlighted(tool); - } - }; - - /** - * @private - * - * Mark button if text is already executed - */ - inline.setButtonHighlighted = function (button) { - button.classList.add('hightlighted'); - - /** At link tool we also change icon */ - if (button.dataset.type == 'link') { - var icon = button.childNodes[0]; - icon.classList.remove('ce-icon-link'); - icon.classList.add('ce-icon-unlink'); - } - }; - - /** - * @private - * - * Removes hightlight - */ - inline.removeButtonsHighLight = function (button) { - button.classList.remove('hightlighted'); - - /** At link tool we also change icon */ - if (button.dataset.type == 'link') { - var icon = button.childNodes[0]; - icon.classList.remove('ce-icon-unlink'); - icon.classList.add('ce-icon-link'); - } - }; - - return inline; - }({}); - - inline.init(); - - module.exports = inline; - -/***/ }, -/* 12 */ -/***/ function(module, exports, __webpack_require__) { - - 'use strict'; - - /** - * Codex Editor toolbox - * - * All tools be able to appended here - * - * @author Codex Team - * @version 1.0 - */ - - var toolbox = function (toolbox) { - - toolbox.init = function () { - - __webpack_require__(9); - }; - - toolbox.opened = false; - - /** Shows toolbox */ - toolbox.open = function () { - - /** Close setting if toolbox is opened */ - if (codex.toolbar.settings.opened) { - - codex.toolbar.settings.close(); - } - - /** display toolbox */ - codex.nodes.toolbox.classList.add('opened'); - - /** Animate plus button */ - codex.nodes.plusButton.classList.add('clicked'); - - /** toolbox state */ - codex.toolbar.toolbox.opened = true; - }; - - /** Closes toolbox */ - toolbox.close = function () { - - /** Makes toolbox disapear */ - codex.nodes.toolbox.classList.remove('opened'); - - /** Rotate plus button */ - codex.nodes.plusButton.classList.remove('clicked'); - - /** toolbox state */ - codex.toolbar.toolbox.opened = false; - }; - - toolbox.leaf = function () { - - var currentTool = codex.toolbar.current, - tools = Object.keys(codex.tools), - barButtons = codex.nodes.toolbarButtons, - nextToolIndex, - hiddenToolsAmount = 0, - toolToSelect; - - /** Count toolbox hidden tools */ - for (var tool in codex.tools) { - - if (!codex.tools[tool].displayInToolbox) { - - hiddenToolsAmount++; - } - } - - if (!currentTool) { - - /** Get first tool from object*/ - for (toolToSelect in barButtons) { - break; - } - } else { - - nextToolIndex = tools.indexOf(currentTool) + 1; - - var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2); - - if (toolIsLastInToolbox) { - - nextToolIndex = 0; - - /** getting first displayed tool */ - for (var tool in codex.tools) { - - if (codex.tools[tool].displayInToolbox) { - - break; - } - - nextToolIndex++; - } - } - - toolToSelect = tools[nextToolIndex]; - } - - for (var button in barButtons) { - barButtons[button].classList.remove('selected'); - }barButtons[toolToSelect].classList.add('selected'); - codex.toolbar.current = toolToSelect; - }; - - /** - * Transforming selected node type into selected toolbar element type - * @param {event} event - */ - toolbox.toolClicked = function () { - - /** - * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty - */ - var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter', 'embed'], - tool = codex.tools[codex.toolbar.current], - workingNode = codex.content.currentNode, - currentInputIndex = codex.caret.inputIndex, - newBlockContent, - appendCallback, - blockData; - - /** Make block from plugin */ - newBlockContent = tool.make(); - - /** information about block */ - blockData = { - block: newBlockContent, - type: tool.type, - stretched: false - }; - - if (workingNode && UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 && workingNode.textContent.trim() === '') { - - /** Replace current block */ - codex.content.switchBlock(workingNode, newBlockContent, tool.type); - } else { - - /** Insert new Block from plugin */ - codex.content.insertBlock(blockData); - - /** increase input index */ - currentInputIndex++; - } - - /** Fire tool append callback */ - appendCallback = tool.appendCallback; - - if (appendCallback && typeof appendCallback == 'function') { - - appendCallback.call(event); - } - - setTimeout(function () { - - /** Set caret to current block */ - codex.caret.setToBlock(currentInputIndex); - }, 10); - - /** - * Changing current Node - */ - codex.content.workingNodeChanged(); - - /** - * Move toolbar when node is changed - */ - codex.toolbar.move(); - }; - - return toolbox; - }({}); - - toolbox.init(); - - module.exports = toolbox; - -/***/ }, -/* 13 */ -/***/ function(module, exports) { - - "use strict"; - - /** - * Codex Editor tools - * This tools will be appended in toolbox - * - * @author Codex Team - * @version 1.0 - */ - - var tools = function (tools) { - - return tools; - }({}); - - module.exports = tools; - -/***/ }, -/* 14 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Codex Editor callbacks module - * - * @author Codex Team - * @version 1.2.5 - */ - - var callbacks = function (callbacks) { - - callbacks.redactorSyncTimeout = null; - - callbacks.globalKeydown = function (event) { - switch (event.keyCode) { - case codex.core.keys.ENTER: - codex.callback.enterKeyPressed(event);break; - } - }; - - callbacks.redactorKeyDown = function (event) { - switch (event.keyCode) { - case codex.core.keys.TAB: - codex.callback.tabKeyPressed(event);break; - case codex.core.keys.ENTER: - codex.callback.enterKeyPressedOnRedactorZone(event);break; - case codex.core.keys.ESC: - codex.callback.escapeKeyPressed(event);break; - default: - codex.callback.defaultKeyPressed(event);break; - } - }; - - callbacks.globalKeyup = function (event) { - switch (event.keyCode) { - case codex.core.keys.UP: - case codex.core.keys.LEFT: - case codex.core.keys.RIGHT: - case codex.core.keys.DOWN: - codex.callback.arrowKeyPressed(event);break; - } - }; - - callbacks.tabKeyPressed = function (event) { - - if (!codex.toolbar.opened) { - codex.toolbar.open(); - } - - if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) { - codex.toolbar.toolbox.open(); - } else { - codex.toolbar.toolbox.leaf(); - } - - event.preventDefault(); - }; - - callbacks.enterKeyPressed = function (event) { - - if (codex.content.editorAreaHightlighted) { - - /** - * it means that we lose input index, saved index before is not correct - * therefore we need to set caret when we insert new block - */ - codex.caret.inputIndex = -1; - - codex.callback.enterPressedOnBlock(); - } - }; - - /** - * ENTER key handler - * Makes new paragraph block - */ - callbacks.enterKeyPressedOnRedactorZone = function (event) { - - if (event.target.contentEditable == 'true') { - - /** Update input index */ - codex.caret.saveCurrentInputIndex(); - } - - if (!codex.content.currentNode) { - /** - * Enter key pressed in first-level block area - */ - codex.callback.enterPressedOnBlock(event); - return; - } - - var currentInputIndex = codex.caret.getCurrentInputIndex() || 0, - workingNode = codex.content.currentNode, - tool = workingNode.dataset.tool, - isEnterPressedOnToolbar = codex.toolbar.opened && codex.toolbar.current && event.target == codex.state.inputs[currentInputIndex]; - - /** The list of tools which needs the default browser behaviour */ - var enableLineBreaks = codex.tools[tool].enableLineBreaks; - - /** This type of block creates when enter is pressed */ - var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; - - /** - * When toolbar is opened, select tool instead of making new paragraph - */ - if (isEnterPressedOnToolbar) { - - event.preventDefault(); - - codex.toolbar.toolbox.toolClicked(event); - - codex.toolbar.close(); - - /** - * Stop other listeners callback executions - */ - event.stopPropagation(); - event.stopImmediatePropagation(); - - return; - } - - /** - * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour - */ - if (event.shiftKey && !enableLineBreaks) { - codex.callback.enterPressedOnBlock(codex.content.currentBlock, event); - event.preventDefault(); - } else if (event.shiftKey && !enableLineBreaks || !event.shiftKey && enableLineBreaks) { - /** XOR */ - return; - } - - var isLastTextNode = false, - currentSelection = window.getSelection(), - currentSelectedNode = currentSelection.anchorNode, - caretAtTheEndOfText = codex.caret.position.atTheEnd(), - isTextNodeHasParentBetweenContenteditable = false; - - /** - * Workaround situation when caret at the Text node that has some wrapper Elements - * Split block cant handle this. - * We need to save default behavior - */ - isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != "true"; - - /** - * Split blocks when input has several nodes and caret placed in textNode - */ - if (currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT && !isTextNodeHasParentBetweenContenteditable && !caretAtTheEndOfText) { - - event.preventDefault(); - - codex.core.log('Splitting Text node...'); - - codex.content.splitBlock(currentInputIndex); - - /** Show plus button when next input after split is empty*/ - if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) { - codex.toolbar.showPlusButton(); - } - } else { - - if (currentSelectedNode && currentSelectedNode.parentNode) { - - isLastTextNode = !currentSelectedNode.parentNode.nextSibling; - } - - if (isLastTextNode && caretAtTheEndOfText) { - - event.preventDefault(); - - codex.core.log('ENTER clicked in last textNode. Create new BLOCK'); - - codex.content.insertBlock({ - type: NEW_BLOCK_TYPE, - block: codex.tools[NEW_BLOCK_TYPE].render() - }, true); - - codex.toolbar.move(); - codex.toolbar.open(); - - /** Show plus button with empty block */ - codex.toolbar.showPlusButton(); - } else { - - codex.core.log('Default ENTER behavior.'); - } - } - - /** get all inputs after new appending block */ - codex.ui.saveInputs(); - }; - - callbacks.escapeKeyPressed = function (event) { - - /** Close all toolbar */ - codex.toolbar.close(); - - /** Close toolbox */ - codex.toolbar.toolbox.close(); - - event.preventDefault(); - }; - - callbacks.arrowKeyPressed = function (event) { - - codex.content.workingNodeChanged(); - - /* Closing toolbar */ - codex.toolbar.close(); - codex.toolbar.move(); - }; - - callbacks.defaultKeyPressed = function (event) { - - codex.toolbar.close(); - - if (!codex.toolbar.inline.actionsOpened) { - codex.toolbar.inline.close(); - codex.content.clearMark(); - } - }; - - callbacks.redactorClicked = function (event) { - - callbacks.detectWhenClickedOnFirstLevelBlockArea(); - - codex.content.workingNodeChanged(event.target); - - codex.ui.saveInputs(); - - var selectedText = codex.toolbar.inline.getSelectionText(); - - /** - * If selection range took off, then we hide inline toolbar - */ - if (selectedText.length === 0) { - codex.toolbar.inline.close(); - } - - /** Update current input index in memory when caret focused into existed input */ - if (event.target.contentEditable == 'true') { - - codex.caret.saveCurrentInputIndex(); - } - - if (codex.content.currentNode === null) { - - /** - * If inputs in redactor does not exits, then we put input index 0 not -1 - */ - var indexOfLastInput = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0; - - /** If we have any inputs */ - if (codex.state.inputs.length) { - - /** getting firstlevel parent of input */ - var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]); - } - - /** If input is empty, then we set caret to the last input */ - if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) { - - codex.caret.setToBlock(indexOfLastInput); - } else { - - /** Create new input when caret clicked in redactors area */ - var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; - - codex.content.insertBlock({ - type: NEW_BLOCK_TYPE, - block: codex.tools[NEW_BLOCK_TYPE].render() - }); - - /** If there is no inputs except inserted */ - if (codex.state.inputs.length === 1) { - - codex.caret.setToBlock(indexOfLastInput); - } else { - - /** Set caret to this appended input */ - codex.caret.setToNextBlock(indexOfLastInput); - } - } - - /** - * Move toolbar to the right position and open - */ - codex.toolbar.move(); - - codex.toolbar.open(); - } else { - - /** - * Move toolbar to the new position and open - */ - codex.toolbar.move(); - - codex.toolbar.open(); - - /** Close all panels */ - codex.toolbar.settings.close(); - codex.toolbar.toolbox.close(); - } - - var inputIsEmpty = !codex.content.currentNode.textContent.trim(); - - if (inputIsEmpty) { - - /** Show plus button */ - codex.toolbar.showPlusButton(); - } else { - - /** Hide plus buttons */ - codex.toolbar.hidePlusButton(); - } - - var currentNodeType = codex.content.currentNode.dataset.tool; - - /** Mark current block*/ - if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) { - - codex.content.markBlock(); - } - }; - - /** - * This method allows to define, is caret in contenteditable element or not. - * Otherwise, if we get TEXT node from range container, that will means we have input index. - * In this case we use default browsers behaviour (if plugin allows that) or overwritten action. - * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always - * specifies to the first-level block. Other cases we just ignore. - */ - callbacks.detectWhenClickedOnFirstLevelBlockArea = function () { - - var selection = window.getSelection(), - anchorNode = selection.anchorNode, - flag = false; - - if (selection.rangeCount == 0) { - - codex.content.editorAreaHightlighted = true; - } else { - - if (!codex.core.isDomNode(anchorNode)) { - anchorNode = anchorNode.parentNode; - } - - /** Already founded, without loop */ - if (anchorNode.contentEditable == 'true') { - flag = true; - } - - while (anchorNode.contentEditable != 'true') { - anchorNode = anchorNode.parentNode; - - if (anchorNode.contentEditable == 'true') { - flag = true; - } - - if (anchorNode == document.body) { - break; - } - } - - /** If editable element founded, flag is "TRUE", Therefore we return "FALSE" */ - codex.content.editorAreaHightlighted = flag ? false : true; - } - }; - - /** - * Toolbar button click handler - * @param this - cursor to the button - */ - callbacks.toolbarButtonClicked = function (event) { - - var button = this; - - codex.toolbar.current = button.dataset.type; - - codex.toolbar.toolbox.toolClicked(event); - codex.toolbar.close(); - }; - - callbacks.redactorInputEvent = function (event) { - - /** - * Clear previous sync-timeout - */ - if (this.redactorSyncTimeout) { - clearTimeout(this.redactorSyncTimeout); - } - - /** - * Start waiting to input finish and sync redactor - */ - this.redactorSyncTimeout = setTimeout(function () { - - codex.content.sync(); - }, 500); - }; - - /** Show or Hide toolbox when plus button is clicked */ - callbacks.plusButtonClicked = function () { - - if (!codex.nodes.toolbox.classList.contains('opened')) { - - codex.toolbar.toolbox.open(); - } else { - - codex.toolbar.toolbox.close(); - } - }; - - /** - * Block handlers for KeyDown events - */ - callbacks.blockKeydown = function (event, block) { - - switch (event.keyCode) { - - case codex.core.keys.DOWN: - case codex.core.keys.RIGHT: - codex.callback.blockRightOrDownArrowPressed(block); - break; - - case codex.core.keys.BACKSPACE: - codex.callback.backspacePressed(block); - break; - - case codex.core.keys.UP: - case codex.core.keys.LEFT: - codex.callback.blockLeftOrUpArrowPressed(block); - break; - - } - }; - - /** - * RIGHT or DOWN keydowns on block - */ - callbacks.blockRightOrDownArrowPressed = function (block) { - - var selection = window.getSelection(), - inputs = codex.state.inputs, - focusedNode = selection.anchorNode, - focusedNodeHolder; - - /** Check for caret existance */ - if (!focusedNode) { - return false; - } - - /** Looking for closest (parent) contentEditable element of focused node */ - while (focusedNode.contentEditable != 'true') { - - focusedNodeHolder = focusedNode.parentNode; - focusedNode = focusedNodeHolder; - } - - /** Input index in DOM level */ - var editableElementIndex = 0; - while (focusedNode != inputs[editableElementIndex]) { - editableElementIndex++; - } - - /** - * Founded contentEditable element doesn't have childs - * Or maybe New created block - */ - if (!focusedNode.textContent) { - codex.caret.setToNextBlock(editableElementIndex); - return; - } - - /** - * Do nothing when caret doesn not reaches the end of last child - */ - var caretInLastChild = false, - caretAtTheEndOfText = false; - - var lastChild, deepestTextnode; - - lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1]; - - if (codex.core.isDomNode(lastChild)) { - - deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length); - } else { - - deepestTextnode = lastChild; - } - - caretInLastChild = selection.anchorNode == deepestTextnode; - caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset; - - if (!caretInLastChild || !caretAtTheEndOfText) { - codex.core.log('arrow [down|right] : caret does not reached the end'); - return false; - } - - codex.caret.setToNextBlock(editableElementIndex); - }; - - /** - * LEFT or UP keydowns on block - */ - callbacks.blockLeftOrUpArrowPressed = function (block) { - - var selection = window.getSelection(), - inputs = codex.state.inputs, - focusedNode = selection.anchorNode, - focusedNodeHolder; - - /** Check for caret existance */ - if (!focusedNode) { - return false; - } - - /** - * LEFT or UP not at the beginning - */ - if (selection.anchorOffset !== 0) { - return false; - } - - /** Looking for parent contentEditable block */ - while (focusedNode.contentEditable != 'true') { - focusedNodeHolder = focusedNode.parentNode; - focusedNode = focusedNodeHolder; - } - - /** Input index in DOM level */ - var editableElementIndex = 0; - while (focusedNode != inputs[editableElementIndex]) { - editableElementIndex++; - } - - /** - * Do nothing if caret is not at the beginning of first child - */ - var caretInFirstChild = false, - caretAtTheBeginning = false; - - var firstChild, deepestTextnode; - - /** - * Founded contentEditable element doesn't have childs - * Or maybe New created block - */ - if (!focusedNode.textContent) { - codex.caret.setToPreviousBlock(editableElementIndex); - return; - } - - firstChild = focusedNode.childNodes[0]; - - if (codex.core.isDomNode(firstChild)) { - - deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0); - } else { - - deepestTextnode = firstChild; - } - - caretInFirstChild = selection.anchorNode == deepestTextnode; - caretAtTheBeginning = selection.anchorOffset === 0; - - if (caretInFirstChild && caretAtTheBeginning) { - - codex.caret.setToPreviousBlock(editableElementIndex); - } - }; - - /** - * Callback for enter key pressing in first-level block area - */ - callbacks.enterPressedOnBlock = function (event) { - - var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; - - codex.content.insertBlock({ - type: NEW_BLOCK_TYPE, - block: codex.tools[NEW_BLOCK_TYPE].render() - }, true); - - codex.toolbar.move(); - codex.toolbar.open(); - }; - - callbacks.backspacePressed = function (block) { - - var currentInputIndex = codex.caret.getCurrentInputIndex(), - range, - selectionLength, - firstLevelBlocksCount; - - if (block.textContent.trim()) { - - range = codex.content.getRange(); - selectionLength = range.endOffset - range.startOffset; - - if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) { - - codex.content.mergeBlocks(currentInputIndex); - } else { - - return; - } - } - - if (!selectionLength) { - block.remove(); - } - - firstLevelBlocksCount = codex.nodes.redactor.childNodes.length; - - /** - * If all blocks are removed - */ - if (firstLevelBlocksCount === 0) { - - /** update currentNode variable */ - codex.content.currentNode = null; - - /** Inserting new empty initial block */ - codex.ui.addInitialBlock(); - - /** Updating inputs state after deleting last block */ - codex.ui.saveInputs(); - - /** Set to current appended block */ - setTimeout(function () { - - codex.caret.setToPreviousBlock(1); - }, 10); - } else { - - if (codex.caret.inputIndex !== 0) { - - /** Target block is not first */ - codex.caret.setToPreviousBlock(codex.caret.inputIndex); - } else { - - /** If we try to delete first block */ - codex.caret.setToNextBlock(codex.caret.inputIndex); - } - } - - codex.toolbar.move(); - - if (!codex.toolbar.opened) { - codex.toolbar.open(); - } - - /** Updating inputs state */ - codex.ui.saveInputs(); - - /** Prevent default browser behaviour */ - event.preventDefault(); - }; - - /** - * @deprecated - * - * @param event - */ - callbacks.blockPaste = function (event) { - - var currentInputIndex = codex.caret.getCurrentInputIndex(), - node = codex.state.inputs[currentInputIndex]; - - setTimeout(function () { - - codex.content.sanitize(node); - - event.preventDefault(); - }, 10); - - event.stopImmediatePropagation(); - }; - - callbacks.blockPasteCallback = function (event) { - - var currentInputIndex = codex.caret.getCurrentInputIndex(); - - /** - * create an observer instance - */ - var observer = new MutationObserver(codex.callback.handleMutationsOnPaste); - - /** - * configuration of the observer: - */ - var config = { - attributes: true, - childList: true, - characterData: false, - subtree: true - }; - - // pass in the target node, as well as the observer options - observer.observe(codex.state.inputs[currentInputIndex], config); - }; - - /** - * Sends all mutations to paste handler - */ - callbacks.handleMutationsOnPaste = function (mutations) { - - var self = this; - - /** - * Calling function with context of this function. - * Also, we should sanitize pasted or changed data one time and ignore - * changings which makes sanitize method. - * For that, we need to send Context, MutationObserver.__proto__ that contains - * observer disconnect method. - */ - mutations.forEach(function (mutation) { - codex.content.paste.call(self, mutation); - }); - }; - - /** - * Clicks on block settings button - */ - callbacks.showSettingsButtonClicked = function () { - - /** - * Get type of current block - * It uses to append settings from tool.settings property. - * ... - * Type is stored in data-type attribute on block - */ - var currentToolType = codex.content.currentNode.dataset.tool; - - codex.toolbar.settings.toggle(currentToolType); - - /** Close toolbox when settings button is active */ - codex.toolbar.toolbox.close(); - codex.toolbar.settings.hideRemoveActions(); - }; - - return callbacks; - }({}); - - module.exports = callbacks; - -/***/ }, -/* 15 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Codex Editor Draw module - * - * @author Codex Team - * @version 1.0. - */ - - var draw = function (draw) { - - /** - * Base editor wrapper - */ - draw.wrapper = function () { - - var wrapper = document.createElement('div'); - - wrapper.className += 'codex-editor'; - - return wrapper; - }; - - /** - * Content-editable holder - */ - draw.redactor = function () { - - var redactor = document.createElement('div'); - - redactor.className += 'ce-redactor'; - - return redactor; - }; - - draw.ceBlock = function () { - - var block = document.createElement('DIV'); - - block.className += 'ce_block'; - - return block; - }; - - /** - * Empty toolbar with toggler - */ - draw.toolbar = function () { - - var bar = document.createElement('div'); - - bar.className += 'ce-toolbar'; - - return bar; - }; - - draw.toolbarContent = function () { - - var wrapper = document.createElement('DIV'); - wrapper.classList.add('ce-toolbar__content'); - - return wrapper; - }; - - /** - * Inline toolbar - */ - draw.inlineToolbar = function () { - - var bar = document.createElement('DIV'); - - bar.className += 'ce-toolbar-inline'; - - return bar; - }; - - /** - * Wrapper for inline toobar buttons - */ - draw.inlineToolbarButtons = function () { - - var wrapper = document.createElement('DIV'); - - wrapper.className += 'ce-toolbar-inline__buttons'; - - return wrapper; - }; - - /** - * For some actions - */ - draw.inlineToolbarActions = function () { - - var wrapper = document.createElement('DIV'); - - wrapper.className += 'ce-toolbar-inline__actions'; - - return wrapper; - }; - - draw.inputForLink = function () { - - var input = document.createElement('INPUT'); - - input.type = 'input'; - input.className += 'inputForLink'; - input.placeholder = 'Type URL ...'; - input.setAttribute('form', 'defaultForm'); - - input.setAttribute('autofocus', 'autofocus'); - - return input; - }; - - /** - * Block with notifications - */ - draw.alertsHolder = function () { - - var block = document.createElement('div'); - - block.classList.add('ce_notifications-block'); - - return block; - }; - - /** - * @todo Desc - */ - draw.blockButtons = function () { - - var block = document.createElement('div'); - - block.className += 'ce-toolbar__actions'; - - return block; - }; - - /** - * Block settings panel - */ - draw.blockSettings = function () { - - var settings = document.createElement('div'); - - settings.className += 'ce-settings'; - - return settings; - }; - - draw.defaultSettings = function () { - - var div = document.createElement('div'); - - div.classList.add('ce-settings_default'); - - return div; - }; - - draw.pluginsSettings = function () { - - var div = document.createElement('div'); - - div.classList.add('ce-settings_plugin'); - - return div; - }; - - draw.plusButton = function () { - - var button = document.createElement('span'); - - button.className = 'ce-toolbar__plus'; - // button.innerHTML = ''; - - return button; - }; - - /** - * Settings button in toolbar - */ - draw.settingsButton = function () { - - var toggler = document.createElement('span'); - - toggler.className = 'ce-toolbar__settings-btn'; - - /** Toggler button*/ - toggler.innerHTML = ''; - - return toggler; - }; - - /** - * Redactor tools wrapper - */ - - draw.toolbox = function () { - - var wrapper = document.createElement('div'); - - wrapper.className = 'ce-toolbar__tools'; - - return wrapper; - }; - - /** - * @protected - * - * Draws tool buttons for toolbox - * - * @param {String} type - * @param {String} classname - * @returns {Element} - */ - draw.toolbarButton = function (type, classname) { - - var button = document.createElement("li"), - tool_icon = document.createElement("i"), - tool_title = document.createElement("span"); - - button.dataset.type = type; - button.setAttribute('title', type); - - tool_icon.classList.add(classname); - tool_title.classList.add('ce_toolbar_tools--title'); - - button.appendChild(tool_icon); - button.appendChild(tool_title); - - return button; - }; - - /** - * @protected - * - * Draws tools for inline toolbar - * - * @param {String} type - * @param {String} classname - */ - draw.toolbarButtonInline = function (type, classname) { - var button = document.createElement("BUTTON"), - tool_icon = document.createElement("I"); - - button.type = "button"; - button.dataset.type = type; - tool_icon.classList.add(classname); - - button.appendChild(tool_icon); - - return button; - }; - - /** - * Redactor block - */ - draw.block = function (tagName, content) { - - var node = document.createElement(tagName); - - node.innerHTML = content || ''; - - return node; - }; - - /** - * Creates Node with passed tagName and className - * @param {string} tagName - * @param {string} className - * @param {object} properties - allow to assign properties - */ - draw.node = function (tagName, className, properties) { - - var el = document.createElement(tagName); - - if (className) el.className = className; - - if (properties) { - - for (var name in properties) { - el[name] = properties[name]; - } - } - - return el; - }; - - draw.pluginsRender = function (type, content) { - - return { - type: type, - block: cEditor.tools[type].render({ - text: content - }) - }; - }; - - return draw; - }({}); - - module.exports = draw; - -/***/ }, -/* 16 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Codex Editor Caret Module - * - * @author Codex Team - * @version 1.0 - */ - - var caret = function (caret) { - - /** - * @var {int} InputIndex - editable element in DOM - */ - caret.inputIndex = null; - - /** - * @var {int} offset - caret position in a text node. - */ - caret.offset = null; - - /** - * @var {int} focusedNodeIndex - we get index of child node from first-level block - */ - caret.focusedNodeIndex = null; - - /** - * Creates Document Range and sets caret to the element. - * @protected - * @uses caret.save — if you need to save caret position - * @param {Element} el - Changed Node. - */ - caret.set = function (el, index, offset) { - - offset = offset || this.offset || 0; - index = index || this.focusedNodeIndex || 0; - - var childs = el.childNodes, - nodeToSet; - - if (childs.length === 0) { - - nodeToSet = el; - } else { - - nodeToSet = childs[index]; - } - - /** If Element is INPUT */ - if (el.tagName == 'INPUT') { - el.focus(); - return; - } - - if (codex.core.isDomNode(nodeToSet)) { - - nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length); - } - - var range = document.createRange(), - selection = window.getSelection(); - - setTimeout(function () { - - range.setStart(nodeToSet, offset); - range.setEnd(nodeToSet, offset); - - selection.removeAllRanges(); - selection.addRange(range); - - codex.caret.saveCurrentInputIndex(); - }, 20); - }; - - /** - * @protected - * Updates index of input and saves it in caret object - */ - caret.saveCurrentInputIndex = function () { - - /** Index of Input that we paste sanitized content */ - var selection = window.getSelection(), - inputs = codex.state.inputs, - focusedNode = selection.anchorNode, - focusedNodeHolder; - - if (!focusedNode) { - return; - } - - /** Looking for parent contentEditable block */ - while (focusedNode.contentEditable != 'true') { - focusedNodeHolder = focusedNode.parentNode; - focusedNode = focusedNodeHolder; - } - - /** Input index in DOM level */ - var editableElementIndex = 0; - - while (focusedNode != inputs[editableElementIndex]) { - editableElementIndex++; - } - - this.inputIndex = editableElementIndex; - }; - - /** - * Returns current input index (caret object) - */ - caret.getCurrentInputIndex = function () { - return this.inputIndex; - }; - - /** - * @param {int} index - index of first-level block after that we set caret into next input - */ - caret.setToNextBlock = function (index) { - - var inputs = codex.state.inputs, - nextInput = inputs[index + 1]; - - if (!nextInput) { - codex.core.log('We are reached the end'); - return; - } - - /** - * When new Block created or deleted content of input - * We should add some text node to set caret - */ - if (!nextInput.childNodes.length) { - var emptyTextElement = document.createTextNode(''); - nextInput.appendChild(emptyTextElement); - } - - codex.caret.inputIndex = index + 1; - codex.caret.set(nextInput, 0, 0); - codex.content.workingNodeChanged(nextInput); - }; - - /** - * @param {int} index - index of target input. - * Sets caret to input with this index - */ - caret.setToBlock = function (index) { - - var inputs = codex.state.inputs, - targetInput = inputs[index]; - - console.assert(targetInput, 'caret.setToBlock: target input does not exists'); - - if (!targetInput) { - return; - } - - /** - * When new Block created or deleted content of input - * We should add some text node to set caret - */ - if (!targetInput.childNodes.length) { - var emptyTextElement = document.createTextNode(''); - targetInput.appendChild(emptyTextElement); - } - - codex.caret.inputIndex = index; - codex.caret.set(targetInput, 0, 0); - codex.content.workingNodeChanged(targetInput); - }; - - /** - * @param {int} index - index of input - */ - caret.setToPreviousBlock = function (index) { - - index = index || 0; - - var inputs = codex.state.inputs, - previousInput = inputs[index - 1], - lastChildNode, - lengthOfLastChildNode, - emptyTextElement; - - if (!previousInput) { - codex.core.log('We are reached first node'); - return; - } - - lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length); - lengthOfLastChildNode = lastChildNode.length; - - /** - * When new Block created or deleted content of input - * We should add some text node to set caret - */ - if (!previousInput.childNodes.length) { - - emptyTextElement = document.createTextNode(''); - previousInput.appendChild(emptyTextElement); - } - codex.caret.inputIndex = index - 1; - codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode); - codex.content.workingNodeChanged(inputs[index - 1]); - }; - - caret.position = { - - atStart: function atStart() { - - var selection = window.getSelection(), - anchorOffset = selection.anchorOffset, - anchorNode = selection.anchorNode, - firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode), - pluginsRender = firstLevelBlock.childNodes[0]; - - if (!codex.core.isDomNode(anchorNode)) { - anchorNode = anchorNode.parentNode; - } - - var isFirstNode = anchorNode === pluginsRender.childNodes[0], - isOffsetZero = anchorOffset === 0; - - return isFirstNode && isOffsetZero; - }, - - atTheEnd: function atTheEnd() { - - var selection = window.getSelection(), - anchorOffset = selection.anchorOffset, - anchorNode = selection.anchorNode; - - /** Caret is at the end of input */ - return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length; - } - }; - - return caret; - }({}); - - module.exports = caret; - -/***/ }, -/* 17 */ -/***/ function(module, exports) { - - 'use strict'; - - /** - * Codex Editor Notification Module - * - * @author Codex Team - * @version 1.0 - */ - - var notifications = function (notifications) { - - /** - * Error notificator. Shows block with message - * @protected - */ - notifications.errorThrown = function (errorMsg, event) { - - codex.notifications.send('This action is not available currently', event.type, false); - }; - - /** - * Appends notification with different types - * @param message {string} - Error or alert message - * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ... - * @param append {boolean} - can be True or False when notification should be inserted after - */ - notifications.send = function (message, type, append) { - - var notification = codex.draw.block('div'); - - notification.textContent = message; - notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX'); - - if (!append) { - codex.nodes.notifications.innerHTML = ''; - } - - codex.nodes.notifications.appendChild(notification); - - setTimeout(function () { - notification.remove(); - }, 3000); - }; - - return notifications; - }({}); - - module.exports = notifications; - -/***/ }, -/* 18 */ -/***/ function(module, exports) { - - "use strict"; - - /** - * Codex Editor Parser Module - * - * @author Codex Team - * @version 1.1 - */ - - var parser = function (parser) { - - /** inserting text */ - parser.insertPastedContent = function (blockType, tag) { - - codex.content.insertBlock({ - type: blockType.type, - block: blockType.render({ - text: tag.innerHTML - }) - }); - }; - - /** - * Check DOM node for display style: separated block or child-view - */ - parser.isFirstLevelBlock = function (node) { - - return node.nodeType == cEditor.core.nodeTypes.TAG && node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME); - }; - - return parser; - }({}); - - module.exports = parser; - -/***/ } -/******/ ]); -//# sourceMappingURL=codex-editor.js.map \ No newline at end of file diff --git a/codex-editor.js.map b/codex-editor.js.map index b4739699..27889c78 100644 --- a/codex-editor.js.map +++ b/codex-editor.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 685c3b69d4372899a8c1","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./~/html-janitor/src/html-janitor.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","version","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","redactorKeyDown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPasteCallback","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","text","trim","classList","contains","push","janitor","Config","tags","p","a","href","rel","b","strong","em","span","currentNode","editorAreaHightlighted","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","textContent","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","disconnect","sanitizer","clear","clean","outerHTML","div","replaceWith","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","plugin","showInlineToolbar","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","enterKeyPressed","tabKeyPressed","enterKeyPressedOnRedactorZone","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","stopPropagation","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","detectWhenClickedOnFirstLevelBlockArea","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","blockPaste","observer","MutationObserver","handleMutationsOnPaste","config","attributes","childList","characterData","subtree","observe","mutations","self","currentToolType","bar","placeholder","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","insertPastedContent"],"mappings":"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","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 685c3b69d4372899a8c1","/**\r\n *\r\n */\r\n\r\n'use strict';\r\n\r\nvar editor = require('./editor');\r\nmodule.exports = editor;\r\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","/**\r\n *\r\n * Codex Editor\r\n *\r\n * @author Codex Team\r\n * @version 1.2.5\r\n */\r\n\r\nvar codex = (function(codex){\r\n\r\n var init = function() {\r\n\r\n codex.core = require('./modules/core');\r\n codex.ui = require('./modules/ui');\r\n codex.transport = require('./modules/transport');\r\n codex.renderer = require('./modules/renderer');\r\n codex.saver = require('./modules/saver');\r\n codex.content = require('./modules/content');\r\n codex.toolbar = require('./modules/toolbar/toolbar');\r\n codex.tools = require('./modules/tools');\r\n codex.callback = require('./modules/callbacks');\r\n codex.draw = require('./modules/draw');\r\n codex.caret = require('./modules/caret');\r\n codex.notifications = require('./modules/notifications');\r\n codex.parser = require('./modules/parser');\r\n };\r\n\r\n codex.version = VERSION;\r\n\r\n /**\r\n * @public\r\n *\r\n * holds initial settings\r\n */\r\n codex.settings = {\r\n tools : ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'],\r\n textareaId: 'codex-editor',\r\n uploadImagesUrl: '/editor/transport/',\r\n\r\n // Type of block showing on empty editor\r\n initialBlockPlugin: \"paragraph\"\r\n };\r\n\r\n /**\r\n * public\r\n *\r\n * Static nodes\r\n */\r\n codex.nodes = {\r\n textarea : null,\r\n wrapper : null,\r\n toolbar : null,\r\n inlineToolbar : {\r\n wrapper : null,\r\n buttons : null,\r\n actions : null\r\n },\r\n toolbox : null,\r\n notifications : null,\r\n plusButton : null,\r\n showSettingsButton: null,\r\n showTrashButton : null,\r\n blockSettings : null,\r\n pluginSettings : null,\r\n defaultSettings : null,\r\n toolbarButtons : {}, // { type : DomEl, ... }\r\n redactor : null\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * Output state\r\n */\r\n codex.state = {\r\n jsonOutput: [],\r\n blocks : [],\r\n inputs : []\r\n };\r\n\r\n /**\r\n * Initialization\r\n * @uses Promise cEditor.core.prepare\r\n * @param {} userSettings are :\r\n * - tools [],\r\n * - textareaId String\r\n * ...\r\n *\r\n * Load user defined tools\r\n * Tools must contain this important objects :\r\n * @param {String} type - this is a type of plugin. It can be used as plugin name\r\n * @param {String} iconClassname - this a icon in toolbar\r\n * @param {Object} make - what should plugin do, when it is clicked\r\n * @param {Object} appendCallback - callback after clicking\r\n * @param {Element} settings - what settings does it have\r\n * @param {Object} render - plugin get JSON, and should return HTML\r\n * @param {Object} save - plugin gets HTML content, returns JSON\r\n * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE\r\n * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE\r\n *\r\n * @example\r\n * - type : 'header',\r\n * - iconClassname : 'ce-icon-header',\r\n * - make : headerTool.make,\r\n * - appendCallback : headerTool.appendCallback,\r\n * - settings : headerTool.makeSettings(),\r\n * - render : headerTool.render,\r\n * - save : headerTool.save,\r\n * - displayInToolbox : true,\r\n * - enableLineBreaks : false\r\n */\r\n codex.start = function (userSettings) {\r\n\r\n init();\r\n\r\n this.core.prepare(userSettings)\r\n\r\n // If all ok, make UI, bind events and parse initial-content\r\n .then(this.ui.make)\r\n .then(this.ui.addTools)\r\n .then(this.ui.bindEvents)\r\n .then(this.ui.preparePlugins)\r\n .then(this.transport.prepare)\r\n .then(this.renderer.makeBlocksFromData)\r\n .then(this.ui.saveInputs)\r\n .catch(function (error) {\r\n codex.core.log('Initialization failed with error: %o', 'warn', error);\r\n });\r\n\r\n };\r\n\r\n return codex;\r\n\r\n})({});\r\n\r\nmodule.exports = codex;\r\n\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./editor.js","/**\r\n * Codex Editor Core\r\n *\r\n * @author Codex Team\r\n * @version 1.1.2\r\n */\r\n\r\nvar core = (function(core) {\r\n\r\n /**\r\n * @public\r\n *\r\n * Editor preparing method\r\n * @return Promise\r\n */\r\n core.prepare = function (userSettings) {\r\n\r\n return new Promise(function(resolve, reject) {\r\n\r\n if ( userSettings ){\r\n\r\n codex.settings.tools = userSettings.tools || codex.settings.tools;\r\n\r\n }\r\n\r\n if (userSettings.data) {\r\n codex.state.blocks = userSettings.data;\r\n }\r\n\r\n if (userSettings.initialBlockPlugin) {\r\n codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin;\r\n }\r\n\r\n if (userSettings.uploadImagesUrl) {\r\n codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl;\r\n }\r\n\r\n codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId);\r\n\r\n if (typeof codex.nodes.textarea === undefined || codex.nodes.textarea === null) {\r\n reject(Error(\"Textarea wasn't found by ID: #\" + userSettings.textareaId));\r\n } else {\r\n resolve();\r\n }\r\n\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Logging method\r\n * @param type = ['log', 'info', 'warn']\r\n */\r\n core.log = function (msg, type, arg) {\r\n\r\n type = type || 'log';\r\n\r\n if (!arg) {\r\n arg = msg || 'undefined';\r\n msg = '[codex-editor]: %o';\r\n } else {\r\n msg = '[codex-editor]: ' + msg;\r\n }\r\n\r\n try{\r\n if ( 'console' in window && console[ type ] ){\r\n if ( arg ) console[ type ]( msg , arg );\r\n else console[ type ]( msg );\r\n }\r\n\r\n }catch(e){}\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Helper for insert one element after another\r\n */\r\n core.insertAfter = function (target, element) {\r\n target.parentNode.insertBefore(element, target.nextSibling);\r\n };\r\n\r\n /**\r\n * @const\r\n *\r\n * Readable DOM-node types map\r\n */\r\n core.nodeTypes = {\r\n TAG : 1,\r\n TEXT : 3,\r\n COMMENT : 8\r\n };\r\n\r\n /**\r\n * @const\r\n * Readable keys map\r\n */\r\n core.keys = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, LEFT: 37, UP: 38, DOWN: 40, RIGHT: 39, DELETE: 46, META: 91 };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Check object for DOM node\r\n */\r\n core.isDomNode = function (el) {\r\n return el && typeof el === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG;\r\n };\r\n\r\n /**\r\n * Native Ajax\r\n */\r\n core.ajax = function (data) {\r\n\r\n if (!data || !data.url){\r\n return;\r\n }\r\n\r\n var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject(\"Microsoft.XMLHTTP\"),\r\n success_function = function(){},\r\n params = '',\r\n obj;\r\n\r\n data.async = true;\r\n data.type = data.type || 'GET';\r\n data.data = data.data || '';\r\n data['content-type'] = data['content-type'] || 'application/json; charset=utf-8';\r\n success_function = data.success || success_function ;\r\n\r\n if (data.type == 'GET' && data.data) {\r\n\r\n data.url = /\\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data;\r\n\r\n } else {\r\n\r\n for(obj in data.data) {\r\n params += (obj + '=' + encodeURIComponent(data.data[obj]) + '&');\r\n }\r\n }\r\n\r\n if (data.withCredentials) {\r\n XMLHTTP.withCredentials = true;\r\n }\r\n\r\n if (data.beforeSend && typeof data.beforeSend == 'function') {\r\n data.beforeSend.call();\r\n }\r\n\r\n XMLHTTP.open( data.type, data.url, data.async );\r\n XMLHTTP.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n XMLHTTP.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\r\n\r\n XMLHTTP.onreadystatechange = function() {\r\n if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) {\r\n success_function(XMLHTTP.responseText);\r\n }\r\n };\r\n\r\n XMLHTTP.send(params);\r\n };\r\n\r\n /** Appends script to head of document */\r\n core.importScript = function(scriptPath, instanceName) {\r\n\r\n /** Script is already loaded */\r\n if ( !instanceName || (instanceName && document.getElementById('ce-script-' + instanceName)) ) {\r\n codex.core.log(\"Instance name of script is missed or script is already loaded\", \"warn\");\r\n return;\r\n }\r\n\r\n\r\n var script = document.createElement('SCRIPT');\r\n script.type = \"text/javascript\";\r\n script.src = scriptPath;\r\n script.async = true;\r\n script.defer = true;\r\n\r\n if (instanceName) {\r\n script.id = \"ce-script-\" + instanceName;\r\n }\r\n\r\n document.head.appendChild(script);\r\n return script;\r\n };\r\n\r\n return core;\r\n\r\n})({});\r\n\r\nmodule.exports = core;\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/core.js","/**\r\n * Codex Editor UI module\r\n *\r\n * @author Codex Team\r\n * @version 1.1\r\n */\r\n\r\nvar ui = (function(ui){\r\n\r\n /**\r\n * Basic editor classnames\r\n */\r\n ui.className = {\r\n\r\n /**\r\n * @const {string} BLOCK_CLASSNAME - redactor blocks name\r\n */\r\n BLOCK_CLASSNAME : 'ce-block',\r\n\r\n /**\r\n * @const {String} wrapper for plugins content\r\n */\r\n BLOCK_CONTENT : 'ce-block__content',\r\n\r\n /**\r\n * @const {String} BLOCK_STRETCHED - makes block stretched\r\n */\r\n BLOCK_STRETCHED : 'ce-block--stretched',\r\n\r\n /**\r\n * @const {String} BLOCK_HIGHLIGHTED - adds background\r\n */\r\n BLOCK_HIGHLIGHTED : 'ce-block--focused',\r\n\r\n /**\r\n * @const {String} - highlights covered blocks\r\n */\r\n BLOCK_IN_FEED_MODE : 'ce-block--feed-mode',\r\n\r\n /**\r\n * @const {String} - for all default settings\r\n */\r\n SETTINGS_ITEM : 'ce-settings__item'\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Making main interface\r\n */\r\n ui.make = function () {\r\n\r\n var wrapper,\r\n toolbar,\r\n toolbarContent,\r\n inlineToolbar,\r\n redactor,\r\n ceBlock,\r\n notifications,\r\n blockButtons,\r\n blockSettings,\r\n showSettingsButton,\r\n showTrashButton,\r\n toolbox,\r\n plusButton;\r\n\r\n /** Make editor wrapper */\r\n wrapper = codex.draw.wrapper();\r\n\r\n /** Append editor wrapper after initial textarea */\r\n codex.core.insertAfter(codex.nodes.textarea, wrapper);\r\n\r\n /** Append block with notifications to the document */\r\n notifications = codex.draw.alertsHolder();\r\n codex.nodes.notifications = document.body.appendChild(notifications);\r\n\r\n /** Make toolbar and content-editable redactor */\r\n toolbar = codex.draw.toolbar();\r\n toolbarContent = codex.draw.toolbarContent();\r\n inlineToolbar = codex.draw.inlineToolbar();\r\n plusButton = codex.draw.plusButton();\r\n showSettingsButton = codex.draw.settingsButton();\r\n showTrashButton = codex.toolbar.settings.makeRemoveBlockButton();\r\n blockSettings = codex.draw.blockSettings();\r\n blockButtons = codex.draw.blockButtons();\r\n toolbox = codex.draw.toolbox();\r\n redactor = codex.draw.redactor();\r\n\r\n /** settings */\r\n var defaultSettings = codex.draw.defaultSettings(),\r\n pluginSettings = codex.draw.pluginsSettings();\r\n\r\n /** Add default and plugins settings */\r\n blockSettings.appendChild(pluginSettings);\r\n blockSettings.appendChild(defaultSettings);\r\n\r\n /** Make blocks buttons\r\n * This block contains settings button and remove block button\r\n */\r\n blockButtons.appendChild(showSettingsButton);\r\n blockButtons.appendChild(showTrashButton);\r\n blockButtons.appendChild(blockSettings);\r\n\r\n /** Append plus button */\r\n toolbarContent.appendChild(plusButton);\r\n\r\n /** Appending toolbar tools */\r\n toolbarContent.appendChild(toolbox);\r\n\r\n /** Appending first-level block buttons */\r\n toolbar.appendChild(blockButtons);\r\n\r\n /** Append toolbarContent to toolbar */\r\n toolbar.appendChild(toolbarContent);\r\n\r\n wrapper.appendChild(toolbar);\r\n\r\n wrapper.appendChild(redactor);\r\n\r\n /** Save created ui-elements to static nodes state */\r\n codex.nodes.wrapper = wrapper;\r\n codex.nodes.toolbar = toolbar;\r\n codex.nodes.plusButton = plusButton;\r\n codex.nodes.toolbox = toolbox;\r\n codex.nodes.blockSettings = blockSettings;\r\n codex.nodes.pluginSettings = pluginSettings;\r\n codex.nodes.defaultSettings = defaultSettings;\r\n codex.nodes.showSettingsButton = showSettingsButton;\r\n codex.nodes.showTrashButton = showTrashButton;\r\n\r\n codex.nodes.redactor = redactor;\r\n\r\n codex.ui.makeInlineToolbar(inlineToolbar);\r\n\r\n /** fill in default settings */\r\n codex.toolbar.settings.addDefaultSettings();\r\n };\r\n\r\n ui.makeInlineToolbar = function(container) {\r\n\r\n /** Append to redactor new inline block */\r\n codex.nodes.inlineToolbar.wrapper = container;\r\n\r\n /** Draw toolbar buttons */\r\n codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons();\r\n\r\n /** Buttons action or settings */\r\n codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions();\r\n\r\n /** Append to inline toolbar buttons as part of it */\r\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons);\r\n codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions);\r\n\r\n codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper);\r\n };\r\n\r\n /**\r\n * @private\r\n * Append tools passed in codex.tools\r\n */\r\n ui.addTools = function () {\r\n\r\n var tool,\r\n tool_button;\r\n\r\n for(var name in codex.settings.tools) {\r\n tool = codex.settings.tools[name];\r\n codex.tools[name] = tool;;\r\n }\r\n\r\n /** Make toolbar buttons */\r\n for (var name in codex.tools){\r\n\r\n tool = codex.tools[name];\r\n\r\n if (!tool.displayInToolbox) {\r\n continue;\r\n }\r\n\r\n if (!tool.iconClassname) {\r\n codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name);\r\n continue;\r\n }\r\n\r\n if (typeof tool.make != 'function') {\r\n codex.core.log('make method missed. Tool %o skipped', 'warn', name);\r\n continue;\r\n }\r\n\r\n /**\r\n * if tools is for toolbox\r\n */\r\n tool_button = codex.draw.toolbarButton(name, tool.iconClassname);\r\n\r\n codex.nodes.toolbox.appendChild(tool_button);\r\n\r\n /** Save tools to static nodes */\r\n codex.nodes.toolbarButtons[name] = tool_button;\r\n }\r\n\r\n\r\n /**\r\n * Add inline toolbar tools\r\n */\r\n codex.ui.addInlineToolbarTools();\r\n\r\n\r\n };\r\n\r\n ui.addInlineToolbarTools = function() {\r\n\r\n var tools = {\r\n\r\n bold: {\r\n icon : 'ce-icon-bold',\r\n command : 'bold'\r\n },\r\n\r\n italic: {\r\n icon : 'ce-icon-italic',\r\n command : 'italic'\r\n },\r\n\r\n underline: {\r\n icon : 'ce-icon-underline',\r\n command : 'underline'\r\n },\r\n\r\n link: {\r\n icon : 'ce-icon-link',\r\n command : 'createLink',\r\n }\r\n };\r\n\r\n var toolButton,\r\n tool;\r\n\r\n for(var name in tools) {\r\n\r\n tool = tools[name];\r\n\r\n toolButton = codex.draw.toolbarButtonInline(name, tool.icon);\r\n\r\n codex.nodes.inlineToolbar.buttons.appendChild(toolButton);\r\n /**\r\n * Add callbacks to this buttons\r\n */\r\n codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n * Bind editor UI events\r\n */\r\n ui.bindEvents = function () {\r\n\r\n codex.core.log('ui.bindEvents fired', 'info');\r\n\r\n window.addEventListener('error', function (errorMsg, url, lineNumber) {\r\n codex.notifications.errorThrown(errorMsg, event);\r\n }, false );\r\n\r\n /** All keydowns on Document */\r\n document.addEventListener('keydown', codex.callback.globalKeydown, false );\r\n\r\n /** All keydowns on Redactor zone */\r\n codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false);\r\n\r\n /** All keydowns on Document */\r\n document.addEventListener('keyup', codex.callback.globalKeyup, false );\r\n\r\n /**\r\n * Mouse click to radactor\r\n */\r\n codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false );\r\n\r\n /**\r\n * Clicks to the Plus button\r\n */\r\n codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false);\r\n\r\n /**\r\n * Clicks to SETTINGS button in toolbar\r\n */\r\n codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false );\r\n /**\r\n * @deprecated ( but now in use for syncronization );\r\n * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text\r\n */\r\n codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false );\r\n\r\n /** Bind click listeners on toolbar buttons */\r\n for (var button in codex.nodes.toolbarButtons){\r\n codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Initialize plugins before using\r\n * Ex. Load scripts or call some internal methods\r\n */\r\n ui.preparePlugins = function() {\r\n\r\n for(var tool in codex.tools) {\r\n\r\n if (typeof codex.tools[tool].prepare != 'function')\r\n continue;\r\n\r\n codex.tools[tool].prepare();\r\n }\r\n };\r\n\r\n ui.addBlockHandlers = function(block) {\r\n\r\n if (!block) return;\r\n\r\n /**\r\n * Block keydowns\r\n */\r\n block.addEventListener('keydown', function(event) {\r\n codex.callback.blockKeydown(event, block);\r\n }, false);\r\n\r\n /**\r\n * Pasting content from another source\r\n * We have two type of sanitization\r\n * First - uses deep-first search algorithm to get sub nodes,\r\n * sanitizes whole Block_content and replaces cleared nodes\r\n * This method is deprecated\r\n * Method is used in codex.callback.blockPaste(event)\r\n *\r\n * Secont - uses Mutation observer.\r\n * Observer \"observe\" DOM changes and send changings to callback.\r\n * Callback gets changed node, not whole Block_content.\r\n * Inserted or changed node, which we've gotten have been cleared and replaced with diry node\r\n *\r\n * Method is used in codex.callback.blockPasteViaSanitize(event)\r\n *\r\n * @uses html-janitor\r\n * @example codex.callback.blockPasteViaSanitize(event), the second method.\r\n *\r\n */\r\n block.addEventListener('paste', codex.callback.blockPasteCallback, false);\r\n\r\n block.addEventListener('mouseup', function(){\r\n codex.toolbar.inline.show();\r\n }, false);\r\n\r\n };\r\n\r\n /** getting all contenteditable elements */\r\n ui.saveInputs = function() {\r\n\r\n var redactor = codex.nodes.redactor,\r\n elements = [];\r\n\r\n /** Save all inputs in global variable state */\r\n codex.state.inputs = redactor.querySelectorAll('[contenteditable], input');\r\n };\r\n\r\n /**\r\n * Adds first initial block on empty redactor\r\n */\r\n ui.addInitialBlock = function(){\r\n\r\n var initialBlockType = codex.settings.initialBlockPlugin,\r\n initialBlock;\r\n\r\n if ( !codex.tools[initialBlockType] ){\r\n codex.core.log('Plugin %o was not implemented and can\\'t be used as initial block', 'warn', initialBlockType);\r\n return;\r\n }\r\n\r\n initialBlock = codex.tools[initialBlockType].render();\r\n\r\n initialBlock.setAttribute('data-placeholder', 'Write your story...');\r\n\r\n codex.content.insertBlock({\r\n type : initialBlockType,\r\n block : initialBlock\r\n });\r\n\r\n codex.content.workingNodeChanged(initialBlock);\r\n\r\n };\r\n\r\n ui.setInlineToolbarButtonBehaviour = function(button, type) {\r\n\r\n button.addEventListener('mousedown', function(event) {\r\n\r\n codex.toolbar.inline.toolClicked(event, type);\r\n\r\n }, false);\r\n };\r\n\r\n return ui;\r\n\r\n})({});\r\n\r\nmodule.exports = ui;\n\n\n// WEBPACK FOOTER //\n// ./modules/ui.js","/**\r\n *\r\n * Codex.Editor Transport Module\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\n\r\nvar transport = (function(transport){\r\n\r\n transport.input = null;\r\n\r\n /**\r\n * @property {Object} arguments - keep plugin settings and defined callbacks\r\n */\r\n transport.arguments = null;\r\n\r\n transport.prepare = function(){\r\n\r\n var input = document.createElement('INPUT');\r\n\r\n input.type = 'file';\r\n input.addEventListener('change', codex.transport.fileSelected);\r\n\r\n codex.transport.input = input;\r\n\r\n };\r\n\r\n /** Clear input when files is uploaded */\r\n transport.clearInput = function() {\r\n\r\n /** Remove old input */\r\n this.input = null;\r\n\r\n /** Prepare new one */\r\n this.prepare();\r\n };\r\n\r\n /**\r\n * Callback for file selection\r\n */\r\n transport.fileSelected = function(event){\r\n\r\n var input = this,\r\n files = input.files,\r\n filesLength = files.length,\r\n formdData = new FormData(),\r\n file,\r\n i;\r\n\r\n formdData.append('files', files[0], files[0].name);\r\n\r\n codex.transport.ajax({\r\n data : formdData,\r\n beforeSend : codex.transport.arguments.beforeSend,\r\n success : codex.transport.arguments.success,\r\n error : codex.transport.arguments.error\r\n });\r\n };\r\n\r\n /**\r\n * Use plugin callbacks\r\n * @protected\r\n */\r\n transport.selectAndUpload = function (args) {\r\n\r\n this.arguments = args;\r\n this.input.click();\r\n\r\n };\r\n\r\n /**\r\n * Ajax requests module\r\n */\r\n transport.ajax = function(params){\r\n\r\n var xhr = new XMLHttpRequest(),\r\n beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function(){},\r\n success = typeof params.success == 'function' ? params.success : function(){},\r\n error = typeof params.error == 'function' ? params.error : function(){};\r\n\r\n beforeSend();\r\n\r\n xhr.open('POST', codex.settings.uploadImagesUrl, true);\r\n\r\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n\r\n xhr.onload = function () {\r\n if (xhr.status === 200) {\r\n success(xhr.responseText);\r\n } else {\r\n console.log(\"request error: %o\", xhr);\r\n error();\r\n }\r\n };\r\n\r\n xhr.send(params.data);\r\n this.clearInput();\r\n\r\n };\r\n\r\n return transport;\r\n\r\n})({});\r\n\r\nmodule.exports = transport;\n\n\n// WEBPACK FOOTER //\n// ./modules/transport.js","/**\r\n * Codex Editor Renderer Module\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\n\r\nvar renderer = (function(renderer) {\r\n\r\n /**\r\n * Asyncronously parses input JSON to redactor blocks\r\n */\r\n renderer.makeBlocksFromData = function () {\r\n\r\n /**\r\n * If redactor is empty, add first paragraph to start writing\r\n */\r\n if (!codex.state.blocks.items.length) {\r\n\r\n codex.ui.addInitialBlock();\r\n return;\r\n\r\n }\r\n\r\n Promise.resolve()\r\n\r\n /** First, get JSON from state */\r\n .then(function() {\r\n return codex.state.blocks;\r\n })\r\n\r\n /** Then, start to iterate they */\r\n .then(codex.renderer.appendBlocks)\r\n\r\n /** Write log if something goes wrong */\r\n .catch(function(error) {\r\n codex.core.log('Error while parsing JSON: %o', 'error', error);\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Parses JSON to blocks\r\n * @param {object} data\r\n * @return Primise -> nodeList\r\n */\r\n renderer.appendBlocks = function (data) {\r\n\r\n var blocks = data.items;\r\n\r\n /**\r\n * Sequence of one-by-one blocks appending\r\n * Uses to save blocks order after async-handler\r\n */\r\n var nodeSequence = Promise.resolve();\r\n\r\n for (var index = 0; index < blocks.length ; index++ ) {\r\n\r\n /** Add node to sequence at specified index */\r\n codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index);\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Append node at specified index\r\n */\r\n renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) {\r\n\r\n /** We need to append node to sequence */\r\n nodeSequence\r\n\r\n /** first, get node async-aware */\r\n .then(function() {\r\n\r\n return codex.renderer.getNodeAsync(blocks , index);\r\n\r\n })\r\n\r\n /**\r\n * second, compose editor-block from JSON object\r\n */\r\n .then(codex.renderer.createBlockFromData)\r\n\r\n /**\r\n * now insert block to redactor\r\n */\r\n .then(function(blockData){\r\n\r\n /**\r\n * blockData has 'block', 'type' and 'stretched' information\r\n */\r\n codex.content.insertBlock(blockData);\r\n\r\n /** Pass created block to next step */\r\n return blockData.block;\r\n\r\n })\r\n\r\n /** Log if something wrong with node */\r\n .catch(function(error) {\r\n codex.core.log('Node skipped while parsing because %o', 'error', error);\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Asynchronously returns block data from blocksList by index\r\n * @return Promise to node\r\n */\r\n renderer.getNodeAsync = function (blocksList, index) {\r\n\r\n return Promise.resolve().then(function() {\r\n\r\n return blocksList[index];\r\n\r\n });\r\n };\r\n\r\n /**\r\n * Creates editor block by JSON-data\r\n *\r\n * @uses render method of each plugin\r\n *\r\n * @param {object} blockData looks like\r\n * { header : {\r\n * text: '',\r\n * type: 'H3', ...\r\n * }\r\n * }\r\n * @return {object} with type and Element\r\n */\r\n renderer.createBlockFromData = function (blockData) {\r\n\r\n /** New parser */\r\n var pluginName = blockData.type,\r\n cover = blockData.cover;\r\n\r\n /** Get first key of object that stores plugin name */\r\n // for (var pluginName in blockData) break;\r\n\r\n /** Check for plugin existance */\r\n if (!codex.tools[pluginName]) {\r\n throw Error(`Plugin «${pluginName}» not found`);\r\n }\r\n\r\n /** Check for plugin having render method */\r\n if (typeof codex.tools[pluginName].render != 'function') {\r\n\r\n throw Error(`Plugin «${pluginName}» must have «render» method`);\r\n }\r\n\r\n /** New Parser */\r\n var block = codex.tools[pluginName].render(blockData.data);\r\n\r\n /** is first-level block stretched */\r\n var stretched = codex.tools[pluginName].isStretched || false;\r\n\r\n /** Retrun type and block */\r\n return {\r\n type : pluginName,\r\n block : block,\r\n stretched : stretched,\r\n cover : cover\r\n };\r\n\r\n };\r\n\r\n return renderer;\r\n\r\n})({});\r\n\r\nmodule.exports = renderer;\n\n\n// WEBPACK FOOTER //\n// ./modules/renderer.js","/**\r\n * Codex Editor Saver\r\n *\r\n * @author Codex Team\r\n * @version 1.0.2\r\n */\r\n\r\nvar saver = (function(saver) {\r\n\r\n /**\r\n * Saves blocks\r\n * @private\r\n */\r\n saver.saveBlocks = function () {\r\n\r\n /** Save html content of redactor to memory */\r\n codex.state.html = codex.nodes.redactor.innerHTML;\r\n\r\n /** Empty jsonOutput state */\r\n codex.state.jsonOutput = [];\r\n\r\n Promise.resolve()\r\n\r\n .then(function() {\r\n return codex.nodes.redactor.childNodes;\r\n })\r\n /** Making a sequence from separate blocks */\r\n .then(codex.saver.makeQueue)\r\n\r\n .then(function() {\r\n // codex.nodes.textarea.innerHTML = codex.state.html;\r\n })\r\n\r\n .catch( function(error) {\r\n console.log('Something happend');\r\n });\r\n\r\n };\r\n\r\n saver.makeQueue = function(blocks) {\r\n\r\n var queue = Promise.resolve();\r\n\r\n for(var index = 0; index < blocks.length; index++) {\r\n\r\n /** Add node to sequence at specified index */\r\n codex.saver.getBlockData(queue, blocks, index);\r\n\r\n }\r\n\r\n };\r\n\r\n /** Gets every block and makes From Data */\r\n saver.getBlockData = function(queue, blocks, index) {\r\n\r\n queue.then(function() {\r\n return codex.saver.getNodeAsync(blocks, index);\r\n })\r\n\r\n .then(codex.saver.makeFormDataFromBlocks);\r\n\r\n };\r\n\r\n\r\n /**\r\n * Asynchronously returns block data from blocksList by index\r\n * @return Promise to node\r\n */\r\n saver.getNodeAsync = function (blocksList, index) {\r\n\r\n return Promise.resolve().then(function() {\r\n\r\n return blocksList[index];\r\n\r\n });\r\n };\r\n\r\n saver.makeFormDataFromBlocks = function(block) {\r\n\r\n var pluginName = block.dataset.tool;\r\n\r\n /** Check for plugin existance */\r\n if (!codex.tools[pluginName]) {\r\n throw Error(`Plugin «${pluginName}» not found`);\r\n }\r\n\r\n /** Check for plugin having render method */\r\n if (typeof codex.tools[pluginName].save != 'function') {\r\n\r\n throw Error(`Plugin «${pluginName}» must have save method`);\r\n }\r\n\r\n /** Result saver */\r\n var blockContent = block.childNodes[0],\r\n pluginsContent = blockContent.childNodes[0],\r\n savedData = codex.tools[pluginName].save(pluginsContent),\r\n output;\r\n\r\n\r\n output = {\r\n type: pluginName,\r\n data: savedData\r\n };\r\n\r\n /**\r\n * Do not allow empty initial plugins block\r\n */\r\n if (savedData.text.trim() == '' && pluginName == codex.settings.initialBlockPlugin)\r\n return;\r\n\r\n /** Marks Blocks that will be in main page */\r\n output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n\r\n codex.state.jsonOutput.push(output);\r\n };\r\n\r\n return saver;\r\n\r\n})({});\r\n\r\nmodule.exports = saver;\n\n\n// WEBPACK FOOTER //\n// ./modules/saver.js","/**\r\n * Codex Editor Content Module\r\n * Works with DOM\r\n *\r\n * @author Codex Team\r\n * @version 1.3.1\r\n */\r\n\r\nvar janitor = require('html-janitor');\r\n\r\n\r\n/**\r\n * Default settings for sane.\r\n * @uses html-janitor\r\n */\r\nvar Config = {\r\n\r\n tags: {\r\n p: {},\r\n a: {\r\n href: true,\r\n target: '_blank',\r\n rel: 'nofollow'\r\n },\r\n i: {},\r\n b: {},\r\n strong: {},\r\n em: {},\r\n span: {}\r\n }\r\n};\r\n\r\nvar content = (function(content) {\r\n\r\n /**\r\n * Links to current active block\r\n * @type {null | Element}\r\n */\r\n content.currentNode = null;\r\n\r\n /**\r\n * clicked in redactor area\r\n * @type {null | Boolean}\r\n */\r\n content.editorAreaHightlighted = null;\r\n\r\n /**\r\n * Synchronizes redactor with original textarea\r\n */\r\n content.sync = function () {\r\n\r\n codex.core.log('syncing...');\r\n\r\n /**\r\n * Save redactor content to codex.state\r\n */\r\n codex.state.html = codex.nodes.redactor.innerHTML;\r\n\r\n };\r\n\r\n /**\r\n * @deprecated\r\n */\r\n content.getNodeFocused = function() {\r\n\r\n var selection = window.getSelection(),\r\n focused;\r\n\r\n if (selection.anchorNode === null) {\r\n return null;\r\n }\r\n\r\n if ( selection.anchorNode.nodeType == codex.core.nodeTypes.TAG ) {\r\n focused = selection.anchorNode;\r\n } else {\r\n focused = selection.focusNode.parentElement;\r\n }\r\n\r\n if ( !codex.parser.isFirstLevelBlock(focused) ) {\r\n\r\n /** Iterate with parent nodes to find first-level*/\r\n var parent = focused.parentNode;\r\n\r\n while (parent && !codex.parser.isFirstLevelBlock(parent)){\r\n parent = parent.parentNode;\r\n }\r\n\r\n focused = parent;\r\n }\r\n\r\n if (focused != codex.nodes.redactor){\r\n return focused;\r\n }\r\n\r\n return null;\r\n\r\n };\r\n\r\n /**\r\n * Appends background to the block\r\n */\r\n content.markBlock = function() {\r\n\r\n codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED);\r\n };\r\n\r\n /**\r\n * Clear background\r\n */\r\n content.clearMark = function() {\r\n\r\n if (codex.content.currentNode) {\r\n codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Finds first-level block\r\n * @param {Element} node - selected or clicked in redactors area node\r\n */\r\n content.getFirstLevelBlock = function(node) {\r\n\r\n if (!codex.core.isDomNode(node)) {\r\n node = node.parentNode;\r\n }\r\n\r\n if (node === codex.nodes.redactor || node === document.body) {\r\n\r\n return null;\r\n\r\n } else {\r\n\r\n while(!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\r\n node = node.parentNode;\r\n }\r\n\r\n return node;\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Trigger this event when working node changed\r\n * @param {Element} targetNode - first-level of this node will be current\r\n * If targetNode is first-level then we set it as current else we look for parents to find first-level\r\n */\r\n content.workingNodeChanged = function (targetNode) {\r\n\r\n /** Clear background from previous marked block before we change */\r\n codex.content.clearMark();\r\n\r\n if (!targetNode) {\r\n return;\r\n }\r\n\r\n this.currentNode = this.getFirstLevelBlock(targetNode);\r\n\r\n };\r\n\r\n /**\r\n * Replaces one redactor block with another\r\n * @protected\r\n * @param {Element} targetBlock - block to replace. Mostly currentNode.\r\n * @param {Element} newBlock\r\n * @param {string} newBlockType - type of new block; we need to store it to data-attribute\r\n *\r\n * [!] Function does not saves old block content.\r\n * You can get it manually and pass with newBlock.innerHTML\r\n */\r\n content.replaceBlock = function function_name(targetBlock, newBlock) {\r\n\r\n if (!targetBlock || !newBlock){\r\n codex.core.log('replaceBlock: missed params');\r\n return;\r\n }\r\n\r\n /** If target-block is not a frist-level block, then we iterate parents to find it */\r\n while(!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) {\r\n targetBlock = targetBlock.parentNode;\r\n }\r\n\r\n /** Replacing */\r\n codex.nodes.redactor.replaceChild(newBlock, targetBlock);\r\n\r\n /**\r\n * Set new node as current\r\n */\r\n codex.content.workingNodeChanged(newBlock);\r\n\r\n /**\r\n * Add block handlers\r\n */\r\n codex.ui.addBlockHandlers(newBlock);\r\n\r\n /**\r\n * Save changes\r\n */\r\n codex.ui.saveInputs();\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Inserts new block to redactor\r\n * Wrapps block into a DIV with BLOCK_CLASSNAME class\r\n *\r\n * @param blockData {object}\r\n * @param blockData.block {Element} element with block content\r\n * @param blockData.type {string} block plugin\r\n * @param needPlaceCaret {bool} pass true to set caret in new block\r\n *\r\n */\r\n content.insertBlock = function( blockData, needPlaceCaret ) {\r\n\r\n var workingBlock = codex.content.currentNode,\r\n newBlockContent = blockData.block,\r\n blockType = blockData.type,\r\n cover = blockData.cover,\r\n isStretched = blockData.stretched;\r\n\r\n var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched);\r\n\r\n if (cover === true) {\r\n newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n }\r\n\r\n if (workingBlock) {\r\n\r\n codex.core.insertAfter(workingBlock, newBlock);\r\n\r\n } else {\r\n /**\r\n * If redactor is empty, append as first child\r\n */\r\n codex.nodes.redactor.appendChild(newBlock);\r\n\r\n }\r\n\r\n /**\r\n * Block handler\r\n */\r\n codex.ui.addBlockHandlers(newBlock);\r\n\r\n /**\r\n * Set new node as current\r\n */\r\n codex.content.workingNodeChanged(newBlock);\r\n\r\n /**\r\n * Save changes\r\n */\r\n codex.ui.saveInputs();\r\n\r\n\r\n if ( needPlaceCaret ) {\r\n\r\n /**\r\n * If we don't know input index then we set default value -1\r\n */\r\n var currentInputIndex = codex.caret.getCurrentInputIndex() || -1;\r\n\r\n\r\n if (currentInputIndex == -1) {\r\n\r\n\r\n var editableElement = newBlock.querySelector('[contenteditable]'),\r\n emptyText = document.createTextNode('');\r\n\r\n editableElement.appendChild(emptyText);\r\n codex.caret.set(editableElement, 0, 0);\r\n\r\n codex.toolbar.move();\r\n codex.toolbar.showPlusButton();\r\n\r\n\r\n } else {\r\n\r\n if (currentInputIndex === codex.state.inputs.length - 1)\r\n return;\r\n\r\n /** Timeout for browsers execution */\r\n setTimeout(function () {\r\n\r\n /** Setting to the new input */\r\n codex.caret.setToNextBlock(currentInputIndex);\r\n codex.toolbar.move();\r\n codex.toolbar.open();\r\n\r\n }, 10);\r\n\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Block is inserted, wait for new click that defined focusing on editors area\r\n * @type {boolean}\r\n */\r\n content.editorAreaHightlighted = false;\r\n\r\n };\r\n\r\n /**\r\n * Replaces blocks with saving content\r\n * @protected\r\n * @param {Element} noteToReplace\r\n * @param {Element} newNode\r\n * @param {Element} blockType\r\n */\r\n content.switchBlock = function(blockToReplace, newBlock, tool){\r\n\r\n var newBlockComposed = codex.content.composeNewBlock(newBlock, tool);\r\n\r\n /** Replacing */\r\n codex.content.replaceBlock(blockToReplace, newBlockComposed);\r\n\r\n /** Save new Inputs when block is changed */\r\n codex.ui.saveInputs();\r\n };\r\n\r\n /**\r\n * Iterates between child noted and looking for #text node on deepest level\r\n * @private\r\n * @param {Element} block - node where find\r\n * @param {int} postiton - starting postion\r\n * Example: childNodex.length to find from the end\r\n * or 0 to find from the start\r\n * @return {Text} block\r\n * @uses DFS\r\n */\r\n content.getDeepestTextNodeFromPosition = function (block, position) {\r\n\r\n /**\r\n * Clear Block from empty and useless spaces with trim.\r\n * Such nodes we should remove\r\n */\r\n var blockChilds = block.childNodes,\r\n index,\r\n node,\r\n text;\r\n\r\n for(index = 0; index < blockChilds.length; index++)\r\n {\r\n node = blockChilds[index];\r\n\r\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\r\n\r\n text = node.textContent.trim();\r\n\r\n /** Text is empty. We should remove this child from node before we start DFS\r\n * decrease the quantity of childs.\r\n */\r\n if (text === '') {\r\n\r\n block.removeChild(node);\r\n position--;\r\n }\r\n }\r\n }\r\n\r\n if (block.childNodes.length === 0) {\r\n return document.createTextNode('');\r\n }\r\n\r\n /** Setting default position when we deleted all empty nodes */\r\n if ( position < 0 )\r\n position = 1;\r\n\r\n var looking_from_start = false;\r\n\r\n /** For looking from START */\r\n if (position === 0) {\r\n looking_from_start = true;\r\n position = 1;\r\n }\r\n\r\n while ( position ) {\r\n\r\n /** initial verticle of node. */\r\n if ( looking_from_start ) {\r\n block = block.childNodes[0];\r\n } else {\r\n block = block.childNodes[position - 1];\r\n }\r\n\r\n if ( block.nodeType == codex.core.nodeTypes.TAG ){\r\n\r\n position = block.childNodes.length;\r\n\r\n } else if (block.nodeType == codex.core.nodeTypes.TEXT ){\r\n\r\n position = 0;\r\n }\r\n\r\n }\r\n\r\n return block;\r\n };\r\n\r\n /**\r\n * @private\r\n */\r\n content.composeNewBlock = function (block, tool, isStretched) {\r\n\r\n var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}),\r\n blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {});\r\n\r\n blockContent.appendChild(block);\r\n newBlock.appendChild(blockContent);\r\n\r\n if (isStretched) {\r\n blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED);\r\n }\r\n\r\n newBlock.dataset.tool = tool;\r\n return newBlock;\r\n };\r\n\r\n /**\r\n * Returns Range object of current selection\r\n */\r\n content.getRange = function() {\r\n\r\n var selection = window.getSelection().getRangeAt(0);\r\n\r\n return selection;\r\n };\r\n\r\n /**\r\n * Divides block in two blocks (after and before caret)\r\n * @private\r\n * @param {Int} inputIndex - target input index\r\n */\r\n content.splitBlock = function(inputIndex) {\r\n\r\n var selection = window.getSelection(),\r\n anchorNode = selection.anchorNode,\r\n anchorNodeText = anchorNode.textContent,\r\n caretOffset = selection.anchorOffset,\r\n textBeforeCaret,\r\n textNodeBeforeCaret,\r\n textAfterCaret,\r\n textNodeAfterCaret;\r\n\r\n var currentBlock = codex.content.currentNode.querySelector('[contentEditable]');\r\n\r\n\r\n textBeforeCaret = anchorNodeText.substring(0, caretOffset);\r\n textAfterCaret = anchorNodeText.substring(caretOffset);\r\n\r\n textNodeBeforeCaret = document.createTextNode(textBeforeCaret);\r\n\r\n if (textAfterCaret) {\r\n textNodeAfterCaret = document.createTextNode(textAfterCaret);\r\n }\r\n\r\n var previousChilds = [],\r\n nextChilds = [],\r\n reachedCurrent = false;\r\n\r\n if (textNodeAfterCaret) {\r\n nextChilds.push(textNodeAfterCaret);\r\n }\r\n\r\n for ( var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) {\r\n\r\n if ( child != anchorNode ) {\r\n if ( !reachedCurrent ){\r\n previousChilds.push(child);\r\n } else {\r\n nextChilds.push(child);\r\n }\r\n } else {\r\n reachedCurrent = true;\r\n }\r\n\r\n }\r\n\r\n /** Clear current input */\r\n codex.state.inputs[inputIndex].innerHTML = '';\r\n\r\n /**\r\n * Append all childs founded before anchorNode\r\n */\r\n var previousChildsLength = previousChilds.length;\r\n\r\n for(i = 0; i < previousChildsLength; i++) {\r\n codex.state.inputs[inputIndex].appendChild(previousChilds[i]);\r\n }\r\n\r\n codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret);\r\n\r\n /**\r\n * Append text node which is after caret\r\n */\r\n var nextChildsLength = nextChilds.length,\r\n newNode = document.createElement('div');\r\n\r\n for(i = 0; i < nextChildsLength; i++) {\r\n newNode.appendChild(nextChilds[i]);\r\n }\r\n\r\n newNode = newNode.innerHTML;\r\n\r\n /** This type of block creates when enter is pressed */\r\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\r\n\r\n /**\r\n * Make new paragraph with text after caret\r\n */\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render({\r\n text : newNode\r\n })\r\n }, true );\r\n\r\n };\r\n\r\n /**\r\n * Merges two blocks — current and target\r\n * If target index is not exist, then previous will be as target\r\n */\r\n content.mergeBlocks = function(currentInputIndex, targetInputIndex) {\r\n\r\n /** If current input index is zero, then prevent method execution */\r\n if (currentInputIndex === 0) {\r\n return;\r\n }\r\n\r\n var targetInput,\r\n currentInputContent = codex.state.inputs[currentInputIndex].innerHTML;\r\n\r\n if (!targetInputIndex) {\r\n\r\n targetInput = codex.state.inputs[currentInputIndex - 1];\r\n\r\n } else {\r\n\r\n targetInput = codex.state.inputs[targetInputIndex];\r\n\r\n }\r\n\r\n targetInput.innerHTML += currentInputContent;\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Callback for HTML Mutations\r\n * @param {Array} mutation - Mutation Record\r\n */\r\n content.paste = function(mutation) {\r\n\r\n var workingNode = codex.content.currentNode,\r\n tool = workingNode.dataset.tool;\r\n\r\n if (codex.tools[tool].allowedToPaste) {\r\n codex.content.sanitize.call(this, mutation.addedNodes);\r\n } else {\r\n codex.content.pasteTextContent(mutation.addedNodes);\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * gets only text/plain content of node\r\n * @param {Element} target - HTML node\r\n */\r\n content.pasteTextContent = function(nodes) {\r\n\r\n var node = nodes[0],\r\n textNode;\r\n\r\n if (!node) {\r\n return;\r\n }\r\n\r\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\r\n textNode = document.createTextNode(node);\r\n } else {\r\n textNode = document.createTextNode(node.textContent);\r\n }\r\n\r\n if (codex.core.isDomNode(node)) {\r\n node.parentNode.replaceChild(textNode, node);\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Sanitizes HTML content\r\n * @param {Element} target - inserted element\r\n * @uses Sanitize library html-janitor\r\n */\r\n content.sanitize = function(target) {\r\n\r\n if (!target) {\r\n return;\r\n }\r\n\r\n var node = target[0];\r\n\r\n if (!node) {\r\n return;\r\n }\r\n\r\n /**\r\n * Disconnect Observer\r\n * hierarchy of function calls inherits context of observer\r\n */\r\n this.disconnect();\r\n\r\n /**\r\n * Don't sanitize text node\r\n */\r\n if (node.nodeType == codex.core.nodeTypes.TEXT) {\r\n return;\r\n }\r\n\r\n /**\r\n * Clear dirty content\r\n */\r\n var sanitizer = new janitor(Config),\r\n clear = sanitizer.clean(node.outerHTML);\r\n\r\n var div = codex.draw.node('DIV', [], { innerHTML: clear });\r\n node.replaceWith(div.childNodes[0]);\r\n\r\n // for (i = 0; i < clearHTML.childNodes.length; i++) {\r\n //\r\n // var tag = clearHTML.childNodes[i],\r\n // blockType = null;\r\n //\r\n // for (tool in codex.tools) {\r\n //\r\n // var handleTags = codex.tools[tool].handleTagOnPaste;\r\n //\r\n // if (!handleTags) {\r\n // continue;\r\n // }\r\n //\r\n // if (handleTags.indexOf(tag.tagName) !== -1) {\r\n // blockType = codex.tools[tool];\r\n // break;\r\n // }\r\n //\r\n // }\r\n //\r\n // if (blockType) {\r\n // codex.parser.insertPastedContent(blockType, tag);\r\n // }\r\n //\r\n // }\r\n\r\n };\r\n\r\n return content;\r\n\r\n})({});\r\n\r\nmodule.exports = content;\n\n\n// WEBPACK FOOTER //\n// ./modules/content.js","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('html-janitor', factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.HTMLJanitor = factory();\n }\n}(this, function () {\n\n /**\n * @param {Object} config.tags Dictionary of allowed tags.\n * @param {boolean} config.keepNestedBlockElements Default false.\n */\n function HTMLJanitor(config) {\n\n var tagDefinitions = config['tags'];\n var tags = Object.keys(tagDefinitions);\n\n var validConfigValues = tags\n .map(function(k) { return typeof tagDefinitions[k]; })\n .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });\n\n if(!validConfigValues) {\n throw new Error(\"The configuration was invalid\");\n }\n\n this.config = config;\n }\n\n // TODO: not exhaustive?\n var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];\n function isBlockElement(node) {\n return blockElementNames.indexOf(node.nodeName) !== -1;\n }\n\n var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];\n function isInlineElement(node) {\n return inlineElementNames.indexOf(node.nodeName) !== -1;\n }\n\n HTMLJanitor.prototype.clean = function (html) {\n var sandbox = document.createElement('div');\n sandbox.innerHTML = html;\n\n this._sanitize(sandbox);\n\n return sandbox.innerHTML;\n };\n\n HTMLJanitor.prototype._sanitize = function (parentNode) {\n var treeWalker = createTreeWalker(parentNode);\n var node = treeWalker.firstChild();\n if (!node) { return; }\n\n do {\n // Ignore nodes that have already been sanitized\n if (node._sanitized) {\n continue;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // If this text node is just whitespace and the previous or next element\n // sibling is a block element, remove it\n // N.B.: This heuristic could change. Very specific to a bug with\n // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output\n // FIXME: make this an option?\n if (node.data.trim() === ''\n && ((node.previousElementSibling && isBlockElement(node.previousElementSibling))\n || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n } else {\n continue;\n }\n }\n\n // Remove all comments\n if (node.nodeType === Node.COMMENT_NODE) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n }\n\n var isInline = isInlineElement(node);\n var containsBlockElement;\n if (isInline) {\n containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);\n }\n\n // Block elements should not be nested (e.g.

  • ...); if\n // they are, we want to unwrap the inner block element.\n var isNotTopContainer = !! parentNode.parentNode;\n var isNestedBlockElement =\n isBlockElement(parentNode) &&\n isBlockElement(node) &&\n isNotTopContainer;\n\n var nodeName = node.nodeName.toLowerCase();\n\n var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);\n\n var isInvalid = isInline && containsBlockElement;\n\n // Drop tag entirely according to the whitelist *and* if the markup\n // is invalid.\n if (isInvalid || shouldRejectNode(node, allowedAttrs)\n || (!this.config.keepNestedBlockElements && isNestedBlockElement)) {\n // Do not keep the inner text of SCRIPT/STYLE elements.\n if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {\n while (node.childNodes.length > 0) {\n parentNode.insertBefore(node.childNodes[0], node);\n }\n }\n parentNode.removeChild(node);\n\n this._sanitize(parentNode);\n break;\n }\n\n // Sanitize attributes\n for (var a = 0; a < node.attributes.length; a += 1) {\n var attr = node.attributes[a];\n\n if (shouldRejectAttr(attr, allowedAttrs, node)) {\n node.removeAttribute(attr.name);\n // Shift the array to continue looping.\n a = a - 1;\n }\n }\n\n // Sanitize children\n this._sanitize(node);\n\n // Mark node as sanitized so it's ignored in future runs\n node._sanitized = true;\n } while ((node = treeWalker.nextSibling()));\n };\n\n function createTreeWalker(node) {\n return document.createTreeWalker(node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,\n null, false);\n }\n\n function getAllowedAttrs(config, nodeName, node){\n if (typeof config.tags[nodeName] === 'function') {\n return config.tags[nodeName](node);\n } else {\n return config.tags[nodeName];\n }\n }\n\n function shouldRejectNode(node, allowedAttrs){\n if (typeof allowedAttrs === 'undefined') {\n return true;\n } else if (typeof allowedAttrs === 'boolean') {\n return !allowedAttrs;\n }\n\n return false;\n }\n\n function shouldRejectAttr(attr, allowedAttrs, node){\n var attrName = attr.name.toLowerCase();\n\n if (allowedAttrs === true){\n return false;\n } else if (typeof allowedAttrs[attrName] === 'function'){\n return !allowedAttrs[attrName](attr.value, node);\n } else if (typeof allowedAttrs[attrName] === 'undefined'){\n return true;\n } else if (allowedAttrs[attrName] === false) {\n return true;\n } else if (typeof allowedAttrs[attrName] === 'string') {\n return (allowedAttrs[attrName] !== attr.value);\n }\n\n return false;\n }\n\n return HTMLJanitor;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/html-janitor/src/html-janitor.js\n// module id = 8\n// module chunks = 0","/**\r\n * Codex Editor toolbar module\r\n *\r\n * Contains:\r\n * - Inline toolbox\r\n * - Toolbox within plus button\r\n * - Settings section\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\nvar toolbar = (function(toolbar) {\r\n\r\n toolbar.init = function() {\r\n toolbar.settings = require('./settings');\r\n toolbar.inline = require('./inline');\r\n toolbar.toolbox = require('./toolbox');\r\n };\r\n\r\n /**\r\n * Margin between focused node and toolbar\r\n */\r\n toolbar.defaultToolbarHeight = 49;\r\n\r\n toolbar.defaultOffset = 34;\r\n\r\n toolbar.opened = false;\r\n\r\n toolbar.current = null;\r\n\r\n /**\r\n * @protected\r\n */\r\n toolbar.open = function (){\r\n\r\n codex.nodes.toolbar.classList.add('opened');\r\n this.opened = true;\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n */\r\n toolbar.close = function(){\r\n\r\n codex.nodes.toolbar.classList.remove('opened');\r\n\r\n toolbar.opened = false;\r\n toolbar.current = null;\r\n\r\n for (var button in codex.nodes.toolbarButtons){\r\n codex.nodes.toolbarButtons[button].classList.remove('selected');\r\n }\r\n\r\n /** Close toolbox when toolbar is not displayed */\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.close();\r\n\r\n };\r\n\r\n toolbar.toggle = function(){\r\n\r\n if ( !this.opened ){\r\n\r\n this.open();\r\n\r\n } else {\r\n\r\n this.close();\r\n\r\n }\r\n\r\n };\r\n\r\n toolbar.hidePlusButton = function() {\r\n codex.nodes.plusButton.classList.add('hide');\r\n };\r\n\r\n toolbar.showPlusButton = function() {\r\n codex.nodes.plusButton.classList.remove('hide');\r\n };\r\n\r\n /**\r\n * Moving toolbar to the specified node\r\n */\r\n toolbar.move = function() {\r\n\r\n /** Close Toolbox when we move toolbar */\r\n codex.toolbar.toolbox.close();\r\n\r\n if (!codex.content.currentNode) {\r\n return;\r\n }\r\n\r\n var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight,\r\n newYCoordinate = codex.content.currentNode.offsetTop - (codex.toolbar.defaultToolbarHeight / 2) + codex.toolbar.defaultOffset;\r\n\r\n codex.nodes.toolbar.style.transform = `translate3D(0, ${Math.floor(newYCoordinate)}px, 0)`;\r\n\r\n /** Close trash actions */\r\n codex.toolbar.settings.hideRemoveActions();\r\n\r\n };\r\n\r\n return toolbar;\r\n\r\n})({});\r\n\r\ntoolbar.init();\r\n\r\nmodule.exports = toolbar;\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbar.js","var settings = (function(settings) {\r\n\r\n settings.init = function() {\r\n require('../content');\r\n };\r\n\r\n settings.opened = false;\r\n\r\n settings.setting = null;\r\n settings.actions = null;\r\n\r\n settings.cover = null;\r\n\r\n /**\r\n * Append and open settings\r\n */\r\n settings.open = function(toolType){\r\n\r\n /**\r\n * Append settings content\r\n * It's stored in tool.settings\r\n */\r\n if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings) ) {\r\n\r\n codex.core.log(`Plugin «${toolType}» has no settings`, 'warn');\r\n // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`;\r\n\r\n } else {\r\n\r\n codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings);\r\n\r\n }\r\n\r\n var currentBlock = codex.content.currentNode;\r\n\r\n /** Open settings block */\r\n codex.nodes.blockSettings.classList.add('opened');\r\n codex.toolbar.settings.addDefaultSettings();\r\n this.opened = true;\r\n };\r\n\r\n /**\r\n * Close and clear settings\r\n */\r\n settings.close = function(){\r\n\r\n codex.nodes.blockSettings.classList.remove('opened');\r\n codex.nodes.pluginSettings.innerHTML = '';\r\n\r\n this.opened = false;\r\n\r\n };\r\n\r\n /**\r\n * @param {string} toolType - plugin type\r\n */\r\n settings.toggle = function( toolType ){\r\n\r\n if ( !this.opened ){\r\n\r\n this.open(toolType);\r\n\r\n } else {\r\n\r\n this.close();\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * This function adds default core settings\r\n */\r\n settings.addDefaultSettings = function() {\r\n\r\n /** list of default settings */\r\n var feedModeToggler;\r\n\r\n /** Clear block and append initialized settings */\r\n codex.nodes.defaultSettings.innerHTML = '';\r\n\r\n\r\n /** Init all default setting buttons */\r\n feedModeToggler = codex.toolbar.settings.makeFeedModeToggler();\r\n\r\n /**\r\n * Fill defaultSettings\r\n */\r\n\r\n /**\r\n * Button that enables/disables Feed-mode\r\n * Feed-mode means that block will be showed in articles-feed like cover\r\n */\r\n codex.nodes.defaultSettings.appendChild(feedModeToggler);\r\n\r\n };\r\n\r\n /**\r\n * Cover setting.\r\n * This tune highlights block, so that it may be used for showing target block on main page\r\n * Draw different setting when block is marked for main page\r\n * If TRUE, then we show button that removes this selection\r\n * Also defined setting \"Click\" events will be listened and have separate callbacks\r\n *\r\n * @return {Element} node/button that we place in default settings block\r\n */\r\n settings.makeFeedModeToggler = function() {\r\n\r\n var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(),\r\n setting,\r\n data;\r\n\r\n if (!isFeedModeActivated) {\r\n\r\n data = {\r\n innerHTML : 'Вывести в ленте'\r\n };\r\n\r\n } else {\r\n\r\n data = {\r\n innerHTML : 'Не выводить в ленте'\r\n };\r\n\r\n }\r\n\r\n setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data);\r\n setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false);\r\n\r\n return setting;\r\n };\r\n\r\n /**\r\n * Updates Feed-mode\r\n */\r\n settings.updateFeedMode = function() {\r\n\r\n var currentNode = codex.content.currentNode;\r\n\r\n currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n\r\n codex.toolbar.settings.close();\r\n };\r\n\r\n settings.isFeedModeActivated = function() {\r\n\r\n var currentBlock = codex.content.currentNode;\r\n\r\n if (currentBlock) {\r\n return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE);\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n /**\r\n * Here we will draw buttons and add listeners to components\r\n */\r\n settings.makeRemoveBlockButton = function() {\r\n\r\n var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}),\r\n settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML : '' }),\r\n actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}),\r\n confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent : 'Удалить блок' }),\r\n cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent : 'Отменить удаление' });\r\n\r\n settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false);\r\n\r\n confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false);\r\n\r\n cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false);\r\n\r\n actionWrapper.appendChild(confirmAction);\r\n actionWrapper.appendChild(cancelAction);\r\n\r\n removeBlockWrapper.appendChild(settingButton);\r\n removeBlockWrapper.appendChild(actionWrapper);\r\n\r\n /** Save setting */\r\n codex.toolbar.settings.setting = settingButton;\r\n codex.toolbar.settings.actions = actionWrapper;\r\n\r\n return removeBlockWrapper;\r\n\r\n };\r\n\r\n settings.removeButtonClicked = function() {\r\n\r\n var action = codex.toolbar.settings.actions;\r\n\r\n if (action.classList.contains('opened')) {\r\n codex.toolbar.settings.hideRemoveActions();\r\n } else {\r\n codex.toolbar.settings.showRemoveActions();\r\n }\r\n\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.close();\r\n\r\n };\r\n\r\n settings.cancelRemovingRequest = function() {\r\n\r\n codex.toolbar.settings.actions.classList.remove('opened');\r\n };\r\n\r\n settings.confirmRemovingRequest = function() {\r\n\r\n var currentBlock = codex.content.currentNode,\r\n firstLevelBlocksCount;\r\n\r\n currentBlock.remove();\r\n\r\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\r\n\r\n /**\r\n * If all blocks are removed\r\n */\r\n if (firstLevelBlocksCount === 0) {\r\n\r\n /** update currentNode variable */\r\n codex.content.currentNode = null;\r\n\r\n /** Inserting new empty initial block */\r\n codex.ui.addInitialBlock();\r\n }\r\n\r\n codex.ui.saveInputs();\r\n\r\n codex.toolbar.close();\r\n };\r\n\r\n settings.showRemoveActions = function() {\r\n codex.toolbar.settings.actions.classList.add('opened');\r\n };\r\n\r\n settings.hideRemoveActions = function() {\r\n codex.toolbar.settings.actions.classList.remove('opened');\r\n };\r\n\r\n return settings;\r\n\r\n})({});\r\n\r\nsettings.init();\r\n\r\nmodule.exports = settings;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/settings.js","/**\r\n * Inline toolbar\r\n *\r\n * Contains from tools:\r\n * Bold, Italic, Underline and Anchor\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\nvar inline = (function(inline) {\r\n\r\n inline.init = function() {\r\n\r\n };\r\n\r\n inline.buttonsOpened = null;\r\n inline.actionsOpened = null;\r\n inline.wrappersOffset = null;\r\n\r\n /**\r\n * saving selection that need for execCommand for styling\r\n *\r\n */\r\n inline.storedSelection = null;\r\n\r\n /**\r\n * @protected\r\n *\r\n * Open inline toobar\r\n */\r\n inline.show = function() {\r\n\r\n var currentNode = codex.content.currentNode,\r\n tool = currentNode.dataset.tool,\r\n plugin;\r\n\r\n /**\r\n * tool allowed to open inline toolbar\r\n */\r\n plugin = codex.tools[tool];\r\n\r\n if (!plugin.showInlineToolbar)\r\n return;\r\n\r\n var selectedText = this.getSelectionText(),\r\n toolbar = codex.nodes.inlineToolbar.wrapper,\r\n buttons = codex.nodes.inlineToolbar.buttons;\r\n\r\n if (selectedText.length > 0) {\r\n\r\n /** Move toolbar and open */\r\n codex.toolbar.inline.move();\r\n\r\n /** Open inline toolbar */\r\n toolbar.classList.add('opened');\r\n\r\n /** show buttons of inline toolbar */\r\n codex.toolbar.inline.showButtons();\r\n }\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Closes inline toolbar\r\n */\r\n inline.close = function() {\r\n var toolbar = codex.nodes.inlineToolbar.wrapper;\r\n toolbar.classList.remove('opened');\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Moving toolbar\r\n */\r\n inline.move = function() {\r\n\r\n if (!this.wrappersOffset) {\r\n this.wrappersOffset = this.getWrappersOffset();\r\n }\r\n\r\n var coords = this.getSelectionCoords(),\r\n defaultOffset = 0,\r\n toolbar = codex.nodes.inlineToolbar.wrapper,\r\n newCoordinateX,\r\n newCoordinateY;\r\n\r\n if (toolbar.offsetHeight === 0) {\r\n defaultOffset = 40;\r\n }\r\n\r\n newCoordinateX = coords.x - this.wrappersOffset.left;\r\n newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight;\r\n\r\n toolbar.style.transform = `translate3D(${Math.floor(newCoordinateX)}px, ${Math.floor(newCoordinateY)}px, 0)`;\r\n\r\n /** Close everything */\r\n codex.toolbar.inline.closeButtons();\r\n codex.toolbar.inline.closeAction();\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Tool Clicked\r\n */\r\n\r\n inline.toolClicked = function(event, type) {\r\n\r\n /**\r\n * For simple tools we use default browser function\r\n * For more complicated tools, we should write our own behavior\r\n */\r\n switch (type) {\r\n case 'createLink' : codex.toolbar.inline.createLinkAction(event, type); break;\r\n default : codex.toolbar.inline.defaultToolAction(type); break;\r\n }\r\n\r\n /**\r\n * highlight buttons\r\n * after making some action\r\n */\r\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Saving wrappers offset in DOM\r\n */\r\n inline.getWrappersOffset = function() {\r\n\r\n var wrapper = codex.nodes.wrapper,\r\n offset = this.getOffset(wrapper);\r\n\r\n this.wrappersOffset = offset;\r\n return offset;\r\n\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Calculates offset of DOM element\r\n *\r\n * @param el\r\n * @returns {{top: number, left: number}}\r\n */\r\n inline.getOffset = function ( el ) {\r\n\r\n var _x = 0;\r\n var _y = 0;\r\n\r\n while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {\r\n _x += (el.offsetLeft + el.clientLeft);\r\n _y += (el.offsetTop + el.clientTop);\r\n el = el.offsetParent;\r\n }\r\n return { top: _y, left: _x };\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Calculates position of selected text\r\n * @returns {{x: number, y: number}}\r\n */\r\n inline.getSelectionCoords = function() {\r\n\r\n var sel = document.selection, range;\r\n var x = 0, y = 0;\r\n\r\n if (sel) {\r\n\r\n if (sel.type != \"Control\") {\r\n range = sel.createRange();\r\n range.collapse(true);\r\n x = range.boundingLeft;\r\n y = range.boundingTop;\r\n }\r\n\r\n } else if (window.getSelection) {\r\n\r\n sel = window.getSelection();\r\n\r\n if (sel.rangeCount) {\r\n\r\n range = sel.getRangeAt(0).cloneRange();\r\n if (range.getClientRects) {\r\n range.collapse(true);\r\n var rect = range.getClientRects()[0];\r\n\r\n if (!rect) {\r\n return;\r\n }\r\n\r\n x = rect.left;\r\n y = rect.top;\r\n }\r\n\r\n }\r\n }\r\n return { x: x, y: y };\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Returns selected text as String\r\n * @returns {string}\r\n */\r\n inline.getSelectionText = function getSelectionText(){\r\n\r\n var selectedText = \"\";\r\n\r\n if (window.getSelection){ // all modern browsers and IE9+\r\n selectedText = window.getSelection().toString();\r\n }\r\n\r\n return selectedText;\r\n };\r\n\r\n /** Opens buttons block */\r\n inline.showButtons = function() {\r\n\r\n var buttons = codex.nodes.inlineToolbar.buttons;\r\n buttons.classList.add('opened');\r\n\r\n codex.toolbar.inline.buttonsOpened = true;\r\n\r\n /** highlight buttons */\r\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight);\r\n\r\n };\r\n\r\n /** Makes buttons disappear */\r\n inline.closeButtons = function() {\r\n var buttons = codex.nodes.inlineToolbar.buttons;\r\n buttons.classList.remove('opened');\r\n\r\n codex.toolbar.inline.buttonsOpened = false;\r\n };\r\n\r\n /** Open buttons defined action if exist */\r\n inline.showActions = function() {\r\n var action = codex.nodes.inlineToolbar.actions;\r\n action.classList.add('opened');\r\n\r\n codex.toolbar.inline.actionsOpened = true;\r\n };\r\n\r\n /** Close actions block */\r\n inline.closeAction = function() {\r\n var action = codex.nodes.inlineToolbar.actions;\r\n action.innerHTML = '';\r\n action.classList.remove('opened');\r\n codex.toolbar.inline.actionsOpened = false;\r\n };\r\n\r\n /** Action for link creation or for setting anchor */\r\n inline.createLinkAction = function(event, type) {\r\n\r\n var isActive = this.isLinkActive();\r\n\r\n var editable = codex.content.currentNode,\r\n storedSelection = codex.toolbar.inline.storedSelection;\r\n\r\n if (isActive) {\r\n\r\n var selection = window.getSelection(),\r\n anchorNode = selection.anchorNode;\r\n\r\n storedSelection = codex.toolbar.inline.saveSelection(editable);\r\n\r\n /**\r\n * Changing stored selection. if we want to remove anchor from word\r\n * we should remove anchor from whole word, not only selected part.\r\n * The solution is than we get the length of current link\r\n * Change start position to - end of selection minus length of anchor\r\n */\r\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\r\n\r\n codex.toolbar.inline.defaultToolAction('unlink');\r\n\r\n } else {\r\n\r\n /** Create input and close buttons */\r\n var action = codex.draw.inputForLink();\r\n codex.nodes.inlineToolbar.actions.appendChild(action);\r\n\r\n codex.toolbar.inline.closeButtons();\r\n codex.toolbar.inline.showActions();\r\n\r\n storedSelection = codex.toolbar.inline.saveSelection(editable);\r\n\r\n /**\r\n * focus to input\r\n * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus\r\n * Prevents event after showing input and when we need to focus an input which is in unexisted form\r\n */\r\n action.focus();\r\n event.preventDefault();\r\n\r\n /** Callback to link action */\r\n action.addEventListener('keydown', function(event){\r\n\r\n if (event.keyCode == codex.core.keys.ENTER) {\r\n\r\n codex.toolbar.inline.restoreSelection(editable, storedSelection);\r\n codex.toolbar.inline.setAnchor(action.value);\r\n\r\n /**\r\n * Preventing events that will be able to happen\r\n */\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n\r\n codex.toolbar.inline.clearRange();\r\n }\r\n\r\n }, false);\r\n }\r\n };\r\n\r\n inline.isLinkActive = function() {\r\n\r\n var isActive = false;\r\n\r\n codex.nodes.inlineToolbar.buttons.childNodes.forEach(function(tool) {\r\n var dataType = tool.dataset.type;\r\n\r\n if (dataType == 'link' && tool.classList.contains('hightlighted')) {\r\n isActive = true;\r\n }\r\n });\r\n\r\n return isActive;\r\n };\r\n\r\n /** default action behavior of tool */\r\n inline.defaultToolAction = function(type) {\r\n document.execCommand(type, false, null);\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Sets URL\r\n *\r\n * @param {String} url - URL\r\n */\r\n inline.setAnchor = function(url) {\r\n\r\n document.execCommand('createLink', false, url);\r\n\r\n /** Close after URL inserting */\r\n codex.toolbar.inline.closeAction();\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Saves selection\r\n */\r\n inline.saveSelection = function(containerEl) {\r\n\r\n var range = window.getSelection().getRangeAt(0),\r\n preSelectionRange = range.cloneRange(),\r\n start;\r\n\r\n preSelectionRange.selectNodeContents(containerEl);\r\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\r\n\r\n start = preSelectionRange.toString().length;\r\n\r\n return {\r\n start: start,\r\n end: start + range.toString().length\r\n };\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Sets to previous selection (Range)\r\n *\r\n * @param {Element} containerEl - editable element where we restore range\r\n * @param {Object} savedSel - range basic information to restore\r\n */\r\n inline.restoreSelection = function(containerEl, savedSel) {\r\n\r\n var range = document.createRange(),\r\n charIndex = 0;\r\n\r\n range.setStart(containerEl, 0);\r\n range.collapse(true);\r\n\r\n var nodeStack = [containerEl],\r\n node,\r\n foundStart = false,\r\n stop = false,\r\n nextCharIndex;\r\n\r\n while (!stop && (node = nodeStack.pop())) {\r\n\r\n if (node.nodeType == 3) {\r\n\r\n nextCharIndex = charIndex + node.length;\r\n\r\n if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {\r\n range.setStart(node, savedSel.start - charIndex);\r\n foundStart = true;\r\n }\r\n if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {\r\n range.setEnd(node, savedSel.end - charIndex);\r\n stop = true;\r\n }\r\n charIndex = nextCharIndex;\r\n } else {\r\n var i = node.childNodes.length;\r\n while (i--) {\r\n nodeStack.push(node.childNodes[i]);\r\n }\r\n }\r\n }\r\n\r\n var sel = window.getSelection();\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Removes all ranges from window selection\r\n */\r\n inline.clearRange = function() {\r\n var selection = window.getSelection();\r\n selection.removeAllRanges();\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * sets or removes hightlight\r\n */\r\n inline.hightlight = function(tool) {\r\n var dataType = tool.dataset.type;\r\n\r\n if (document.queryCommandState(dataType)) {\r\n codex.toolbar.inline.setButtonHighlighted(tool);\r\n } else {\r\n codex.toolbar.inline.removeButtonsHighLight(tool);\r\n }\r\n\r\n /**\r\n *\r\n * hightlight for anchors\r\n */\r\n var selection = window.getSelection(),\r\n tag = selection.anchorNode.parentNode;\r\n\r\n if (tag.tagName == 'A' && dataType == 'link') {\r\n codex.toolbar.inline.setButtonHighlighted(tool);\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Mark button if text is already executed\r\n */\r\n inline.setButtonHighlighted = function(button) {\r\n button.classList.add('hightlighted');\r\n\r\n /** At link tool we also change icon */\r\n if (button.dataset.type == 'link') {\r\n var icon = button.childNodes[0];\r\n icon.classList.remove('ce-icon-link');\r\n icon.classList.add('ce-icon-unlink');\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n *\r\n * Removes hightlight\r\n */\r\n inline.removeButtonsHighLight = function(button) {\r\n button.classList.remove('hightlighted');\r\n\r\n /** At link tool we also change icon */\r\n if (button.dataset.type == 'link') {\r\n var icon = button.childNodes[0];\r\n icon.classList.remove('ce-icon-unlink');\r\n icon.classList.add('ce-icon-link');\r\n }\r\n };\r\n\r\n\r\n return inline;\r\n})({});\r\n\r\ninline.init();\r\n\r\nmodule.exports = inline;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/inline.js","/**\r\n * Codex Editor toolbox\r\n *\r\n * All tools be able to appended here\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\n \r\nvar toolbox = (function(toolbox) {\r\n\r\n toolbox.init = function () {\r\n\r\n require('./toolbar');\r\n\r\n };\r\n\r\n toolbox.opened = false;\r\n\r\n /** Shows toolbox */\r\n toolbox.open = function() {\r\n\r\n /** Close setting if toolbox is opened */\r\n if (codex.toolbar.settings.opened) {\r\n\r\n codex.toolbar.settings.close();\r\n\r\n }\r\n\r\n /** display toolbox */\r\n codex.nodes.toolbox.classList.add('opened');\r\n\r\n /** Animate plus button */\r\n codex.nodes.plusButton.classList.add('clicked');\r\n\r\n /** toolbox state */\r\n codex.toolbar.toolbox.opened = true;\r\n\r\n };\r\n\r\n /** Closes toolbox */\r\n toolbox.close = function() {\r\n\r\n /** Makes toolbox disapear */\r\n codex.nodes.toolbox.classList.remove('opened');\r\n\r\n /** Rotate plus button */\r\n codex.nodes.plusButton.classList.remove('clicked');\r\n\r\n /** toolbox state */\r\n codex.toolbar.toolbox.opened = false;\r\n\r\n };\r\n\r\n toolbox.leaf = function(){\r\n\r\n var currentTool = codex.toolbar.current,\r\n tools = Object.keys(codex.tools),\r\n barButtons = codex.nodes.toolbarButtons,\r\n nextToolIndex,\r\n hiddenToolsAmount = 0,\r\n toolToSelect;\r\n\r\n /** Count toolbox hidden tools */\r\n for( var tool in codex.tools ) {\r\n\r\n if (!codex.tools[tool].displayInToolbox) {\r\n\r\n hiddenToolsAmount ++;\r\n\r\n }\r\n\r\n\r\n }\r\n\r\n if ( !currentTool ) {\r\n\r\n /** Get first tool from object*/\r\n for (toolToSelect in barButtons) break;\r\n\r\n } else {\r\n\r\n nextToolIndex = tools.indexOf(currentTool) + 1;\r\n\r\n var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2);\r\n\r\n if ( toolIsLastInToolbox ) {\r\n\r\n nextToolIndex = 0;\r\n\r\n /** getting first displayed tool */\r\n for( var tool in codex.tools ) {\r\n\r\n if (codex.tools[tool].displayInToolbox){\r\n\r\n break;\r\n\r\n }\r\n\r\n nextToolIndex ++;\r\n }\r\n\r\n }\r\n\r\n toolToSelect = tools[nextToolIndex];\r\n\r\n }\r\n\r\n for (var button in barButtons) barButtons[button].classList.remove('selected');\r\n barButtons[toolToSelect].classList.add('selected');\r\n codex.toolbar.current = toolToSelect;\r\n\r\n };\r\n\r\n /**\r\n * Transforming selected node type into selected toolbar element type\r\n * @param {event} event\r\n */\r\n toolbox.toolClicked = function() {\r\n\r\n /**\r\n * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty\r\n */\r\n var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter', 'video'],\r\n tool = codex.tools[codex.toolbar.current],\r\n workingNode = codex.content.currentNode,\r\n currentInputIndex = codex.caret.inputIndex,\r\n newBlockContent,\r\n appendCallback,\r\n blockData;\r\n\r\n /** Make block from plugin */\r\n newBlockContent = tool.make();\r\n\r\n /** information about block */\r\n blockData = {\r\n block : newBlockContent,\r\n type : tool.type,\r\n stretched : false\r\n };\r\n\r\n if (\r\n workingNode &&\r\n UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 &&\r\n workingNode.textContent.trim() === ''\r\n ){\r\n\r\n /** Replace current block */\r\n codex.content.switchBlock(workingNode, newBlockContent, tool.type);\r\n\r\n } else {\r\n\r\n /** Insert new Block from plugin */\r\n codex.content.insertBlock(blockData);\r\n\r\n /** increase input index */\r\n currentInputIndex++;\r\n\r\n }\r\n\r\n /** Fire tool append callback */\r\n appendCallback = tool.appendCallback;\r\n\r\n if (appendCallback && typeof appendCallback == 'function') {\r\n\r\n appendCallback.call(event);\r\n\r\n }\r\n\r\n setTimeout(function() {\r\n\r\n /** Set caret to current block */\r\n codex.caret.setToBlock(currentInputIndex);\r\n\r\n }, 10);\r\n\r\n\r\n /**\r\n * Changing current Node\r\n */\r\n codex.content.workingNodeChanged();\r\n\r\n /**\r\n * Move toolbar when node is changed\r\n */\r\n codex.toolbar.move();\r\n };\r\n\r\n return toolbox;\r\n\r\n})({});\r\n\r\ntoolbox.init();\r\n\r\nmodule.exports = toolbox;\n\n\n// WEBPACK FOOTER //\n// ./modules/toolbar/toolbox.js","/**\r\n * Codex Editor tools\r\n * This tools will be appended in toolbox\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\n\r\nvar tools = (function(tools) {\r\n\r\n return tools;\r\n\r\n})({});\r\n\r\nmodule.exports = tools;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/tools.js","/**\r\n * Codex Editor callbacks module\r\n *\r\n * @author Codex Team\r\n * @version 1.2.5\r\n */\r\n\r\nvar callbacks = (function(callbacks) {\r\n\r\n callbacks.redactorSyncTimeout = null;\r\n\r\n callbacks.globalKeydown = function(event){\r\n switch (event.keyCode){\r\n case codex.core.keys.ENTER : codex.callback.enterKeyPressed(event); break;\r\n }\r\n };\r\n\r\n callbacks.redactorKeyDown = function(event) {\r\n switch (event.keyCode){\r\n case codex.core.keys.TAB : codex.callback.tabKeyPressed(event); break;\r\n case codex.core.keys.ENTER : codex.callback.enterKeyPressedOnRedactorZone(event); break;\r\n case codex.core.keys.ESC : codex.callback.escapeKeyPressed(event); break;\r\n default : codex.callback.defaultKeyPressed(event); break;\r\n }\r\n };\r\n\r\n callbacks.globalKeyup = function(event){\r\n switch (event.keyCode){\r\n case codex.core.keys.UP :\r\n case codex.core.keys.LEFT :\r\n case codex.core.keys.RIGHT :\r\n case codex.core.keys.DOWN : codex.callback.arrowKeyPressed(event); break;\r\n }\r\n };\r\n\r\n callbacks.tabKeyPressed = function(event){\r\n\r\n if ( !codex.toolbar.opened ) {\r\n codex.toolbar.open();\r\n }\r\n\r\n if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) {\r\n codex.toolbar.toolbox.open();\r\n } else {\r\n codex.toolbar.toolbox.leaf();\r\n }\r\n\r\n event.preventDefault();\r\n };\r\n\r\n callbacks.enterKeyPressed = function(event) {\r\n\r\n if (codex.content.editorAreaHightlighted) {\r\n\r\n /**\r\n * it means that we lose input index, saved index before is not correct\r\n * therefore we need to set caret when we insert new block\r\n */\r\n codex.caret.inputIndex = -1;\r\n\r\n codex.callback.enterPressedOnBlock();\r\n }\r\n };\r\n\r\n /**\r\n * ENTER key handler\r\n * Makes new paragraph block\r\n */\r\n callbacks.enterKeyPressedOnRedactorZone = function(event){\r\n\r\n if (event.target.contentEditable == 'true') {\r\n\r\n /** Update input index */\r\n codex.caret.saveCurrentInputIndex();\r\n }\r\n\r\n if (!codex.content.currentNode) {\r\n /**\r\n * Enter key pressed in first-level block area\r\n */\r\n codex.callback.enterPressedOnBlock(event);\r\n return;\r\n }\r\n\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex() || 0,\r\n workingNode = codex.content.currentNode,\r\n tool = workingNode.dataset.tool,\r\n isEnterPressedOnToolbar = codex.toolbar.opened &&\r\n codex.toolbar.current &&\r\n event.target == codex.state.inputs[currentInputIndex];\r\n\r\n /** The list of tools which needs the default browser behaviour */\r\n var enableLineBreaks = codex.tools[tool].enableLineBreaks;\r\n\r\n /** This type of block creates when enter is pressed */\r\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\r\n\r\n /**\r\n * When toolbar is opened, select tool instead of making new paragraph\r\n */\r\n if ( isEnterPressedOnToolbar ) {\r\n\r\n event.preventDefault();\r\n\r\n codex.toolbar.toolbox.toolClicked(event);\r\n\r\n codex.toolbar.close();\r\n\r\n /**\r\n * Stop other listeners callback executions\r\n */\r\n event.stopPropagation();\r\n event.stopImmediatePropagation();\r\n\r\n return;\r\n\r\n }\r\n\r\n /**\r\n * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour\r\n */\r\n if ( event.shiftKey && !enableLineBreaks) {\r\n codex.callback.enterPressedOnBlock(codex.content.currentBlock, event);\r\n event.preventDefault();\r\n\r\n } else if ( (event.shiftKey && !enableLineBreaks) || (!event.shiftKey && enableLineBreaks) ){\r\n /** XOR */\r\n return;\r\n }\r\n\r\n var isLastTextNode = false,\r\n currentSelection = window.getSelection(),\r\n currentSelectedNode = currentSelection.anchorNode,\r\n caretAtTheEndOfText = codex.caret.position.atTheEnd(),\r\n isTextNodeHasParentBetweenContenteditable = false;\r\n\r\n /**\r\n * Workaround situation when caret at the Text node that has some wrapper Elements\r\n * Split block cant handle this.\r\n * We need to save default behavior\r\n */\r\n isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != \"true\";\r\n\r\n /**\r\n * Split blocks when input has several nodes and caret placed in textNode\r\n */\r\n if (\r\n currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT &&\r\n !isTextNodeHasParentBetweenContenteditable &&\r\n !caretAtTheEndOfText\r\n ){\r\n\r\n event.preventDefault();\r\n\r\n codex.core.log('Splitting Text node...');\r\n\r\n codex.content.splitBlock(currentInputIndex);\r\n\r\n /** Show plus button when next input after split is empty*/\r\n if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) {\r\n codex.toolbar.showPlusButton();\r\n }\r\n\r\n } else {\r\n\r\n if ( currentSelectedNode && currentSelectedNode.parentNode) {\r\n\r\n isLastTextNode = !currentSelectedNode.parentNode.nextSibling;\r\n\r\n }\r\n\r\n if ( isLastTextNode && caretAtTheEndOfText ) {\r\n\r\n event.preventDefault();\r\n\r\n codex.core.log('ENTER clicked in last textNode. Create new BLOCK');\r\n\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render()\r\n }, true );\r\n\r\n codex.toolbar.move();\r\n codex.toolbar.open();\r\n\r\n /** Show plus button with empty block */\r\n codex.toolbar.showPlusButton();\r\n\r\n } else {\r\n\r\n codex.core.log('Default ENTER behavior.');\r\n\r\n }\r\n\r\n }\r\n\r\n /** get all inputs after new appending block */\r\n codex.ui.saveInputs();\r\n\r\n };\r\n\r\n callbacks.escapeKeyPressed = function(event){\r\n\r\n /** Close all toolbar */\r\n codex.toolbar.close();\r\n\r\n /** Close toolbox */\r\n codex.toolbar.toolbox.close();\r\n\r\n event.preventDefault();\r\n\r\n };\r\n\r\n callbacks.arrowKeyPressed = function(event){\r\n\r\n codex.content.workingNodeChanged();\r\n\r\n /* Closing toolbar */\r\n codex.toolbar.close();\r\n codex.toolbar.move();\r\n\r\n };\r\n\r\n callbacks.defaultKeyPressed = function(event) {\r\n\r\n codex.toolbar.close();\r\n\r\n if (!codex.toolbar.inline.actionsOpened) {\r\n codex.toolbar.inline.close();\r\n codex.content.clearMark();\r\n }\r\n };\r\n\r\n callbacks.redactorClicked = function (event) {\r\n\r\n callbacks.detectWhenClickedOnFirstLevelBlockArea();\r\n\r\n codex.content.workingNodeChanged(event.target);\r\n\r\n codex.ui.saveInputs();\r\n\r\n var selectedText = codex.toolbar.inline.getSelectionText();\r\n\r\n /**\r\n * If selection range took off, then we hide inline toolbar\r\n */\r\n if (selectedText.length === 0) {\r\n codex.toolbar.inline.close();\r\n }\r\n\r\n /** Update current input index in memory when caret focused into existed input */\r\n if (event.target.contentEditable == 'true') {\r\n\r\n codex.caret.saveCurrentInputIndex();\r\n\r\n }\r\n\r\n if (codex.content.currentNode === null) {\r\n\r\n /**\r\n * If inputs in redactor does not exits, then we put input index 0 not -1\r\n */\r\n var indexOfLastInput = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0;\r\n\r\n /** If we have any inputs */\r\n if (codex.state.inputs.length) {\r\n\r\n /** getting firstlevel parent of input */\r\n var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]);\r\n }\r\n\r\n /** If input is empty, then we set caret to the last input */\r\n if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) {\r\n\r\n codex.caret.setToBlock(indexOfLastInput);\r\n\r\n } else {\r\n\r\n /** Create new input when caret clicked in redactors area */\r\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\r\n\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render()\r\n });\r\n\r\n /** If there is no inputs except inserted */\r\n if (codex.state.inputs.length === 1) {\r\n\r\n codex.caret.setToBlock(indexOfLastInput);\r\n\r\n } else {\r\n\r\n /** Set caret to this appended input */\r\n codex.caret.setToNextBlock(indexOfLastInput);\r\n }\r\n }\r\n\r\n /**\r\n * Move toolbar to the right position and open\r\n */\r\n codex.toolbar.move();\r\n\r\n\r\n codex.toolbar.open();\r\n\r\n } else {\r\n\r\n /**\r\n * Move toolbar to the new position and open\r\n */\r\n codex.toolbar.move();\r\n\r\n codex.toolbar.open();\r\n\r\n /** Close all panels */\r\n codex.toolbar.settings.close();\r\n codex.toolbar.toolbox.close();\r\n }\r\n\r\n\r\n var inputIsEmpty = !codex.content.currentNode.textContent.trim();\r\n\r\n if (inputIsEmpty) {\r\n\r\n /** Show plus button */\r\n codex.toolbar.showPlusButton();\r\n\r\n } else {\r\n\r\n /** Hide plus buttons */\r\n codex.toolbar.hidePlusButton();\r\n\r\n }\r\n\r\n var currentNodeType = codex.content.currentNode.dataset.tool;\r\n\r\n /** Mark current block*/\r\n if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) {\r\n\r\n codex.content.markBlock();\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * This method allows to define, is caret in contenteditable element or not.\r\n * Otherwise, if we get TEXT node from range container, that will means we have input index.\r\n * In this case we use default browsers behaviour (if plugin allows that) or overwritten action.\r\n * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always\r\n * specifies to the first-level block. Other cases we just ignore.\r\n */\r\n callbacks.detectWhenClickedOnFirstLevelBlockArea = function() {\r\n\r\n var selection = window.getSelection(),\r\n anchorNode = selection.anchorNode,\r\n flag = false;\r\n\r\n if (selection.rangeCount == 0) {\r\n\r\n codex.content.editorAreaHightlighted = true;\r\n\r\n } else {\r\n\r\n if (!codex.core.isDomNode(anchorNode)) {\r\n anchorNode = anchorNode.parentNode;\r\n }\r\n\r\n /** Already founded, without loop */\r\n if (anchorNode.contentEditable == 'true') {\r\n flag = true;\r\n }\r\n\r\n while (anchorNode.contentEditable != 'true') {\r\n anchorNode = anchorNode.parentNode;\r\n\r\n if (anchorNode.contentEditable == 'true') {\r\n flag = true;\r\n }\r\n\r\n if (anchorNode == document.body) {\r\n break;\r\n }\r\n }\r\n\r\n /** If editable element founded, flag is \"TRUE\", Therefore we return \"FALSE\" */\r\n codex.content.editorAreaHightlighted = flag ? false : true;\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Toolbar button click handler\r\n * @param this - cursor to the button\r\n */\r\n callbacks.toolbarButtonClicked = function (event) {\r\n\r\n var button = this;\r\n\r\n codex.toolbar.current = button.dataset.type;\r\n\r\n codex.toolbar.toolbox.toolClicked(event);\r\n codex.toolbar.close();\r\n\r\n };\r\n\r\n callbacks.redactorInputEvent = function (event) {\r\n\r\n /**\r\n * Clear previous sync-timeout\r\n */\r\n if (this.redactorSyncTimeout){\r\n clearTimeout(this.redactorSyncTimeout);\r\n }\r\n\r\n /**\r\n * Start waiting to input finish and sync redactor\r\n */\r\n this.redactorSyncTimeout = setTimeout(function() {\r\n\r\n codex.content.sync();\r\n\r\n }, 500);\r\n\r\n };\r\n\r\n /** Show or Hide toolbox when plus button is clicked */\r\n callbacks.plusButtonClicked = function() {\r\n\r\n if (!codex.nodes.toolbox.classList.contains('opened')) {\r\n\r\n codex.toolbar.toolbox.open();\r\n\r\n } else {\r\n\r\n codex.toolbar.toolbox.close();\r\n\r\n }\r\n };\r\n\r\n /**\r\n * Block handlers for KeyDown events\r\n */\r\n callbacks.blockKeydown = function(event, block) {\r\n\r\n switch (event.keyCode){\r\n\r\n case codex.core.keys.DOWN:\r\n case codex.core.keys.RIGHT:\r\n codex.callback.blockRightOrDownArrowPressed(block);\r\n break;\r\n\r\n case codex.core.keys.BACKSPACE:\r\n codex.callback.backspacePressed(block);\r\n break;\r\n\r\n case codex.core.keys.UP:\r\n case codex.core.keys.LEFT:\r\n codex.callback.blockLeftOrUpArrowPressed(block);\r\n break;\r\n\r\n }\r\n };\r\n\r\n /**\r\n * RIGHT or DOWN keydowns on block\r\n */\r\n callbacks.blockRightOrDownArrowPressed = function (block) {\r\n\r\n var selection = window.getSelection(),\r\n inputs = codex.state.inputs,\r\n focusedNode = selection.anchorNode,\r\n focusedNodeHolder;\r\n\r\n /** Check for caret existance */\r\n if (!focusedNode){\r\n return false;\r\n }\r\n\r\n /** Looking for closest (parent) contentEditable element of focused node */\r\n while (focusedNode.contentEditable != 'true') {\r\n\r\n focusedNodeHolder = focusedNode.parentNode;\r\n focusedNode = focusedNodeHolder;\r\n }\r\n\r\n /** Input index in DOM level */\r\n var editableElementIndex = 0;\r\n while (focusedNode != inputs[editableElementIndex]) {\r\n editableElementIndex ++;\r\n }\r\n\r\n /**\r\n * Founded contentEditable element doesn't have childs\r\n * Or maybe New created block\r\n */\r\n if (!focusedNode.textContent)\r\n {\r\n codex.caret.setToNextBlock(editableElementIndex);\r\n return;\r\n }\r\n\r\n /**\r\n * Do nothing when caret doesn not reaches the end of last child\r\n */\r\n var caretInLastChild = false,\r\n caretAtTheEndOfText = false;\r\n\r\n var lastChild,\r\n deepestTextnode;\r\n\r\n lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1 ];\r\n\r\n if (codex.core.isDomNode(lastChild)) {\r\n\r\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length);\r\n\r\n } else {\r\n\r\n deepestTextnode = lastChild;\r\n\r\n }\r\n\r\n caretInLastChild = selection.anchorNode == deepestTextnode;\r\n caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset;\r\n\r\n if ( !caretInLastChild || !caretAtTheEndOfText ) {\r\n codex.core.log('arrow [down|right] : caret does not reached the end');\r\n return false;\r\n }\r\n\r\n codex.caret.setToNextBlock(editableElementIndex);\r\n\r\n };\r\n\r\n /**\r\n * LEFT or UP keydowns on block\r\n */\r\n callbacks.blockLeftOrUpArrowPressed = function (block) {\r\n\r\n var selection = window.getSelection(),\r\n inputs = codex.state.inputs,\r\n focusedNode = selection.anchorNode,\r\n focusedNodeHolder;\r\n\r\n /** Check for caret existance */\r\n if (!focusedNode){\r\n return false;\r\n }\r\n\r\n /**\r\n * LEFT or UP not at the beginning\r\n */\r\n if ( selection.anchorOffset !== 0) {\r\n return false;\r\n }\r\n\r\n /** Looking for parent contentEditable block */\r\n while (focusedNode.contentEditable != 'true') {\r\n focusedNodeHolder = focusedNode.parentNode;\r\n focusedNode = focusedNodeHolder;\r\n }\r\n\r\n /** Input index in DOM level */\r\n var editableElementIndex = 0;\r\n while (focusedNode != inputs[editableElementIndex]) {\r\n editableElementIndex ++;\r\n }\r\n\r\n /**\r\n * Do nothing if caret is not at the beginning of first child\r\n */\r\n var caretInFirstChild = false,\r\n caretAtTheBeginning = false;\r\n\r\n var firstChild,\r\n deepestTextnode;\r\n\r\n /**\r\n * Founded contentEditable element doesn't have childs\r\n * Or maybe New created block\r\n */\r\n if (!focusedNode.textContent) {\r\n codex.caret.setToPreviousBlock(editableElementIndex);\r\n return;\r\n }\r\n\r\n firstChild = focusedNode.childNodes[0];\r\n\r\n if (codex.core.isDomNode(firstChild)) {\r\n\r\n deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0);\r\n\r\n } else {\r\n\r\n deepestTextnode = firstChild;\r\n\r\n }\r\n\r\n caretInFirstChild = selection.anchorNode == deepestTextnode;\r\n caretAtTheBeginning = selection.anchorOffset === 0;\r\n\r\n if ( caretInFirstChild && caretAtTheBeginning ) {\r\n\r\n codex.caret.setToPreviousBlock(editableElementIndex);\r\n\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Callback for enter key pressing in first-level block area\r\n */\r\n callbacks.enterPressedOnBlock = function (event) {\r\n\r\n var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin;\r\n\r\n codex.content.insertBlock({\r\n type : NEW_BLOCK_TYPE,\r\n block : codex.tools[NEW_BLOCK_TYPE].render()\r\n }, true );\r\n\r\n codex.toolbar.move();\r\n codex.toolbar.open();\r\n\r\n };\r\n\r\n callbacks.backspacePressed = function (block) {\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\r\n range,\r\n selectionLength,\r\n firstLevelBlocksCount;\r\n\r\n if (block.textContent.trim()) {\r\n\r\n range = codex.content.getRange();\r\n selectionLength = range.endOffset - range.startOffset;\r\n\r\n\r\n if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) {\r\n\r\n codex.content.mergeBlocks(currentInputIndex);\r\n\r\n } else {\r\n\r\n return;\r\n\r\n }\r\n }\r\n\r\n if (!selectionLength) {\r\n block.remove();\r\n }\r\n\r\n\r\n firstLevelBlocksCount = codex.nodes.redactor.childNodes.length;\r\n\r\n /**\r\n * If all blocks are removed\r\n */\r\n if (firstLevelBlocksCount === 0) {\r\n\r\n /** update currentNode variable */\r\n codex.content.currentNode = null;\r\n\r\n /** Inserting new empty initial block */\r\n codex.ui.addInitialBlock();\r\n\r\n /** Updating inputs state after deleting last block */\r\n codex.ui.saveInputs();\r\n\r\n /** Set to current appended block */\r\n setTimeout(function () {\r\n\r\n codex.caret.setToPreviousBlock(1);\r\n\r\n }, 10);\r\n\r\n } else {\r\n\r\n if (codex.caret.inputIndex !== 0) {\r\n\r\n /** Target block is not first */\r\n codex.caret.setToPreviousBlock(codex.caret.inputIndex);\r\n\r\n } else {\r\n\r\n /** If we try to delete first block */\r\n codex.caret.setToNextBlock(codex.caret.inputIndex);\r\n\r\n }\r\n }\r\n\r\n codex.toolbar.move();\r\n\r\n if (!codex.toolbar.opened) {\r\n codex.toolbar.open();\r\n }\r\n\r\n /** Updating inputs state */\r\n codex.ui.saveInputs();\r\n\r\n /** Prevent default browser behaviour */\r\n event.preventDefault();\r\n\r\n };\r\n\r\n /**\r\n * @deprecated\r\n *\r\n * @param event\r\n */\r\n callbacks.blockPaste = function(event) {\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex(),\r\n node = codex.state.inputs[currentInputIndex];\r\n\r\n setTimeout(function() {\r\n\r\n codex.content.sanitize(node);\r\n\r\n event.preventDefault();\r\n\r\n }, 10);\r\n\r\n event.stopImmediatePropagation();\r\n\r\n };\r\n\r\n callbacks.blockPasteCallback = function(event) {\r\n\r\n var currentInputIndex = codex.caret.getCurrentInputIndex();\r\n\r\n /**\r\n * create an observer instance\r\n */\r\n var observer = new MutationObserver(codex.callback.handleMutationsOnPaste);\r\n\r\n /**\r\n * configuration of the observer:\r\n */\r\n var config = {\r\n attributes: true,\r\n childList: true,\r\n characterData: false,\r\n subtree : true\r\n };\r\n\r\n // pass in the target node, as well as the observer options\r\n observer.observe(codex.state.inputs[currentInputIndex], config);\r\n };\r\n\r\n /**\r\n * Sends all mutations to paste handler\r\n */\r\n callbacks.handleMutationsOnPaste = function(mutations) {\r\n\r\n var self = this;\r\n\r\n /**\r\n * Calling function with context of this function.\r\n * Also, we should sanitize pasted or changed data one time and ignore\r\n * changings which makes sanitize method.\r\n * For that, we need to send Context, MutationObserver.__proto__ that contains\r\n * observer disconnect method.\r\n */\r\n mutations.forEach(function(mutation) {\r\n codex.content.paste.call(self, mutation);\r\n });\r\n };\r\n\r\n /**\r\n * Clicks on block settings button\r\n */\r\n callbacks.showSettingsButtonClicked = function(){\r\n\r\n /**\r\n * Get type of current block\r\n * It uses to append settings from tool.settings property.\r\n * ...\r\n * Type is stored in data-type attribute on block\r\n */\r\n var currentToolType = codex.content.currentNode.dataset.tool;\r\n\r\n codex.toolbar.settings.toggle(currentToolType);\r\n\r\n /** Close toolbox when settings button is active */\r\n codex.toolbar.toolbox.close();\r\n codex.toolbar.settings.hideRemoveActions();\r\n\r\n };\r\n\r\n return callbacks;\r\n\r\n})({});\r\n\r\nmodule.exports = callbacks;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/callbacks.js","/**\r\n * Codex Editor Draw module\r\n *\r\n * @author Codex Team\r\n * @version 1.0.\r\n */\r\n\r\nvar draw = (function(draw) {\r\n\r\n /**\r\n * Base editor wrapper\r\n */\r\n draw.wrapper = function () {\r\n\r\n var wrapper = document.createElement('div');\r\n\r\n wrapper.className += 'codex-editor';\r\n\r\n return wrapper;\r\n\r\n };\r\n\r\n /**\r\n * Content-editable holder\r\n */\r\n draw.redactor = function () {\r\n\r\n var redactor = document.createElement('div');\r\n\r\n redactor.className += 'ce-redactor';\r\n\r\n return redactor;\r\n\r\n };\r\n\r\n draw.ceBlock = function() {\r\n\r\n var block = document.createElement('DIV');\r\n\r\n block.className += 'ce_block';\r\n\r\n return block;\r\n\r\n };\r\n\r\n /**\r\n * Empty toolbar with toggler\r\n */\r\n draw.toolbar = function () {\r\n\r\n var bar = document.createElement('div');\r\n\r\n bar.className += 'ce-toolbar';\r\n\r\n return bar;\r\n };\r\n\r\n draw.toolbarContent = function() {\r\n\r\n var wrapper = document.createElement('DIV');\r\n wrapper.classList.add('ce-toolbar__content');\r\n\r\n return wrapper;\r\n };\r\n\r\n /**\r\n * Inline toolbar\r\n */\r\n draw.inlineToolbar = function() {\r\n\r\n var bar = document.createElement('DIV');\r\n\r\n bar.className += 'ce-toolbar-inline';\r\n\r\n return bar;\r\n\r\n };\r\n\r\n /**\r\n * Wrapper for inline toobar buttons\r\n */\r\n draw.inlineToolbarButtons = function() {\r\n\r\n var wrapper = document.createElement('DIV');\r\n\r\n wrapper.className += 'ce-toolbar-inline__buttons';\r\n\r\n return wrapper;\r\n };\r\n\r\n /**\r\n * For some actions\r\n */\r\n draw.inlineToolbarActions = function() {\r\n\r\n var wrapper = document.createElement('DIV');\r\n\r\n wrapper.className += 'ce-toolbar-inline__actions';\r\n\r\n return wrapper;\r\n\r\n };\r\n\r\n draw.inputForLink = function() {\r\n\r\n var input = document.createElement('INPUT');\r\n\r\n input.type = 'input';\r\n input.className += 'inputForLink';\r\n input.placeholder = 'Type URL ...';\r\n input.setAttribute('form', 'defaultForm');\r\n\r\n input.setAttribute('autofocus', 'autofocus');\r\n\r\n return input;\r\n\r\n };\r\n\r\n /**\r\n * Block with notifications\r\n */\r\n draw.alertsHolder = function() {\r\n\r\n var block = document.createElement('div');\r\n\r\n block.classList.add('ce_notifications-block');\r\n\r\n return block;\r\n\r\n };\r\n\r\n /**\r\n * @todo Desc\r\n */\r\n draw.blockButtons = function() {\r\n\r\n var block = document.createElement('div');\r\n\r\n block.className += 'ce-toolbar__actions';\r\n\r\n return block;\r\n };\r\n\r\n /**\r\n * Block settings panel\r\n */\r\n draw.blockSettings = function () {\r\n\r\n var settings = document.createElement('div');\r\n\r\n settings.className += 'ce-settings';\r\n\r\n return settings;\r\n };\r\n\r\n draw.defaultSettings = function() {\r\n\r\n var div = document.createElement('div');\r\n\r\n div.classList.add('ce-settings_default');\r\n\r\n return div;\r\n };\r\n\r\n draw.pluginsSettings = function() {\r\n\r\n var div = document.createElement('div');\r\n\r\n div.classList.add('ce-settings_plugin');\r\n\r\n return div;\r\n\r\n };\r\n\r\n draw.plusButton = function() {\r\n\r\n var button = document.createElement('span');\r\n\r\n button.className = 'ce-toolbar__plus';\r\n // button.innerHTML = '';\r\n\r\n return button;\r\n };\r\n\r\n /**\r\n * Settings button in toolbar\r\n */\r\n draw.settingsButton = function () {\r\n\r\n var toggler = document.createElement('span');\r\n\r\n toggler.className = 'ce-toolbar__settings-btn';\r\n\r\n /** Toggler button*/\r\n toggler.innerHTML = '';\r\n\r\n return toggler;\r\n };\r\n\r\n /**\r\n * Redactor tools wrapper\r\n */\r\n\r\n draw.toolbox = function() {\r\n\r\n var wrapper = document.createElement('div');\r\n\r\n wrapper.className = 'ce-toolbar__tools';\r\n\r\n return wrapper;\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Draws tool buttons for toolbox\r\n *\r\n * @param {String} type\r\n * @param {String} classname\r\n * @returns {Element}\r\n */\r\n draw.toolbarButton = function (type, classname) {\r\n\r\n var button = document.createElement(\"li\"),\r\n tool_icon = document.createElement(\"i\"),\r\n tool_title = document.createElement(\"span\");\r\n\r\n button.dataset.type = type;\r\n button.setAttribute('title', type);\r\n\r\n tool_icon.classList.add(classname);\r\n tool_title.classList.add('ce_toolbar_tools--title');\r\n\r\n\r\n button.appendChild(tool_icon);\r\n button.appendChild(tool_title);\r\n\r\n return button;\r\n\r\n };\r\n\r\n /**\r\n * @protected\r\n *\r\n * Draws tools for inline toolbar\r\n *\r\n * @param {String} type\r\n * @param {String} classname\r\n */\r\n draw.toolbarButtonInline = function(type, classname) {\r\n var button = document.createElement(\"BUTTON\"),\r\n tool_icon = document.createElement(\"I\");\r\n\r\n button.type = \"button\";\r\n button.dataset.type = type;\r\n tool_icon.classList.add(classname);\r\n\r\n button.appendChild(tool_icon);\r\n\r\n return button;\r\n };\r\n\r\n /**\r\n * Redactor block\r\n */\r\n draw.block = function (tagName, content) {\r\n\r\n var node = document.createElement(tagName);\r\n\r\n node.innerHTML = content || '';\r\n\r\n return node;\r\n\r\n };\r\n\r\n /**\r\n * Creates Node with passed tagName and className\r\n * @param {string} tagName\r\n * @param {string} className\r\n * @param {object} properties - allow to assign properties\r\n */\r\n draw.node = function( tagName , className , properties ){\r\n\r\n var el = document.createElement( tagName );\r\n\r\n if ( className ) el.className = className;\r\n\r\n if ( properties ) {\r\n\r\n for (var name in properties){\r\n el[name] = properties[name];\r\n }\r\n }\r\n\r\n return el;\r\n };\r\n\r\n draw.pluginsRender = function(type, content) {\r\n\r\n return {\r\n type : type,\r\n block : cEditor.tools[type].render({\r\n text : content\r\n })\r\n };\r\n };\r\n\r\n return draw;\r\n\r\n})({});\r\n\r\nmodule.exports = draw;\r\n\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/draw.js","/**\r\n * Codex Editor Caret Module\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\n\r\nvar caret = (function(caret) {\r\n\r\n /**\r\n * @var {int} InputIndex - editable element in DOM\r\n */\r\n caret.inputIndex = null;\r\n\r\n /**\r\n * @var {int} offset - caret position in a text node.\r\n */\r\n caret.offset = null;\r\n\r\n /**\r\n * @var {int} focusedNodeIndex - we get index of child node from first-level block\r\n */\r\n caret.focusedNodeIndex = null;\r\n\r\n /**\r\n * Creates Document Range and sets caret to the element.\r\n * @protected\r\n * @uses caret.save — if you need to save caret position\r\n * @param {Element} el - Changed Node.\r\n */\r\n caret.set = function( el , index, offset) {\r\n\r\n offset = offset || this.offset || 0;\r\n index = index || this.focusedNodeIndex || 0;\r\n\r\n var childs = el.childNodes,\r\n nodeToSet;\r\n\r\n if ( childs.length === 0 ) {\r\n\r\n nodeToSet = el;\r\n\r\n } else {\r\n\r\n nodeToSet = childs[index];\r\n\r\n }\r\n\r\n /** If Element is INPUT */\r\n if (el.tagName == 'INPUT') {\r\n el.focus();\r\n return;\r\n }\r\n\r\n if (codex.core.isDomNode(nodeToSet)) {\r\n\r\n nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length);\r\n }\r\n\r\n var range = document.createRange(),\r\n selection = window.getSelection();\r\n\r\n setTimeout(function() {\r\n\r\n range.setStart(nodeToSet, offset);\r\n range.setEnd(nodeToSet, offset);\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n\r\n codex.caret.saveCurrentInputIndex();\r\n\r\n }, 20);\r\n };\r\n\r\n /**\r\n * @protected\r\n * Updates index of input and saves it in caret object\r\n */\r\n caret.saveCurrentInputIndex = function () {\r\n\r\n /** Index of Input that we paste sanitized content */\r\n var selection = window.getSelection(),\r\n inputs = codex.state.inputs,\r\n focusedNode = selection.anchorNode,\r\n focusedNodeHolder;\r\n\r\n if (!focusedNode){\r\n return;\r\n }\r\n\r\n /** Looking for parent contentEditable block */\r\n while (focusedNode.contentEditable != 'true') {\r\n focusedNodeHolder = focusedNode.parentNode;\r\n focusedNode = focusedNodeHolder;\r\n }\r\n\r\n /** Input index in DOM level */\r\n var editableElementIndex = 0;\r\n\r\n while (focusedNode != inputs[editableElementIndex]) {\r\n editableElementIndex ++;\r\n }\r\n\r\n this.inputIndex = editableElementIndex;\r\n };\r\n\r\n /**\r\n * Returns current input index (caret object)\r\n */\r\n caret.getCurrentInputIndex = function() {\r\n return this.inputIndex;\r\n };\r\n\r\n /**\r\n * @param {int} index - index of first-level block after that we set caret into next input\r\n */\r\n caret.setToNextBlock = function(index) {\r\n\r\n var inputs = codex.state.inputs,\r\n nextInput = inputs[index + 1];\r\n\r\n if (!nextInput) {\r\n codex.core.log('We are reached the end');\r\n return;\r\n }\r\n\r\n /**\r\n * When new Block created or deleted content of input\r\n * We should add some text node to set caret\r\n */\r\n if (!nextInput.childNodes.length) {\r\n var emptyTextElement = document.createTextNode('');\r\n nextInput.appendChild(emptyTextElement);\r\n }\r\n\r\n codex.caret.inputIndex = index + 1;\r\n codex.caret.set(nextInput, 0, 0);\r\n codex.content.workingNodeChanged(nextInput);\r\n\r\n };\r\n\r\n /**\r\n * @param {int} index - index of target input.\r\n * Sets caret to input with this index\r\n */\r\n caret.setToBlock = function(index) {\r\n\r\n var inputs = codex.state.inputs,\r\n targetInput = inputs[index];\r\n\r\n console.assert( targetInput , 'caret.setToBlock: target input does not exists');\r\n\r\n if ( !targetInput ) {\r\n return;\r\n }\r\n\r\n /**\r\n * When new Block created or deleted content of input\r\n * We should add some text node to set caret\r\n */\r\n if (!targetInput.childNodes.length) {\r\n var emptyTextElement = document.createTextNode('');\r\n targetInput.appendChild(emptyTextElement);\r\n }\r\n\r\n codex.caret.inputIndex = index;\r\n codex.caret.set(targetInput, 0, 0);\r\n codex.content.workingNodeChanged(targetInput);\r\n\r\n };\r\n\r\n /**\r\n * @param {int} index - index of input\r\n */\r\n caret.setToPreviousBlock = function(index) {\r\n\r\n index = index || 0;\r\n\r\n var inputs = codex.state.inputs,\r\n previousInput = inputs[index - 1],\r\n lastChildNode,\r\n lengthOfLastChildNode,\r\n emptyTextElement;\r\n\r\n\r\n if (!previousInput) {\r\n codex.core.log('We are reached first node');\r\n return;\r\n }\r\n\r\n lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length);\r\n lengthOfLastChildNode = lastChildNode.length;\r\n\r\n /**\r\n * When new Block created or deleted content of input\r\n * We should add some text node to set caret\r\n */\r\n if (!previousInput.childNodes.length) {\r\n\r\n emptyTextElement = document.createTextNode('');\r\n previousInput.appendChild(emptyTextElement);\r\n }\r\n codex.caret.inputIndex = index - 1;\r\n codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode);\r\n codex.content.workingNodeChanged(inputs[index - 1]);\r\n };\r\n\r\n caret.position = {\r\n\r\n atStart : function() {\r\n\r\n var selection = window.getSelection(),\r\n anchorOffset = selection.anchorOffset,\r\n anchorNode = selection.anchorNode,\r\n firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode),\r\n pluginsRender = firstLevelBlock.childNodes[0];\r\n\r\n if (!codex.core.isDomNode(anchorNode)) {\r\n anchorNode = anchorNode.parentNode;\r\n }\r\n\r\n var isFirstNode = anchorNode === pluginsRender.childNodes[0],\r\n isOffsetZero = anchorOffset === 0;\r\n\r\n return isFirstNode && isOffsetZero;\r\n\r\n },\r\n\r\n atTheEnd : function() {\r\n\r\n var selection = window.getSelection(),\r\n anchorOffset = selection.anchorOffset,\r\n anchorNode = selection.anchorNode;\r\n\r\n /** Caret is at the end of input */\r\n return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length;\r\n }\r\n };\r\n\r\n return caret;\r\n\r\n})({});\r\n\r\nmodule.exports = caret;\n\n\n// WEBPACK FOOTER //\n// ./modules/caret.js","/**\r\n * Codex Editor Notification Module\r\n *\r\n * @author Codex Team\r\n * @version 1.0\r\n */\r\n\r\nvar notifications = (function(notifications) {\r\n\r\n /**\r\n * Error notificator. Shows block with message\r\n * @protected\r\n */\r\n notifications.errorThrown = function(errorMsg, event) {\r\n\r\n codex.notifications.send('This action is not available currently', event.type, false);\r\n\r\n };\r\n\r\n /**\r\n * Appends notification with different types\r\n * @param message {string} - Error or alert message\r\n * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ...\r\n * @param append {boolean} - can be True or False when notification should be inserted after\r\n */\r\n notifications.send = function(message, type, append) {\r\n\r\n var notification = codex.draw.block('div');\r\n\r\n notification.textContent = message;\r\n notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX');\r\n\r\n if (!append) {\r\n codex.nodes.notifications.innerHTML = '';\r\n }\r\n\r\n codex.nodes.notifications.appendChild(notification);\r\n\r\n setTimeout(function () {\r\n notification.remove();\r\n }, 3000);\r\n\r\n };\r\n\r\n return notifications;\r\n\r\n})({});\r\n\r\nmodule.exports = notifications;\n\n\n// WEBPACK FOOTER //\n// ./modules/notifications.js","/**\r\n * Codex Editor Parser Module\r\n *\r\n * @author Codex Team\r\n * @version 1.1\r\n */\r\n\r\nvar parser = (function(parser) {\r\n\r\n /** inserting text */\r\n parser.insertPastedContent = function(blockType, tag) {\r\n\r\n codex.content.insertBlock({\r\n type : blockType.type,\r\n block : blockType.render({\r\n text : tag.innerHTML\r\n })\r\n });\r\n\r\n };\r\n\r\n /**\r\n * Check DOM node for display style: separated block or child-view\r\n */\r\n parser.isFirstLevelBlock = function (node) {\r\n\r\n return node.nodeType == cEditor.core.nodeTypes.TAG &&\r\n node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME);\r\n\r\n };\r\n\r\n return parser;\r\n\r\n})({});\r\n\r\nmodule.exports = parser;\r\n\n\n\n// WEBPACK FOOTER //\n// ./modules/parser.js"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap 78f79f86c8f65991c6cb","webpack:///./index.js","webpack:///./editor.js","webpack:///./modules/core.js","webpack:///./modules/ui.js","webpack:///./modules/transport.js","webpack:///./modules/renderer.js","webpack:///./modules/saver.js","webpack:///./modules/content.js","webpack:///./~/html-janitor/src/html-janitor.js","webpack:///./modules/toolbar/toolbar.js","webpack:///./modules/toolbar/settings.js","webpack:///./modules/toolbar/inline.js","webpack:///./modules/toolbar/toolbox.js","webpack:///./modules/tools.js","webpack:///./modules/callbacks.js","webpack:///./modules/draw.js","webpack:///./modules/caret.js","webpack:///./modules/notifications.js","webpack:///./modules/parser.js"],"names":["editor","require","module","exports","codex","init","core","ui","transport","renderer","saver","content","toolbar","tools","callback","draw","caret","notifications","parser","version","settings","textareaId","uploadImagesUrl","initialBlockPlugin","nodes","textarea","wrapper","inlineToolbar","buttons","actions","toolbox","plusButton","showSettingsButton","showTrashButton","blockSettings","pluginSettings","defaultSettings","toolbarButtons","redactor","state","jsonOutput","blocks","inputs","start","userSettings","prepare","then","make","addTools","bindEvents","preparePlugins","makeBlocksFromData","saveInputs","catch","error","log","Promise","resolve","reject","data","document","getElementById","undefined","Error","msg","type","arg","window","console","e","insertAfter","target","element","parentNode","insertBefore","nextSibling","nodeTypes","TAG","TEXT","COMMENT","keys","BACKSPACE","TAB","ENTER","SHIFT","CTRL","ALT","ESC","SPACE","LEFT","UP","DOWN","RIGHT","DELETE","META","isDomNode","el","nodeType","ajax","url","XMLHTTP","XMLHttpRequest","ActiveXObject","success_function","params","obj","async","success","test","encodeURIComponent","withCredentials","beforeSend","call","open","setRequestHeader","onreadystatechange","readyState","status","responseText","send","importScript","scriptPath","instanceName","script","createElement","src","defer","id","head","appendChild","className","BLOCK_CLASSNAME","BLOCK_CONTENT","BLOCK_STRETCHED","BLOCK_HIGHLIGHTED","BLOCK_IN_FEED_MODE","SETTINGS_ITEM","toolbarContent","ceBlock","blockButtons","alertsHolder","body","settingsButton","makeRemoveBlockButton","pluginsSettings","makeInlineToolbar","addDefaultSettings","container","inlineToolbarButtons","inlineToolbarActions","tool","tool_button","name","displayInToolbox","iconClassname","toolbarButton","addInlineToolbarTools","bold","icon","command","italic","underline","link","toolButton","toolbarButtonInline","setInlineToolbarButtonBehaviour","addEventListener","errorMsg","lineNumber","errorThrown","event","globalKeydown","redactorKeyDown","globalKeyup","redactorClicked","plusButtonClicked","showSettingsButtonClicked","redactorInputEvent","button","toolbarButtonClicked","addBlockHandlers","block","blockKeydown","blockPasteCallback","inline","show","elements","querySelectorAll","addInitialBlock","initialBlockType","initialBlock","render","setAttribute","insertBlock","workingNodeChanged","toolClicked","input","arguments","fileSelected","clearInput","files","filesLength","length","formdData","FormData","file","i","append","selectAndUpload","args","click","xhr","onload","items","appendBlocks","nodeSequence","index","appendNodeAtIndex","getNodeAsync","createBlockFromData","blockData","blocksList","pluginName","cover","stretched","isStretched","saveBlocks","html","innerHTML","childNodes","makeQueue","queue","getBlockData","makeFormDataFromBlocks","dataset","save","blockContent","pluginsContent","savedData","output","text","trim","classList","contains","push","janitor","Config","tags","p","a","href","rel","b","strong","em","span","currentNode","editorAreaHightlighted","sync","getNodeFocused","selection","getSelection","focused","anchorNode","focusNode","parentElement","isFirstLevelBlock","parent","markBlock","add","clearMark","remove","getFirstLevelBlock","node","targetNode","replaceBlock","function_name","targetBlock","newBlock","replaceChild","needPlaceCaret","workingBlock","newBlockContent","blockType","composeNewBlock","currentInputIndex","getCurrentInputIndex","editableElement","querySelector","emptyText","createTextNode","set","move","showPlusButton","setTimeout","setToNextBlock","switchBlock","blockToReplace","newBlockComposed","getDeepestTextNodeFromPosition","position","blockChilds","textContent","removeChild","looking_from_start","getRange","getRangeAt","splitBlock","inputIndex","anchorNodeText","caretOffset","anchorOffset","textBeforeCaret","textNodeBeforeCaret","textAfterCaret","textNodeAfterCaret","currentBlock","substring","previousChilds","nextChilds","reachedCurrent","child","previousChildsLength","nextChildsLength","newNode","NEW_BLOCK_TYPE","mergeBlocks","targetInputIndex","targetInput","currentInputContent","paste","mutation","workingNode","allowedToPaste","sanitize","addedNodes","pasteTextContent","textNode","disconnect","sanitizer","clear","clean","outerHTML","div","replaceWith","defaultToolbarHeight","defaultOffset","opened","current","close","toggle","hidePlusButton","toolbarHeight","clientHeight","newYCoordinate","offsetTop","style","transform","Math","floor","hideRemoveActions","setting","toolType","feedModeToggler","makeFeedModeToggler","isFeedModeActivated","updateFeedMode","removeBlockWrapper","settingButton","actionWrapper","confirmAction","cancelAction","removeButtonClicked","confirmRemovingRequest","cancelRemovingRequest","action","showRemoveActions","firstLevelBlocksCount","buttonsOpened","actionsOpened","wrappersOffset","storedSelection","plugin","showInlineToolbar","selectedText","getSelectionText","showButtons","getWrappersOffset","coords","getSelectionCoords","newCoordinateX","newCoordinateY","offsetHeight","x","left","y","scrollY","top","closeButtons","closeAction","createLinkAction","defaultToolAction","forEach","hightlight","offset","getOffset","_x","_y","isNaN","offsetLeft","clientLeft","clientTop","offsetParent","sel","range","createRange","collapse","boundingLeft","boundingTop","rangeCount","cloneRange","getClientRects","rect","toString","showActions","isActive","isLinkActive","editable","saveSelection","restoreSelection","inputForLink","focus","preventDefault","keyCode","setAnchor","value","stopImmediatePropagation","clearRange","dataType","execCommand","containerEl","preSelectionRange","selectNodeContents","setEnd","startContainer","startOffset","end","savedSel","charIndex","setStart","nodeStack","foundStart","stop","nextCharIndex","pop","removeAllRanges","addRange","queryCommandState","setButtonHighlighted","removeButtonsHighLight","tag","tagName","leaf","currentTool","Object","barButtons","nextToolIndex","hiddenToolsAmount","toolToSelect","indexOf","toolIsLastInToolbox","UNREPLACEBLE_TOOLS","appendCallback","setToBlock","callbacks","redactorSyncTimeout","enterKeyPressed","tabKeyPressed","enterKeyPressedOnRedactorZone","escapeKeyPressed","defaultKeyPressed","arrowKeyPressed","enterPressedOnBlock","contentEditable","saveCurrentInputIndex","isEnterPressedOnToolbar","enableLineBreaks","stopPropagation","shiftKey","isLastTextNode","currentSelection","currentSelectedNode","caretAtTheEndOfText","atTheEnd","isTextNodeHasParentBetweenContenteditable","detectWhenClickedOnFirstLevelBlockArea","indexOfLastInput","firstLevelBlock","inputIsEmpty","currentNodeType","flag","clearTimeout","blockRightOrDownArrowPressed","backspacePressed","blockLeftOrUpArrowPressed","focusedNode","focusedNodeHolder","editableElementIndex","caretInLastChild","lastChild","deepestTextnode","caretInFirstChild","caretAtTheBeginning","firstChild","setToPreviousBlock","selectionLength","endOffset","atStart","blockPaste","observer","MutationObserver","handleMutationsOnPaste","config","attributes","childList","characterData","subtree","observe","mutations","self","currentToolType","bar","placeholder","toggler","classname","tool_icon","tool_title","properties","pluginsRender","cEditor","focusedNodeIndex","childs","nodeToSet","nextInput","emptyTextElement","assert","previousInput","lastChildNode","lengthOfLastChildNode","isFirstNode","isOffsetZero","message","notification","insertPastedContent"],"mappings":"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","file":"codex-editor.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 78f79f86c8f65991c6cb","/**\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.2.5\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 };\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.1\n */\n\nvar janitor = require('html-janitor');\n\n\n/**\n * Default settings for sane.\n * @uses html-janitor\n */\nvar Config = {\n\n tags: {\n p: {},\n a: {\n href: true,\n target: '_blank',\n rel: 'nofollow'\n },\n i: {},\n b: {},\n strong: {},\n em: {},\n span: {}\n }\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 if (currentInputIndex === codex.state.inputs.length - 1)\n return;\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.addedNodes);\n } else {\n codex.content.pasteTextContent(mutation.addedNodes);\n }\n\n };\n\n /**\n * @private\n *\n * gets only text/plain content of node\n * @param {Element} target - HTML node\n */\n content.pasteTextContent = function(nodes) {\n\n var node = nodes[0],\n textNode;\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 sanitizer = new janitor(Config),\n clear = sanitizer.clean(node.outerHTML);\n\n var div = codex.draw.node('DIV', [], { innerHTML: clear });\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","(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n define('html-janitor', factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.HTMLJanitor = factory();\n }\n}(this, function () {\n\n /**\n * @param {Object} config.tags Dictionary of allowed tags.\n * @param {boolean} config.keepNestedBlockElements Default false.\n */\n function HTMLJanitor(config) {\n\n var tagDefinitions = config['tags'];\n var tags = Object.keys(tagDefinitions);\n\n var validConfigValues = tags\n .map(function(k) { return typeof tagDefinitions[k]; })\n .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; });\n\n if(!validConfigValues) {\n throw new Error(\"The configuration was invalid\");\n }\n\n this.config = config;\n }\n\n // TODO: not exhaustive?\n var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE'];\n function isBlockElement(node) {\n return blockElementNames.indexOf(node.nodeName) !== -1;\n }\n\n var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE'];\n function isInlineElement(node) {\n return inlineElementNames.indexOf(node.nodeName) !== -1;\n }\n\n HTMLJanitor.prototype.clean = function (html) {\n var sandbox = document.createElement('div');\n sandbox.innerHTML = html;\n\n this._sanitize(sandbox);\n\n return sandbox.innerHTML;\n };\n\n HTMLJanitor.prototype._sanitize = function (parentNode) {\n var treeWalker = createTreeWalker(parentNode);\n var node = treeWalker.firstChild();\n if (!node) { return; }\n\n do {\n // Ignore nodes that have already been sanitized\n if (node._sanitized) {\n continue;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n // If this text node is just whitespace and the previous or next element\n // sibling is a block element, remove it\n // N.B.: This heuristic could change. Very specific to a bug with\n // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output\n // FIXME: make this an option?\n if (node.data.trim() === ''\n && ((node.previousElementSibling && isBlockElement(node.previousElementSibling))\n || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n } else {\n continue;\n }\n }\n\n // Remove all comments\n if (node.nodeType === Node.COMMENT_NODE) {\n parentNode.removeChild(node);\n this._sanitize(parentNode);\n break;\n }\n\n var isInline = isInlineElement(node);\n var containsBlockElement;\n if (isInline) {\n containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement);\n }\n\n // Block elements should not be nested (e.g.

  • ...); if\n // they are, we want to unwrap the inner block element.\n var isNotTopContainer = !! parentNode.parentNode;\n var isNestedBlockElement =\n isBlockElement(parentNode) &&\n isBlockElement(node) &&\n isNotTopContainer;\n\n var nodeName = node.nodeName.toLowerCase();\n\n var allowedAttrs = getAllowedAttrs(this.config, nodeName, node);\n\n var isInvalid = isInline && containsBlockElement;\n\n // Drop tag entirely according to the whitelist *and* if the markup\n // is invalid.\n if (isInvalid || shouldRejectNode(node, allowedAttrs)\n || (!this.config.keepNestedBlockElements && isNestedBlockElement)) {\n // Do not keep the inner text of SCRIPT/STYLE elements.\n if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) {\n while (node.childNodes.length > 0) {\n parentNode.insertBefore(node.childNodes[0], node);\n }\n }\n parentNode.removeChild(node);\n\n this._sanitize(parentNode);\n break;\n }\n\n // Sanitize attributes\n for (var a = 0; a < node.attributes.length; a += 1) {\n var attr = node.attributes[a];\n\n if (shouldRejectAttr(attr, allowedAttrs, node)) {\n node.removeAttribute(attr.name);\n // Shift the array to continue looping.\n a = a - 1;\n }\n }\n\n // Sanitize children\n this._sanitize(node);\n\n // Mark node as sanitized so it's ignored in future runs\n node._sanitized = true;\n } while ((node = treeWalker.nextSibling()));\n };\n\n function createTreeWalker(node) {\n return document.createTreeWalker(node,\n NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT,\n null, false);\n }\n\n function getAllowedAttrs(config, nodeName, node){\n if (typeof config.tags[nodeName] === 'function') {\n return config.tags[nodeName](node);\n } else {\n return config.tags[nodeName];\n }\n }\n\n function shouldRejectNode(node, allowedAttrs){\n if (typeof allowedAttrs === 'undefined') {\n return true;\n } else if (typeof allowedAttrs === 'boolean') {\n return !allowedAttrs;\n }\n\n return false;\n }\n\n function shouldRejectAttr(attr, allowedAttrs, node){\n var attrName = attr.name.toLowerCase();\n\n if (allowedAttrs === true){\n return false;\n } else if (typeof allowedAttrs[attrName] === 'function'){\n return !allowedAttrs[attrName](attr.value, node);\n } else if (typeof allowedAttrs[attrName] === 'undefined'){\n return true;\n } else if (allowedAttrs[attrName] === false) {\n return true;\n } else if (typeof allowedAttrs[attrName] === 'string') {\n return (allowedAttrs[attrName] !== attr.value);\n }\n\n return false;\n }\n\n return HTMLJanitor;\n\n}));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/html-janitor/src/html-janitor.js\n// module id = 8\n// module chunks = 0","/**\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', 'video'],\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.2.5\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 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: true,\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 * 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"],"sourceRoot":""} \ No newline at end of file diff --git a/result-sample.json b/result-sample.json index fcbbc3e4..8312c69a 100644 --- a/result-sample.json +++ b/result-sample.json @@ -76,7 +76,7 @@ }, { "type":"video_extended", - "data":{ + "data":{ "source":"youtube", "remote_id":"SqmAjcAPBpA", "thumbnailUrl":"http:\/\/tj.local\/preview\/youtube\/SqmAjcAPBpA", diff --git a/whatwg-fetch.js b/whatwg-fetch.js deleted file mode 100644 index 21e370bc..00000000 --- a/whatwg-fetch.js +++ /dev/null @@ -1,510 +0,0 @@ -var codex = -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) -/******/ return installedModules[moduleId].exports; -/******/ -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ exports: {}, -/******/ id: moduleId, -/******/ loaded: false -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.loaded = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ function(module, exports) { - - (function(self) { - 'use strict'; - - if (self.fetch) { - return - } - - var support = { - searchParams: 'URLSearchParams' in self, - iterable: 'Symbol' in self && 'iterator' in Symbol, - blob: 'FileReader' in self && 'Blob' in self && (function() { - try { - new Blob() - return true - } catch(e) { - return false - } - })(), - formData: 'FormData' in self, - arrayBuffer: 'ArrayBuffer' in self - } - - if (support.arrayBuffer) { - var viewClasses = [ - '[object Int8Array]', - '[object Uint8Array]', - '[object Uint8ClampedArray]', - '[object Int16Array]', - '[object Uint16Array]', - '[object Int32Array]', - '[object Uint32Array]', - '[object Float32Array]', - '[object Float64Array]' - ] - - var isDataView = function(obj) { - return obj && DataView.prototype.isPrototypeOf(obj) - } - - var isArrayBufferView = ArrayBuffer.isView || function(obj) { - return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 - } - } - - function normalizeName(name) { - if (typeof name !== 'string') { - name = String(name) - } - if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { - throw new TypeError('Invalid character in header field name') - } - return name.toLowerCase() - } - - function normalizeValue(value) { - if (typeof value !== 'string') { - value = String(value) - } - return value - } - - // Build a destructive iterator for the value list - function iteratorFor(items) { - var iterator = { - next: function() { - var value = items.shift() - return {done: value === undefined, value: value} - } - } - - if (support.iterable) { - iterator[Symbol.iterator] = function() { - return iterator - } - } - - return iterator - } - - function Headers(headers) { - this.map = {} - - if (headers instanceof Headers) { - headers.forEach(function(value, name) { - this.append(name, value) - }, this) - - } else if (headers) { - Object.getOwnPropertyNames(headers).forEach(function(name) { - this.append(name, headers[name]) - }, this) - } - } - - Headers.prototype.append = function(name, value) { - name = normalizeName(name) - value = normalizeValue(value) - var oldValue = this.map[name] - this.map[name] = oldValue ? oldValue+','+value : value - } - - Headers.prototype['delete'] = function(name) { - delete this.map[normalizeName(name)] - } - - Headers.prototype.get = function(name) { - name = normalizeName(name) - return this.has(name) ? this.map[name] : null - } - - Headers.prototype.has = function(name) { - return this.map.hasOwnProperty(normalizeName(name)) - } - - Headers.prototype.set = function(name, value) { - this.map[normalizeName(name)] = normalizeValue(value) - } - - Headers.prototype.forEach = function(callback, thisArg) { - for (var name in this.map) { - if (this.map.hasOwnProperty(name)) { - callback.call(thisArg, this.map[name], name, this) - } - } - } - - Headers.prototype.keys = function() { - var items = [] - this.forEach(function(value, name) { items.push(name) }) - return iteratorFor(items) - } - - Headers.prototype.values = function() { - var items = [] - this.forEach(function(value) { items.push(value) }) - return iteratorFor(items) - } - - Headers.prototype.entries = function() { - var items = [] - this.forEach(function(value, name) { items.push([name, value]) }) - return iteratorFor(items) - } - - if (support.iterable) { - Headers.prototype[Symbol.iterator] = Headers.prototype.entries - } - - function consumed(body) { - if (body.bodyUsed) { - return Promise.reject(new TypeError('Already read')) - } - body.bodyUsed = true - } - - function fileReaderReady(reader) { - return new Promise(function(resolve, reject) { - reader.onload = function() { - resolve(reader.result) - } - reader.onerror = function() { - reject(reader.error) - } - }) - } - - function readBlobAsArrayBuffer(blob) { - var reader = new FileReader() - var promise = fileReaderReady(reader) - reader.readAsArrayBuffer(blob) - return promise - } - - function readBlobAsText(blob) { - var reader = new FileReader() - var promise = fileReaderReady(reader) - reader.readAsText(blob) - return promise - } - - function readArrayBufferAsText(buf) { - var view = new Uint8Array(buf) - var chars = new Array(view.length) - - for (var i = 0; i < view.length; i++) { - chars[i] = String.fromCharCode(view[i]) - } - return chars.join('') - } - - function bufferClone(buf) { - if (buf.slice) { - return buf.slice(0) - } else { - var view = new Uint8Array(buf.byteLength) - view.set(new Uint8Array(buf)) - return view.buffer - } - } - - function Body() { - this.bodyUsed = false - - this._initBody = function(body) { - this._bodyInit = body - if (!body) { - this._bodyText = '' - } else if (typeof body === 'string') { - this._bodyText = body - } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { - this._bodyBlob = body - } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { - this._bodyFormData = body - } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { - this._bodyText = body.toString() - } else if (support.arrayBuffer && support.blob && isDataView(body)) { - this._bodyArrayBuffer = bufferClone(body.buffer) - // IE 10-11 can't handle a DataView body. - this._bodyInit = new Blob([this._bodyArrayBuffer]) - } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { - this._bodyArrayBuffer = bufferClone(body) - } else { - throw new Error('unsupported BodyInit type') - } - - if (!this.headers.get('content-type')) { - if (typeof body === 'string') { - this.headers.set('content-type', 'text/plain;charset=UTF-8') - } else if (this._bodyBlob && this._bodyBlob.type) { - this.headers.set('content-type', this._bodyBlob.type) - } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { - this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8') - } - } - } - - if (support.blob) { - this.blob = function() { - var rejected = consumed(this) - if (rejected) { - return rejected - } - - if (this._bodyBlob) { - return Promise.resolve(this._bodyBlob) - } else if (this._bodyArrayBuffer) { - return Promise.resolve(new Blob([this._bodyArrayBuffer])) - } else if (this._bodyFormData) { - throw new Error('could not read FormData body as blob') - } else { - return Promise.resolve(new Blob([this._bodyText])) - } - } - - this.arrayBuffer = function() { - if (this._bodyArrayBuffer) { - return consumed(this) || Promise.resolve(this._bodyArrayBuffer) - } else { - return this.blob().then(readBlobAsArrayBuffer) - } - } - } - - this.text = function() { - var rejected = consumed(this) - if (rejected) { - return rejected - } - - if (this._bodyBlob) { - return readBlobAsText(this._bodyBlob) - } else if (this._bodyArrayBuffer) { - return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) - } else if (this._bodyFormData) { - throw new Error('could not read FormData body as text') - } else { - return Promise.resolve(this._bodyText) - } - } - - if (support.formData) { - this.formData = function() { - return this.text().then(decode) - } - } - - this.json = function() { - return this.text().then(JSON.parse) - } - - return this - } - - // HTTP methods whose capitalization should be normalized - var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'] - - function normalizeMethod(method) { - var upcased = method.toUpperCase() - return (methods.indexOf(upcased) > -1) ? upcased : method - } - - function Request(input, options) { - options = options || {} - var body = options.body - - if (typeof input === 'string') { - this.url = input - } else { - if (input.bodyUsed) { - throw new TypeError('Already read') - } - this.url = input.url - this.credentials = input.credentials - if (!options.headers) { - this.headers = new Headers(input.headers) - } - this.method = input.method - this.mode = input.mode - if (!body && input._bodyInit != null) { - body = input._bodyInit - input.bodyUsed = true - } - } - - this.credentials = options.credentials || this.credentials || 'omit' - if (options.headers || !this.headers) { - this.headers = new Headers(options.headers) - } - this.method = normalizeMethod(options.method || this.method || 'GET') - this.mode = options.mode || this.mode || null - this.referrer = null - - if ((this.method === 'GET' || this.method === 'HEAD') && body) { - throw new TypeError('Body not allowed for GET or HEAD requests') - } - this._initBody(body) - } - - Request.prototype.clone = function() { - return new Request(this, { body: this._bodyInit }) - } - - function decode(body) { - var form = new FormData() - body.trim().split('&').forEach(function(bytes) { - if (bytes) { - var split = bytes.split('=') - var name = split.shift().replace(/\+/g, ' ') - var value = split.join('=').replace(/\+/g, ' ') - form.append(decodeURIComponent(name), decodeURIComponent(value)) - } - }) - return form - } - - function parseHeaders(rawHeaders) { - var headers = new Headers() - rawHeaders.split('\r\n').forEach(function(line) { - var parts = line.split(':') - var key = parts.shift().trim() - if (key) { - var value = parts.join(':').trim() - headers.append(key, value) - } - }) - return headers - } - - Body.call(Request.prototype) - - function Response(bodyInit, options) { - if (!options) { - options = {} - } - - this.type = 'default' - this.status = 'status' in options ? options.status : 200 - this.ok = this.status >= 200 && this.status < 300 - this.statusText = 'statusText' in options ? options.statusText : 'OK' - this.headers = new Headers(options.headers) - this.url = options.url || '' - this._initBody(bodyInit) - } - - Body.call(Response.prototype) - - Response.prototype.clone = function() { - return new Response(this._bodyInit, { - status: this.status, - statusText: this.statusText, - headers: new Headers(this.headers), - url: this.url - }) - } - - Response.error = function() { - var response = new Response(null, {status: 0, statusText: ''}) - response.type = 'error' - return response - } - - var redirectStatuses = [301, 302, 303, 307, 308] - - Response.redirect = function(url, status) { - if (redirectStatuses.indexOf(status) === -1) { - throw new RangeError('Invalid status code') - } - - return new Response(null, {status: status, headers: {location: url}}) - } - - self.Headers = Headers - self.Request = Request - self.Response = Response - - self.fetch = function(input, init) { - return new Promise(function(resolve, reject) { - var request = new Request(input, init) - var xhr = new XMLHttpRequest() - - xhr.onload = function() { - var options = { - status: xhr.status, - statusText: xhr.statusText, - headers: parseHeaders(xhr.getAllResponseHeaders() || '') - } - options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL') - var body = 'response' in xhr ? xhr.response : xhr.responseText - resolve(new Response(body, options)) - } - - xhr.onerror = function() { - reject(new TypeError('Network request failed')) - } - - xhr.ontimeout = function() { - reject(new TypeError('Network request failed')) - } - - xhr.open(request.method, request.url, true) - - if (request.credentials === 'include') { - xhr.withCredentials = true - } - - if ('responseType' in xhr && support.blob) { - xhr.responseType = 'blob' - } - - request.headers.forEach(function(value, name) { - xhr.setRequestHeader(name, value) - }) - - xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit) - }) - } - self.fetch.polyfill = true - })(typeof self !== 'undefined' ? self : this); - - -/***/ } -/******/ ]); -//# sourceMappingURL=whatwg-fetch.js.map \ No newline at end of file diff --git a/whatwg-fetch.js.map b/whatwg-fetch.js.map index dbcdf299..84d55775 100644 --- a/whatwg-fetch.js.map +++ b/whatwg-fetch.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap 685c3b69d4372899a8c1?27da","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 685c3b69d4372899a8c1","(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 +{"version":3,"sources":["webpack:///webpack/bootstrap 78f79f86c8f65991c6cb?51a4","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 78f79f86c8f65991c6cb","(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 From cd58297a9e73bed40b2f81be953c1094a4ed3d6b Mon Sep 17 00:00:00 2001 From: khaydarov Date: Wed, 25 Jan 2017 19:59:39 +0300 Subject: [PATCH 18/23] resolve --- codex-editor.js | 4459 +++++++++++++++++++++++++++++++++++++++++++++++ whatwg-fetch.js | 510 ++++++ 2 files changed, 4969 insertions(+) create mode 100644 codex-editor.js create mode 100644 whatwg-fetch.js diff --git a/codex-editor.js b/codex-editor.js new file mode 100644 index 00000000..f8f19d39 --- /dev/null +++ b/codex-editor.js @@ -0,0 +1,4459 @@ +var codex = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports, __webpack_require__) { + + /** + * + */ + + 'use strict'; + + var editor = __webpack_require__(1); + module.exports = editor; + +/***/ }, +/* 1 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + /** + * + * Codex Editor + * + * @author Codex Team + * @version 1.2.5 + */ + + var codex = function (codex) { + + var init = function init() { + + codex.core = __webpack_require__(2); + codex.ui = __webpack_require__(3); + codex.transport = __webpack_require__(4); + codex.renderer = __webpack_require__(5); + codex.saver = __webpack_require__(6); + codex.content = __webpack_require__(7); + codex.toolbar = __webpack_require__(9); + codex.tools = __webpack_require__(13); + codex.callback = __webpack_require__(14); + codex.draw = __webpack_require__(15); + codex.caret = __webpack_require__(16); + codex.notifications = __webpack_require__(17); + codex.parser = __webpack_require__(18); + }; + + codex.version = ("1.2.8"); + + /** + * @public + * + * holds initial settings + */ + codex.settings = { + tools: ['paragraph', 'header', 'picture', 'list', 'quote', 'code', 'twitter', 'instagram', 'smile'], + textareaId: 'codex-editor', + uploadImagesUrl: '/editor/transport/', + + // Type of block showing on empty editor + initialBlockPlugin: "paragraph" + }; + + /** + * public + * + * Static nodes + */ + codex.nodes = { + textarea: null, + wrapper: null, + toolbar: null, + inlineToolbar: { + wrapper: null, + buttons: null, + actions: null + }, + toolbox: null, + notifications: null, + plusButton: null, + showSettingsButton: null, + showTrashButton: null, + blockSettings: null, + pluginSettings: null, + defaultSettings: null, + toolbarButtons: {}, // { type : DomEl, ... } + redactor: null + }; + + /** + * @public + * + * Output state + */ + codex.state = { + jsonOutput: [], + blocks: [], + inputs: [] + }; + + /** + * Initialization + * @uses Promise cEditor.core.prepare + * @param {} userSettings are : + * - tools [], + * - textareaId String + * ... + * + * Load user defined tools + * Tools must contain this important objects : + * @param {String} type - this is a type of plugin. It can be used as plugin name + * @param {String} iconClassname - this a icon in toolbar + * @param {Object} make - what should plugin do, when it is clicked + * @param {Object} appendCallback - callback after clicking + * @param {Element} settings - what settings does it have + * @param {Object} render - plugin get JSON, and should return HTML + * @param {Object} save - plugin gets HTML content, returns JSON + * @param {Boolean} displayInToolbox - will be displayed in toolbox. Default value is TRUE + * @param {Boolean} enableLineBreaks - inserts new block or break lines. Default value is FALSE + * + * @example + * - type : 'header', + * - iconClassname : 'ce-icon-header', + * - make : headerTool.make, + * - appendCallback : headerTool.appendCallback, + * - settings : headerTool.makeSettings(), + * - render : headerTool.render, + * - save : headerTool.save, + * - displayInToolbox : true, + * - enableLineBreaks : false + */ + codex.start = function (userSettings) { + + init(); + + this.core.prepare(userSettings) + + // If all ok, make UI, bind events and parse initial-content + .then(this.ui.make).then(this.ui.addTools).then(this.ui.bindEvents).then(this.ui.preparePlugins).then(this.transport.prepare).then(this.renderer.makeBlocksFromData).then(this.ui.saveInputs).catch(function (error) { + codex.core.log('Initialization failed with error: %o', 'warn', error); + }); + }; + + return codex; + }({}); + + module.exports = codex; + +/***/ }, +/* 2 */ +/***/ function(module, exports) { + + 'use strict'; + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + + /** + * Codex Editor Core + * + * @author Codex Team + * @version 1.1.2 + */ + + var core = function (core) { + + /** + * @public + * + * Editor preparing method + * @return Promise + */ + core.prepare = function (userSettings) { + + return new Promise(function (resolve, reject) { + + if (userSettings) { + + codex.settings.tools = userSettings.tools || codex.settings.tools; + } + + if (userSettings.data) { + codex.state.blocks = userSettings.data; + } + + if (userSettings.initialBlockPlugin) { + codex.settings.initialBlockPlugin = userSettings.initialBlockPlugin; + } + + if (userSettings.uploadImagesUrl) { + codex.settings.uploadImagesUrl = userSettings.uploadImagesUrl; + } + + codex.nodes.textarea = document.getElementById(userSettings.textareaId || codex.settings.textareaId); + + if (_typeof(codex.nodes.textarea) === undefined || codex.nodes.textarea === null) { + reject(Error("Textarea wasn't found by ID: #" + userSettings.textareaId)); + } else { + resolve(); + } + }); + }; + + /** + * Logging method + * @param type = ['log', 'info', 'warn'] + */ + core.log = function (msg, type, arg) { + + type = type || 'log'; + + if (!arg) { + arg = msg || 'undefined'; + msg = '[codex-editor]: %o'; + } else { + msg = '[codex-editor]: ' + msg; + } + + try { + if ('console' in window && console[type]) { + if (arg) console[type](msg, arg);else console[type](msg); + } + } catch (e) {} + }; + + /** + * @protected + * + * Helper for insert one element after another + */ + core.insertAfter = function (target, element) { + target.parentNode.insertBefore(element, target.nextSibling); + }; + + /** + * @const + * + * Readable DOM-node types map + */ + core.nodeTypes = { + TAG: 1, + TEXT: 3, + COMMENT: 8 + }; + + /** + * @const + * Readable keys map + */ + core.keys = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, LEFT: 37, UP: 38, DOWN: 40, RIGHT: 39, DELETE: 46, META: 91 }; + + /** + * @protected + * + * Check object for DOM node + */ + core.isDomNode = function (el) { + return el && (typeof el === 'undefined' ? 'undefined' : _typeof(el)) === 'object' && el.nodeType && el.nodeType == this.nodeTypes.TAG; + }; + + /** + * Native Ajax + */ + core.ajax = function (data) { + + if (!data || !data.url) { + return; + } + + var XMLHTTP = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"), + success_function = function success_function() {}, + params = '', + obj; + + data.async = true; + data.type = data.type || 'GET'; + data.data = data.data || ''; + data['content-type'] = data['content-type'] || 'application/json; charset=utf-8'; + success_function = data.success || success_function; + + if (data.type == 'GET' && data.data) { + + data.url = /\?/.test(data.url) ? data.url + '&' + data.data : data.url + '?' + data.data; + } else { + + for (obj in data.data) { + params += obj + '=' + encodeURIComponent(data.data[obj]) + '&'; + } + } + + if (data.withCredentials) { + XMLHTTP.withCredentials = true; + } + + if (data.beforeSend && typeof data.beforeSend == 'function') { + data.beforeSend.call(); + } + + XMLHTTP.open(data.type, data.url, data.async); + XMLHTTP.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + XMLHTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); + + XMLHTTP.onreadystatechange = function () { + if (XMLHTTP.readyState == 4 && XMLHTTP.status == 200) { + success_function(XMLHTTP.responseText); + } + }; + + XMLHTTP.send(params); + }; + + /** Appends script to head of document */ + core.importScript = function (scriptPath, instanceName) { + + /** Script is already loaded */ + if (!instanceName || instanceName && document.getElementById('ce-script-' + instanceName)) { + codex.core.log("Instance name of script is missed or script is already loaded", "warn"); + return; + } + + var script = document.createElement('SCRIPT'); + script.type = "text/javascript"; + script.src = scriptPath; + script.async = true; + script.defer = true; + + if (instanceName) { + script.id = "ce-script-" + instanceName; + } + + document.head.appendChild(script); + return script; + }; + + return core; + }({}); + + module.exports = core; + +/***/ }, +/* 3 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Codex Editor UI module + * + * @author Codex Team + * @version 1.1 + */ + + var ui = function (ui) { + + /** + * Basic editor classnames + */ + ui.className = { + + /** + * @const {string} BLOCK_CLASSNAME - redactor blocks name + */ + BLOCK_CLASSNAME: 'ce-block', + + /** + * @const {String} wrapper for plugins content + */ + BLOCK_CONTENT: 'ce-block__content', + + /** + * @const {String} BLOCK_STRETCHED - makes block stretched + */ + BLOCK_STRETCHED: 'ce-block--stretched', + + /** + * @const {String} BLOCK_HIGHLIGHTED - adds background + */ + BLOCK_HIGHLIGHTED: 'ce-block--focused', + + /** + * @const {String} - highlights covered blocks + */ + BLOCK_IN_FEED_MODE: 'ce-block--feed-mode', + + /** + * @const {String} - for all default settings + */ + SETTINGS_ITEM: 'ce-settings__item' + + }; + + /** + * @protected + * + * Making main interface + */ + ui.make = function () { + + var wrapper, toolbar, toolbarContent, inlineToolbar, redactor, ceBlock, notifications, blockButtons, blockSettings, showSettingsButton, showTrashButton, toolbox, plusButton; + + /** Make editor wrapper */ + wrapper = codex.draw.wrapper(); + + /** Append editor wrapper after initial textarea */ + codex.core.insertAfter(codex.nodes.textarea, wrapper); + + /** Append block with notifications to the document */ + notifications = codex.draw.alertsHolder(); + codex.nodes.notifications = document.body.appendChild(notifications); + + /** Make toolbar and content-editable redactor */ + toolbar = codex.draw.toolbar(); + toolbarContent = codex.draw.toolbarContent(); + inlineToolbar = codex.draw.inlineToolbar(); + plusButton = codex.draw.plusButton(); + showSettingsButton = codex.draw.settingsButton(); + showTrashButton = codex.toolbar.settings.makeRemoveBlockButton(); + blockSettings = codex.draw.blockSettings(); + blockButtons = codex.draw.blockButtons(); + toolbox = codex.draw.toolbox(); + redactor = codex.draw.redactor(); + + /** settings */ + var defaultSettings = codex.draw.defaultSettings(), + pluginSettings = codex.draw.pluginsSettings(); + + /** Add default and plugins settings */ + blockSettings.appendChild(pluginSettings); + blockSettings.appendChild(defaultSettings); + + /** Make blocks buttons + * This block contains settings button and remove block button + */ + blockButtons.appendChild(showSettingsButton); + blockButtons.appendChild(showTrashButton); + blockButtons.appendChild(blockSettings); + + /** Append plus button */ + toolbarContent.appendChild(plusButton); + + /** Appending toolbar tools */ + toolbarContent.appendChild(toolbox); + + /** Appending first-level block buttons */ + toolbar.appendChild(blockButtons); + + /** Append toolbarContent to toolbar */ + toolbar.appendChild(toolbarContent); + + wrapper.appendChild(toolbar); + + wrapper.appendChild(redactor); + + /** Save created ui-elements to static nodes state */ + codex.nodes.wrapper = wrapper; + codex.nodes.toolbar = toolbar; + codex.nodes.plusButton = plusButton; + codex.nodes.toolbox = toolbox; + codex.nodes.blockSettings = blockSettings; + codex.nodes.pluginSettings = pluginSettings; + codex.nodes.defaultSettings = defaultSettings; + codex.nodes.showSettingsButton = showSettingsButton; + codex.nodes.showTrashButton = showTrashButton; + + codex.nodes.redactor = redactor; + + codex.ui.makeInlineToolbar(inlineToolbar); + + /** fill in default settings */ + codex.toolbar.settings.addDefaultSettings(); + }; + + ui.makeInlineToolbar = function (container) { + + /** Append to redactor new inline block */ + codex.nodes.inlineToolbar.wrapper = container; + + /** Draw toolbar buttons */ + codex.nodes.inlineToolbar.buttons = codex.draw.inlineToolbarButtons(); + + /** Buttons action or settings */ + codex.nodes.inlineToolbar.actions = codex.draw.inlineToolbarActions(); + + /** Append to inline toolbar buttons as part of it */ + codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.buttons); + codex.nodes.inlineToolbar.wrapper.appendChild(codex.nodes.inlineToolbar.actions); + + codex.nodes.wrapper.appendChild(codex.nodes.inlineToolbar.wrapper); + }; + + /** + * @private + * Append tools passed in codex.tools + */ + ui.addTools = function () { + + var tool, tool_button; + + for (var name in codex.settings.tools) { + tool = codex.settings.tools[name]; + codex.tools[name] = tool;; + } + + /** Make toolbar buttons */ + for (var name in codex.tools) { + + tool = codex.tools[name]; + + if (!tool.displayInToolbox) { + continue; + } + + if (!tool.iconClassname) { + codex.core.log('Toolbar icon classname missed. Tool %o skipped', 'warn', name); + continue; + } + + if (typeof tool.make != 'function') { + codex.core.log('make method missed. Tool %o skipped', 'warn', name); + continue; + } + + /** + * if tools is for toolbox + */ + tool_button = codex.draw.toolbarButton(name, tool.iconClassname); + + codex.nodes.toolbox.appendChild(tool_button); + + /** Save tools to static nodes */ + codex.nodes.toolbarButtons[name] = tool_button; + } + + /** + * Add inline toolbar tools + */ + codex.ui.addInlineToolbarTools(); + }; + + ui.addInlineToolbarTools = function () { + + var tools = { + + bold: { + icon: 'ce-icon-bold', + command: 'bold' + }, + + italic: { + icon: 'ce-icon-italic', + command: 'italic' + }, + + underline: { + icon: 'ce-icon-underline', + command: 'underline' + }, + + link: { + icon: 'ce-icon-link', + command: 'createLink' + } + }; + + var toolButton, tool; + + for (var name in tools) { + + tool = tools[name]; + + toolButton = codex.draw.toolbarButtonInline(name, tool.icon); + + codex.nodes.inlineToolbar.buttons.appendChild(toolButton); + /** + * Add callbacks to this buttons + */ + codex.ui.setInlineToolbarButtonBehaviour(toolButton, tool.command); + } + }; + + /** + * @private + * Bind editor UI events + */ + ui.bindEvents = function () { + + codex.core.log('ui.bindEvents fired', 'info'); + + window.addEventListener('error', function (errorMsg, url, lineNumber) { + codex.notifications.errorThrown(errorMsg, event); + }, false); + + /** All keydowns on Document */ + document.addEventListener('keydown', codex.callback.globalKeydown, false); + + /** All keydowns on Redactor zone */ + codex.nodes.redactor.addEventListener('keydown', codex.callback.redactorKeyDown, false); + + /** All keydowns on Document */ + document.addEventListener('keyup', codex.callback.globalKeyup, false); + + /** + * Mouse click to radactor + */ + codex.nodes.redactor.addEventListener('click', codex.callback.redactorClicked, false); + + /** + * Clicks to the Plus button + */ + codex.nodes.plusButton.addEventListener('click', codex.callback.plusButtonClicked, false); + + /** + * Clicks to SETTINGS button in toolbar + */ + codex.nodes.showSettingsButton.addEventListener('click', codex.callback.showSettingsButtonClicked, false); + /** + * @deprecated ( but now in use for syncronization ); + * Any redactor changes: keyboard input, mouse cut/paste, drag-n-drop text + */ + codex.nodes.redactor.addEventListener('input', codex.callback.redactorInputEvent, false); + + /** Bind click listeners on toolbar buttons */ + for (var button in codex.nodes.toolbarButtons) { + codex.nodes.toolbarButtons[button].addEventListener('click', codex.callback.toolbarButtonClicked, false); + } + }; + + /** + * Initialize plugins before using + * Ex. Load scripts or call some internal methods + */ + ui.preparePlugins = function () { + + for (var tool in codex.tools) { + + if (typeof codex.tools[tool].prepare != 'function') continue; + + codex.tools[tool].prepare(); + } + }; + + ui.addBlockHandlers = function (block) { + + if (!block) return; + + /** + * Block keydowns + */ + block.addEventListener('keydown', function (event) { + codex.callback.blockKeydown(event, block); + }, false); + + /** + * Pasting content from another source + * We have two type of sanitization + * First - uses deep-first search algorithm to get sub nodes, + * sanitizes whole Block_content and replaces cleared nodes + * This method is deprecated + * Method is used in codex.callback.blockPaste(event) + * + * Secont - uses Mutation observer. + * Observer "observe" DOM changes and send changings to callback. + * Callback gets changed node, not whole Block_content. + * Inserted or changed node, which we've gotten have been cleared and replaced with diry node + * + * Method is used in codex.callback.blockPasteViaSanitize(event) + * + * @uses html-janitor + * @example codex.callback.blockPasteViaSanitize(event), the second method. + * + */ + block.addEventListener('paste', codex.callback.blockPasteCallback, false); + + block.addEventListener('mouseup', function () { + codex.toolbar.inline.show(); + }, false); + }; + + /** getting all contenteditable elements */ + ui.saveInputs = function () { + + var redactor = codex.nodes.redactor, + elements = []; + + /** Save all inputs in global variable state */ + codex.state.inputs = redactor.querySelectorAll('[contenteditable], input'); + }; + + /** + * Adds first initial block on empty redactor + */ + ui.addInitialBlock = function () { + + var initialBlockType = codex.settings.initialBlockPlugin, + initialBlock; + + if (!codex.tools[initialBlockType]) { + codex.core.log('Plugin %o was not implemented and can\'t be used as initial block', 'warn', initialBlockType); + return; + } + + initialBlock = codex.tools[initialBlockType].render(); + + initialBlock.setAttribute('data-placeholder', 'Write your story...'); + + codex.content.insertBlock({ + type: initialBlockType, + block: initialBlock + }); + + codex.content.workingNodeChanged(initialBlock); + }; + + ui.setInlineToolbarButtonBehaviour = function (button, type) { + + button.addEventListener('mousedown', function (event) { + + codex.toolbar.inline.toolClicked(event, type); + }, false); + }; + + return ui; + }({}); + + module.exports = ui; + +/***/ }, +/* 4 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * + * Codex.Editor Transport Module + * + * @author Codex Team + * @version 1.0 + */ + + var transport = function (transport) { + + transport.input = null; + + /** + * @property {Object} arguments - keep plugin settings and defined callbacks + */ + transport.arguments = null; + + transport.prepare = function () { + + var input = document.createElement('INPUT'); + + input.type = 'file'; + input.addEventListener('change', codex.transport.fileSelected); + + codex.transport.input = input; + }; + + /** Clear input when files is uploaded */ + transport.clearInput = function () { + + /** Remove old input */ + this.input = null; + + /** Prepare new one */ + this.prepare(); + }; + + /** + * Callback for file selection + */ + transport.fileSelected = function (event) { + + var input = this, + files = input.files, + filesLength = files.length, + formdData = new FormData(), + file, + i; + + formdData.append('files', files[0], files[0].name); + + codex.transport.ajax({ + data: formdData, + beforeSend: codex.transport.arguments.beforeSend, + success: codex.transport.arguments.success, + error: codex.transport.arguments.error + }); + }; + + /** + * Use plugin callbacks + * @protected + */ + transport.selectAndUpload = function (args) { + + this.arguments = args; + this.input.click(); + }; + + /** + * Ajax requests module + */ + transport.ajax = function (params) { + + var xhr = new XMLHttpRequest(), + beforeSend = typeof params.beforeSend == 'function' ? params.beforeSend : function () {}, + success = typeof params.success == 'function' ? params.success : function () {}, + error = typeof params.error == 'function' ? params.error : function () {}; + + beforeSend(); + + xhr.open('POST', codex.settings.uploadImagesUrl, true); + + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); + + xhr.onload = function () { + if (xhr.status === 200) { + success(xhr.responseText); + } else { + console.log("request error: %o", xhr); + error(); + } + }; + + xhr.send(params.data); + this.clearInput(); + }; + + return transport; + }({}); + + module.exports = transport; + +/***/ }, +/* 5 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Codex Editor Renderer Module + * + * @author Codex Team + * @version 1.0 + */ + + var renderer = function (renderer) { + + /** + * Asyncronously parses input JSON to redactor blocks + */ + renderer.makeBlocksFromData = function () { + + /** + * If redactor is empty, add first paragraph to start writing + */ + if (!codex.state.blocks.items.length) { + + codex.ui.addInitialBlock(); + return; + } + + Promise.resolve() + + /** First, get JSON from state */ + .then(function () { + return codex.state.blocks; + }) + + /** Then, start to iterate they */ + .then(codex.renderer.appendBlocks) + + /** Write log if something goes wrong */ + .catch(function (error) { + codex.core.log('Error while parsing JSON: %o', 'error', error); + }); + }; + + /** + * Parses JSON to blocks + * @param {object} data + * @return Primise -> nodeList + */ + renderer.appendBlocks = function (data) { + + var blocks = data.items; + + /** + * Sequence of one-by-one blocks appending + * Uses to save blocks order after async-handler + */ + var nodeSequence = Promise.resolve(); + + for (var index = 0; index < blocks.length; index++) { + + /** Add node to sequence at specified index */ + codex.renderer.appendNodeAtIndex(nodeSequence, blocks, index); + } + }; + + /** + * Append node at specified index + */ + renderer.appendNodeAtIndex = function (nodeSequence, blocks, index) { + + /** We need to append node to sequence */ + nodeSequence + + /** first, get node async-aware */ + .then(function () { + + return codex.renderer.getNodeAsync(blocks, index); + }) + + /** + * second, compose editor-block from JSON object + */ + .then(codex.renderer.createBlockFromData) + + /** + * now insert block to redactor + */ + .then(function (blockData) { + + /** + * blockData has 'block', 'type' and 'stretched' information + */ + codex.content.insertBlock(blockData); + + /** Pass created block to next step */ + return blockData.block; + }) + + /** Log if something wrong with node */ + .catch(function (error) { + codex.core.log('Node skipped while parsing because %o', 'error', error); + }); + }; + + /** + * Asynchronously returns block data from blocksList by index + * @return Promise to node + */ + renderer.getNodeAsync = function (blocksList, index) { + + return Promise.resolve().then(function () { + + return blocksList[index]; + }); + }; + + /** + * Creates editor block by JSON-data + * + * @uses render method of each plugin + * + * @param {object} blockData looks like + * { header : { + * text: '', + * type: 'H3', ... + * } + * } + * @return {object} with type and Element + */ + renderer.createBlockFromData = function (blockData) { + + /** New parser */ + var pluginName = blockData.type, + cover = blockData.cover; + + /** Get first key of object that stores plugin name */ + // for (var pluginName in blockData) break; + + /** Check for plugin existance */ + if (!codex.tools[pluginName]) { + throw Error('Plugin \xAB' + pluginName + '\xBB not found'); + } + + /** Check for plugin having render method */ + if (typeof codex.tools[pluginName].render != 'function') { + + throw Error('Plugin \xAB' + pluginName + '\xBB must have \xABrender\xBB method'); + } + + /** New Parser */ + var block = codex.tools[pluginName].render(blockData.data); + + /** is first-level block stretched */ + var stretched = codex.tools[pluginName].isStretched || false; + + /** Retrun type and block */ + return { + type: pluginName, + block: block, + stretched: stretched, + cover: cover + }; + }; + + return renderer; + }({}); + + module.exports = renderer; + +/***/ }, +/* 6 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Codex Editor Saver + * + * @author Codex Team + * @version 1.0.2 + */ + + var saver = function (saver) { + + /** + * Saves blocks + * @private + */ + saver.saveBlocks = function () { + + /** Save html content of redactor to memory */ + codex.state.html = codex.nodes.redactor.innerHTML; + + /** Empty jsonOutput state */ + codex.state.jsonOutput = []; + + Promise.resolve().then(function () { + return codex.nodes.redactor.childNodes; + }) + /** Making a sequence from separate blocks */ + .then(codex.saver.makeQueue).then(function () { + // codex.nodes.textarea.innerHTML = codex.state.html; + }).catch(function (error) { + console.log('Something happend'); + }); + }; + + saver.makeQueue = function (blocks) { + + var queue = Promise.resolve(); + + for (var index = 0; index < blocks.length; index++) { + + /** Add node to sequence at specified index */ + codex.saver.getBlockData(queue, blocks, index); + } + }; + + /** Gets every block and makes From Data */ + saver.getBlockData = function (queue, blocks, index) { + + queue.then(function () { + return codex.saver.getNodeAsync(blocks, index); + }).then(codex.saver.makeFormDataFromBlocks); + }; + + /** + * Asynchronously returns block data from blocksList by index + * @return Promise to node + */ + saver.getNodeAsync = function (blocksList, index) { + + return Promise.resolve().then(function () { + + return blocksList[index]; + }); + }; + + saver.makeFormDataFromBlocks = function (block) { + + var pluginName = block.dataset.tool; + + /** Check for plugin existance */ + if (!codex.tools[pluginName]) { + throw Error('Plugin \xAB' + pluginName + '\xBB not found'); + } + + /** Check for plugin having render method */ + if (typeof codex.tools[pluginName].save != 'function') { + + throw Error('Plugin \xAB' + pluginName + '\xBB must have save method'); + } + + /** Result saver */ + var blockContent = block.childNodes[0], + pluginsContent = blockContent.childNodes[0], + savedData = codex.tools[pluginName].save(pluginsContent), + output; + + output = { + type: pluginName, + data: savedData + }; + + /** + * Do not allow empty initial plugins block + */ + if (savedData.text.trim() == '' && pluginName == codex.settings.initialBlockPlugin) return; + + /** Marks Blocks that will be in main page */ + output.cover = block.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE); + + codex.state.jsonOutput.push(output); + }; + + return saver; + }({}); + + module.exports = saver; + +/***/ }, +/* 7 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + /** + * Codex Editor Content Module + * Works with DOM + * + * @author Codex Team + * @version 1.3.1 + */ + + var janitor = __webpack_require__(8); + + /** + * Default settings for sane. + * @uses html-janitor + */ + var Config = { + + tags: { + p: {}, + a: { + href: true, + target: '_blank', + rel: 'nofollow' + }, + i: {}, + b: {}, + strong: {}, + em: {}, + span: {} + } + }; + + var content = function (content) { + + /** + * Links to current active block + * @type {null | Element} + */ + content.currentNode = null; + + /** + * clicked in redactor area + * @type {null | Boolean} + */ + content.editorAreaHightlighted = null; + + /** + * Synchronizes redactor with original textarea + */ + content.sync = function () { + + codex.core.log('syncing...'); + + /** + * Save redactor content to codex.state + */ + codex.state.html = codex.nodes.redactor.innerHTML; + }; + + /** + * @deprecated + */ + content.getNodeFocused = function () { + + var selection = window.getSelection(), + focused; + + if (selection.anchorNode === null) { + return null; + } + + if (selection.anchorNode.nodeType == codex.core.nodeTypes.TAG) { + focused = selection.anchorNode; + } else { + focused = selection.focusNode.parentElement; + } + + if (!codex.parser.isFirstLevelBlock(focused)) { + + /** Iterate with parent nodes to find first-level*/ + var parent = focused.parentNode; + + while (parent && !codex.parser.isFirstLevelBlock(parent)) { + parent = parent.parentNode; + } + + focused = parent; + } + + if (focused != codex.nodes.redactor) { + return focused; + } + + return null; + }; + + /** + * Appends background to the block + */ + content.markBlock = function () { + + codex.content.currentNode.classList.add(codex.ui.className.BLOCK_HIGHLIGHTED); + }; + + /** + * Clear background + */ + content.clearMark = function () { + + if (codex.content.currentNode) { + codex.content.currentNode.classList.remove(codex.ui.className.BLOCK_HIGHLIGHTED); + } + }; + + /** + * @private + * + * Finds first-level block + * @param {Element} node - selected or clicked in redactors area node + */ + content.getFirstLevelBlock = function (node) { + + if (!codex.core.isDomNode(node)) { + node = node.parentNode; + } + + if (node === codex.nodes.redactor || node === document.body) { + + return null; + } else { + + while (!node.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) { + node = node.parentNode; + } + + return node; + } + }; + + /** + * Trigger this event when working node changed + * @param {Element} targetNode - first-level of this node will be current + * If targetNode is first-level then we set it as current else we look for parents to find first-level + */ + content.workingNodeChanged = function (targetNode) { + + /** Clear background from previous marked block before we change */ + codex.content.clearMark(); + + if (!targetNode) { + return; + } + + this.currentNode = this.getFirstLevelBlock(targetNode); + }; + + /** + * Replaces one redactor block with another + * @protected + * @param {Element} targetBlock - block to replace. Mostly currentNode. + * @param {Element} newBlock + * @param {string} newBlockType - type of new block; we need to store it to data-attribute + * + * [!] Function does not saves old block content. + * You can get it manually and pass with newBlock.innerHTML + */ + content.replaceBlock = function function_name(targetBlock, newBlock) { + + if (!targetBlock || !newBlock) { + codex.core.log('replaceBlock: missed params'); + return; + } + + /** If target-block is not a frist-level block, then we iterate parents to find it */ + while (!targetBlock.classList.contains(codex.ui.className.BLOCK_CLASSNAME)) { + targetBlock = targetBlock.parentNode; + } + + /** Replacing */ + codex.nodes.redactor.replaceChild(newBlock, targetBlock); + + /** + * Set new node as current + */ + codex.content.workingNodeChanged(newBlock); + + /** + * Add block handlers + */ + codex.ui.addBlockHandlers(newBlock); + + /** + * Save changes + */ + codex.ui.saveInputs(); + }; + + /** + * @private + * + * Inserts new block to redactor + * Wrapps block into a DIV with BLOCK_CLASSNAME class + * + * @param blockData {object} + * @param blockData.block {Element} element with block content + * @param blockData.type {string} block plugin + * @param needPlaceCaret {bool} pass true to set caret in new block + * + */ + content.insertBlock = function (blockData, needPlaceCaret) { + + var workingBlock = codex.content.currentNode, + newBlockContent = blockData.block, + blockType = blockData.type, + cover = blockData.cover, + isStretched = blockData.stretched; + + var newBlock = codex.content.composeNewBlock(newBlockContent, blockType, isStretched); + + if (cover === true) { + newBlock.classList.add(codex.ui.className.BLOCK_IN_FEED_MODE); + } + + if (workingBlock) { + + codex.core.insertAfter(workingBlock, newBlock); + } else { + /** + * If redactor is empty, append as first child + */ + codex.nodes.redactor.appendChild(newBlock); + } + + /** + * Block handler + */ + codex.ui.addBlockHandlers(newBlock); + + /** + * Set new node as current + */ + codex.content.workingNodeChanged(newBlock); + + /** + * Save changes + */ + codex.ui.saveInputs(); + + if (needPlaceCaret) { + + /** + * If we don't know input index then we set default value -1 + */ + var currentInputIndex = codex.caret.getCurrentInputIndex() || -1; + + if (currentInputIndex == -1) { + + var editableElement = newBlock.querySelector('[contenteditable]'), + emptyText = document.createTextNode(''); + + editableElement.appendChild(emptyText); + codex.caret.set(editableElement, 0, 0); + + codex.toolbar.move(); + codex.toolbar.showPlusButton(); + } else { + + if (currentInputIndex === codex.state.inputs.length - 1) return; + + /** Timeout for browsers execution */ + setTimeout(function () { + + /** Setting to the new input */ + codex.caret.setToNextBlock(currentInputIndex); + codex.toolbar.move(); + codex.toolbar.open(); + }, 10); + } + } + + /** + * Block is inserted, wait for new click that defined focusing on editors area + * @type {boolean} + */ + content.editorAreaHightlighted = false; + }; + + /** + * Replaces blocks with saving content + * @protected + * @param {Element} noteToReplace + * @param {Element} newNode + * @param {Element} blockType + */ + content.switchBlock = function (blockToReplace, newBlock, tool) { + + var newBlockComposed = codex.content.composeNewBlock(newBlock, tool); + + /** Replacing */ + codex.content.replaceBlock(blockToReplace, newBlockComposed); + + /** Save new Inputs when block is changed */ + codex.ui.saveInputs(); + }; + + /** + * Iterates between child noted and looking for #text node on deepest level + * @private + * @param {Element} block - node where find + * @param {int} postiton - starting postion + * Example: childNodex.length to find from the end + * or 0 to find from the start + * @return {Text} block + * @uses DFS + */ + content.getDeepestTextNodeFromPosition = function (block, position) { + + /** + * Clear Block from empty and useless spaces with trim. + * Such nodes we should remove + */ + var blockChilds = block.childNodes, + index, + node, + text; + + for (index = 0; index < blockChilds.length; index++) { + node = blockChilds[index]; + + if (node.nodeType == codex.core.nodeTypes.TEXT) { + + text = node.textContent.trim(); + + /** Text is empty. We should remove this child from node before we start DFS + * decrease the quantity of childs. + */ + if (text === '') { + + block.removeChild(node); + position--; + } + } + } + + if (block.childNodes.length === 0) { + return document.createTextNode(''); + } + + /** Setting default position when we deleted all empty nodes */ + if (position < 0) position = 1; + + var looking_from_start = false; + + /** For looking from START */ + if (position === 0) { + looking_from_start = true; + position = 1; + } + + while (position) { + + /** initial verticle of node. */ + if (looking_from_start) { + block = block.childNodes[0]; + } else { + block = block.childNodes[position - 1]; + } + + if (block.nodeType == codex.core.nodeTypes.TAG) { + + position = block.childNodes.length; + } else if (block.nodeType == codex.core.nodeTypes.TEXT) { + + position = 0; + } + } + + return block; + }; + + /** + * @private + */ + content.composeNewBlock = function (block, tool, isStretched) { + + var newBlock = codex.draw.node('DIV', codex.ui.className.BLOCK_CLASSNAME, {}), + blockContent = codex.draw.node('DIV', codex.ui.className.BLOCK_CONTENT, {}); + + blockContent.appendChild(block); + newBlock.appendChild(blockContent); + + if (isStretched) { + blockContent.classList.add(codex.ui.className.BLOCK_STRETCHED); + } + + newBlock.dataset.tool = tool; + return newBlock; + }; + + /** + * Returns Range object of current selection + */ + content.getRange = function () { + + var selection = window.getSelection().getRangeAt(0); + + return selection; + }; + + /** + * Divides block in two blocks (after and before caret) + * @private + * @param {Int} inputIndex - target input index + */ + content.splitBlock = function (inputIndex) { + + var selection = window.getSelection(), + anchorNode = selection.anchorNode, + anchorNodeText = anchorNode.textContent, + caretOffset = selection.anchorOffset, + textBeforeCaret, + textNodeBeforeCaret, + textAfterCaret, + textNodeAfterCaret; + + var currentBlock = codex.content.currentNode.querySelector('[contentEditable]'); + + textBeforeCaret = anchorNodeText.substring(0, caretOffset); + textAfterCaret = anchorNodeText.substring(caretOffset); + + textNodeBeforeCaret = document.createTextNode(textBeforeCaret); + + if (textAfterCaret) { + textNodeAfterCaret = document.createTextNode(textAfterCaret); + } + + var previousChilds = [], + nextChilds = [], + reachedCurrent = false; + + if (textNodeAfterCaret) { + nextChilds.push(textNodeAfterCaret); + } + + for (var i = 0, child; !!(child = currentBlock.childNodes[i]); i++) { + + if (child != anchorNode) { + if (!reachedCurrent) { + previousChilds.push(child); + } else { + nextChilds.push(child); + } + } else { + reachedCurrent = true; + } + } + + /** Clear current input */ + codex.state.inputs[inputIndex].innerHTML = ''; + + /** + * Append all childs founded before anchorNode + */ + var previousChildsLength = previousChilds.length; + + for (i = 0; i < previousChildsLength; i++) { + codex.state.inputs[inputIndex].appendChild(previousChilds[i]); + } + + codex.state.inputs[inputIndex].appendChild(textNodeBeforeCaret); + + /** + * Append text node which is after caret + */ + var nextChildsLength = nextChilds.length, + newNode = document.createElement('div'); + + for (i = 0; i < nextChildsLength; i++) { + newNode.appendChild(nextChilds[i]); + } + + newNode = newNode.innerHTML; + + /** This type of block creates when enter is pressed */ + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; + + /** + * Make new paragraph with text after caret + */ + codex.content.insertBlock({ + type: NEW_BLOCK_TYPE, + block: codex.tools[NEW_BLOCK_TYPE].render({ + text: newNode + }) + }, true); + }; + + /** + * Merges two blocks — current and target + * If target index is not exist, then previous will be as target + */ + content.mergeBlocks = function (currentInputIndex, targetInputIndex) { + + /** If current input index is zero, then prevent method execution */ + if (currentInputIndex === 0) { + return; + } + + var targetInput, + currentInputContent = codex.state.inputs[currentInputIndex].innerHTML; + + if (!targetInputIndex) { + + targetInput = codex.state.inputs[currentInputIndex - 1]; + } else { + + targetInput = codex.state.inputs[targetInputIndex]; + } + + targetInput.innerHTML += currentInputContent; + }; + + /** + * @private + * + * Callback for HTML Mutations + * @param {Array} mutation - Mutation Record + */ + content.paste = function (mutation) { + + var workingNode = codex.content.currentNode, + tool = workingNode.dataset.tool; + + if (codex.tools[tool].allowedToPaste) { + codex.content.sanitize.call(this, mutation.addedNodes); + } else { + codex.content.pasteTextContent(mutation.addedNodes); + } + }; + + /** + * @private + * + * gets only text/plain content of node + * @param {Element} target - HTML node + */ + content.pasteTextContent = function (nodes) { + + var node = nodes[0], + textNode; + + if (!node) { + return; + } + + if (node.nodeType == codex.core.nodeTypes.TEXT) { + textNode = document.createTextNode(node); + } else { + textNode = document.createTextNode(node.textContent); + } + + if (codex.core.isDomNode(node)) { + node.parentNode.replaceChild(textNode, node); + } + }; + + /** + * @private + * + * Sanitizes HTML content + * @param {Element} target - inserted element + * @uses Sanitize library html-janitor + */ + content.sanitize = function (target) { + + if (!target) { + return; + } + + var node = target[0]; + + if (!node) { + return; + } + + /** + * Disconnect Observer + * hierarchy of function calls inherits context of observer + */ + this.disconnect(); + + /** + * Don't sanitize text node + */ + if (node.nodeType == codex.core.nodeTypes.TEXT) { + return; + } + + /** + * Clear dirty content + */ + var sanitizer = new janitor(Config), + clear = sanitizer.clean(node.outerHTML); + + var div = codex.draw.node('DIV', [], { innerHTML: clear }); + node.replaceWith(div.childNodes[0]); + + // for (i = 0; i < clearHTML.childNodes.length; i++) { + // + // var tag = clearHTML.childNodes[i], + // blockType = null; + // + // for (tool in codex.tools) { + // + // var handleTags = codex.tools[tool].handleTagOnPaste; + // + // if (!handleTags) { + // continue; + // } + // + // if (handleTags.indexOf(tag.tagName) !== -1) { + // blockType = codex.tools[tool]; + // break; + // } + // + // } + // + // if (blockType) { + // codex.parser.insertPastedContent(blockType, tag); + // } + // + // } + }; + + return content; + }({}); + + module.exports = content; + +/***/ }, +/* 8 */ +/***/ function(module, exports, __webpack_require__) { + + var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) { + if (true) { + !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); + } else if (typeof exports === 'object') { + module.exports = factory(); + } else { + root.HTMLJanitor = factory(); + } + }(this, function () { + + /** + * @param {Object} config.tags Dictionary of allowed tags. + * @param {boolean} config.keepNestedBlockElements Default false. + */ + function HTMLJanitor(config) { + + var tagDefinitions = config['tags']; + var tags = Object.keys(tagDefinitions); + + var validConfigValues = tags + .map(function(k) { return typeof tagDefinitions[k]; }) + .every(function(type) { return type === 'object' || type === 'boolean' || type === 'function'; }); + + if(!validConfigValues) { + throw new Error("The configuration was invalid"); + } + + this.config = config; + } + + // TODO: not exhaustive? + var blockElementNames = ['P', 'LI', 'TD', 'TH', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'PRE']; + function isBlockElement(node) { + return blockElementNames.indexOf(node.nodeName) !== -1; + } + + var inlineElementNames = ['A', 'B', 'STRONG', 'I', 'EM', 'SUB', 'SUP', 'U', 'STRIKE']; + function isInlineElement(node) { + return inlineElementNames.indexOf(node.nodeName) !== -1; + } + + HTMLJanitor.prototype.clean = function (html) { + var sandbox = document.createElement('div'); + sandbox.innerHTML = html; + + this._sanitize(sandbox); + + return sandbox.innerHTML; + }; + + HTMLJanitor.prototype._sanitize = function (parentNode) { + var treeWalker = createTreeWalker(parentNode); + var node = treeWalker.firstChild(); + if (!node) { return; } + + do { + // Ignore nodes that have already been sanitized + if (node._sanitized) { + continue; + } + + if (node.nodeType === Node.TEXT_NODE) { + // If this text node is just whitespace and the previous or next element + // sibling is a block element, remove it + // N.B.: This heuristic could change. Very specific to a bug with + // `contenteditable` in Firefox: http://jsbin.com/EyuKase/1/edit?js,output + // FIXME: make this an option? + if (node.data.trim() === '' + && ((node.previousElementSibling && isBlockElement(node.previousElementSibling)) + || (node.nextElementSibling && isBlockElement(node.nextElementSibling)))) { + parentNode.removeChild(node); + this._sanitize(parentNode); + break; + } else { + continue; + } + } + + // Remove all comments + if (node.nodeType === Node.COMMENT_NODE) { + parentNode.removeChild(node); + this._sanitize(parentNode); + break; + } + + var isInline = isInlineElement(node); + var containsBlockElement; + if (isInline) { + containsBlockElement = Array.prototype.some.call(node.childNodes, isBlockElement); + } + + // Block elements should not be nested (e.g.

  • ...); if + // they are, we want to unwrap the inner block element. + var isNotTopContainer = !! parentNode.parentNode; + var isNestedBlockElement = + isBlockElement(parentNode) && + isBlockElement(node) && + isNotTopContainer; + + var nodeName = node.nodeName.toLowerCase(); + + var allowedAttrs = getAllowedAttrs(this.config, nodeName, node); + + var isInvalid = isInline && containsBlockElement; + + // Drop tag entirely according to the whitelist *and* if the markup + // is invalid. + if (isInvalid || shouldRejectNode(node, allowedAttrs) + || (!this.config.keepNestedBlockElements && isNestedBlockElement)) { + // Do not keep the inner text of SCRIPT/STYLE elements. + if (! (node.nodeName === 'SCRIPT' || node.nodeName === 'STYLE')) { + while (node.childNodes.length > 0) { + parentNode.insertBefore(node.childNodes[0], node); + } + } + parentNode.removeChild(node); + + this._sanitize(parentNode); + break; + } + + // Sanitize attributes + for (var a = 0; a < node.attributes.length; a += 1) { + var attr = node.attributes[a]; + + if (shouldRejectAttr(attr, allowedAttrs, node)) { + node.removeAttribute(attr.name); + // Shift the array to continue looping. + a = a - 1; + } + } + + // Sanitize children + this._sanitize(node); + + // Mark node as sanitized so it's ignored in future runs + node._sanitized = true; + } while ((node = treeWalker.nextSibling())); + }; + + function createTreeWalker(node) { + return document.createTreeWalker(node, + NodeFilter.SHOW_TEXT | NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT, + null, false); + } + + function getAllowedAttrs(config, nodeName, node){ + if (typeof config.tags[nodeName] === 'function') { + return config.tags[nodeName](node); + } else { + return config.tags[nodeName]; + } + } + + function shouldRejectNode(node, allowedAttrs){ + if (typeof allowedAttrs === 'undefined') { + return true; + } else if (typeof allowedAttrs === 'boolean') { + return !allowedAttrs; + } + + return false; + } + + function shouldRejectAttr(attr, allowedAttrs, node){ + var attrName = attr.name.toLowerCase(); + + if (allowedAttrs === true){ + return false; + } else if (typeof allowedAttrs[attrName] === 'function'){ + return !allowedAttrs[attrName](attr.value, node); + } else if (typeof allowedAttrs[attrName] === 'undefined'){ + return true; + } else if (allowedAttrs[attrName] === false) { + return true; + } else if (typeof allowedAttrs[attrName] === 'string') { + return (allowedAttrs[attrName] !== attr.value); + } + + return false; + } + + return HTMLJanitor; + + })); + + +/***/ }, +/* 9 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + /** + * Codex Editor toolbar module + * + * Contains: + * - Inline toolbox + * - Toolbox within plus button + * - Settings section + * + * @author Codex Team + * @version 1.0 + */ + var toolbar = function (toolbar) { + + toolbar.init = function () { + toolbar.settings = __webpack_require__(10); + toolbar.inline = __webpack_require__(11); + toolbar.toolbox = __webpack_require__(12); + }; + + /** + * Margin between focused node and toolbar + */ + toolbar.defaultToolbarHeight = 49; + + toolbar.defaultOffset = 34; + + toolbar.opened = false; + + toolbar.current = null; + + /** + * @protected + */ + toolbar.open = function () { + + codex.nodes.toolbar.classList.add('opened'); + this.opened = true; + }; + + /** + * @protected + */ + toolbar.close = function () { + + codex.nodes.toolbar.classList.remove('opened'); + + toolbar.opened = false; + toolbar.current = null; + + for (var button in codex.nodes.toolbarButtons) { + codex.nodes.toolbarButtons[button].classList.remove('selected'); + } + + /** Close toolbox when toolbar is not displayed */ + codex.toolbar.toolbox.close(); + codex.toolbar.settings.close(); + }; + + toolbar.toggle = function () { + + if (!this.opened) { + + this.open(); + } else { + + this.close(); + } + }; + + toolbar.hidePlusButton = function () { + codex.nodes.plusButton.classList.add('hide'); + }; + + toolbar.showPlusButton = function () { + codex.nodes.plusButton.classList.remove('hide'); + }; + + /** + * Moving toolbar to the specified node + */ + toolbar.move = function () { + + /** Close Toolbox when we move toolbar */ + codex.toolbar.toolbox.close(); + + if (!codex.content.currentNode) { + return; + } + + var toolbarHeight = codex.nodes.toolbar.clientHeight || codex.toolbar.defaultToolbarHeight, + newYCoordinate = codex.content.currentNode.offsetTop - codex.toolbar.defaultToolbarHeight / 2 + codex.toolbar.defaultOffset; + + codex.nodes.toolbar.style.transform = 'translate3D(0, ' + Math.floor(newYCoordinate) + 'px, 0)'; + + /** Close trash actions */ + codex.toolbar.settings.hideRemoveActions(); + }; + + return toolbar; + }({}); + + toolbar.init(); + + module.exports = toolbar; + +/***/ }, +/* 10 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + var settings = function (settings) { + + settings.init = function () { + __webpack_require__(7); + }; + + settings.opened = false; + + settings.setting = null; + settings.actions = null; + + settings.cover = null; + + /** + * Append and open settings + */ + settings.open = function (toolType) { + + /** + * Append settings content + * It's stored in tool.settings + */ + if (!codex.tools[toolType] || !codex.core.isDomNode(codex.tools[toolType].settings)) { + + codex.core.log('Plugin \xAB' + toolType + '\xBB has no settings', 'warn'); + // codex.nodes.pluginSettings.innerHTML = `Плагин «${toolType}» не имеет настроек`; + } else { + + codex.nodes.pluginSettings.appendChild(codex.tools[toolType].settings); + } + + var currentBlock = codex.content.currentNode; + + /** Open settings block */ + codex.nodes.blockSettings.classList.add('opened'); + codex.toolbar.settings.addDefaultSettings(); + this.opened = true; + }; + + /** + * Close and clear settings + */ + settings.close = function () { + + codex.nodes.blockSettings.classList.remove('opened'); + codex.nodes.pluginSettings.innerHTML = ''; + + this.opened = false; + }; + + /** + * @param {string} toolType - plugin type + */ + settings.toggle = function (toolType) { + + if (!this.opened) { + + this.open(toolType); + } else { + + this.close(); + } + }; + + /** + * This function adds default core settings + */ + settings.addDefaultSettings = function () { + + /** list of default settings */ + var feedModeToggler; + + /** Clear block and append initialized settings */ + codex.nodes.defaultSettings.innerHTML = ''; + + /** Init all default setting buttons */ + feedModeToggler = codex.toolbar.settings.makeFeedModeToggler(); + + /** + * Fill defaultSettings + */ + + /** + * Button that enables/disables Feed-mode + * Feed-mode means that block will be showed in articles-feed like cover + */ + codex.nodes.defaultSettings.appendChild(feedModeToggler); + }; + + /** + * Cover setting. + * This tune highlights block, so that it may be used for showing target block on main page + * Draw different setting when block is marked for main page + * If TRUE, then we show button that removes this selection + * Also defined setting "Click" events will be listened and have separate callbacks + * + * @return {Element} node/button that we place in default settings block + */ + settings.makeFeedModeToggler = function () { + + var isFeedModeActivated = codex.toolbar.settings.isFeedModeActivated(), + setting, + data; + + if (!isFeedModeActivated) { + + data = { + innerHTML: 'Вывести в ленте' + }; + } else { + + data = { + innerHTML: 'Не выводить в ленте' + }; + } + + setting = codex.draw.node('DIV', codex.ui.className.SETTINGS_ITEM, data); + setting.addEventListener('click', codex.toolbar.settings.updateFeedMode, false); + + return setting; + }; + + /** + * Updates Feed-mode + */ + settings.updateFeedMode = function () { + + var currentNode = codex.content.currentNode; + + currentNode.classList.toggle(codex.ui.className.BLOCK_IN_FEED_MODE); + + codex.toolbar.settings.close(); + }; + + settings.isFeedModeActivated = function () { + + var currentBlock = codex.content.currentNode; + + if (currentBlock) { + return currentBlock.classList.contains(codex.ui.className.BLOCK_IN_FEED_MODE); + } else { + return false; + } + }; + + /** + * Here we will draw buttons and add listeners to components + */ + settings.makeRemoveBlockButton = function () { + + var removeBlockWrapper = codex.draw.node('SPAN', 'ce-toolbar__remove-btn', {}), + settingButton = codex.draw.node('SPAN', 'ce-toolbar__remove-setting', { innerHTML: '' }), + actionWrapper = codex.draw.node('DIV', 'ce-toolbar__remove-confirmation', {}), + confirmAction = codex.draw.node('DIV', 'ce-toolbar__remove-confirm', { textContent: 'Удалить блок' }), + cancelAction = codex.draw.node('DIV', 'ce-toolbar__remove-cancel', { textContent: 'Отменить удаление' }); + + settingButton.addEventListener('click', codex.toolbar.settings.removeButtonClicked, false); + + confirmAction.addEventListener('click', codex.toolbar.settings.confirmRemovingRequest, false); + + cancelAction.addEventListener('click', codex.toolbar.settings.cancelRemovingRequest, false); + + actionWrapper.appendChild(confirmAction); + actionWrapper.appendChild(cancelAction); + + removeBlockWrapper.appendChild(settingButton); + removeBlockWrapper.appendChild(actionWrapper); + + /** Save setting */ + codex.toolbar.settings.setting = settingButton; + codex.toolbar.settings.actions = actionWrapper; + + return removeBlockWrapper; + }; + + settings.removeButtonClicked = function () { + + var action = codex.toolbar.settings.actions; + + if (action.classList.contains('opened')) { + codex.toolbar.settings.hideRemoveActions(); + } else { + codex.toolbar.settings.showRemoveActions(); + } + + codex.toolbar.toolbox.close(); + codex.toolbar.settings.close(); + }; + + settings.cancelRemovingRequest = function () { + + codex.toolbar.settings.actions.classList.remove('opened'); + }; + + settings.confirmRemovingRequest = function () { + + var currentBlock = codex.content.currentNode, + firstLevelBlocksCount; + + currentBlock.remove(); + + firstLevelBlocksCount = codex.nodes.redactor.childNodes.length; + + /** + * If all blocks are removed + */ + if (firstLevelBlocksCount === 0) { + + /** update currentNode variable */ + codex.content.currentNode = null; + + /** Inserting new empty initial block */ + codex.ui.addInitialBlock(); + } + + codex.ui.saveInputs(); + + codex.toolbar.close(); + }; + + settings.showRemoveActions = function () { + codex.toolbar.settings.actions.classList.add('opened'); + }; + + settings.hideRemoveActions = function () { + codex.toolbar.settings.actions.classList.remove('opened'); + }; + + return settings; + }({}); + + settings.init(); + + module.exports = settings; + +/***/ }, +/* 11 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Inline toolbar + * + * Contains from tools: + * Bold, Italic, Underline and Anchor + * + * @author Codex Team + * @version 1.0 + */ + var inline = function (inline) { + + inline.init = function () {}; + + inline.buttonsOpened = null; + inline.actionsOpened = null; + inline.wrappersOffset = null; + + /** + * saving selection that need for execCommand for styling + * + */ + inline.storedSelection = null; + + /** + * @protected + * + * Open inline toobar + */ + inline.show = function () { + + var currentNode = codex.content.currentNode, + tool = currentNode.dataset.tool, + plugin; + + /** + * tool allowed to open inline toolbar + */ + plugin = codex.tools[tool]; + + if (!plugin.showInlineToolbar) return; + + var selectedText = this.getSelectionText(), + toolbar = codex.nodes.inlineToolbar.wrapper, + buttons = codex.nodes.inlineToolbar.buttons; + + if (selectedText.length > 0) { + + /** Move toolbar and open */ + codex.toolbar.inline.move(); + + /** Open inline toolbar */ + toolbar.classList.add('opened'); + + /** show buttons of inline toolbar */ + codex.toolbar.inline.showButtons(); + } + }; + + /** + * @protected + * + * Closes inline toolbar + */ + inline.close = function () { + var toolbar = codex.nodes.inlineToolbar.wrapper; + toolbar.classList.remove('opened'); + }; + + /** + * @private + * + * Moving toolbar + */ + inline.move = function () { + + if (!this.wrappersOffset) { + this.wrappersOffset = this.getWrappersOffset(); + } + + var coords = this.getSelectionCoords(), + defaultOffset = 0, + toolbar = codex.nodes.inlineToolbar.wrapper, + newCoordinateX, + newCoordinateY; + + if (toolbar.offsetHeight === 0) { + defaultOffset = 40; + } + + newCoordinateX = coords.x - this.wrappersOffset.left; + newCoordinateY = coords.y + window.scrollY - this.wrappersOffset.top - defaultOffset - toolbar.offsetHeight; + + toolbar.style.transform = 'translate3D(' + Math.floor(newCoordinateX) + 'px, ' + Math.floor(newCoordinateY) + 'px, 0)'; + + /** Close everything */ + codex.toolbar.inline.closeButtons(); + codex.toolbar.inline.closeAction(); + }; + + /** + * @private + * + * Tool Clicked + */ + + inline.toolClicked = function (event, type) { + + /** + * For simple tools we use default browser function + * For more complicated tools, we should write our own behavior + */ + switch (type) { + case 'createLink': + codex.toolbar.inline.createLinkAction(event, type);break; + default: + codex.toolbar.inline.defaultToolAction(type);break; + } + + /** + * highlight buttons + * after making some action + */ + codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight); + }; + + /** + * @private + * + * Saving wrappers offset in DOM + */ + inline.getWrappersOffset = function () { + + var wrapper = codex.nodes.wrapper, + offset = this.getOffset(wrapper); + + this.wrappersOffset = offset; + return offset; + }; + + /** + * @private + * + * Calculates offset of DOM element + * + * @param el + * @returns {{top: number, left: number}} + */ + inline.getOffset = function (el) { + + var _x = 0; + var _y = 0; + + while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) { + _x += el.offsetLeft + el.clientLeft; + _y += el.offsetTop + el.clientTop; + el = el.offsetParent; + } + return { top: _y, left: _x }; + }; + + /** + * @private + * + * Calculates position of selected text + * @returns {{x: number, y: number}} + */ + inline.getSelectionCoords = function () { + + var sel = document.selection, + range; + var x = 0, + y = 0; + + if (sel) { + + if (sel.type != "Control") { + range = sel.createRange(); + range.collapse(true); + x = range.boundingLeft; + y = range.boundingTop; + } + } else if (window.getSelection) { + + sel = window.getSelection(); + + if (sel.rangeCount) { + + range = sel.getRangeAt(0).cloneRange(); + if (range.getClientRects) { + range.collapse(true); + var rect = range.getClientRects()[0]; + + if (!rect) { + return; + } + + x = rect.left; + y = rect.top; + } + } + } + return { x: x, y: y }; + }; + + /** + * @private + * + * Returns selected text as String + * @returns {string} + */ + inline.getSelectionText = function getSelectionText() { + + var selectedText = ""; + + if (window.getSelection) { + // all modern browsers and IE9+ + selectedText = window.getSelection().toString(); + } + + return selectedText; + }; + + /** Opens buttons block */ + inline.showButtons = function () { + + var buttons = codex.nodes.inlineToolbar.buttons; + buttons.classList.add('opened'); + + codex.toolbar.inline.buttonsOpened = true; + + /** highlight buttons */ + codex.nodes.inlineToolbar.buttons.childNodes.forEach(codex.toolbar.inline.hightlight); + }; + + /** Makes buttons disappear */ + inline.closeButtons = function () { + var buttons = codex.nodes.inlineToolbar.buttons; + buttons.classList.remove('opened'); + + codex.toolbar.inline.buttonsOpened = false; + }; + + /** Open buttons defined action if exist */ + inline.showActions = function () { + var action = codex.nodes.inlineToolbar.actions; + action.classList.add('opened'); + + codex.toolbar.inline.actionsOpened = true; + }; + + /** Close actions block */ + inline.closeAction = function () { + var action = codex.nodes.inlineToolbar.actions; + action.innerHTML = ''; + action.classList.remove('opened'); + codex.toolbar.inline.actionsOpened = false; + }; + + /** Action for link creation or for setting anchor */ + inline.createLinkAction = function (event, type) { + + var isActive = this.isLinkActive(); + + var editable = codex.content.currentNode, + storedSelection = codex.toolbar.inline.storedSelection; + + if (isActive) { + + var selection = window.getSelection(), + anchorNode = selection.anchorNode; + + storedSelection = codex.toolbar.inline.saveSelection(editable); + + /** + * Changing stored selection. if we want to remove anchor from word + * we should remove anchor from whole word, not only selected part. + * The solution is than we get the length of current link + * Change start position to - end of selection minus length of anchor + */ + codex.toolbar.inline.restoreSelection(editable, storedSelection); + + codex.toolbar.inline.defaultToolAction('unlink'); + } else { + + /** Create input and close buttons */ + var action = codex.draw.inputForLink(); + codex.nodes.inlineToolbar.actions.appendChild(action); + + codex.toolbar.inline.closeButtons(); + codex.toolbar.inline.showActions(); + + storedSelection = codex.toolbar.inline.saveSelection(editable); + + /** + * focus to input + * Solution: https://developer.mozilla.org/ru/docs/Web/API/HTMLElement/focus + * Prevents event after showing input and when we need to focus an input which is in unexisted form + */ + action.focus(); + event.preventDefault(); + + /** Callback to link action */ + action.addEventListener('keydown', function (event) { + + if (event.keyCode == codex.core.keys.ENTER) { + + codex.toolbar.inline.restoreSelection(editable, storedSelection); + codex.toolbar.inline.setAnchor(action.value); + + /** + * Preventing events that will be able to happen + */ + event.preventDefault(); + event.stopImmediatePropagation(); + + codex.toolbar.inline.clearRange(); + } + }, false); + } + }; + + inline.isLinkActive = function () { + + var isActive = false; + + codex.nodes.inlineToolbar.buttons.childNodes.forEach(function (tool) { + var dataType = tool.dataset.type; + + if (dataType == 'link' && tool.classList.contains('hightlighted')) { + isActive = true; + } + }); + + return isActive; + }; + + /** default action behavior of tool */ + inline.defaultToolAction = function (type) { + document.execCommand(type, false, null); + }; + + /** + * @private + * + * Sets URL + * + * @param {String} url - URL + */ + inline.setAnchor = function (url) { + + document.execCommand('createLink', false, url); + + /** Close after URL inserting */ + codex.toolbar.inline.closeAction(); + }; + + /** + * @private + * + * Saves selection + */ + inline.saveSelection = function (containerEl) { + + var range = window.getSelection().getRangeAt(0), + preSelectionRange = range.cloneRange(), + start; + + preSelectionRange.selectNodeContents(containerEl); + preSelectionRange.setEnd(range.startContainer, range.startOffset); + + start = preSelectionRange.toString().length; + + return { + start: start, + end: start + range.toString().length + }; + }; + + /** + * @private + * + * Sets to previous selection (Range) + * + * @param {Element} containerEl - editable element where we restore range + * @param {Object} savedSel - range basic information to restore + */ + inline.restoreSelection = function (containerEl, savedSel) { + + var range = document.createRange(), + charIndex = 0; + + range.setStart(containerEl, 0); + range.collapse(true); + + var nodeStack = [containerEl], + node, + foundStart = false, + stop = false, + nextCharIndex; + + while (!stop && (node = nodeStack.pop())) { + + if (node.nodeType == 3) { + + nextCharIndex = charIndex + node.length; + + if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) { + range.setStart(node, savedSel.start - charIndex); + foundStart = true; + } + if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) { + range.setEnd(node, savedSel.end - charIndex); + stop = true; + } + charIndex = nextCharIndex; + } else { + var i = node.childNodes.length; + while (i--) { + nodeStack.push(node.childNodes[i]); + } + } + } + + var sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + }; + + /** + * @private + * + * Removes all ranges from window selection + */ + inline.clearRange = function () { + var selection = window.getSelection(); + selection.removeAllRanges(); + }; + + /** + * @private + * + * sets or removes hightlight + */ + inline.hightlight = function (tool) { + var dataType = tool.dataset.type; + + if (document.queryCommandState(dataType)) { + codex.toolbar.inline.setButtonHighlighted(tool); + } else { + codex.toolbar.inline.removeButtonsHighLight(tool); + } + + /** + * + * hightlight for anchors + */ + var selection = window.getSelection(), + tag = selection.anchorNode.parentNode; + + if (tag.tagName == 'A' && dataType == 'link') { + codex.toolbar.inline.setButtonHighlighted(tool); + } + }; + + /** + * @private + * + * Mark button if text is already executed + */ + inline.setButtonHighlighted = function (button) { + button.classList.add('hightlighted'); + + /** At link tool we also change icon */ + if (button.dataset.type == 'link') { + var icon = button.childNodes[0]; + icon.classList.remove('ce-icon-link'); + icon.classList.add('ce-icon-unlink'); + } + }; + + /** + * @private + * + * Removes hightlight + */ + inline.removeButtonsHighLight = function (button) { + button.classList.remove('hightlighted'); + + /** At link tool we also change icon */ + if (button.dataset.type == 'link') { + var icon = button.childNodes[0]; + icon.classList.remove('ce-icon-unlink'); + icon.classList.add('ce-icon-link'); + } + }; + + return inline; + }({}); + + inline.init(); + + module.exports = inline; + +/***/ }, +/* 12 */ +/***/ function(module, exports, __webpack_require__) { + + 'use strict'; + + /** + * Codex Editor toolbox + * + * All tools be able to appended here + * + * @author Codex Team + * @version 1.0 + */ + + var toolbox = function (toolbox) { + + toolbox.init = function () { + + __webpack_require__(9); + }; + + toolbox.opened = false; + + /** Shows toolbox */ + toolbox.open = function () { + + /** Close setting if toolbox is opened */ + if (codex.toolbar.settings.opened) { + + codex.toolbar.settings.close(); + } + + /** display toolbox */ + codex.nodes.toolbox.classList.add('opened'); + + /** Animate plus button */ + codex.nodes.plusButton.classList.add('clicked'); + + /** toolbox state */ + codex.toolbar.toolbox.opened = true; + }; + + /** Closes toolbox */ + toolbox.close = function () { + + /** Makes toolbox disapear */ + codex.nodes.toolbox.classList.remove('opened'); + + /** Rotate plus button */ + codex.nodes.plusButton.classList.remove('clicked'); + + /** toolbox state */ + codex.toolbar.toolbox.opened = false; + }; + + toolbox.leaf = function () { + + var currentTool = codex.toolbar.current, + tools = Object.keys(codex.tools), + barButtons = codex.nodes.toolbarButtons, + nextToolIndex, + hiddenToolsAmount = 0, + toolToSelect; + + /** Count toolbox hidden tools */ + for (var tool in codex.tools) { + + if (!codex.tools[tool].displayInToolbox) { + + hiddenToolsAmount++; + } + } + + if (!currentTool) { + + /** Get first tool from object*/ + for (toolToSelect in barButtons) { + break; + } + } else { + + nextToolIndex = tools.indexOf(currentTool) + 1; + + var toolIsLastInToolbox = nextToolIndex == tools.length - (hiddenToolsAmount - 2); + + if (toolIsLastInToolbox) { + + nextToolIndex = 0; + + /** getting first displayed tool */ + for (var tool in codex.tools) { + + if (codex.tools[tool].displayInToolbox) { + + break; + } + + nextToolIndex++; + } + } + + toolToSelect = tools[nextToolIndex]; + } + + for (var button in barButtons) { + barButtons[button].classList.remove('selected'); + }barButtons[toolToSelect].classList.add('selected'); + codex.toolbar.current = toolToSelect; + }; + + /** + * Transforming selected node type into selected toolbar element type + * @param {event} event + */ + toolbox.toolClicked = function () { + + /** + * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty + */ + var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter', 'video'], + tool = codex.tools[codex.toolbar.current], + workingNode = codex.content.currentNode, + currentInputIndex = codex.caret.inputIndex, + newBlockContent, + appendCallback, + blockData; + + /** Make block from plugin */ + newBlockContent = tool.make(); + + /** information about block */ + blockData = { + block: newBlockContent, + type: tool.type, + stretched: false + }; + + if (workingNode && UNREPLACEBLE_TOOLS.indexOf(workingNode.dataset.tool) === -1 && workingNode.textContent.trim() === '') { + + /** Replace current block */ + codex.content.switchBlock(workingNode, newBlockContent, tool.type); + } else { + + /** Insert new Block from plugin */ + codex.content.insertBlock(blockData); + + /** increase input index */ + currentInputIndex++; + } + + /** Fire tool append callback */ + appendCallback = tool.appendCallback; + + if (appendCallback && typeof appendCallback == 'function') { + + appendCallback.call(event); + } + + setTimeout(function () { + + /** Set caret to current block */ + codex.caret.setToBlock(currentInputIndex); + }, 10); + + /** + * Changing current Node + */ + codex.content.workingNodeChanged(); + + /** + * Move toolbar when node is changed + */ + codex.toolbar.move(); + }; + + return toolbox; + }({}); + + toolbox.init(); + + module.exports = toolbox; + +/***/ }, +/* 13 */ +/***/ function(module, exports) { + + "use strict"; + + /** + * Codex Editor tools + * This tools will be appended in toolbox + * + * @author Codex Team + * @version 1.0 + */ + + var tools = function (tools) { + + return tools; + }({}); + + module.exports = tools; + +/***/ }, +/* 14 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Codex Editor callbacks module + * + * @author Codex Team + * @version 1.2.5 + */ + + var callbacks = function (callbacks) { + + callbacks.redactorSyncTimeout = null; + + callbacks.globalKeydown = function (event) { + switch (event.keyCode) { + case codex.core.keys.ENTER: + codex.callback.enterKeyPressed(event);break; + } + }; + + callbacks.redactorKeyDown = function (event) { + switch (event.keyCode) { + case codex.core.keys.TAB: + codex.callback.tabKeyPressed(event);break; + case codex.core.keys.ENTER: + codex.callback.enterKeyPressedOnRedactorZone(event);break; + case codex.core.keys.ESC: + codex.callback.escapeKeyPressed(event);break; + default: + codex.callback.defaultKeyPressed(event);break; + } + }; + + callbacks.globalKeyup = function (event) { + switch (event.keyCode) { + case codex.core.keys.UP: + case codex.core.keys.LEFT: + case codex.core.keys.RIGHT: + case codex.core.keys.DOWN: + codex.callback.arrowKeyPressed(event);break; + } + }; + + callbacks.tabKeyPressed = function (event) { + + if (!codex.toolbar.opened) { + codex.toolbar.open(); + } + + if (codex.toolbar.opened && !codex.toolbar.toolbox.opened) { + codex.toolbar.toolbox.open(); + } else { + codex.toolbar.toolbox.leaf(); + } + + event.preventDefault(); + }; + + callbacks.enterKeyPressed = function (event) { + + if (codex.content.editorAreaHightlighted) { + + /** + * it means that we lose input index, saved index before is not correct + * therefore we need to set caret when we insert new block + */ + codex.caret.inputIndex = -1; + + codex.callback.enterPressedOnBlock(); + } + }; + + /** + * ENTER key handler + * Makes new paragraph block + */ + callbacks.enterKeyPressedOnRedactorZone = function (event) { + + if (event.target.contentEditable == 'true') { + + /** Update input index */ + codex.caret.saveCurrentInputIndex(); + } + + if (!codex.content.currentNode) { + /** + * Enter key pressed in first-level block area + */ + codex.callback.enterPressedOnBlock(event); + return; + } + + var currentInputIndex = codex.caret.getCurrentInputIndex() || 0, + workingNode = codex.content.currentNode, + tool = workingNode.dataset.tool, + isEnterPressedOnToolbar = codex.toolbar.opened && codex.toolbar.current && event.target == codex.state.inputs[currentInputIndex]; + + /** The list of tools which needs the default browser behaviour */ + var enableLineBreaks = codex.tools[tool].enableLineBreaks; + + /** This type of block creates when enter is pressed */ + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; + + /** + * When toolbar is opened, select tool instead of making new paragraph + */ + if (isEnterPressedOnToolbar) { + + event.preventDefault(); + + codex.toolbar.toolbox.toolClicked(event); + + codex.toolbar.close(); + + /** + * Stop other listeners callback executions + */ + event.stopPropagation(); + event.stopImmediatePropagation(); + + return; + } + + /** + * Allow making new

    in same block by SHIFT+ENTER and forbids to prevent default browser behaviour + */ + if (event.shiftKey && !enableLineBreaks) { + codex.callback.enterPressedOnBlock(codex.content.currentBlock, event); + event.preventDefault(); + } else if (event.shiftKey && !enableLineBreaks || !event.shiftKey && enableLineBreaks) { + /** XOR */ + return; + } + + var isLastTextNode = false, + currentSelection = window.getSelection(), + currentSelectedNode = currentSelection.anchorNode, + caretAtTheEndOfText = codex.caret.position.atTheEnd(), + isTextNodeHasParentBetweenContenteditable = false; + + /** + * Workaround situation when caret at the Text node that has some wrapper Elements + * Split block cant handle this. + * We need to save default behavior + */ + isTextNodeHasParentBetweenContenteditable = currentSelectedNode && currentSelectedNode.parentNode.contentEditable != "true"; + + /** + * Split blocks when input has several nodes and caret placed in textNode + */ + if (currentSelectedNode.nodeType == codex.core.nodeTypes.TEXT && !isTextNodeHasParentBetweenContenteditable && !caretAtTheEndOfText) { + + event.preventDefault(); + + codex.core.log('Splitting Text node...'); + + codex.content.splitBlock(currentInputIndex); + + /** Show plus button when next input after split is empty*/ + if (!codex.state.inputs[currentInputIndex + 1].textContent.trim()) { + codex.toolbar.showPlusButton(); + } + } else { + + if (currentSelectedNode && currentSelectedNode.parentNode) { + + isLastTextNode = !currentSelectedNode.parentNode.nextSibling; + } + + if (isLastTextNode && caretAtTheEndOfText) { + + event.preventDefault(); + + codex.core.log('ENTER clicked in last textNode. Create new BLOCK'); + + codex.content.insertBlock({ + type: NEW_BLOCK_TYPE, + block: codex.tools[NEW_BLOCK_TYPE].render() + }, true); + + codex.toolbar.move(); + codex.toolbar.open(); + + /** Show plus button with empty block */ + codex.toolbar.showPlusButton(); + } else { + + codex.core.log('Default ENTER behavior.'); + } + } + + /** get all inputs after new appending block */ + codex.ui.saveInputs(); + }; + + callbacks.escapeKeyPressed = function (event) { + + /** Close all toolbar */ + codex.toolbar.close(); + + /** Close toolbox */ + codex.toolbar.toolbox.close(); + + event.preventDefault(); + }; + + callbacks.arrowKeyPressed = function (event) { + + codex.content.workingNodeChanged(); + + /* Closing toolbar */ + codex.toolbar.close(); + codex.toolbar.move(); + }; + + callbacks.defaultKeyPressed = function (event) { + + codex.toolbar.close(); + + if (!codex.toolbar.inline.actionsOpened) { + codex.toolbar.inline.close(); + codex.content.clearMark(); + } + }; + + callbacks.redactorClicked = function (event) { + + callbacks.detectWhenClickedOnFirstLevelBlockArea(); + + codex.content.workingNodeChanged(event.target); + + codex.ui.saveInputs(); + + var selectedText = codex.toolbar.inline.getSelectionText(); + + /** + * If selection range took off, then we hide inline toolbar + */ + if (selectedText.length === 0) { + codex.toolbar.inline.close(); + } + + /** Update current input index in memory when caret focused into existed input */ + if (event.target.contentEditable == 'true') { + + codex.caret.saveCurrentInputIndex(); + } + + if (codex.content.currentNode === null) { + + /** + * If inputs in redactor does not exits, then we put input index 0 not -1 + */ + var indexOfLastInput = codex.state.inputs.length > 0 ? codex.state.inputs.length - 1 : 0; + + /** If we have any inputs */ + if (codex.state.inputs.length) { + + /** getting firstlevel parent of input */ + var firstLevelBlock = codex.content.getFirstLevelBlock(codex.state.inputs[indexOfLastInput]); + } + + /** If input is empty, then we set caret to the last input */ + if (codex.state.inputs.length && codex.state.inputs[indexOfLastInput].textContent === '' && firstLevelBlock.dataset.tool == codex.settings.initialBlockPlugin) { + + codex.caret.setToBlock(indexOfLastInput); + } else { + + /** Create new input when caret clicked in redactors area */ + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; + + codex.content.insertBlock({ + type: NEW_BLOCK_TYPE, + block: codex.tools[NEW_BLOCK_TYPE].render() + }); + + /** If there is no inputs except inserted */ + if (codex.state.inputs.length === 1) { + + codex.caret.setToBlock(indexOfLastInput); + } else { + + /** Set caret to this appended input */ + codex.caret.setToNextBlock(indexOfLastInput); + } + } + + /** + * Move toolbar to the right position and open + */ + codex.toolbar.move(); + + codex.toolbar.open(); + } else { + + /** + * Move toolbar to the new position and open + */ + codex.toolbar.move(); + + codex.toolbar.open(); + + /** Close all panels */ + codex.toolbar.settings.close(); + codex.toolbar.toolbox.close(); + } + + var inputIsEmpty = !codex.content.currentNode.textContent.trim(); + + if (inputIsEmpty) { + + /** Show plus button */ + codex.toolbar.showPlusButton(); + } else { + + /** Hide plus buttons */ + codex.toolbar.hidePlusButton(); + } + + var currentNodeType = codex.content.currentNode.dataset.tool; + + /** Mark current block*/ + if (currentNodeType != codex.settings.initialBlockPlugin || !inputIsEmpty) { + + codex.content.markBlock(); + } + }; + + /** + * This method allows to define, is caret in contenteditable element or not. + * Otherwise, if we get TEXT node from range container, that will means we have input index. + * In this case we use default browsers behaviour (if plugin allows that) or overwritten action. + * Therefore, to be sure that we've clicked first-level block area, we should have currentNode, which always + * specifies to the first-level block. Other cases we just ignore. + */ + callbacks.detectWhenClickedOnFirstLevelBlockArea = function () { + + var selection = window.getSelection(), + anchorNode = selection.anchorNode, + flag = false; + + if (selection.rangeCount == 0) { + + codex.content.editorAreaHightlighted = true; + } else { + + if (!codex.core.isDomNode(anchorNode)) { + anchorNode = anchorNode.parentNode; + } + + /** Already founded, without loop */ + if (anchorNode.contentEditable == 'true') { + flag = true; + } + + while (anchorNode.contentEditable != 'true') { + anchorNode = anchorNode.parentNode; + + if (anchorNode.contentEditable == 'true') { + flag = true; + } + + if (anchorNode == document.body) { + break; + } + } + + /** If editable element founded, flag is "TRUE", Therefore we return "FALSE" */ + codex.content.editorAreaHightlighted = flag ? false : true; + } + }; + + /** + * Toolbar button click handler + * @param this - cursor to the button + */ + callbacks.toolbarButtonClicked = function (event) { + + var button = this; + + codex.toolbar.current = button.dataset.type; + + codex.toolbar.toolbox.toolClicked(event); + codex.toolbar.close(); + }; + + callbacks.redactorInputEvent = function (event) { + + /** + * Clear previous sync-timeout + */ + if (this.redactorSyncTimeout) { + clearTimeout(this.redactorSyncTimeout); + } + + /** + * Start waiting to input finish and sync redactor + */ + this.redactorSyncTimeout = setTimeout(function () { + + codex.content.sync(); + }, 500); + }; + + /** Show or Hide toolbox when plus button is clicked */ + callbacks.plusButtonClicked = function () { + + if (!codex.nodes.toolbox.classList.contains('opened')) { + + codex.toolbar.toolbox.open(); + } else { + + codex.toolbar.toolbox.close(); + } + }; + + /** + * Block handlers for KeyDown events + */ + callbacks.blockKeydown = function (event, block) { + + switch (event.keyCode) { + + case codex.core.keys.DOWN: + case codex.core.keys.RIGHT: + codex.callback.blockRightOrDownArrowPressed(block); + break; + + case codex.core.keys.BACKSPACE: + codex.callback.backspacePressed(block); + break; + + case codex.core.keys.UP: + case codex.core.keys.LEFT: + codex.callback.blockLeftOrUpArrowPressed(block); + break; + + } + }; + + /** + * RIGHT or DOWN keydowns on block + */ + callbacks.blockRightOrDownArrowPressed = function (block) { + + var selection = window.getSelection(), + inputs = codex.state.inputs, + focusedNode = selection.anchorNode, + focusedNodeHolder; + + /** Check for caret existance */ + if (!focusedNode) { + return false; + } + + /** Looking for closest (parent) contentEditable element of focused node */ + while (focusedNode.contentEditable != 'true') { + + focusedNodeHolder = focusedNode.parentNode; + focusedNode = focusedNodeHolder; + } + + /** Input index in DOM level */ + var editableElementIndex = 0; + while (focusedNode != inputs[editableElementIndex]) { + editableElementIndex++; + } + + /** + * Founded contentEditable element doesn't have childs + * Or maybe New created block + */ + if (!focusedNode.textContent) { + codex.caret.setToNextBlock(editableElementIndex); + return; + } + + /** + * Do nothing when caret doesn not reaches the end of last child + */ + var caretInLastChild = false, + caretAtTheEndOfText = false; + + var lastChild, deepestTextnode; + + lastChild = focusedNode.childNodes[focusedNode.childNodes.length - 1]; + + if (codex.core.isDomNode(lastChild)) { + + deepestTextnode = codex.content.getDeepestTextNodeFromPosition(lastChild, lastChild.childNodes.length); + } else { + + deepestTextnode = lastChild; + } + + caretInLastChild = selection.anchorNode == deepestTextnode; + caretAtTheEndOfText = deepestTextnode.length == selection.anchorOffset; + + if (!caretInLastChild || !caretAtTheEndOfText) { + codex.core.log('arrow [down|right] : caret does not reached the end'); + return false; + } + + codex.caret.setToNextBlock(editableElementIndex); + }; + + /** + * LEFT or UP keydowns on block + */ + callbacks.blockLeftOrUpArrowPressed = function (block) { + + var selection = window.getSelection(), + inputs = codex.state.inputs, + focusedNode = selection.anchorNode, + focusedNodeHolder; + + /** Check for caret existance */ + if (!focusedNode) { + return false; + } + + /** + * LEFT or UP not at the beginning + */ + if (selection.anchorOffset !== 0) { + return false; + } + + /** Looking for parent contentEditable block */ + while (focusedNode.contentEditable != 'true') { + focusedNodeHolder = focusedNode.parentNode; + focusedNode = focusedNodeHolder; + } + + /** Input index in DOM level */ + var editableElementIndex = 0; + while (focusedNode != inputs[editableElementIndex]) { + editableElementIndex++; + } + + /** + * Do nothing if caret is not at the beginning of first child + */ + var caretInFirstChild = false, + caretAtTheBeginning = false; + + var firstChild, deepestTextnode; + + /** + * Founded contentEditable element doesn't have childs + * Or maybe New created block + */ + if (!focusedNode.textContent) { + codex.caret.setToPreviousBlock(editableElementIndex); + return; + } + + firstChild = focusedNode.childNodes[0]; + + if (codex.core.isDomNode(firstChild)) { + + deepestTextnode = codex.content.getDeepestTextNodeFromPosition(firstChild, 0); + } else { + + deepestTextnode = firstChild; + } + + caretInFirstChild = selection.anchorNode == deepestTextnode; + caretAtTheBeginning = selection.anchorOffset === 0; + + if (caretInFirstChild && caretAtTheBeginning) { + + codex.caret.setToPreviousBlock(editableElementIndex); + } + }; + + /** + * Callback for enter key pressing in first-level block area + */ + callbacks.enterPressedOnBlock = function (event) { + + var NEW_BLOCK_TYPE = codex.settings.initialBlockPlugin; + + codex.content.insertBlock({ + type: NEW_BLOCK_TYPE, + block: codex.tools[NEW_BLOCK_TYPE].render() + }, true); + + codex.toolbar.move(); + codex.toolbar.open(); + }; + + callbacks.backspacePressed = function (block) { + + var currentInputIndex = codex.caret.getCurrentInputIndex(), + range, + selectionLength, + firstLevelBlocksCount; + + if (block.textContent.trim()) { + + range = codex.content.getRange(); + selectionLength = range.endOffset - range.startOffset; + + if (codex.caret.position.atStart() && !selectionLength && codex.state.inputs[currentInputIndex - 1]) { + + codex.content.mergeBlocks(currentInputIndex); + } else { + + return; + } + } + + if (!selectionLength) { + block.remove(); + } + + firstLevelBlocksCount = codex.nodes.redactor.childNodes.length; + + /** + * If all blocks are removed + */ + if (firstLevelBlocksCount === 0) { + + /** update currentNode variable */ + codex.content.currentNode = null; + + /** Inserting new empty initial block */ + codex.ui.addInitialBlock(); + + /** Updating inputs state after deleting last block */ + codex.ui.saveInputs(); + + /** Set to current appended block */ + setTimeout(function () { + + codex.caret.setToPreviousBlock(1); + }, 10); + } else { + + if (codex.caret.inputIndex !== 0) { + + /** Target block is not first */ + codex.caret.setToPreviousBlock(codex.caret.inputIndex); + } else { + + /** If we try to delete first block */ + codex.caret.setToNextBlock(codex.caret.inputIndex); + } + } + + codex.toolbar.move(); + + if (!codex.toolbar.opened) { + codex.toolbar.open(); + } + + /** Updating inputs state */ + codex.ui.saveInputs(); + + /** Prevent default browser behaviour */ + event.preventDefault(); + }; + + /** + * @deprecated + * + * @param event + */ + callbacks.blockPaste = function (event) { + + var currentInputIndex = codex.caret.getCurrentInputIndex(), + node = codex.state.inputs[currentInputIndex]; + + setTimeout(function () { + + codex.content.sanitize(node); + + event.preventDefault(); + }, 10); + + event.stopImmediatePropagation(); + }; + + callbacks.blockPasteCallback = function (event) { + + var currentInputIndex = codex.caret.getCurrentInputIndex(); + + /** + * create an observer instance + */ + var observer = new MutationObserver(codex.callback.handleMutationsOnPaste); + + /** + * configuration of the observer: + */ + var config = { + attributes: true, + childList: true, + characterData: false, + subtree: true + }; + + // pass in the target node, as well as the observer options + observer.observe(codex.state.inputs[currentInputIndex], config); + }; + + /** + * Sends all mutations to paste handler + */ + callbacks.handleMutationsOnPaste = function (mutations) { + + var self = this; + + /** + * Calling function with context of this function. + * Also, we should sanitize pasted or changed data one time and ignore + * changings which makes sanitize method. + * For that, we need to send Context, MutationObserver.__proto__ that contains + * observer disconnect method. + */ + mutations.forEach(function (mutation) { + codex.content.paste.call(self, mutation); + }); + }; + + /** + * Clicks on block settings button + */ + callbacks.showSettingsButtonClicked = function () { + + /** + * Get type of current block + * It uses to append settings from tool.settings property. + * ... + * Type is stored in data-type attribute on block + */ + var currentToolType = codex.content.currentNode.dataset.tool; + + codex.toolbar.settings.toggle(currentToolType); + + /** Close toolbox when settings button is active */ + codex.toolbar.toolbox.close(); + codex.toolbar.settings.hideRemoveActions(); + }; + + return callbacks; + }({}); + + module.exports = callbacks; + +/***/ }, +/* 15 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Codex Editor Draw module + * + * @author Codex Team + * @version 1.0. + */ + + var draw = function (draw) { + + /** + * Base editor wrapper + */ + draw.wrapper = function () { + + var wrapper = document.createElement('div'); + + wrapper.className += 'codex-editor'; + + return wrapper; + }; + + /** + * Content-editable holder + */ + draw.redactor = function () { + + var redactor = document.createElement('div'); + + redactor.className += 'ce-redactor'; + + return redactor; + }; + + draw.ceBlock = function () { + + var block = document.createElement('DIV'); + + block.className += 'ce_block'; + + return block; + }; + + /** + * Empty toolbar with toggler + */ + draw.toolbar = function () { + + var bar = document.createElement('div'); + + bar.className += 'ce-toolbar'; + + return bar; + }; + + draw.toolbarContent = function () { + + var wrapper = document.createElement('DIV'); + wrapper.classList.add('ce-toolbar__content'); + + return wrapper; + }; + + /** + * Inline toolbar + */ + draw.inlineToolbar = function () { + + var bar = document.createElement('DIV'); + + bar.className += 'ce-toolbar-inline'; + + return bar; + }; + + /** + * Wrapper for inline toobar buttons + */ + draw.inlineToolbarButtons = function () { + + var wrapper = document.createElement('DIV'); + + wrapper.className += 'ce-toolbar-inline__buttons'; + + return wrapper; + }; + + /** + * For some actions + */ + draw.inlineToolbarActions = function () { + + var wrapper = document.createElement('DIV'); + + wrapper.className += 'ce-toolbar-inline__actions'; + + return wrapper; + }; + + draw.inputForLink = function () { + + var input = document.createElement('INPUT'); + + input.type = 'input'; + input.className += 'inputForLink'; + input.placeholder = 'Type URL ...'; + input.setAttribute('form', 'defaultForm'); + + input.setAttribute('autofocus', 'autofocus'); + + return input; + }; + + /** + * Block with notifications + */ + draw.alertsHolder = function () { + + var block = document.createElement('div'); + + block.classList.add('ce_notifications-block'); + + return block; + }; + + /** + * @todo Desc + */ + draw.blockButtons = function () { + + var block = document.createElement('div'); + + block.className += 'ce-toolbar__actions'; + + return block; + }; + + /** + * Block settings panel + */ + draw.blockSettings = function () { + + var settings = document.createElement('div'); + + settings.className += 'ce-settings'; + + return settings; + }; + + draw.defaultSettings = function () { + + var div = document.createElement('div'); + + div.classList.add('ce-settings_default'); + + return div; + }; + + draw.pluginsSettings = function () { + + var div = document.createElement('div'); + + div.classList.add('ce-settings_plugin'); + + return div; + }; + + draw.plusButton = function () { + + var button = document.createElement('span'); + + button.className = 'ce-toolbar__plus'; + // button.innerHTML = ''; + + return button; + }; + + /** + * Settings button in toolbar + */ + draw.settingsButton = function () { + + var toggler = document.createElement('span'); + + toggler.className = 'ce-toolbar__settings-btn'; + + /** Toggler button*/ + toggler.innerHTML = ''; + + return toggler; + }; + + /** + * Redactor tools wrapper + */ + + draw.toolbox = function () { + + var wrapper = document.createElement('div'); + + wrapper.className = 'ce-toolbar__tools'; + + return wrapper; + }; + + /** + * @protected + * + * Draws tool buttons for toolbox + * + * @param {String} type + * @param {String} classname + * @returns {Element} + */ + draw.toolbarButton = function (type, classname) { + + var button = document.createElement("li"), + tool_icon = document.createElement("i"), + tool_title = document.createElement("span"); + + button.dataset.type = type; + button.setAttribute('title', type); + + tool_icon.classList.add(classname); + tool_title.classList.add('ce_toolbar_tools--title'); + + button.appendChild(tool_icon); + button.appendChild(tool_title); + + return button; + }; + + /** + * @protected + * + * Draws tools for inline toolbar + * + * @param {String} type + * @param {String} classname + */ + draw.toolbarButtonInline = function (type, classname) { + var button = document.createElement("BUTTON"), + tool_icon = document.createElement("I"); + + button.type = "button"; + button.dataset.type = type; + tool_icon.classList.add(classname); + + button.appendChild(tool_icon); + + return button; + }; + + /** + * Redactor block + */ + draw.block = function (tagName, content) { + + var node = document.createElement(tagName); + + node.innerHTML = content || ''; + + return node; + }; + + /** + * Creates Node with passed tagName and className + * @param {string} tagName + * @param {string} className + * @param {object} properties - allow to assign properties + */ + draw.node = function (tagName, className, properties) { + + var el = document.createElement(tagName); + + if (className) el.className = className; + + if (properties) { + + for (var name in properties) { + el[name] = properties[name]; + } + } + + return el; + }; + + draw.pluginsRender = function (type, content) { + + return { + type: type, + block: cEditor.tools[type].render({ + text: content + }) + }; + }; + + return draw; + }({}); + + module.exports = draw; + +/***/ }, +/* 16 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Codex Editor Caret Module + * + * @author Codex Team + * @version 1.0 + */ + + var caret = function (caret) { + + /** + * @var {int} InputIndex - editable element in DOM + */ + caret.inputIndex = null; + + /** + * @var {int} offset - caret position in a text node. + */ + caret.offset = null; + + /** + * @var {int} focusedNodeIndex - we get index of child node from first-level block + */ + caret.focusedNodeIndex = null; + + /** + * Creates Document Range and sets caret to the element. + * @protected + * @uses caret.save — if you need to save caret position + * @param {Element} el - Changed Node. + */ + caret.set = function (el, index, offset) { + + offset = offset || this.offset || 0; + index = index || this.focusedNodeIndex || 0; + + var childs = el.childNodes, + nodeToSet; + + if (childs.length === 0) { + + nodeToSet = el; + } else { + + nodeToSet = childs[index]; + } + + /** If Element is INPUT */ + if (el.tagName == 'INPUT') { + el.focus(); + return; + } + + if (codex.core.isDomNode(nodeToSet)) { + + nodeToSet = codex.content.getDeepestTextNodeFromPosition(nodeToSet, nodeToSet.childNodes.length); + } + + var range = document.createRange(), + selection = window.getSelection(); + + setTimeout(function () { + + range.setStart(nodeToSet, offset); + range.setEnd(nodeToSet, offset); + + selection.removeAllRanges(); + selection.addRange(range); + + codex.caret.saveCurrentInputIndex(); + }, 20); + }; + + /** + * @protected + * Updates index of input and saves it in caret object + */ + caret.saveCurrentInputIndex = function () { + + /** Index of Input that we paste sanitized content */ + var selection = window.getSelection(), + inputs = codex.state.inputs, + focusedNode = selection.anchorNode, + focusedNodeHolder; + + if (!focusedNode) { + return; + } + + /** Looking for parent contentEditable block */ + while (focusedNode.contentEditable != 'true') { + focusedNodeHolder = focusedNode.parentNode; + focusedNode = focusedNodeHolder; + } + + /** Input index in DOM level */ + var editableElementIndex = 0; + + while (focusedNode != inputs[editableElementIndex]) { + editableElementIndex++; + } + + this.inputIndex = editableElementIndex; + }; + + /** + * Returns current input index (caret object) + */ + caret.getCurrentInputIndex = function () { + return this.inputIndex; + }; + + /** + * @param {int} index - index of first-level block after that we set caret into next input + */ + caret.setToNextBlock = function (index) { + + var inputs = codex.state.inputs, + nextInput = inputs[index + 1]; + + if (!nextInput) { + codex.core.log('We are reached the end'); + return; + } + + /** + * When new Block created or deleted content of input + * We should add some text node to set caret + */ + if (!nextInput.childNodes.length) { + var emptyTextElement = document.createTextNode(''); + nextInput.appendChild(emptyTextElement); + } + + codex.caret.inputIndex = index + 1; + codex.caret.set(nextInput, 0, 0); + codex.content.workingNodeChanged(nextInput); + }; + + /** + * @param {int} index - index of target input. + * Sets caret to input with this index + */ + caret.setToBlock = function (index) { + + var inputs = codex.state.inputs, + targetInput = inputs[index]; + + console.assert(targetInput, 'caret.setToBlock: target input does not exists'); + + if (!targetInput) { + return; + } + + /** + * When new Block created or deleted content of input + * We should add some text node to set caret + */ + if (!targetInput.childNodes.length) { + var emptyTextElement = document.createTextNode(''); + targetInput.appendChild(emptyTextElement); + } + + codex.caret.inputIndex = index; + codex.caret.set(targetInput, 0, 0); + codex.content.workingNodeChanged(targetInput); + }; + + /** + * @param {int} index - index of input + */ + caret.setToPreviousBlock = function (index) { + + index = index || 0; + + var inputs = codex.state.inputs, + previousInput = inputs[index - 1], + lastChildNode, + lengthOfLastChildNode, + emptyTextElement; + + if (!previousInput) { + codex.core.log('We are reached first node'); + return; + } + + lastChildNode = codex.content.getDeepestTextNodeFromPosition(previousInput, previousInput.childNodes.length); + lengthOfLastChildNode = lastChildNode.length; + + /** + * When new Block created or deleted content of input + * We should add some text node to set caret + */ + if (!previousInput.childNodes.length) { + + emptyTextElement = document.createTextNode(''); + previousInput.appendChild(emptyTextElement); + } + codex.caret.inputIndex = index - 1; + codex.caret.set(previousInput, previousInput.childNodes.length - 1, lengthOfLastChildNode); + codex.content.workingNodeChanged(inputs[index - 1]); + }; + + caret.position = { + + atStart: function atStart() { + + var selection = window.getSelection(), + anchorOffset = selection.anchorOffset, + anchorNode = selection.anchorNode, + firstLevelBlock = codex.content.getFirstLevelBlock(anchorNode), + pluginsRender = firstLevelBlock.childNodes[0]; + + if (!codex.core.isDomNode(anchorNode)) { + anchorNode = anchorNode.parentNode; + } + + var isFirstNode = anchorNode === pluginsRender.childNodes[0], + isOffsetZero = anchorOffset === 0; + + return isFirstNode && isOffsetZero; + }, + + atTheEnd: function atTheEnd() { + + var selection = window.getSelection(), + anchorOffset = selection.anchorOffset, + anchorNode = selection.anchorNode; + + /** Caret is at the end of input */ + return !anchorNode || !anchorNode.length || anchorOffset === anchorNode.length; + } + }; + + return caret; + }({}); + + module.exports = caret; + +/***/ }, +/* 17 */ +/***/ function(module, exports) { + + 'use strict'; + + /** + * Codex Editor Notification Module + * + * @author Codex Team + * @version 1.0 + */ + + var notifications = function (notifications) { + + /** + * Error notificator. Shows block with message + * @protected + */ + notifications.errorThrown = function (errorMsg, event) { + + codex.notifications.send('This action is not available currently', event.type, false); + }; + + /** + * Appends notification with different types + * @param message {string} - Error or alert message + * @param type {string} - Type of message notification. Ex: Error, Warning, Danger ... + * @param append {boolean} - can be True or False when notification should be inserted after + */ + notifications.send = function (message, type, append) { + + var notification = codex.draw.block('div'); + + notification.textContent = message; + notification.classList.add('ce_notification-item', 'ce_notification-' + type, 'flipInX'); + + if (!append) { + codex.nodes.notifications.innerHTML = ''; + } + + codex.nodes.notifications.appendChild(notification); + + setTimeout(function () { + notification.remove(); + }, 3000); + }; + + return notifications; + }({}); + + module.exports = notifications; + +/***/ }, +/* 18 */ +/***/ function(module, exports) { + + "use strict"; + + /** + * Codex Editor Parser Module + * + * @author Codex Team + * @version 1.1 + */ + + var parser = function (parser) { + + /** inserting text */ + parser.insertPastedContent = function (blockType, tag) { + + codex.content.insertBlock({ + type: blockType.type, + block: blockType.render({ + text: tag.innerHTML + }) + }); + }; + + /** + * Check DOM node for display style: separated block or child-view + */ + parser.isFirstLevelBlock = function (node) { + + return node.nodeType == cEditor.core.nodeTypes.TAG && node.classList.contains(cEditor.ui.className.BLOCK_CLASSNAME); + }; + + return parser; + }({}); + + module.exports = parser; + +/***/ } +/******/ ]); +//# sourceMappingURL=codex-editor.js.map \ No newline at end of file diff --git a/whatwg-fetch.js b/whatwg-fetch.js new file mode 100644 index 00000000..21e370bc --- /dev/null +++ b/whatwg-fetch.js @@ -0,0 +1,510 @@ +var codex = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ exports: {}, +/******/ id: moduleId, +/******/ loaded: false +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.loaded = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(0); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ function(module, exports) { + + (function(self) { + 'use strict'; + + if (self.fetch) { + return + } + + var support = { + searchParams: 'URLSearchParams' in self, + iterable: 'Symbol' in self && 'iterator' in Symbol, + blob: 'FileReader' in self && 'Blob' in self && (function() { + try { + new Blob() + return true + } catch(e) { + return false + } + })(), + formData: 'FormData' in self, + arrayBuffer: 'ArrayBuffer' in self + } + + if (support.arrayBuffer) { + var viewClasses = [ + '[object Int8Array]', + '[object Uint8Array]', + '[object Uint8ClampedArray]', + '[object Int16Array]', + '[object Uint16Array]', + '[object Int32Array]', + '[object Uint32Array]', + '[object Float32Array]', + '[object Float64Array]' + ] + + var isDataView = function(obj) { + return obj && DataView.prototype.isPrototypeOf(obj) + } + + var isArrayBufferView = ArrayBuffer.isView || function(obj) { + return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1 + } + } + + function normalizeName(name) { + if (typeof name !== 'string') { + name = String(name) + } + if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { + throw new TypeError('Invalid character in header field name') + } + return name.toLowerCase() + } + + function normalizeValue(value) { + if (typeof value !== 'string') { + value = String(value) + } + return value + } + + // Build a destructive iterator for the value list + function iteratorFor(items) { + var iterator = { + next: function() { + var value = items.shift() + return {done: value === undefined, value: value} + } + } + + if (support.iterable) { + iterator[Symbol.iterator] = function() { + return iterator + } + } + + return iterator + } + + function Headers(headers) { + this.map = {} + + if (headers instanceof Headers) { + headers.forEach(function(value, name) { + this.append(name, value) + }, this) + + } else if (headers) { + Object.getOwnPropertyNames(headers).forEach(function(name) { + this.append(name, headers[name]) + }, this) + } + } + + Headers.prototype.append = function(name, value) { + name = normalizeName(name) + value = normalizeValue(value) + var oldValue = this.map[name] + this.map[name] = oldValue ? oldValue+','+value : value + } + + Headers.prototype['delete'] = function(name) { + delete this.map[normalizeName(name)] + } + + Headers.prototype.get = function(name) { + name = normalizeName(name) + return this.has(name) ? this.map[name] : null + } + + Headers.prototype.has = function(name) { + return this.map.hasOwnProperty(normalizeName(name)) + } + + Headers.prototype.set = function(name, value) { + this.map[normalizeName(name)] = normalizeValue(value) + } + + Headers.prototype.forEach = function(callback, thisArg) { + for (var name in this.map) { + if (this.map.hasOwnProperty(name)) { + callback.call(thisArg, this.map[name], name, this) + } + } + } + + Headers.prototype.keys = function() { + var items = [] + this.forEach(function(value, name) { items.push(name) }) + return iteratorFor(items) + } + + Headers.prototype.values = function() { + var items = [] + this.forEach(function(value) { items.push(value) }) + return iteratorFor(items) + } + + Headers.prototype.entries = function() { + var items = [] + this.forEach(function(value, name) { items.push([name, value]) }) + return iteratorFor(items) + } + + if (support.iterable) { + Headers.prototype[Symbol.iterator] = Headers.prototype.entries + } + + function consumed(body) { + if (body.bodyUsed) { + return Promise.reject(new TypeError('Already read')) + } + body.bodyUsed = true + } + + function fileReaderReady(reader) { + return new Promise(function(resolve, reject) { + reader.onload = function() { + resolve(reader.result) + } + reader.onerror = function() { + reject(reader.error) + } + }) + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader() + var promise = fileReaderReady(reader) + reader.readAsArrayBuffer(blob) + return promise + } + + function readBlobAsText(blob) { + var reader = new FileReader() + var promise = fileReaderReady(reader) + reader.readAsText(blob) + return promise + } + + function readArrayBufferAsText(buf) { + var view = new Uint8Array(buf) + var chars = new Array(view.length) + + for (var i = 0; i < view.length; i++) { + chars[i] = String.fromCharCode(view[i]) + } + return chars.join('') + } + + function bufferClone(buf) { + if (buf.slice) { + return buf.slice(0) + } else { + var view = new Uint8Array(buf.byteLength) + view.set(new Uint8Array(buf)) + return view.buffer + } + } + + function Body() { + this.bodyUsed = false + + this._initBody = function(body) { + this._bodyInit = body + if (!body) { + this._bodyText = '' + } else if (typeof body === 'string') { + this._bodyText = body + } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { + this._bodyBlob = body + } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { + this._bodyFormData = body + } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { + this._bodyText = body.toString() + } else if (support.arrayBuffer && support.blob && isDataView(body)) { + this._bodyArrayBuffer = bufferClone(body.buffer) + // IE 10-11 can't handle a DataView body. + this._bodyInit = new Blob([this._bodyArrayBuffer]) + } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { + this._bodyArrayBuffer = bufferClone(body) + } else { + throw new Error('unsupported BodyInit type') + } + + if (!this.headers.get('content-type')) { + if (typeof body === 'string') { + this.headers.set('content-type', 'text/plain;charset=UTF-8') + } else if (this._bodyBlob && this._bodyBlob.type) { + this.headers.set('content-type', this._bodyBlob.type) + } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { + this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8') + } + } + } + + if (support.blob) { + this.blob = function() { + var rejected = consumed(this) + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return Promise.resolve(this._bodyBlob) + } else if (this._bodyArrayBuffer) { + return Promise.resolve(new Blob([this._bodyArrayBuffer])) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as blob') + } else { + return Promise.resolve(new Blob([this._bodyText])) + } + } + + this.arrayBuffer = function() { + if (this._bodyArrayBuffer) { + return consumed(this) || Promise.resolve(this._bodyArrayBuffer) + } else { + return this.blob().then(readBlobAsArrayBuffer) + } + } + } + + this.text = function() { + var rejected = consumed(this) + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return readBlobAsText(this._bodyBlob) + } else if (this._bodyArrayBuffer) { + return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as text') + } else { + return Promise.resolve(this._bodyText) + } + } + + if (support.formData) { + this.formData = function() { + return this.text().then(decode) + } + } + + this.json = function() { + return this.text().then(JSON.parse) + } + + return this + } + + // HTTP methods whose capitalization should be normalized + var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'] + + function normalizeMethod(method) { + var upcased = method.toUpperCase() + return (methods.indexOf(upcased) > -1) ? upcased : method + } + + function Request(input, options) { + options = options || {} + var body = options.body + + if (typeof input === 'string') { + this.url = input + } else { + if (input.bodyUsed) { + throw new TypeError('Already read') + } + this.url = input.url + this.credentials = input.credentials + if (!options.headers) { + this.headers = new Headers(input.headers) + } + this.method = input.method + this.mode = input.mode + if (!body && input._bodyInit != null) { + body = input._bodyInit + input.bodyUsed = true + } + } + + this.credentials = options.credentials || this.credentials || 'omit' + if (options.headers || !this.headers) { + this.headers = new Headers(options.headers) + } + this.method = normalizeMethod(options.method || this.method || 'GET') + this.mode = options.mode || this.mode || null + this.referrer = null + + if ((this.method === 'GET' || this.method === 'HEAD') && body) { + throw new TypeError('Body not allowed for GET or HEAD requests') + } + this._initBody(body) + } + + Request.prototype.clone = function() { + return new Request(this, { body: this._bodyInit }) + } + + function decode(body) { + var form = new FormData() + body.trim().split('&').forEach(function(bytes) { + if (bytes) { + var split = bytes.split('=') + var name = split.shift().replace(/\+/g, ' ') + var value = split.join('=').replace(/\+/g, ' ') + form.append(decodeURIComponent(name), decodeURIComponent(value)) + } + }) + return form + } + + function parseHeaders(rawHeaders) { + var headers = new Headers() + rawHeaders.split('\r\n').forEach(function(line) { + var parts = line.split(':') + var key = parts.shift().trim() + if (key) { + var value = parts.join(':').trim() + headers.append(key, value) + } + }) + return headers + } + + Body.call(Request.prototype) + + function Response(bodyInit, options) { + if (!options) { + options = {} + } + + this.type = 'default' + this.status = 'status' in options ? options.status : 200 + this.ok = this.status >= 200 && this.status < 300 + this.statusText = 'statusText' in options ? options.statusText : 'OK' + this.headers = new Headers(options.headers) + this.url = options.url || '' + this._initBody(bodyInit) + } + + Body.call(Response.prototype) + + Response.prototype.clone = function() { + return new Response(this._bodyInit, { + status: this.status, + statusText: this.statusText, + headers: new Headers(this.headers), + url: this.url + }) + } + + Response.error = function() { + var response = new Response(null, {status: 0, statusText: ''}) + response.type = 'error' + return response + } + + var redirectStatuses = [301, 302, 303, 307, 308] + + Response.redirect = function(url, status) { + if (redirectStatuses.indexOf(status) === -1) { + throw new RangeError('Invalid status code') + } + + return new Response(null, {status: status, headers: {location: url}}) + } + + self.Headers = Headers + self.Request = Request + self.Response = Response + + self.fetch = function(input, init) { + return new Promise(function(resolve, reject) { + var request = new Request(input, init) + var xhr = new XMLHttpRequest() + + xhr.onload = function() { + var options = { + status: xhr.status, + statusText: xhr.statusText, + headers: parseHeaders(xhr.getAllResponseHeaders() || '') + } + options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL') + var body = 'response' in xhr ? xhr.response : xhr.responseText + resolve(new Response(body, options)) + } + + xhr.onerror = function() { + reject(new TypeError('Network request failed')) + } + + xhr.ontimeout = function() { + reject(new TypeError('Network request failed')) + } + + xhr.open(request.method, request.url, true) + + if (request.credentials === 'include') { + xhr.withCredentials = true + } + + if ('responseType' in xhr && support.blob) { + xhr.responseType = 'blob' + } + + request.headers.forEach(function(value, name) { + xhr.setRequestHeader(name, value) + }) + + xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit) + }) + } + self.fetch.polyfill = true + })(typeof self !== 'undefined' ? self : this); + + +/***/ } +/******/ ]); +//# sourceMappingURL=whatwg-fetch.js.map \ No newline at end of file From 7a37809532a686ee16b728ef0e7c77d018a0e87b Mon Sep 17 00:00:00 2001 From: George Berezhnoy Date: Thu, 26 Jan 2017 02:55:40 +0300 Subject: [PATCH 19/23] Yandex music added --- example.html | 12 ++-- modules/toolbar/toolbox.js | 2 +- plugins/{video => embed}/embed.css | 6 +- plugins/{video => embed}/embed.js | 103 +++++++++++++++++++++------ plugins/{video => embed}/loading.gif | Bin plugins/paste/paste.js | 17 +++-- plugins/paste/patterns.js | 24 +++++-- 7 files changed, 118 insertions(+), 46 deletions(-) rename plugins/{video => embed}/embed.css (74%) rename plugins/{video => embed}/embed.js (56%) rename plugins/{video => embed}/loading.gif (100%) diff --git a/example.html b/example.html index 076739a2..c88582f4 100644 --- a/example.html +++ b/example.html @@ -42,8 +42,8 @@ - - + + @@ -70,14 +70,14 @@ paste: { type: 'paste', iconClassname: '', - prepare: pasteTool.prepare, - make: pasteTool.make, + prepare: paste.prepare, + make: paste.make, appendCallback: null, settings: null, render: null, - save: pasteTool.save, + save: paste.save, enableLineBreaks: false, - callbacks: pasteTool.pasted, + callbacks: paste.pasted, allowedToPaste: false }, header: { diff --git a/modules/toolbar/toolbox.js b/modules/toolbar/toolbox.js index 31af4b77..48a2a797 100644 --- a/modules/toolbar/toolbox.js +++ b/modules/toolbar/toolbox.js @@ -121,7 +121,7 @@ var toolbox = (function(toolbox) { /** * UNREPLACEBLE_TOOLS this types of tools are forbidden to replace even they are empty */ - var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter', 'video'], + var UNREPLACEBLE_TOOLS = ['image', 'link', 'list', 'instagram', 'twitter', 'embed'], tool = codex.tools[codex.toolbar.current], workingNode = codex.content.currentNode, currentInputIndex = codex.caret.inputIndex, diff --git a/plugins/video/embed.css b/plugins/embed/embed.css similarity index 74% rename from plugins/video/embed.css rename to plugins/embed/embed.css index cf666d67..cbd16b93 100644 --- a/plugins/video/embed.css +++ b/plugins/embed/embed.css @@ -1,7 +1,7 @@ .ce-redactor .embed { - width: 100%; - max-width: 650px; - margin: 10px auto; + max-width: 600px; + margin: 15px 0; + background: #fff; } .embed__loader { diff --git a/plugins/video/embed.js b/plugins/embed/embed.js similarity index 56% rename from plugins/video/embed.js rename to plugins/embed/embed.js index ebc33b6c..83eaf166 100644 --- a/plugins/video/embed.js +++ b/plugins/embed/embed.js @@ -24,62 +24,101 @@ var embed = function(embed){ makeElementFromHtml: function(html) { var wrapper = document.createElement('DIV'); + wrapper.innerHTML = html; - return wrapper.firstElementChild; + + return wrapper; } }; var services = { vimeo: { regex: /(?:http[s]?:\/\/)?(?:www.)?vimeo\.co(?:.+\/([^\/]\d+)(?:#t=[\d]+)?s?$)/, - html: "" + html: "", + height: 320, + width: 580 + }, youtube: { regex: /^.*(?:(?:youtu\.be\/)|(?:youtube\.com)\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*)(?:[\?\&]t\=(\d*)|)/, html: "", - timestamp: '?t=' + height: 320, + width: 580 }, coub: { regex: /https?:\/\/coub\.com\/view\/([^\/\?\&]+)/, - html: "" + html: "", + height: 320, + width: 580 }, vine: { regex: /https?:\/\/vine\.co\/v\/([^\/\?\&]+)/, - html: "" - }, - vk: { - regex: /https?:\/\/vk\.com\/.*(?:video)([-_0-9]+)/, - html: "" + html: "", + height: 320, + width: 580 }, imgur: { regex: /https?:\/\/(?:i\.)?imgur\.com.*\/([a-zA-Z0-9]+)(?:\.gifv)?/, - html: "" + html: "", + height: 500, + width: 540 }, gfycat: { regex: /https?:\/\/gfycat\.com(?:\/detail)?\/([a-zA-Z]+)/, html: "", + height: 436, + width: 580 }, 'twitch-channel': { regex: /https?:\/\/twitch.tv\/([^\/\?\&]*)/, - html: "" + html: "", + height: 366, + width: 600 }, 'twitch-video': { regex: /https?:\/\/www.twitch.tv\/[^\/\?\&]*\/v\/([0-9]*)/, - html: "" + html: "", + height: 366, + width: 600 + }, + 'yandex-music-album': { + regex: '', + html: "", + height: 400, + width: 540 + }, + 'yandex-music-track': { + regex: '', + html: "", + height: 100, + width: 540 + }, + 'yandex-music-playlist': { + regex: '', + html: "", + height: 400, + width: 540 } }; embed.make = function(data, isInternal) { - if (!data.embed_id) + if (!data.remote_id) return; - var html = methods.getHtmlWithEmbedId(data.service, data.embed_id), + var html = methods.getHtmlWithEmbedId(data.source, data.remote_id), block = methods.makeElementFromHtml(html); - block.dataset.id = data.embed_id; - block.dataset.embedSeirvice = data.service; + block.dataset.remoteId = data.remote_id; + block.dataset.source = data.source; + block.dataset.thumbnailUrl = data.thumbnailUrl; + + block.classList.add('embed'); + + var sidePadding = (600 - services[data.source].width) / 2 + 'px'; + + block.style.padding = '30px ' + sidePadding; if (isInternal) { methods.addInternal(block); @@ -95,14 +134,18 @@ var embed = function(embed){ */ embed.save = function(blockContent) { - var data; - if (!blockContent) return; + var data, + source = blockContent.dataset.source; + data = { - embed_id: blockContent.dataset.id, - service: blockContent.dataset.embedService + source: source, + remote_id: blockContent.dataset.remoteId, + thumbnailUrl: blockContent.dataset.thumbnailUrl, + height: services[source].height, + width: services[source].width }; return data; @@ -118,11 +161,25 @@ var embed = function(embed){ embed.urlPastedCallback = function(url, pattern) { - var id = pattern.regex.exec(url)[1]; + var execArray = pattern.regex.exec(url), + id; + + + switch(pattern.type) { + case 'yandex-music-track': + id = execArray[2]+'/'+execArray[1]; + break; + case 'yandex-music-playlist': + id = execArray[1]+'/'+execArray[2]; + break; + default: + id = execArray[1]; + } var data = { - embed_id: id, - service: pattern.type + source: pattern.type, + remote_id: id, + thumbnailUrl: url }; embed.make(data, true); diff --git a/plugins/video/loading.gif b/plugins/embed/loading.gif similarity index 100% rename from plugins/video/loading.gif rename to plugins/embed/loading.gif diff --git a/plugins/paste/paste.js b/plugins/paste/paste.js index a8584f7f..f5c2d5bd 100644 --- a/plugins/paste/paste.js +++ b/plugins/paste/paste.js @@ -9,31 +9,34 @@ * * Main tool settings. */ -var pasteTool = { +var paste = function(paste){ /** * Saves data * @param event */ - pasted : function(event) { + paste.pasted = function(event) { var clipBoardData = event.clipboardData || window.clipboardData, content = clipBoardData.getData('Text'); - pasteTool.analize(content); - }, + analize(content); + }; /** * Analizes pated string and calls necessary method */ - analize : function(string) { + var analize = function(string) { - pasteTool.patterns.map(function(pattern, i){ + paste.patterns.map(function(pattern, i){ if (pattern.regex.test(string)) { pattern.callback.call(null, string, pattern); } }) } -}; + + return paste; + +}(paste || {}); diff --git a/plugins/paste/patterns.js b/plugins/paste/patterns.js index 09f2f642..b746f94d 100644 --- a/plugins/paste/patterns.js +++ b/plugins/paste/patterns.js @@ -10,7 +10,9 @@ * */ -pasteTool.patterns = [ +var paste = paste || {}; + +paste.patterns = [ { type: 'image', regex: /(?:([^:\/?#]+):)?(?:\/\/([^\/?#]*))?([^?#]*\.(?:jpe?g|gif|png))(?:\?([^#]*))?(?:#(.*))?/i, @@ -56,11 +58,6 @@ pasteTool.patterns = [ regex: /https?:\/\/vine\.co\/v\/([^\/\?\&]+)/, callback: embed.urlPastedCallback }, - { - type: 'vk', - regex: /https?:\/\/vk\.com\/.*(?:video)[-0-9]+_([0-9]+)/, - callback: embed.urlPastedCallback - }, { type: 'imgur', regex: /https?:\/\/(?:i\.)?imgur\.com.*\/([a-zA-Z0-9]+)(?:\.gifv)?/, @@ -81,5 +78,20 @@ pasteTool.patterns = [ regex: /https?:\/\/www.twitch.tv\/[^\/\?\&]*\/v\/([0-9]*)/, callback: embed.urlPastedCallback }, + { + type: 'yandex-music-album', + regex: /https?:\/\/music.yandex.ru\/album\/([0-9]*)/, + callback: embed.urlPastedCallback + }, + { + type: 'yandex-music-track', + regex: /https?:\/\/music.yandex.ru\/album\/([0-9]*)\/track\/([0-9]*)/, + callback: embed.urlPastedCallback + }, + { + type: 'yandex-music-playlist', + regex: /https?:\/\/music.yandex.ru\/users\/([^\/\?\&]*)\/playlists\/([0-9]*)/, + callback: embed.urlPastedCallback + } ]; \ No newline at end of file From a8cf1bcdd622397b05486b6a6e25db0fefc6a2bc Mon Sep 17 00:00:00 2001 From: George Berezhnoy Date: Thu, 26 Jan 2017 04:34:00 +0300 Subject: [PATCH 20/23] Validation for embed plugin added --- example.html | 1 + plugins/embed/embed.js | 46 +++++++++++++++++++++++++-------------- plugins/paste/patterns.js | 4 ++-- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/example.html b/example.html index 9918ba00..29f7710a 100644 --- a/example.html +++ b/example.html @@ -183,6 +183,7 @@ settings: null, render: embed.render, save: embed.save, + validate: embed.validate, displayInToolbox: false, enableLineBreaks: false, allowedToPaste: false diff --git a/plugins/embed/embed.js b/plugins/embed/embed.js index 83eaf166..529f1ab5 100644 --- a/plugins/embed/embed.js +++ b/plugins/embed/embed.js @@ -28,6 +28,22 @@ var embed = function(embed){ wrapper.innerHTML = html; return wrapper; + }, + + getRemoteId: function(source, execArray) { + + switch(source) { + case 'yandex-music-track': + id = execArray[2]+'/'+execArray[1]; + break; + case 'yandex-music-playlist': + id = execArray[1]+'/'+execArray[2]; + break; + default: + id = execArray[1]; + } + + return id; } }; @@ -82,19 +98,19 @@ var embed = function(embed){ width: 600 }, 'yandex-music-album': { - regex: '', + regex: /https?:\/\/music.yandex.ru\/album\/([0-9]*)/, html: "", height: 400, width: 540 }, 'yandex-music-track': { - regex: '', + regex: /https?:\/\/music.yandex.ru\/album\/([0-9]*)\/track\/([0-9]*)/, html: "", height: 100, width: 540 }, 'yandex-music-playlist': { - regex: '', + regex: /https?:\/\/music.yandex.ru\/users\/([^\/\?\&]*)\/playlists\/([0-9]*)/, html: "", height: 400, width: 540 @@ -162,19 +178,7 @@ var embed = function(embed){ embed.urlPastedCallback = function(url, pattern) { var execArray = pattern.regex.exec(url), - id; - - - switch(pattern.type) { - case 'yandex-music-track': - id = execArray[2]+'/'+execArray[1]; - break; - case 'yandex-music-playlist': - id = execArray[1]+'/'+execArray[2]; - break; - default: - id = execArray[1]; - } + id = methods.getRemoteId(pattern.type, execArray); var data = { source: pattern.type, @@ -185,6 +189,16 @@ var embed = function(embed){ embed.make(data, true); }; + embed.validate = function(savedData) { + + var source = savedData.source, + execArray = services[source].regex.exec(savedData.thumbnailUrl), + remoteId = methods.getRemoteId(source, execArray); + + return remoteId == savedData.remote_id; + + }; + return embed; }({}); \ No newline at end of file diff --git a/plugins/paste/patterns.js b/plugins/paste/patterns.js index 2f37b369..bc3cf868 100644 --- a/plugins/paste/patterns.js +++ b/plugins/paste/patterns.js @@ -20,12 +20,12 @@ paste.patterns = [ }, { type: 'instagram', - regex: new RegExp("http?.+instagram.com\/p?."), + regex: /http?.+instagram.com\/p\/([a-zA-Z0-9]*)/, callback: instagram.urlPastedCallback }, { type: 'twitter', - regex: new RegExp("http?.+twitter.com?.+\/"), + regex: /http?.+twitter.com?.+\//, callback: twitter.urlPastedCallback }, { From 92d8a1159baa53b50b63fb4b11e50ec880781780 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Thu, 26 Jan 2017 16:30:12 +0300 Subject: [PATCH 21/23] vk support --- plugins/embed/embed.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/embed/embed.js b/plugins/embed/embed.js index 529f1ab5..258f345a 100644 --- a/plugins/embed/embed.js +++ b/plugins/embed/embed.js @@ -61,6 +61,10 @@ var embed = function(embed){ height: 320, width: 580 }, + vk : { + regex: /^https?.+vk?.com\/feed\?w=wall\d+_\d+/, + html: "" + }, coub: { regex: /https?:\/\/coub\.com\/view\/([^\/\?\&]+)/, html: "", From 68d2f8fb1e95b74a0334aa7a8c8841d71f56a14f Mon Sep 17 00:00:00 2001 From: khaydarov Date: Thu, 26 Jan 2017 17:29:14 +0300 Subject: [PATCH 22/23] twitter fixed --- example.html | 16 +++------ plugins/twitter/twitter.js | 68 +++++++++++++++++++++----------------- 2 files changed, 41 insertions(+), 43 deletions(-) diff --git a/example.html b/example.html index 53975e47..0632b092 100644 --- a/example.html +++ b/example.html @@ -75,16 +75,11 @@ }, paste: { type: 'paste', - iconClassname: '', prepare: paste.prepare, make: paste.make, - appendCallback: null, - settings: null, - render: null, save: paste.save, enableLineBreaks: false, - callbacks: paste.pasted, - allowedToPaste: false + callbacks: paste.pasted }, code: { type: 'code', @@ -170,15 +165,12 @@ type: 'twitter', iconClassname: 'ce-icon-twitter', prepare: twitter.prepare, - make: twitter.make, - appendCallback: null, - settings: null, render: twitter.render, validate: twitter.validate, save: twitter.save, - displayInToolbox: false, - enableLineBreaks: false, - allowedToPaste: false + config : { + fetchUrl : '' + } }, embed: { type: 'embed', diff --git a/plugins/twitter/twitter.js b/plugins/twitter/twitter.js index 7d3a2055..937f69d7 100644 --- a/plugins/twitter/twitter.js +++ b/plugins/twitter/twitter.js @@ -21,16 +21,16 @@ var twitter = (function(twitter) { if (codex.content.currentNode) { tweet.dataset.statusUrl = data.status_url; - codex.content.switchBlock(codex.content.currentNode, tweet, 'twitter'); + codex.content.switchBlock(codex.content.currentNode, tweet, 'tweet'); } /** * in case if we need extra data */ - if (!data.user) { + if ( !data.user ) { codex.core.ajax({ - url : '/writing/tweetInfo?tweetId=' + data.id_str, + url : twitter.config.fetchUrl + '?tweetId=' + data.id_str, type: "GET", success: function(result) { methods.saveTwitterData(result, tweet); @@ -43,7 +43,7 @@ var twitter = (function(twitter) { 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.id = +data.id; tweet.dataset.idStr = data.id_str; tweet.dataset.text = data.text; tweet.dataset.createdAt = data.created_at; @@ -62,9 +62,10 @@ var twitter = (function(twitter) { }, saveTwitterData : function(result, tweet) { + var data = JSON.parse(result), twitterContent = tweet; - + setTimeout(function() { /** @@ -74,7 +75,7 @@ var twitter = (function(twitter) { 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.id = +data.id; twitterContent.dataset.idStr = data.id_str; twitterContent.dataset.text = data.text; twitterContent.dataset.createdAt = data.created_at; @@ -90,10 +91,15 @@ var twitter = (function(twitter) { /** * Prepare twitter scripts */ - twitter.prepare = function() { + twitter.prepare = function(config) { var script = "//platform.twitter.com/widgets.js"; + /** + * Save configs + */ + twitter.config = config; + /** * Load script */ @@ -101,12 +107,18 @@ var twitter = (function(twitter) { }; - twitter.make = function(data) { + /** + * @private + * + * @param data + * @returns {*} + */ + make_ = function(data) { if (!data.id || !data.status_url) return; - if (!data.id_str && typeof(data.id) === 'number') { + if (!data.id_str) { data.id_str = data.status_url.match(/[^\/]+$/)[0]; } @@ -146,14 +158,9 @@ var twitter = (function(twitter) { }; twitter.render = function(data) { - return twitter.make(data); + return make_(data); }; - /** - * callback for twitter utl's coming from pasteTool - * Using Twittter Widget to render - * @param url - */ twitter.urlPastedCallback = function(url) { var tweetId, @@ -165,25 +172,24 @@ var twitter = (function(twitter) { /** 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" + "media" : true, + "conversation" : false, + "user" : null, + "id" : +tweetId, + "text" : null, + "created_at" : null, + "status_url" : url, + "caption" : null }; - codex.tools.twitter.make(data); - } - + make_(data); + }; return twitter; })({}); + + + + + From ef714fa5dd9c54ee7c12383cb6325e66d271e4e3 Mon Sep 17 00:00:00 2001 From: khaydarov Date: Thu, 26 Jan 2017 17:43:49 +0300 Subject: [PATCH 23/23] plugins improved --- example.html | 5 ----- plugins/embed/embed.js | 2 +- plugins/instagram/instagram.js | 22 ++++++++++------------ 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/example.html b/example.html index 0632b092..bfebc917 100644 --- a/example.html +++ b/example.html @@ -175,14 +175,9 @@ embed: { type: 'embed', make: embed.make, - appendCallback: null, - settings: null, render: embed.render, save: embed.save, validate: embed.validate, - displayInToolbox: false, - enableLineBreaks: false, - allowedToPaste: false } }, data : { diff --git a/plugins/embed/embed.js b/plugins/embed/embed.js index 258f345a..bac7df1e 100644 --- a/plugins/embed/embed.js +++ b/plugins/embed/embed.js @@ -7,7 +7,7 @@ var embed = function(embed){ var methods = { addInternal: function (content) { - codex.content.switchBlock(codex.content.currentNode, content, 'embed'); + codex.content.switchBlock(codex.content.currentNode, content, 'video_extended'); var blockContent = codex.content.currentNode.childNodes[0]; blockContent.classList.add('embed__loader'); diff --git a/plugins/instagram/instagram.js b/plugins/instagram/instagram.js index 87609a43..af62ebb4 100644 --- a/plugins/instagram/instagram.js +++ b/plugins/instagram/instagram.js @@ -9,15 +9,11 @@ var instagram = (function(instagram) { render : function(content) { codex.content.switchBlock(codex.content.currentNode, content, 'instagram'); + + setTimeout(function() { + window.instgrm.Embeds.process(); + }, 200); - var blockContent = codex.content.currentNode.childNodes[0]; - blockContent.classList.add('instagram__loader'); - - window.instgrm.Embeds.process(); - - setTimeout(function(){ - blockContent.classList.remove('instagram__loader'); - }, 500); }, /** @@ -59,9 +55,11 @@ var instagram = (function(instagram) { }; /** + * @private + * * Make instagram embed via Widgets method */ - instagram.make = function(data, isInternal) { + var make_ = function(data, isInternal) { if (!data.instagram_url) return; @@ -123,7 +121,7 @@ var instagram = (function(instagram) { * Render data */ instagram.render = function(data) { - return instagram.make(data); + return make_(data); }; /** @@ -136,11 +134,11 @@ var instagram = (function(instagram) { instagram_url: url }; - codex.tools.instagram.make(data, true); + make_(data, true); }; - return instagram; })({}); +