📄 editor.js
字号:
/*
[Discuz!] (C)2001-2007 Comsenz Inc.
This is NOT a freeware, use is subject to license terms
$RCSfile: editor.js,v $
$Revision: 1.62 $
$Date: 2007/08/03 09:38:16 $
*/
var editbox = editwin = editdoc = editcss = null;
var cursor = -1;
var stack = new Array();
var initialized = false;
newEditor(wysiwyg);
function newEditor(mode, initialtext) {
wysiwyg = parseInt(mode);
if(!(is_ie || is_moz || (is_opera >= 9))) {
allowswitcheditor = wysiwyg = 0;
}
var bbcodemode = $('bbcodemode');
var wysiwygmode = $('wysiwygmode');
bbcodemode.className = wysiwyg ? 'editor_switcher' : 'editor_switcher_highlight';
wysiwygmode.className = wysiwyg ? 'editor_switcher_highlight' : 'editor_switcher';
if(!allowswitcheditor) {
$(editorid + '_switcher').style.display = 'none';
}
$(editorid + '_cmd_table').style.display = wysiwyg ? '' : 'none';
if(wysiwyg) {
if($(editorid + '_iframe')) {
editbox = $(editorid + '_iframe');
} else {
var iframe = document.createElement('iframe');
editbox = textobj.parentNode.appendChild(iframe);
editbox.id = editorid + '_iframe';
}
editwin = editbox.contentWindow;
editdoc = editwin.document;
writeEditorContents(isUndefined(initialtext) ? textobj.value : initialtext);
} else {
editbox = editwin = editdoc = textobj;
if(!isUndefined(initialtext)) {
writeEditorContents(initialtext);
}
addSnapshot(textobj.value);
}
setEditorEvents();
initEditor();
}
function initEditor() {
var buttons = $(editorid + '_controls').getElementsByTagName('a');
for(var i = 0; i < buttons.length; i++) {
if(buttons[i].id.indexOf(editorid + '_cmd_') != -1) {
buttons[i].href = '###';
buttons[i].onclick = function(e) {discuzcode(this.id.substr(this.id.lastIndexOf('_cmd_') + 5))};
} else if(buttons[i].id.indexOf(editorid + '_popup_') != -1) {
buttons[i].href = '###';
buttons[i].onclick = function(e) {showMenu(this.id, true, 0, 3)};
}
}
setUnselectable($(editorid + '_controls'));
textobj.onselect = textobj.onclick = textobj.onkeyup = function(e) {storeCaret(this)};
textobj.onkeydown = function(e) {ctlent(e ? e : event)};
$('bbcodemode').onclick = function() {switchEditor(0)};
$('wysiwygmode').onclick = function() {switchEditor(1)};
$(editorid + '_buttonctrl').href = '###';
$(editorid + '_buttonctrl').onclick = function() {advanceeditor()};
}
function setUnselectable(obj) {
if(is_ie && is_ie > 4 && typeof obj.tagName != 'undefined') {
if(obj.hasChildNodes()) {
for(var i = 0; i < obj.childNodes.length; i++) {
setUnselectable(obj.childNodes[i]);
}
}
obj.unselectable = 'on';
}
}
function writeEditorContents(text) {
if(wysiwyg) {
if(text == '' && is_moz) {
text = '<br />';
}
if(initialized) {
editdoc.body.innerHTML = text;
} else {
editdoc.designMode = 'on';
editdoc = editwin.document;
editdoc.open('text/html', 'replace');
editdoc.write(text);
editdoc.close();
editdoc.body.contentEditable = true;
initialized = true;
}
} else {
textobj.value = text;
}
setEditorStyle();
}
function getEditorContents() {
return wysiwyg ? editdoc.body.innerHTML : editdoc.value;
}
function setEditorStyle() {
if(wysiwyg) {
textobj.style.display = 'none';
editbox.style.display = '';
if(editcss == null) {
var cssarray = [editorcss, editorcss_append];
for(var i = 0; i < 2; i++) {
editcss = editdoc.createElement('link');
editcss.type = 'text/css';
editcss.rel = 'stylesheet';
editcss.href = cssarray[i];
var headNode = editdoc.getElementsByTagName("head")[0];
headNode.appendChild(editcss);
}
}
if(is_moz || is_opera) {
editbox.style.border = '0px';
} else if(is_ie) {
editdoc.body.style.border = '0px';
editdoc.body.addBehavior('#default#userData');
}
editbox.style.width = textobj.style.width;
editbox.style.height = textobj.style.height;
editdoc.body.style.backgroundColor = TABLEBG;
editdoc.body.style.textAlign = 'left';
editdoc.body.id = 'wysiwyg';
} else {
var iframe = textobj.parentNode.getElementsByTagName('iframe')[0];
if(iframe) {
textobj.style.display = '';
textobj.style.width = iframe.style.width;
textobj.style.height = iframe.style.height;
iframe.style.display = 'none';
}
}
}
function setEditorEvents() {
if(wysiwyg) {
if(is_moz || is_opera) {
editdoc.addEventListener('mouseup', function(e) {setContext();}, true);
editdoc.addEventListener('keyup', function(e) {setContext();}, true);
editwin.addEventListener('focus', function(e) {this.hasfocus = true;}, true);
editwin.addEventListener('blur', function(e) {this.hasfocus = false;}, true);
editwin.addEventListener('keydown', function(e) {ctlent(e);}, true);
} else {
editdoc.onmouseup = function(e) {setContext();};
editdoc.onkeyup = function(e) {setContext();};
if(editdoc.attachEvent) {
editdoc.body.attachEvent("onkeydown", ctlent);
}
}
}
editwin.onfocus = function(e) {this.hasfocus = true;};
editwin.onblur = function(e) {this.hasfocus = false;};
}
function wrapTags(tagname, useoption, selection) {
if(isUndefined(selection)) {
var selection = getSel();
if(selection === false) {
selection = '';
} else {
selection += '';
}
}
if(useoption !== false) {
var opentag = '[' + tagname + '=' + useoption + ']';
} else {
var opentag = '[' + tagname + ']';
}
var closetag = '[/' + tagname + ']';
var text = opentag + selection + closetag;
insertText(text, strlen(opentag), strlen(closetag), in_array(tagname, ['code', 'quote', 'free', 'hide']) ? true : false);
}
function applyFormat(cmd, dialog, argument) {
if(wysiwyg) {
editdoc.execCommand(cmd, (isUndefined(dialog) ? false : dialog), (isUndefined(argument) ? true : argument));
return;
}
switch(cmd) {
case 'bold':
case 'italic':
case 'underline':
wrapTags(cmd.substr(0, 1), false);
break;
case 'justifyleft':
case 'justifycenter':
case 'justifyright':
wrapTags('align', cmd.substr(7));
break;
case 'floatleft':
case 'floatright':
wrapTags('float', cmd.substr(5));
break;
case 'indent':
wrapTags(cmd, false);
break;
case 'fontname':
wrapTags('font', argument);
break;
case 'fontsize':
wrapTags('size', argument);
break;
case 'forecolor':
wrapTags('color', argument);
break;
case 'createlink':
var sel = getSel();
if(sel) {
wrapTags('url', argument);
} else {
wrapTags('url', argument, argument);
}
break;
case 'insertimage':
wrapTags('img', false, argument);
break;
}
}
function getCaret() {
if(wysiwyg) {
var obj = editdoc.body;
var s = document.selection.createRange();
s.setEndPoint("StartToStart", obj.createTextRange());
return s.text.replace(/\r?\n/g, ' ').length;
} else {
var obj = editbox;
var wR = document.selection.createRange();
obj.select();
var aR = document.selection.createRange();
wR.setEndPoint("StartToStart", aR);
var len = wR.text.replace(/\r?\n/g, ' ').length;
wR.collapse(false);
wR.select();
return len;
}
}
function setCaret(pos) {
var obj = wysiwyg ? editdoc.body : editbox;
var r = obj.createTextRange();
r.moveStart('character', pos);
r.collapse(true);
r.select();
}
function insertlink(cmd) {
var sel;
if(is_ie) {
sel = wysiwyg ? editdoc.selection.createRange() : document.selection.createRange();
var pos = getCaret();
}
var selection = sel ? (wysiwyg ? sel.htmlText : sel.text) : getSel();
var ctrlid = editorid + '_cmd_' + cmd;
var tag = cmd == 'insertimage' ? 'img' : (cmd == 'createlink' ? 'url' : 'email');
var str = (tag == 'img' ? lang['enter_image_url'] : (tag == 'url' ? lang['enter_link_url'] : lang['enter_email_link'])) + '<br /><input type="text" id="' + ctrlid + '_param_1" size="50" value="">';
var div = editorMenu(ctrlid, str);
$(ctrlid + '_param_1').focus();
$(ctrlid + '_param_1').onkeydown = editorMenuEvent_onkeydown;
$(ctrlid + '_submit').onclick = function() {
checkFocus();
if(is_ie) {
setCaret(pos);
}
var input = $(ctrlid + '_param_1').value;
if(input != '') {
var v = selection ? selection : input;
var href = tag != 'email' && /^(www\.)/.test(input) ? 'http://' + input : input;
var text = wysiwyg ? (tag == 'img' ? '<img src="' + input + '" border="0">' : '<a href="' + (tag == 'email' ? 'mailto:' : '') + href + '">' + v + '</a>') : (tag == 'img' ? '[' + tag + ']' + input + '[/' + tag + ']' : '[' + tag + '=' + href + ']' + v + '[/' + tag + ']');
var closetaglen = tag == 'email' ? 8 : 6;
if(wysiwyg) insertText(text, text.length - v.length, 0, (selection ? true : false), sel);
else insertText(text, text.length - v.length - closetaglen, closetaglen, (selection ? true : false), sel);
}
hideMenu();
document.body.removeChild(div);
}
}
function editorMenuEvent_onkeydown(e) {
e = e ? e : event;
var ctrlid = this.id.substr(0, this.id.lastIndexOf('_param_'));
if((this.type == 'text' && e.keyCode == 13) || (this.type == 'textarea' && e.ctrlKey && e.keyCode == 13)) {
$(ctrlid + '_submit').click();
doane(e);
} else if(e.keyCode == 27) {
hideMenu();
document.body.removeChild($(ctrlid + '_menu'));
}
}
function customTags(tagname, params) {
var sel;
if(is_ie) {
sel = wysiwyg ? editdoc.selection.createRange() : document.selection.createRange();
var pos = getCaret();
}
var selection = sel ? (wysiwyg ? sel.htmlText : sel.text) : getSel();
var opentag = '[' + tagname + ']';
var closetag = '[/' + tagname + ']';
var haveSel = selection == null || selection == false || in_array(trim(selection), ['', 'null', 'undefined', 'false']) ? 0 : 1;
if(params == 1 && haveSel) {
return insertText((opentag + selection + closetag), strlen(opentag), strlen(closetag), true, sel);
}
var ctrlid = editorid + '_cmd_custom' + params + '_' + tagname;
var ordinal = {1 : 'first', 2 : 'second', 3 : 'third'}
var promptlang = custombbcodes[tagname]['prompt'].split("\t");
var str = '';
for(var i = 1; i <= params; i++) {
if(i != params || !haveSel) {
str += (promptlang[i - 1] ? promptlang[i - 1] : 'Please input the ' + ordinal[i] + ' parameter:') + '<br /><input type="text" id="' + ctrlid + '_param_' + i + '" size="50" value="">' + (i < params ? '<br />' : '');
}
}
var div = editorMenu(ctrlid, str);
$(ctrlid + '_param_1').focus();
for(var i = 1; i <= params; i++) {if(i != params || !haveSel) $(ctrlid + '_param_' + i).onkeydown = editorMenuEvent_onkeydown;}
$(ctrlid + '_submit').onclick = function() {
var first = $(ctrlid + '_param_1').value;
if($(ctrlid + '_param_2')) var second = $(ctrlid + '_param_2').value;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -