richtext.js
来自「Hippo CMS是一个以信息为中心的开源内容管理系统。Hippo CMS目标是」· JavaScript 代码 · 共 1,168 行 · 第 1/3 页
JS
1,168 行
}
this.onLoad();
} else {
dojo.html.removeNode(tmpContent);
this.editNode.innerHTML = html;
this.onDisplayChanged();
}
});
if (this.editNode) {
ifrFunc();
} else {
if (dojo.render.html.moz) {
this.iframe.onload = function () {
setTimeout(ifrFunc, 250);
};
} else {
this.iframe.onload = ifrFunc;
}
}
}, _applyEditingAreaStyleSheets:function () {
var files = [];
if (this.styleSheets) {
files = this.styleSheets.split(";");
this.styleSheets = "";
}
files = files.concat(this.editingAreaStyleSheets);
this.editingAreaStyleSheets = [];
if (files.length > 0) {
for (var i = 0; i < files.length; i++) {
var url = files[i];
if (url) {
this.addStyleSheet(dojo.uri.dojoUri(url));
}
}
}
}, addStyleSheet:function (uri) {
var url = uri.toString();
if (dojo.lang.find(this.editingAreaStyleSheets, url) > -1) {
dojo.debug("dojo.widget.RichText.addStyleSheet: Style sheet " + url + " is already applied to the editing area!");
return;
}
if (url.charAt(0) == "." || (url.charAt(0) != "/" && !uri.host)) {
url = (new dojo.uri.Uri(dojo.global().location, url)).toString();
}
this.editingAreaStyleSheets.push(url);
if (this.document.createStyleSheet) {
this.document.createStyleSheet(url);
} else {
var head = this.document.getElementsByTagName("head")[0];
var stylesheet = this.document.createElement("link");
with (stylesheet) {
rel = "stylesheet";
type = "text/css";
href = url;
}
head.appendChild(stylesheet);
}
}, removeStyleSheet:function (uri) {
var url = uri.toString();
if (url.charAt(0) == "." || (url.charAt(0) != "/" && !uri.host)) {
url = (new dojo.uri.Uri(dojo.global().location, url)).toString();
}
var index = dojo.lang.find(this.editingAreaStyleSheets, url);
if (index == -1) {
dojo.debug("dojo.widget.RichText.removeStyleSheet: Style sheet " + url + " is not applied to the editing area so it can not be removed!");
return;
}
delete this.editingAreaStyleSheets[index];
var links = this.document.getElementsByTagName("link");
for (var i = 0; i < links.length; i++) {
if (links[i].href == url) {
if (dojo.render.html.ie) {
links[i].href = "";
}
dojo.html.removeNode(links[i]);
break;
}
}
}, _drawObject:function (html) {
this.object = dojo.html.createExternalElement(dojo.doc(), "object");
with (this.object) {
classid = "clsid:2D360201-FFF5-11D1-8D03-00A0C959BC0A";
width = this.inheritWidth ? this._oldWidth : "100%";
style.height = this.height ? this.height : (this._oldHeight + "px");
Scrollbars = this.height ? true : false;
Appearance = this._activeX.appearance.flat;
}
this.editorObject = this.object;
this.editingArea.appendChild(this.object);
this.object.attachEvent("DocumentComplete", dojo.lang.hitch(this, "onLoad"));
dojo.lang.forEach(this.events, function (e) {
this.object.attachEvent(e.toLowerCase(), dojo.lang.hitch(this, e));
}, this);
this.object.DocumentHTML = "<!doctype HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" + "<html><title></title>" + "<style type=\"text/css\">" + " body,html { padding: 0; margin: 0; }" + (this.height ? "" : " body, { overflow: hidden; }") + "</style>" + "<body><div>" + html + "<div></body></html>";
this._cacheLocalBlockFormatNames();
}, _local2NativeFormatNames:{}, _native2LocalFormatNames:{}, _cacheLocalBlockFormatNames:function () {
if (!this._native2LocalFormatNames["p"]) {
var obj = this.object;
var error = false;
if (!obj) {
try {
obj = dojo.html.createExternalElement(dojo.doc(), "object");
obj.classid = "clsid:2D360201-FFF5-11D1-8D03-00A0C959BC0A";
dojo.body().appendChild(obj);
obj.DocumentHTML = "<html><head></head><body></body></html>";
}
catch (e) {
error = true;
}
}
try {
var oNamesParm = new ActiveXObject("DEGetBlockFmtNamesParam.DEGetBlockFmtNamesParam");
obj.ExecCommand(this._activeX.command["getblockformatnames"], 0, oNamesParm);
var vbNamesArray = new VBArray(oNamesParm.Names);
var localFormats = vbNamesArray.toArray();
var nativeFormats = ["p", "pre", "address", "h1", "h2", "h3", "h4", "h5", "h6", "ol", "ul", "", "", "", "", "div"];
for (var i = 0; i < nativeFormats.length; ++i) {
if (nativeFormats[i].length > 0) {
this._local2NativeFormatNames[localFormats[i]] = nativeFormats[i];
this._native2LocalFormatNames[nativeFormats[i]] = localFormats[i];
}
}
}
catch (e) {
error = true;
}
if (obj && !this.object) {
dojo.body().removeChild(obj);
}
}
return !error;
}, _isResized:function () {
return false;
}, onLoad:function (e) {
this.isLoaded = true;
if (this.object) {
this.document = this.object.DOM;
this.window = this.document.parentWindow;
this.editNode = this.document.body.firstChild;
this.editingArea.style.height = this.height ? this.height : this.minHeight;
if (!this.height) {
this.connect(this, "onDisplayChanged", "_updateHeight");
}
this.window._frameElement = this.object;
} else {
if (this.iframe && !dojo.render.html.ie) {
this.editNode = this.document.body;
if (!this.height) {
this.connect(this, "onDisplayChanged", "_updateHeight");
}
try {
this.document.execCommand("useCSS", false, true);
this.document.execCommand("styleWithCSS", false, false);
}
catch (e2) {
}
if (dojo.render.html.safari) {
this.connect(this.editNode, "onblur", "onBlur");
this.connect(this.editNode, "onfocus", "onFocus");
this.connect(this.editNode, "onclick", "onFocus");
this.interval = setInterval(dojo.lang.hitch(this, "onDisplayChanged"), 750);
} else {
if (dojo.render.html.mozilla || dojo.render.html.opera) {
var doc = this.document;
var addListener = dojo.event.browser.addListener;
var self = this;
dojo.lang.forEach(this.events, function (e) {
var l = addListener(self.document, e.substr(2).toLowerCase(), dojo.lang.hitch(self, e));
if (e == "onBlur") {
var unBlur = {unBlur:function (e) {
dojo.event.browser.removeListener(doc, "blur", l);
}};
dojo.event.connect("before", self, "close", unBlur, "unBlur");
}
});
}
}
} else {
if (dojo.render.html.ie) {
if (!this.height) {
this.connect(this, "onDisplayChanged", "_updateHeight");
}
this.editNode.style.zoom = 1;
}
}
}
this._applyEditingAreaStyleSheets();
if (this.focusOnLoad) {
this.focus();
}
this.onDisplayChanged(e);
if (this.onLoadDeferred) {
this.onLoadDeferred.callback(true);
}
}, onKeyDown:function (e) {
if ((!e) && (this.object)) {
e = dojo.event.browser.fixEvent(this.window.event);
}
if ((dojo.render.html.ie) && (e.keyCode == e.KEY_TAB)) {
e.preventDefault();
e.stopPropagation();
this.execCommand((e.shiftKey ? "outdent" : "indent"));
} else {
if (dojo.render.html.ie) {
if ((65 <= e.keyCode) && (e.keyCode <= 90)) {
e.charCode = e.keyCode;
this.onKeyPress(e);
}
}
}
}, onKeyUp:function (e) {
return;
}, KEY_CTRL:1, onKeyPress:function (e) {
if ((!e) && (this.object)) {
e = dojo.event.browser.fixEvent(this.window.event);
}
var modifiers = e.ctrlKey ? this.KEY_CTRL : 0;
if (this._keyHandlers[e.key]) {
var handlers = this._keyHandlers[e.key], i = 0, handler;
while (handler = handlers[i++]) {
if (modifiers == handler.modifiers) {
e.preventDefault();
handler.handler.call(this);
break;
}
}
}
dojo.lang.setTimeout(this, this.onKeyPressed, 1, e);
}, addKeyHandler:function (key, modifiers, handler) {
if (!(this._keyHandlers[key] instanceof Array)) {
this._keyHandlers[key] = [];
}
this._keyHandlers[key].push({modifiers:modifiers || 0, handler:handler});
}, onKeyPressed:function (e) {
this.onDisplayChanged();
}, onClick:function (e) {
this.onDisplayChanged(e);
}, onBlur:function (e) {
}, _initialFocus:true, onFocus:function (e) {
if ((dojo.render.html.mozilla) && (this._initialFocus)) {
this._initialFocus = false;
if (dojo.string.trim(this.editNode.innerHTML) == " ") {
this.placeCursorAtStart();
}
}
}, blur:function () {
if (this.iframe) {
this.window.blur();
} else {
if (this.object) {
this.document.body.blur();
} else {
if (this.editNode) {
this.editNode.blur();
}
}
}
}, focus:function () {
if (this.iframe && !dojo.render.html.ie) {
this.window.focus();
} else {
if (this.object) {
this.document.focus();
} else {
if (this.editNode && this.editNode.focus) {
this.editNode.focus();
} else {
dojo.debug("Have no idea how to focus into the editor!");
}
}
}
}, onDisplayChanged:function (e) {
}, _activeX:{command:{bold:5000, italic:5023, underline:5048, justifycenter:5024, justifyleft:5025, justifyright:5026, cut:5003, copy:5002, paste:5032, "delete":5004, undo:5049, redo:5033, removeformat:5034, selectall:5035, unlink:5050, indent:5018, outdent:5031, insertorderedlist:5030, insertunorderedlist:5051, inserttable:5022, insertcell:5019, insertcol:5020, insertrow:5021, deletecells:5005, deletecols:5006, deleterows:5007, mergecells:5029, splitcell:5047, setblockformat:5043, getblockformat:5011, getblockformatnames:5012, setfontname:5044, getfontname:5013, setfontsize:5045, getfontsize:5014, setbackcolor:5042, getbackcolor:5010, setforecolor:5046, getforecolor:5015, findtext:5008, font:5009, hyperlink:5016, image:5017, lockelement:5027, makeabsolute:5028, sendbackward:5036, bringforward:5037, sendbelowtext:5038, bringabovetext:5039, sendtoback:5040, bringtofront:5041, properties:5052}, ui:{"default":0, prompt:1, noprompt:2}, status:{notsupported:0, disabled:1, enabled:3, latched:7, ninched:11}, appearance:{flat:0, inset:1}, state:{unchecked:0, checked:1, gray:2}}, _normalizeCommand:function (cmd) {
var drh = dojo.render.html;
var command = cmd.toLowerCase();
if (command == "formatblock") {
if (drh.safari) {
command = "heading";
}
} else {
if (this.object) {
switch (command) {
case "createlink":
command = "hyperlink";
break;
case "insertimage":
command = "image";
break;
}
} else {
if (command == "hilitecolor" && !drh.mozilla) {
command = "backcolor";
}
}
}
return command;
}, _safariIsLeopard:function () {
var gt420 = false;
if (dojo.render.html.safari) {
var tmp = dojo.render.html.UA.split("AppleWebKit/")[1];
var ver = parseFloat(tmp.split(" ")[0]);
if (ver >= 420) {
gt420 = true;
}
}
return gt420;
}, queryCommandAvailable:function (command) {
var ie = 1;
var mozilla = 1 << 1;
var safari = 1 << 2;
var opera = 1 << 3;
var safari420 = 1 << 4;
var gt420 = this._safariIsLeopard();
function isSupportedBy(browsers) {
return {ie:Boolean(browsers & ie), mozilla:Boolean(browsers & mozilla), safari:Boolean(browsers & safari), safari420:Boolean(browsers & safari420), opera:Boolean(browsers & opera)};
}
var supportedBy = null;
switch (command.toLowerCase()) {
case "bold":
case "italic":
case "underline":
case "subscript":
case "superscript":
case "fontname":
case "fontsize":
case "forecolor":
case "hilitecolor":
case "justifycenter":
case "justifyfull":
case "justifyleft":
case "justifyright":
case "delete":
case "selectall":
supportedBy = isSupportedBy(mozilla | ie | safari | opera);
break;
case "createlink":
case "unlink":
case "removeformat":
case "inserthorizontalrule":
case "insertimage":
case "insertorderedlist":
case "insertunorderedlist":
case "indent":
case "outdent":
case "formatblock":
case "inserthtml":
case "undo":
case "redo":
case "strikethrough":
supportedBy = isSupportedBy(mozilla | ie | opera | safari420);
break;
case "blockdirltr":
case "blockdirrtl":
case "dirltr":
case "dirrtl":
case "inlinedirltr":
case "inlinedirrtl":
supportedBy = isSupportedBy(ie);
break;
case "cut":
case "copy":
case "paste":
supportedBy = isSupportedBy(ie | mozilla | safari420);
break;
case "inserttable":
supportedBy = isSupportedBy(mozilla | (this.object ? ie : 0));
break;
case "insertcell":
case "insertcol":
case "insertrow":
case "deletecells":
case "deletecols":
case "deleterows":
case "mergecells":
case "splitcell":
supportedBy = isSupportedBy(this.object ? ie : 0);
break;
default:
return false;
}
return (dojo.render.html.ie && supportedBy.ie) || (dojo.render.html.mozilla && supportedBy.mozilla) || (dojo.render.html.safari && supportedBy.safari) || (gt420 && supportedBy.safari420) || (dojo.render.html.opera && supportedBy.opera);
}, execCommand:function (command, argument) {
var returnValue;
this.focus();
command = this._normalizeCommand(command);
if (argument != undefined) {
if (command == "heading") {
throw new Error("unimplemented");
} else {
if (command == "formatblock") {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?