📄 editor_main.js
字号:
// check editor mode (don't perform actions in textedit mode)
if (editor_obj.tagName.toLowerCase() == 'textarea') { return; }
var editdoc = editor_obj.contentWindow.document;
editor_focus(editor_obj);
// get index and value for pulldowns
var idx = button_obj.selectedIndex;
var val = (idx != null) ? button_obj[ idx ].value : null;
if (0) {} // use else if for easy cutting and pasting
//
// CUSTOM BUTTONS START HERE
//
// Custom1
else if (cmdID == 'custom1') {
alert("Hello, I am custom button 1!");
}
// Custom2
else if (cmdID == 'custom2') { // insert some text from a popup window
var myTitle = "This is a custom title";
var myText = showModalDialog(_editor_url + "popups/custom2.html",
myTitle, // str or obj specified here can be read from dialog as "window.dialogArguments"
"resizable: yes; help: no; status: no; scroll: no; ");
if (myText) { editor_insertHTML(objname, myText); }
}
// Custom3
else if (cmdID == 'custom3') { // insert some text
editor_insertHTML(objname, "<hr noshade color=#C0C0C0 size=1 style='border-style: dotted; border-width: 1'>");
}
//WME WORD
else if (cmdID == 'word') {
var oTags = editdoc.all.tags("SPAN");
if (oTags != null) {
for (var i = oTags.length - 1; i >= 0; i--) {
oTags[i].outerHTML = oTags[i].innerHTML;
}
}
oTags = editdoc.all.tags("FONT");
if (oTags != null) {
for (var i = oTags.length - 1; i >= 0; i--) {
oTags[i].outerHTML = oTags[i].innerHTML;
}
}
oTags = editdoc.all.tags("P");
if (oTags != null) {
for (var i = oTags.length - 1; i >= 0; i--) {
cleanEmptyTag(oTags[i]);
}
}
oTags = editdoc.all.tags("H1");
if (oTags != null) {
for (var i = oTags.length - 1; i >= 0; i--) {
cleanEmptyTag(oTags[i]);
}
}
oTags = editdoc.all.tags("H2");
if (oTags != null) {
for (var i = oTags.length - 1; i >= 0; i--) {
cleanEmptyTag(oTags[i]);
}
}
oTags = editdoc.all.tags("H3");
if (oTags != null) {
for (var i = oTags.length - 1; i >= 0; i--) {
cleanEmptyTag(oTags[i]);
}
}
oTags = editdoc.all.tags("H4");
if (oTags != null) {
for (var i = oTags.length - 1; i >= 0; i--) {
cleanEmptyTag(oTags[i]);
}
}
oTags = editdoc.all.tags("OL");
if (oTags != null) {
for (var i = oTags.length - 1; i >= 0; i--) {
cleanEmptyTag(oTags[i]);
}
}
oTags = editdoc.all.tags("UL");
if (oTags != null) {
for (var i = oTags.length - 1; i >= 0; i--) {
cleanEmptyTag(oTags[i]); }
}
}
//
// END OF CUSTOM BUTTONS
//
// FontName
else if (cmdID == 'FontName' && val) {
editdoc.execCommand(cmdID,0,val);
}
// FontSize
else if (cmdID == 'FontSize' && val) {
editdoc.execCommand(cmdID,0,val);
}
// FontStyle (change CSS className)
else if (cmdID == 'FontStyle' && val) {
editdoc.execCommand('RemoveFormat');
editdoc.execCommand('FontName',0,'636c6173734e616d6520706c616365686f6c646572');
var fontArray = editdoc.all.tags("FONT");
for (i=0; i<fontArray.length; i++) {
if (fontArray[i].face == '636c6173734e616d6520706c616365686f6c646572') {
fontArray[i].face = "";
fontArray[i].className = val;
fontArray[i].outerHTML = fontArray[i].outerHTML.replace(/face=['"]+/, "");
}
}
button_obj.selectedIndex =0;
}
// fgColor and bgColor
else if (cmdID == 'ForeColor' || cmdID == 'BackColor') {
var oldcolor = _dec_to_rgb(editdoc.queryCommandValue(cmdID));
var newcolor = showModalDialog(_editor_url + "popups/select_color.html", oldcolor, "resizable: no; help: no; status: no; scroll: no;");
if (newcolor != null) { editdoc.execCommand(cmdID, false, "#"+newcolor); }
}
// execute command for buttons - if we didn't catch the cmdID by here we'll assume it's a
// commandID and pass it to execCommand(). See http://msdn.microsoft.com/workshop/author/dhtml/reference/commandids.asp
else {
// subscript & superscript, disable one before enabling the other
if (cmdID.toLowerCase() == 'subscript' && editdoc.queryCommandState('superscript')) { editdoc.execCommand('superscript'); }
if (cmdID.toLowerCase() == 'superscript' && editdoc.queryCommandState('subscript')) { editdoc.execCommand('subscript'); }
// insert link
//if (cmdID.toLowerCase() == 'createlink'){
// editdoc.execCommand(cmdID,1);
// showModalDialog(_editor_url + "popups/insert_link.html", editdoc, "resizable: no; help: no; status: no; scroll: no; ");
//}
// insert link (modified)
if (cmdID.toLowerCase() == 'createlink') {
if (editdoc.selection.createRange().text != "") {
var highlightedText = editdoc.selection.createRange().text;
}
else {
var highlightedText = "";
}
var myText = showModalDialog(_editor_url + "popups/insert_hyperlink.html",
highlightedText, "target is new Window");
if (myText) { editor_insertHTML(objname, unescape( myText) ); }
}
// insert image
else if (cmdID.toLowerCase() == 'insertimage'){
showModalDialog(_editor_url + "popups/insert_image.html", editdoc, "resizable: no; help: no; status: no; scroll: no; ");
}
// insert table
else if (cmdID.toLowerCase() == 'inserttable'){
showModalDialog(_editor_url + "popups/insert_table.html?"+objname,
window,
"resizable: yes; help: no; status: no; scroll: no; ");
}
// all other commands microsoft Command Identifiers
else { editdoc.execCommand(cmdID); }
}
editor_event(objname);
}
// WME: MS-Word clean-up (begin)
/* ---------------------------------------------------------------------- *\
Function : MS-Word clean-up
Description : replace textarea with wysiwyg editor
Usage : editor_generate("textarea_id",[height],[width]);
Arguments : objname - ID of textarea to replace
w - width of wysiwyg editor
h - height of wysiwyg editor
\* ---------------------------------------------------------------------- */
function cleanEmptyTag(oElem) {
if (oElem.hasChildNodes) {
var tmp = oElem
for (var k = tmp.children.length; k >= 0; k--) {
if (tmp.children[k] != null) {
cleanEmptyTag(tmp.children[k]);
}
}
}
var oAttribs = oElem.attributes;
if (oAttribs != null) {
for (var j = oAttribs.length - 1; j >=0; j--) {
var oAttrib = oAttribs[j];
if (oAttrib.nodeValue != null) {
oAttribs.removeNamedItem('class')
}
}
}
oElem.style.cssText = '';
if (oElem.innerHTML == '' || oElem.innerHTML == ' ') {
oElem.outerHTML = ''; }
}
function cleanTable(oElem) {
oElem.style.cssText = '';
var oAttribs = oElem.attributes;
if (oAttribs != null) {
for (var j = oAttribs.length - 1; j >=0; j--) {
var oAttrib = oAttribs[j];
if (oAttrib.nodeValue != null) {
oAttribs.removeNamedItem('class')
}
}
}
var oTR = oElem.rows;
if (oTR != null) {
for (var r = oTR.length - 1; r >= 0; r--) {
oTR[r].style.cssText = '';
}
}
var oTD = oElem.cells;
if (oTD != null) {
for (var t = oTD.length - 1; t >= 0; t--) {
oTD[t].style.cssText = '';
}
}
}
/* ---------------------------------------------------------------------- *\
Function : editor_event
Description : called everytime an editor event occurs
Usage : editor_event(objname, runDelay, eventName)
Arguments : objname - ID of textarea to replace
runDelay: -1 = run now, no matter what
0 = run now, if allowed
1000 = run in 1 sec, if allowed at that point
\* ---------------------------------------------------------------------- */
function editor_event(objname,runDelay) {
var config = document.all[objname].config;
var editor_obj = document.all["_" +objname+ "_editor"]; // html editor object
if (runDelay == null) { runDelay = 0; }
var editdoc;
var editEvent = editor_obj.contentWindow ? editor_obj.contentWindow.event : event;
// catch keypress events
if (editEvent && editEvent.keyCode) {
var ord = editEvent.keyCode; // ascii order of key pressed
var ctrlKey = editEvent.ctrlKey;
var altKey = editEvent.altKey;
var shiftKey = editEvent.shiftKey;
if (ord == 16) { return; } // ignore shift key by itself
if (ord == 17) { return; } // ignore ctrl key by itself
if (ord == 18) { return; } // ignore alt key by itself
// cancel ENTER key and insert <BR> instead
// if (ord == 13 && editEvent.type == 'keypress') {
// editEvent.returnValue = false;
// editor_insertHTML(objname, "<br>");
// return;
// }
if (ctrlKey && (ord == 122 || ord == 90)) { // catch ctrl-z (UNDO)
// TODO: Add our own undo/redo functionality
// editEvent.cancelBubble = true;
return;
}
if ((ctrlKey && (ord == 121 || ord == 89)) ||
ctrlKey && shiftKey && (ord == 122 || ord == 90)) { // catch ctrl-y, ctrl-shift-z (REDO)
// TODO: Add our own undo/redo functionality
return;
}
}
// setup timer for delayed updates (some events take time to complete)
if (runDelay > 0) { return setTimeout(function(){ editor_event(objname); }, runDelay); }
// don't execute more than 3 times a second (eg: too soon after last execution)
if (this.tooSoon == 1 && runDelay >= 0) { this.queue = 1; return; } // queue all but urgent events
this.tooSoon = 1;
setTimeout(function(){
this.tooSoon = 0;
if (this.queue) { editor_event(objname,-1); };
this.queue = 0;
}, 333); // 1/3 second
editor_updateOutput(objname);
editor_updateToolbar(objname);
}
/* ---------------------------------------------------------------------- *\
Function : editor_updateToolbar
Description : update toolbar state
Usage :
Arguments : objname - ID of textarea to replace
action - enable, disable, or update (default action)
\* ---------------------------------------------------------------------- */
function editor_updateToolbar(objname,action) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -