?? editor.js
字號:
?//
// htmlArea v2.02 - Copyright (c) 2002 interactivetools.com, inc.
// This copyright notice MUST stay intact for use (see license.txt).
//
// A free WYSIWYG editor replacement for <textarea> fields.
// For full source code and docs, visit http://www.interactivetools.com/
//
// write out styles for UI buttons
document.write('<style type="text/css">\n');
document.write('.btn { width: 22px; height: 22px; border: 1px solid buttonface; margin: 0; padding: 0; }\n');
document.write('.btnOver { width: 22px; height: 22px; border: 1px outset; }\n');
document.write('.btnDown { width: 22px; height: 22px; border: 1px inset; background-color: buttonhighlight; }\n');
document.write('.btnNA { width: 22px; height: 22px; border: 1px solid buttonface; filter: alpha(opacity=25); }\n');
document.write('.cMenu { background-color: threedface; color: menutext; cursor: Default; font-family: MS Sans Serif; font-size: 8pt; padding: 2 12 2 16; }');
document.write('.cMenuOver { background-color: highlight; color: highlighttext; cursor: Default; font-family: MS Sans Serif; font-size: 8pt; padding: 2 12 2 16; }');
document.write('.cMenuDivOuter { background-color: threedface; height: 9 }');
document.write('.cMenuDivInner { margin: 0 4 0 4; border-width: 1; border-style: solid; border-color: threedshadow threedhighlight threedhighlight threedshadow; }');
document.write('</style>\n');
/* ---------------------------------------------------------------------- *\
Function : editor_defaultConfig
Description : default configuration settings for wysiwyg editor
\* ---------------------------------------------------------------------- */
function editor_defaultConfig(objname) {
this.version = "2.02"
this.width = "auto";
this.height = "auto";
this.bodyStyle = 'background-color: #FFFFFF; font-family: "Verdana"; font-size: x-small;';
this.imgURL = _editor_url + 'images/';
this.debug = 0;
this.replaceNextlines = 0; // replace nextlines from spaces (on output)
this.plaintextInput = 0; // replace nextlines with breaks (on input)
this.toolbar = [
['fontname'],
['fontsize'],
// ['fontstyle'],
// ['linebreak'],
['bold','italic','underline','separator'],
// ['strikethrough','subscript','superscript','separator'],
['justifyleft','justifycenter','justifyright','separator'],
['OrderedList','UnOrderedList','Outdent','Indent','separator'],
['forecolor','backcolor','separator'],
['HorizontalRule','Createlink','InsertImage2','htmlmode','separator'],
// ['custom1','custom2','custom3','separator'],
// ['word'],
// ['popupeditor','about']];
['popupeditor']];
this.fontnames = {
"Arial": "arial, helvetica, sans-serif",
"Courier New": "courier new, courier, mono",
"Georgia": "Georgia, Times New Roman, Times, Serif",
"Tahoma": "Tahoma, Arial, Helvetica, sans-serif",
"Times New Roman": "times new roman, times, serif",
"Verdana": "Verdana, Arial, Helvetica, sans-serif",
"impact": "impact",
"WingDings": "WingDings",
"宋體": "宋體",
"新宋體": "新宋體",
"仿宋_GB2312": "仿宋_GB2312",
"黑體": "黑體",
"楷體_GB2312": "楷體_GB2312"
};
this.fontsizes = {
"1 (8 pt)": "1",
"2 (10 pt)": "2",
"3 (12 pt)": "3",
"4 (14 pt)": "4",
"5 (18 pt)": "5",
"6 (24 pt)": "6",
"7 (36 pt)": "7"
};
//this.stylesheet = "http://www.domain.com/sample.css"; // full URL to stylesheet
this.fontstyles = [ // make sure these exist in the header of page the content is being display as well in or they won't work!
// { name: "headline", className: "headline", classStyle: "font-family: arial black, arial; font-size: 28px; letter-spacing: -2px;" },
// { name: "arial red", className: "headline2", classStyle: "font-family: arial black, arial; font-size: 12px; letter-spacing: -2px; color:red" },
// { name: "verdana blue", className: "headline4", classStyle: "font-family: verdana; font-size: 18px; letter-spacing: -2px; color:blue" },
];
this.btnList = {
// buttonName: commandID, title, onclick, image,
"bold": ['Bold', '粗體', 'editor_action(this.id)', 'ed_format_bold.gif'],
"italic": ['Italic', '斜體', 'editor_action(this.id)', 'ed_format_italic.gif'],
"underline": ['Underline', '下劃線', 'editor_action(this.id)', 'ed_format_underline.gif'],
"strikethrough": ['StrikeThrough', '刪除線', 'editor_action(this.id)', 'ed_format_strike.gif'],
"subscript": ['SubScript', '上標', 'editor_action(this.id)', 'ed_format_sub.gif'],
"superscript": ['SuperScript', '上標', 'editor_action(this.id)', 'ed_format_sup.gif'],
"justifyleft": ['JustifyLeft', '左對齊', 'editor_action(this.id)', 'ed_align_left.gif'],
"justifycenter": ['JustifyCenter', '居中', 'editor_action(this.id)', 'ed_align_center.gif'],
"justifyright": ['JustifyRight', '右對齊', 'editor_action(this.id)', 'ed_align_right.gif'],
"orderedlist": ['InsertOrderedList', '項目列表', 'editor_action(this.id)', 'ed_list_num.gif'],
"unorderedlist": ['InsertUnorderedList', '數目列表', 'editor_action(this.id)', 'ed_list_bullet.gif'],
"outdent": ['Outdent', '文本左縮進', 'editor_action(this.id)', 'ed_indent_less.gif'],
"indent": ['Indent', '文本縮進', 'editor_action(this.id)', 'ed_indent_more.gif'],
"forecolor": ['ForeColor', '文本顏色', 'editor_action(this.id)', 'ed_color_fg.gif'],
"backcolor": ['BackColor', '背景色', 'editor_action(this.id)', 'ed_color_bg.gif'],
"horizontalrule": ['InsertHorizontalRule', '插入水平條', 'editor_action(this.id)', 'ed_hr.gif'],
"createlink": ['CreateLink', '插入超鏈接', 'editor_action(this.id)', 'ed_link.gif'],
"insertimage": ['InsertImage', '插入圖片,帶圖庫預覽','editor_action(this.id)', 'ed_image.gif'],
"insertimage2": ['InsertImage2', '插入圖片', 'editor_action(this.id)', 'ed_image.gif'],
"inserttable": ['InsertTable', '插入表格', 'editor_action(this.id)', 'insert_table.gif'],
"htmlmode": ['HtmlMode', '查看 Html 源代碼', 'editor_setmode(\''+objname+'\')', 'ed_html.gif'],
"popupeditor": ['popupeditor', '最大化編輯器', 'editor_action(this.id)', 'fullscreen_maximize.gif'],
"about": ['about', '關于', 'editor_about(\''+objname+'\')', 'ed_about.gif'],
// Add custom buttons here:
"custom1": ['custom1', 'Purpose of button 1', 'editor_action(this.id)', 'ed_custom.gif'],
"custom2": ['custom2', 'Purpose of button 2', 'editor_action(this.id)', 'ed_custom.gif'],
"custom3": ['custom3', 'Purpose of button 3', 'editor_action(this.id)', 'ed_custom.gif'],
// end: custom buttons
"word": ['word', '清除 MS-WORD 標記" ','editor_action(this.id)','ed_word.gif'],
"help": ['showhelp', '使用幫助', 'editor_action(this.id)', 'ed_help.gif']};
}
/* ---------------------------------------------------------------------- *\
Function : editor_generate
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 editor_generate(objname,userConfig) {
// Default Settings
var config = new editor_defaultConfig(objname);
if (userConfig) {
for (var thisName in userConfig) {
if (userConfig[thisName]) { config[thisName] = userConfig[thisName]; }
}
}
document.all[objname].config = config; // store config settings
// set size to specified size or size of original object
var obj = document.all[objname];
if (!config.width || config.width == "auto") {
if (obj.style.width) { config.width = obj.style.width; } // use css style
else if (obj.cols) { config.width = (obj.cols * 8) + 22; } // col width + toolbar
else { config.width = '100%'; } // default
}
if (!config.height || config.height == "auto") {
if (obj.style.height) { config.height = obj.style.height; } // use css style
else if (obj.rows) { config.height = obj.rows * 17 } // row height
else { config.height = '200'; } // default
}
var tblOpen = '<table border=0 cellspacing=0 cellpadding=0 style="float: left;" unselectable="on"><tr><td style="border: none; padding: 1 0 0 0"><nobr>';
var tblClose = '</nobr></td></tr></table>\n';
// build button toolbar
var toolbar = '';
var btnGroup, btnItem, aboutEditor;
for (var btnGroup in config.toolbar) {
// linebreak
if (config.toolbar[btnGroup].length == 1 &&
config.toolbar[btnGroup][0].toLowerCase() == "linebreak") {
toolbar += '<br clear="all">';
continue;
}
toolbar += tblOpen;
for (var btnItem in config.toolbar[btnGroup]) {
var btnName = config.toolbar[btnGroup][btnItem].toLowerCase();
// fontname
if (btnName == "fontname") {
toolbar += '<select id="_' +objname+ '_FontName" onChange="editor_action(this.id)" unselectable="on" style="margin: 1 2 0 2; font-size: 12px;">';
for (var fontname in config.fontnames) {
toolbar += '<option value="' +config.fontnames[fontname]+ '">' +fontname+ '</option>'
}
toolbar += '</select>';
continue;
}
// fontsize
if (btnName == "fontsize") {
toolbar += '<select id="_' +objname+ '_FontSize" onChange="editor_action(this.id)" unselectable="on" style="margin: 1 2 0 0; font-size: 12px;">';
for (var fontsize in config.fontsizes) {
toolbar += '<option value="' +config.fontsizes[fontsize]+ '">' +fontsize+ '</option>'
}
toolbar += '</select>\n';
continue;
}
// font style
if (btnName == "fontstyle") {
toolbar += '<select id="_' +objname+ '_FontStyle" onChange="editor_action(this.id)" unselectable="on" style="margin: 1 2 0 0; font-size: 12px;">';
+ '<option value="">Font Style</option>';
for (var i in config.fontstyles) {
var fontstyle = config.fontstyles[i];
toolbar += '<option value="' +fontstyle.className+ '">' +fontstyle.name+ '</option>'
}
toolbar += '</select>';
continue;
}
// separator
if (btnName == "separator") {
toolbar += '<span style="border: 1px inset; width: 1px; font-size: 16px; height: 16px; margin: 0 3 0 3"></span>';
continue;
}
// buttons
var btnObj = config.btnList[btnName];
if (btnName == 'linebreak') { alert("htmlArea error: 'linebreak' must be in a subgroup by itself, not with other buttons.\n\nhtmlArea wysiwyg editor not created."); return; }
if (!btnObj) { alert("htmlArea error: button '" +btnName+ "' not found in button list when creating the wysiwyg editor for '"+objname+"'.\nPlease make sure you entered the button name correctly.\n\nhtmlArea wysiwyg editor not created."); return; }
var btnCmdID = btnObj[0];
var btnTitle = btnObj[1];
var btnOnClick = btnObj[2];
var btnImage = btnObj[3];
toolbar += '<button title="' +btnTitle+ '" id="_' +objname+ '_' +btnCmdID+ '" class="btn" onClick="' +btnOnClick+ '" onmouseover="if(this.className==\'btn\'){this.className=\'btnOver\'}" onmouseout="if(this.className==\'btnOver\'){this.className=\'btn\'}" unselectable="on"><img src="' +config.imgURL + btnImage+ '" border=0 unselectable="on"></button>';
} // end of button sub-group
toolbar += tblClose;
} // end of entire button set
// build editor
var editor = '<span id="_editor_toolbar"><table border=0 cellspacing=0 cellpadding=0 bgcolor="buttonface" style="padding: 1 0 0 2" width=' + config.width + ' unselectable="on"><tr><td>\n'
+ toolbar
+ '</td></tr></table>\n'
+ '</td></tr></table></span>\n'
+ '<textarea ID="_' +objname + '_editor" style="width:' +config.width+ '; height:' +config.height+ '; margin-top: -1px; margin-bottom: -1px;" wrap=soft></textarea>';
// add context menu
editor += '<div id="_' +objname + '_cMenu" style="position: absolute; visibility: hidden;"></div>';
// hide original textarea and insert htmlarea after it
if (!config.debug) { document.all[objname].style.display = "none"; }
if (config.plaintextInput) { // replace nextlines with breaks
var contents = document.all[objname].value;
contents = contents.replace(/\r\n/g, '<br>');
contents = contents.replace(/\n/g, '<br>');
contents = contents.replace(/\r/g, '<br>');
document.all[objname].value = contents;
}
// insert wysiwyg
document.all[objname].insertAdjacentHTML('afterEnd', editor)
// convert htmlarea from textarea to wysiwyg editor
editor_setmode(objname, 'init');
// call filterOutput when user submits form
for (var idx=0; idx < document.forms.length; idx++) {
var r = document.forms[idx].attachEvent('onsubmit', function() { editor_filterOutput(objname); });
if (!r) { alert("Error attaching event to form!"); }
}
return true;
}
/* ---------------------------------------------------------------------- *\
Function : editor_action
Description : perform an editor command on selected editor content
Usage :
Arguments : button_id - button id string with editor and action name
\* ---------------------------------------------------------------------- */
function editor_action(button_id) {
// split up button name into "editorID" and "cmdID"
var BtnParts = Array();
BtnParts = button_id.split("_");
var objname = button_id.replace(/^_(.*)_[^_]*$/, '$1');
var cmdID = BtnParts[ BtnParts.length-1 ];
var button_obj = document.all[button_id];
var editor_obj = document.all["_" +objname + "_editor"];
var config = document.all[objname].config;
// help popup
if (cmdID == 'showhelp') {
window.open(_editor_url + "popups/editor_help.html", 'EditorHelp');
return;
}
// popup editor
if (cmdID == 'popupeditor') {
window.open(_editor_url + "popups/fullscreen.html?"+objname,
'FullScreen',
'toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=yes,width=640,height=480');
return;
}
// 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);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -