UNPKG

@progress/kendo-ui

Version:

This package is part of the [Kendo UI for jQuery](http://www.telerik.com/kendo-ui) suite.

865 lines (697 loc) 27.1 kB
module.exports = /******/ (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__) { module.exports = __webpack_require__(965); /***/ }), /***/ 3: /***/ (function(module, exports) { module.exports = function() { throw new Error("define cannot be used indirect"); }; /***/ }), /***/ 946: /***/ (function(module, exports) { module.exports = require("../command"); /***/ }), /***/ 965: /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function(f, define){ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(946) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); })(function(){ (function($) { // Imports ================================================================ var kendo = window.kendo, Class = kendo.Class, editorNS = kendo.ui.editor, RangeUtils = editorNS.RangeUtils, dom = editorNS.Dom, RestorePoint = editorNS.RestorePoint, Marker = editorNS.Marker, browser = kendo.support.browser, br = '<br class="k-br">', extend = $.extend; var nodeTypes = dom.nodeTypes; var PREVIOUS_SIBLING = "previousSibling"; function selected(node, range) { return range.startContainer === node && range.endContainer === node && range.startOffset === 0 && range.endOffset == node.childNodes.length; } function getSibling(node, direction, condition) { var sibling = node ? node[direction] : null; while (sibling && !condition(sibling)) { sibling = sibling[direction]; } return sibling; } var tableCells = "td,th,caption"; var tableCellsWrappers = "table,tbody,thead,tfoot,tr"; var tableElements = tableCellsWrappers + "," + tableCells; var inTable = function (range) { return !range.collapsed && $(range.commonAncestorContainer).is(tableCellsWrappers); }; var RemoveTableContent = Class.extend({ remove: function(range) { var that = this; var marker = new Marker(); marker.add(range, false); var nodes = RangeUtils.getAll(range, function (node) { return $(node).is(tableElements); }); var doc = RangeUtils.documentFromRange(range); var start = marker.start; var end = marker.end; var cellsTypes = tableCells.split(","); var startCell = dom.parentOfType(start, cellsTypes); var endCell = dom.parentOfType(end, cellsTypes); that._removeContent(start, startCell, true); that._removeContent(end, endCell, false); $(nodes).each(function(i, node) { node = $(node); (node.is(tableCells) ? node : node.find(tableCells)).each(function(j, cell) { cell.innerHTML = "&#65279;"; }); }); if (startCell && !start.previousSibling) { dom.insertBefore(doc.createTextNode("\ufeff"), start); } if (endCell && !end.nextSibling) { dom.insertAfter(doc.createTextNode("\ufeff"), end); } if (startCell) { range.setStartBefore(start); } else if (nodes[0]) { startCell = $(nodes[0]); startCell = startCell.is(tableCells) ? startCell : startCell.find(tableCells).first(); if (startCell.length) { range.setStart(startCell.get(0), 0); } } range.collapse(true); dom.remove(start); dom.remove(end); }, _removeContent: function (start, top, forwards) { if (top) { var sibling = forwards ? "nextSibling" : "previousSibling", next, getNext = function (node) { while (node && !node[sibling]) { node = node.parentNode; } return node && $.contains(top, node) ? node[sibling] : null; }; start = getNext(start); while (start) { next = getNext(start); dom.remove(start); start = next; } } } }); var TypingHandler = Class.extend({ init: function(editor) { this.editor = editor; }, keydown: function (e) { var that = this, editor = that.editor, keyboard = editor.keyboard, isTypingKey = keyboard.isTypingKey(e), evt = extend($.Event(), e); that.editor.trigger("keydown", evt); if (evt.isDefaultPrevented()) { e.preventDefault(); return true; } if (!evt.isDefaultPrevented() && isTypingKey && !keyboard.isTypingInProgress()) { var range = editor.getRange(); var body = editor.body; that.startRestorePoint = new RestorePoint(range, body); if (inTable(range)) { var removeTableContent = new RemoveTableContent(editor); removeTableContent.remove(range); editor.selectRange(range); } if (browser.webkit && !range.collapsed && selected(body, range)) { body.innerHTML = ""; } if (editor.immutables && editorNS.Immutables.immutablesContext(range)) { var backspaceHandler = new editorNS.BackspaceHandler(editor); backspaceHandler.deleteSelection(range); } keyboard.startTyping(function () { that.endRestorePoint = editorNS._finishUpdate(editor, that.startRestorePoint); }); return true; } return false; }, keyup: function (e) { var keyboard = this.editor.keyboard; this.editor.trigger("keyup", e); if (keyboard.isTypingInProgress()) { keyboard.endTyping(); return true; } return false; } }); var BackspaceHandler = Class.extend({ init: function(editor) { this.editor = editor; }, _addCaret: function(container) { var caret = dom.create(this.editor.document, "a"); // Only if not Chrome: Make sure to include cared in the formatted inline node if (!kendo.support.browser.chrome && container.firstChild && container.firstChild.nodeType === nodeTypes.ELEMENT_NODE) { container = container.firstChild; } dom.insertAt(container, caret, 0); dom.stripBomNode(caret.previousSibling); dom.stripBomNode(caret.nextSibling); return caret; }, _restoreCaret: function(caret) { var range = this.editor.createRange(); if (!caret.nextSibling && dom.isDataNode(caret.previousSibling)) { range.setStart(caret.previousSibling, caret.previousSibling.length); } else { range.setStartAfter(caret); } range.collapse(true); this.editor.selectRange(range); dom.remove(caret); }, _handleDelete: function(range) { var node = range.endContainer; var block = dom.closestEditableOfType(node, dom.blockElements); if (block && editorNS.RangeUtils.isEndOf(range, block)) { // join with next sibling var next = dom.next(block); if (!next || dom.name(next) != "p") { return false; } var caret = this._addCaret(next); this._merge(block, next); this._restoreCaret(caret); return true; } return false; }, _cleanBomBefore: function(range) { var offset = range.startOffset; var node = range.startContainer; var text = node.nodeValue; var count = 0; while (offset-count >= 0 && text[offset-count-1] == "\ufeff") { count++; } if (count > 0) { node.deleteData(offset-count, count); range.setStart(node, Math.max(0, offset-count)); range.collapse(true); this.editor.selectRange(range); } }, _handleBackspace: function(range) { var node = range.startContainer; var li = dom.closestEditableOfType(node, ['li']); var block = dom.closestEditableOfType(node, 'p,h1,h2,h3,h4,h5,h6'.split(',')); var editor = this.editor; var previousSibling; if (dom.isDataNode(node)) { if (range.collapsed && /^\s[\ufeff]+$/.test(node.nodeValue)) { range.setStart(node, 0); range.setEnd(node, node.length); editor.selectRange(range); return false; } this._cleanBomBefore(range); } previousSibling = getSibling(block, PREVIOUS_SIBLING, function(sibling) { return !dom.htmlIndentSpace(sibling); }); //deleting the first list item with empty content in IE results in invalid range if (range.collapsed && range.startOffset !== range.endOffset && range.startOffset < 0) { range.startOffset = 0; range.endOffset = 0; editor.selectRange(range); } var startAtLi = li && editorNS.RangeUtils.isStartOf(range, li); var liIndex = li && $(li).index(); var startAtNonFirstLi = startAtLi && liIndex > 0; if (startAtNonFirstLi) { block = li; previousSibling = dom.prev(li); } if(block && previousSibling && dom.is(previousSibling, 'table') && editorNS.RangeUtils.isStartOf(range, block)) { if(block.innerText === ''){ block.innerHTML = '\ufeff'; } return true; } // outdent if (editorNS.RangeUtils.isStartOf(range, block) && (parseInt(block.style.marginLeft,10) > 0 || parseInt(block.style.marginRight,10) > 0)) { editor.exec("outdent"); return true; } // unwrap block if ((block && previousSibling && editorNS.RangeUtils.isStartOf(range, block)) || startAtNonFirstLi) { var caret = this._addCaret(block); this._merge(previousSibling, block); this._restoreCaret(caret); return true; } // unwrap li element if (startAtLi && liIndex === 0) { var child = li.firstChild; if (!child) { li.innerHTML = editorNS.emptyElementContent; child = li.firstChild; } var formatter = new editorNS.ListFormatter(dom.name(li.parentNode), "p"); range.selectNodeContents(li); formatter.toggle(range); if (dom.insignificant(child)) { range.setStartBefore(child); } else { range.setStart(child, 0); } editor.selectRange(range); return true; } var rangeStartNode = node.childNodes[range.startOffset - 1]; var linkRange = range; var anchor = rangeStartNode && dom.closestEditableOfType(rangeStartNode, ['a']); var previousNode = getSibling(rangeStartNode || node, PREVIOUS_SIBLING, function(sibling) { return !dom.isDataNode(sibling) || (!dom.isBom(sibling) && sibling.length > 0); }); if (anchor || ((range.startOffset === 0 || rangeStartNode) && dom.is(previousNode, "a"))) { anchor = anchor || previousNode; linkRange = editor.createRange(); linkRange.setStart(anchor, anchor.childNodes.length); linkRange.collapse(true); } anchor = anchor || dom.closestEditableOfType(rangeStartNode || linkRange.startContainer, ['a']); var isEndOfLink = anchor && editorNS.RangeUtils.isEndOf(linkRange, anchor); if (isEndOfLink) { var command = new editorNS.UnlinkCommand({ range: linkRange, body: editor.body, immutables: !!editor.immutables }); editor.execCommand(command); editor._selectionChange(); } return false; }, _handleSelection: function(range) { var ancestor = range.commonAncestorContainer; var table = dom.closest(ancestor, "table"); var emptyParagraphContent = editorNS.emptyElementContent; var editor = this.editor; if (inTable(range)) { var removeTableContent = new RemoveTableContent(editor); removeTableContent.remove(range); editor.selectRange(range); return true; } var marker = new Marker(); marker.add(range, false); if(range.commonAncestorContainer === editor.body) { this._surroundFullyContent(marker, range); } if (editor.immutables) { this._handleImmutables(marker); } this._surroundFullySelectedAnchor(marker, range); range.setStartAfter(marker.start); range.setEndBefore(marker.end); var start = range.startContainer; var end = range.endContainer; range.deleteContents(); if(end.tagName.toLocaleLowerCase() === "li" && dom.emptyNode(end)) { range.selectNode(end); range.deleteContents(); } if (table && $(table).text() === "") { range.selectNode(table); range.deleteContents(); } ancestor = range.commonAncestorContainer; if (dom.name(ancestor) === "p" && ancestor.innerHTML === "") { ancestor.innerHTML = emptyParagraphContent; range.setStart(ancestor, 0); } this._join(start, end); dom.insertAfter(editor.document.createTextNode("\ufeff"), marker.start); marker.remove(range); start = range.startContainer; if (dom.name(start) == "tr") { start = start.childNodes[Math.max(0, range.startOffset-1)]; range.setStart(start, dom.getNodeLength(start)); } range.collapse(true); editor.selectRange(range); return true; }, _handleImmutables: function (marker) { var immutableParent = editorNS.Immutables.immutableParent; var startImmutable = immutableParent(marker.start); var endImmutable = immutableParent(marker.start); if (startImmutable) { dom.insertBefore(marker.start, startImmutable); } if (endImmutable) { dom.insertAfter(marker.end, endImmutable); } if (startImmutable) { dom.remove(startImmutable); } if (endImmutable && endImmutable.parentNode) { dom.remove(endImmutable); } }, _surroundFullyContent: function(marker, range) { var children = range.commonAncestorContainer.children, startParent = children[0], endParent = children[children.length - 1]; this._moveMarker(marker, range, startParent, endParent); }, _surroundFullySelectedAnchor: function(marker, range) { var start = marker.start, startParent = $(start).closest("a").get(0), end = marker.end, endParent = $(end).closest("a").get(0); this._moveMarker(marker, range, startParent, endParent); }, _moveMarker: function(marker, range, startParent, endParent) { var start = marker.start, end = marker.end; if(startParent && RangeUtils.isStartOf(range, startParent)){ dom.insertBefore(start, startParent); } if(endParent && RangeUtils.isEndOf(range, endParent)){ dom.insertAfter(end, endParent); } }, _root: function(node) { while (node && dom.name(node) != "body" && node.parentNode && dom.name(node.parentNode) != "body") { node = node.parentNode; } return node; }, _join: function(start, end) { start = this._root(start); end = this._root(end); if (start != end && dom.is(end, "p")) { this._merge(start, end); } }, _merge: function(dest, src) { dom.removeTrailingBreak(dest); while (dest && src.firstChild) { if (dest.nodeType == 1) { dest = dom.list(dest) ? dest.children[dest.children.length - 1] : dest; if (dest) { dest.appendChild(src.firstChild); } } else if (dest.nodeType === nodeTypes.TEXT_NODE) { this._mergeWithTextNode(dest, src.firstChild); } else { dest.parentNode.appendChild(src.firstChild); } } dom.remove(src); }, _mergeWithTextNode: function(textNode, appendedNode) { if (textNode && textNode.nodeType === nodeTypes.TEXT_NODE) { if (textNode.nextSibling && this._isCaret(textNode.nextSibling)) { dom.insertAfter(appendedNode, textNode.nextSibling); } else { dom.insertAfter(appendedNode, textNode); } } }, _isCaret: function(element) { return $(element).is("a"); }, keydown: function(e) { var method, startRestorePoint; var editor = this.editor; var range = editor.getRange(); var keyCode = e.keyCode; var keys = kendo.keys; var backspace = keyCode === keys.BACKSPACE; var del = keyCode == keys.DELETE; if (editor.immutables && editor.immutables.keydown(e, range)) { return; } if ((backspace || del) && !range.collapsed) { method = "_handleSelection"; } else if (backspace) { method = "_handleBackspace"; } else if (del) { method = "_handleDelete"; } if (!method) { return; } startRestorePoint = new RestorePoint(range, editor.body); if (this[method](range)) { e.preventDefault(); editorNS._finishUpdate(editor, startRestorePoint); } }, deleteSelection: function (range) { this._handleSelection(range); }, keyup: $.noop }); var SystemHandler = Class.extend({ init: function(editor) { this.editor = editor; this.systemCommandIsInProgress = false; }, createUndoCommand: function () { this.startRestorePoint = this.endRestorePoint = editorNS._finishUpdate(this.editor, this.startRestorePoint); }, changed: function () { if (this.startRestorePoint) { return this.startRestorePoint.html != this.editor.body.innerHTML; } return false; }, keydown: function (e) { var that = this, editor = that.editor, keyboard = editor.keyboard; if (keyboard.isModifierKey(e)) { if (keyboard.isTypingInProgress()) { keyboard.endTyping(true); } that.startRestorePoint = new RestorePoint(editor.getRange(), editor.body); return true; } if (keyboard.isSystem(e)) { that.systemCommandIsInProgress = true; if (that.changed()) { that.systemCommandIsInProgress = false; that.createUndoCommand(); } return true; } return false; }, keyup: function () { var that = this; if (that.systemCommandIsInProgress && that.changed()) { that.systemCommandIsInProgress = false; that.createUndoCommand(); return true; } return false; } }); var SelectAllHandler = Class.extend({ init: function(editor) { this.editor = editor; }, keydown: function (e) { if (!browser.webkit || e.isDefaultPrevented() || !(e.ctrlKey && e.keyCode == 65 && !e.altKey && !e.shiftKey)) { return; } if (this.editor.options.immutables) { this._toSelectableImmutables(); } this._selectEditorBody(); }, _selectEditorBody: function() { var editor = this.editor; var range = editor.getRange(); range.selectNodeContents(editor.body); editor.selectRange(range); }, _toSelectableImmutables: function() { var editor = this.editor, body = editor.body, immutable = editorNS.Immutables.immutable, emptyTextNode = dom.emptyTextNode, first = body.firstChild, last = body.lastChild; while (emptyTextNode(first)){ first = first.nextSibling; } while (emptyTextNode(last)){ last = last.previousSibling; } if (first && immutable(first)) { $(br).prependTo(body); } if (last && immutable(last)) { $(br).appendTo(body); } }, keyup: $.noop }); var Keyboard = Class.extend({ init: function(handlers) { this.handlers = handlers; this.typingInProgress = false; }, isCharacter: function(keyCode) { return (keyCode >= 48 && keyCode <= 90) || (keyCode >= 96 && keyCode <= 111) || (keyCode >= 186 && keyCode <= 192) || (keyCode >= 219 && keyCode <= 222) || keyCode == 229; }, toolFromShortcut: function (tools, e) { var key = String.fromCharCode(e.keyCode), toolName, toolOptions, modifier = this._getShortcutModifier(e, navigator.platform); for (toolName in tools) { toolOptions = $.extend({ ctrl: false, alt: false, shift: false }, tools[toolName].options); if ((toolOptions.key == key || toolOptions.key == e.keyCode) && toolOptions.ctrl == modifier && toolOptions.alt == e.altKey && toolOptions.shift == e.shiftKey) { return toolName; } } }, _getShortcutModifier: function (e, platform) { var mac = platform.toUpperCase().indexOf('MAC') >= 0; return mac ? e.metaKey : e.ctrlKey; }, toolsFromShortcut: function (tools, e) { var key = String.fromCharCode(e.keyCode), toolName, o, matchesKey, found = []; var matchKey = function (toolKey) { return toolKey == key || toolKey == e.keyCode || toolKey == e.charCode; }; for (toolName in tools) { o = $.extend({ ctrl: false, alt: false, shift: false }, tools[toolName].options); matchesKey = $.isArray(o.key) ? $.grep(o.key, matchKey).length > 0 : matchKey(o.key); if (matchesKey && o.ctrl == e.ctrlKey && o.alt == e.altKey && o.shift == e.shiftKey) { found.push(tools[toolName]); } } return found; }, isTypingKey: function (e) { var keyCode = e.keyCode; return (this.isCharacter(keyCode) && !e.ctrlKey && !e.altKey) || keyCode == 32 || keyCode == 13 || keyCode == 8 || (keyCode == 46 && !e.shiftKey && !e.ctrlKey && !e.altKey); }, isModifierKey: function (e) { var keyCode = e.keyCode; return (keyCode == 17 && !e.shiftKey && !e.altKey) || (keyCode == 16 && !e.ctrlKey && !e.altKey) || (keyCode == 18 && !e.ctrlKey && !e.shiftKey); }, isSystem: function (e) { return e.keyCode == 46 && e.ctrlKey && !e.altKey && !e.shiftKey; }, startTyping: function (callback) { this.onEndTyping = callback; this.typingInProgress = true; }, stopTyping: function() { if (this.typingInProgress && this.onEndTyping) { this.onEndTyping(); } this.typingInProgress = false; }, endTyping: function (force) { var that = this; that.clearTimeout(); if (force) { that.stopTyping(); } else { that.timeout = window.setTimeout($.proxy(that.stopTyping, that), 1000); } }, isTypingInProgress: function () { return this.typingInProgress; }, clearTimeout: function () { window.clearTimeout(this.timeout); }, notify: function(e, what) { var i, handlers = this.handlers; for (i = 0; i < handlers.length; i++) { if (handlers[i][what](e)) { break; } } }, keydown: function (e) { this.notify(e, 'keydown'); }, keyup: function (e) { this.notify(e, 'keyup'); } }); extend(editorNS, { TypingHandler: TypingHandler, SystemHandler: SystemHandler, BackspaceHandler: BackspaceHandler, SelectAllHandler: SelectAllHandler, Keyboard: Keyboard }); })(window.kendo.jQuery); }, __webpack_require__(3)); /***/ }) /******/ });