@progress/kendo-ui
Version:
This package is part of the [Kendo UI for jQuery](http://www.telerik.com/kendo-ui) suite.
371 lines (309 loc) • 13.6 kB
JavaScript
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__) {
__webpack_require__(938);
module.exports = __webpack_require__(938);
/***/ }),
/***/ 3:
/***/ (function(module, exports) {
module.exports = function() { throw new Error("define cannot be used indirect"); };
/***/ }),
/***/ 938:
/***/ (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__(939) ], __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($, undefined) {
var kendo = window.kendo,
Class = kendo.Class,
Editor = kendo.ui.editor,
dom = Editor.Dom,
template = kendo.template,
RangeUtils = Editor.RangeUtils,
complexBlocks = ["ul", "ol", "tbody", "thead", "table"],
toolsToBeUpdated = [
"bold",
"italic",
"underline",
"strikethrough",
"superscript",
"subscript",
"forecolor",
"backcolor",
"fontname",
"fontsize",
"createlink",
"unlink",
"autolink",
"addcolumnleft",
"addcolumnright",
"addrowabove",
"addrowbelow",
"deleterow",
"deletecolumn",
"mergecells",
"formatting",
"cleanformatting" ],
IMMUTABALE = "k-immutable",
IMMUTABALE_MARKER_SELECTOR = "[" + IMMUTABALE + "]",
IMMUTABLE_SELECTOR = "[contenteditable='false']";
var rootCondition = function(node) {
return $(node).is("body,.k-editor");
};
var immutable = function(node) {
return node.getAttribute && node.getAttribute("contenteditable") == "false";
};
var immutableParent = function (node) {
return dom.closestBy(node, immutable, rootCondition);
};
var expandImmutablesIn = function(range) {
var startImmutableParent = immutableParent(range.startContainer);
var endImmutableParent = immutableParent(range.endContainer);
if (startImmutableParent || endImmutableParent) {
if (startImmutableParent){
range.setStartBefore(startImmutableParent);
}
if (endImmutableParent){
range.setEndAfter(endImmutableParent);
}
}
};
var immutablesContext = function(range) {
if (immutableParent(range.commonAncestorContainer)) {
return true;
} else if(immutableParent(range.startContainer) || immutableParent(range.endContainer)){
var editableNodes = RangeUtils.editableTextNodes(range);
if (editableNodes.length === 0){
return true;
}
}
return false;
};
var randomId = function(length) {
var result = '';
var chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
for (var i = length || 10; i > 0; --i) {
result += chars.charAt(Math.round(Math.random() * (chars.length - 1)));
}
return result;
};
var removeImmutables = function (root) {
var serializedImmutables = {empty: true}, nodeName, id, serialized;
$(root).find(IMMUTABLE_SELECTOR).each(function(i, node){
nodeName = dom.name(node);
id = randomId();
serialized = "<" + nodeName + " " + IMMUTABALE + "='" + id + "'></" + nodeName + ">";
serializedImmutables[id] = {node: node, style: $(node).attr("style")};
serializedImmutables.empty = false;
$(node).replaceWith(serialized);
});
return serializedImmutables;
};
var restoreImmutables = function(root, serializedImmutables) {
var id, immutable;
$(root).find(IMMUTABALE_MARKER_SELECTOR).each(function(i, node) {
id = node.getAttribute(IMMUTABALE);
immutable = serializedImmutables[id];
$(node).replaceWith(immutable.node);
if (immutable.style != $(immutable.node).attr("style")) {
$(immutable.node).removeAttr("style").attr("style", immutable.style);
}
});
};
var deletingKey = function (keyCode) {
var keys = kendo.keys;
return keyCode === keys.BACKSPACE || keyCode == keys.DELETE;
};
var updateToolOptions = function(tool) {
var options = tool ? tool.options : undefined;
if (options && options.finder) {
options.finder._initOptions({immutables: true});
}
};
var Immutables = Class.extend({
init: function (editor) {
this.editor = editor;
this.serializedImmutables = {};
this.options = $.extend({}, editor && editor.options && editor.options.immutables);
var tools = editor.toolbar.tools;
updateToolOptions(tools.justifyLeft);
updateToolOptions(tools.justifyCenter);
updateToolOptions(tools.justifyRight);
updateToolOptions(tools.justifyFull);
},
serialize: function(node) {
var result = this._toHtml(node),
id;
if (result.indexOf(IMMUTABALE) === -1) {
id = this.randomId();
result = result.replace(/>/, ' ' + IMMUTABALE + '="' + id + '">');
} else {
id = result.match(/k-immutable\s*=\s*['"](.*)['"]/)[1];
}
this.serializedImmutables[id] = node;
return result;
},
_toHtml: function(node){
var serialization = this.options.serialization;
var serializationType = typeof serialization;
var nodeName;
switch (serializationType) {
case "string":
return template(serialization)(node);
case "function":
return serialization(node);
default:
nodeName = dom.name(node);
return "<" + nodeName + "></" + nodeName + ">";
}
},
deserialize: function(node) {
var that = this;
var deserialization = this.options.deserialization;
$(IMMUTABALE_MARKER_SELECTOR, node).each(function() {
var id = this.getAttribute(IMMUTABALE);
var immutable = that.serializedImmutables[id];
if (kendo.isFunction(deserialization)) {
deserialization(this, immutable);
}
$(this).replaceWith(immutable);
});
that.serializedImmutables = {};
},
randomId: function (length) {
return randomId(length);
},
keydown: function(e, range) {
var isDeleting = deletingKey(e.keyCode);
var shouldCancelEvent = (isDeleting && this._cancelDeleting(e, range)) ||
(!isDeleting && this._cancelTyping(e, range));
if (shouldCancelEvent) {
e.preventDefault();
return true;
}
},
_cancelTyping: function(e, range) {
var editor = this.editor;
var keyboard = editor.keyboard;
return range.collapsed && !keyboard.typingInProgress &&
keyboard.isTypingKey(e) && immutablesContext(range);
},
_cancelDeleting: function(e, range) {
var keys = kendo.keys;
var backspace = e.keyCode === keys.BACKSPACE;
var del = e.keyCode == keys.DELETE;
if (!backspace && !del) {
return false;
}
var cancelDeleting = false;
if (range.collapsed) {
if (immutablesContext(range)) {
return true;
}
var immutable = this.nextImmutable(range, del);
if (immutable && backspace) {
var closestSelectionLi = dom.closest(range.commonAncestorContainer, "li");
if (closestSelectionLi) {
var closestImmutableLi = dom.closest(immutable, "li");
if (closestImmutableLi && closestImmutableLi !== closestSelectionLi) {
return cancelDeleting;
}
}
}
if (immutable && !dom.tableCell(immutable)) {
if (dom.parentOfType(immutable, complexBlocks) === dom.parentOfType(range.commonAncestorContainer, complexBlocks)) {
while (immutable && immutable.parentNode.childNodes.length == 1) {
immutable = immutable.parentNode;
}
if (dom.tableCell(immutable)) {
return cancelDeleting;
}
this._removeImmutable(immutable, range);
}
cancelDeleting = true;
}
}
return cancelDeleting;
},
nextImmutable: function(range, forwards) {
var commonContainer = range.commonAncestorContainer;
if (dom.isBom(commonContainer) || ((forwards && RangeUtils.isEndOf(range, commonContainer)) || (!forwards && RangeUtils.isStartOf(range, commonContainer)))) {
var next = this._nextNode(commonContainer, forwards);
if (next && dom.isBlock(next) && !immutableParent(next)) {
while (next && next.children && next.children[forwards ? 0 : next.children.length - 1]) {
next = next.children[forwards ? 0 : next.children.length - 1];
}
}
return immutableParent(next);
}
},
_removeImmutable: function(immutable, range) {
var editor = this.editor;
var startRestorePoint = new Editor.RestorePoint(range, editor.body);
dom.remove(immutable);
Editor._finishUpdate(editor, startRestorePoint);
},
_nextNode: function(node, forwards) {
var sibling = forwards ? "nextSibling" : "previousSibling";
var current = node, next;
while(current && !next) {
next = current[sibling];
if (next && dom.isDataNode(next) && /^\s|[\ufeff]$/.test(next.nodeValue)){
current = next;
next = current[sibling];
}
if (!next){
current = current.parentNode;
}
}
return next;
}
});
Immutables.immutable = immutable;
Immutables.immutableParent = immutableParent;
Immutables.expandImmutablesIn = expandImmutablesIn;
Immutables.immutablesContext = immutablesContext;
Immutables.toolsToBeUpdated = toolsToBeUpdated;
Immutables.removeImmutables = removeImmutables;
Immutables.restoreImmutables = restoreImmutables;
Editor.Immutables = Immutables;
})(window.kendo.jQuery);
}, __webpack_require__(3));
/***/ }),
/***/ 939:
/***/ (function(module, exports) {
module.exports = require("./range");
/***/ })
/******/ });