📄 editor.js
字号:
}
return str;
}
function stripComplex(tag, str, iterations) {
var opentag = '[' + tag + '=';
var closetag = '[/' + tag + ']';
if(isUndefined(iterations)) {
iterations = -1;
}
while((startindex = stripos(str, opentag)) !== false && iterations != 0) {
iterations --;
if((stopindex = stripos(str, closetag)) !== false) {
var openend = stripos(str, ']', startindex);
if(openend !== false && openend > startindex && openend < stopindex) {
var text = str.substr(openend + 1, stopindex - openend - 1);
str = str.substr(0, startindex) + text + str.substr(stopindex + closetag.length);
} else {
break;
}
} else {
break;
}
}
return str;
}
function stripos(haystack, needle, offset) {
if(isUndefined(offset)) {
offset = 0;
}
var index = haystack.toLowerCase().indexOf(needle.toLowerCase(), offset);
return (index == -1 ? false : index);
}
function switchEditor(mode) {
mode = parseInt(mode);
if(mode == wysiwyg || !allowswitcheditor) {
return;
}
if(!mode) {
var controlbar = $(editorid + '_controls');
var controls = new Array();
var buttons = controlbar.getElementsByTagName('a');
var buttonslength = buttons.length;
for(var i = 0; i < buttonslength; i++) {
if(buttons[i].id) {
controls[controls.length] = buttons[i].id;
}
}
var controlslength = controls.length;
for(var i = 0; i < controlslength; i++) {
var control = $(controls[i]);
if(control.id.indexOf(editorid + '_cmd_') != -1) {
control.className = '';
control.state = false;
control.mode = 'normal';
} else if(control.id.indexOf(editorid + '_popup_') != -1) {
control.state = false;
}
}
}
cursor = -1;
stack = new Array();
$(editorid + '_font_out').innerHTML = lang['fontname'];
$(editorid + '_font_out').fontstate = null;
$(editorid + '_size_out').innerHTML = lang['fontsize'];
$(editorid + '_size_out').sizestate = null;
$(editorid + '_color_bar').style.borderColor = '#000000';
var parsedtext = getEditorContents();
parsedtext = mode ? bbcode2html(parsedtext) : html2bbcode(parsedtext);
wysiwyg = mode;
// $(editorid + '_mode').value = mode;
newEditor(mode, parsedtext);
editwin.focus();
setCaretAtEnd();
}
function formatFontsize(csssize) {
switch(csssize) {
case '7.5pt':
case '10px': return 1;
case '10pt': return 2;
case '12pt': return 3;
case '14pt': return 4;
case '18pt': return 5;
case '24pt': return 6;
case '36pt': return 7;
default: return lang['fontsize'];
}
}
function rgbToColor(forecolor) {
if(!is_moz && !is_opera) {
return rgbhexToColor((forecolor & 0xFF).toString(16), ((forecolor >> 8) & 0xFF).toString(16), ((forecolor >> 16) & 0xFF).toString(16));
}
if(forecolor == '' || forecolor == null) {
forecolor = window.getComputedStyle(editdoc.body, null).getPropertyValue('color');
}
if(forecolor.toLowerCase().indexOf('rgb') == 0) {
var matches = forecolor.match(/^rgb\s*\(([0-9]+),\s*([0-9]+),\s*([0-9]+)\)$/);
if(matches) {
return rgbhexToColor((matches[1] & 0xFF).toString(16), (matches[2] & 0xFF).toString(16), (matches[3] & 0xFF).toString(16));
} else {
return rgbToColor(null);
}
} else {
return forecolor;
}
}
function rgbhexToColor(r, g, b) {
var coloroptions = {'#000000' : 'Black', '#a0522d' : 'Sienna', '#556b2f' : 'DarkOliveGreen', '#006400' : 'DarkGreen', '#483d8b' : 'DarkSlateBlue', '#000080' : 'Navy', '#4b0082' : 'Indigo', '#2f4f4f' : 'DarkSlateGray', '#8b0000' : 'DarkRed', '#ff8c00' : 'DarkOrange', '#808000' : 'Olive', '#008000' : 'Green', '#008080' : 'Teal', '#0000ff' : 'Blue', '#708090' : 'SlateGray', '#696969' : 'DimGray', '#ff0000' : 'Red', '#f4a460' : 'SandyBrown', '#9acd32' : 'YellowGreen', '#2e8b57' : 'SeaGreen', '#48d1cc' : 'MediumTurquoise', '#4169e1' : 'RoyalBlue', '#800080' : 'Purple', '#808080' : 'Gray', '#ff00ff' : 'Magenta', '#ffa500' : 'Orange', '#ffff00' : 'Yellow', '#00ff00' : 'Lime', '#00ffff' : 'Cyan', '#00bfff' : 'DeepSkyBlue', '#9932cc' : 'DarkOrchid', '#c0c0c0' : 'Silver', '#ffc0cb' : 'Pink', '#f5deb3' : 'Wheat', '#fffacd' : 'LemonChiffon', '#98fb98' : 'PaleGreen', '#afeeee' : 'PaleTurquoise', '#add8e6' : 'LightBlue', '#dda0dd' : 'Plum', '#ffffff' : 'White'};
var temp = coloroptions['#' + (str_pad(r, 2, 0) + str_pad(g, 2, 0) + str_pad(b, 2, 0))];
if(!isUndefined(temp)){
return temp;
}
return '#' + (str_pad(r, 2, 0) + str_pad(g, 2, 0) + str_pad(b, 2, 0));
}
function str_pad(text, length, padstring) {
text += '';
padstring += '';
if(text.length < length) {
padtext = padstring;
while(padtext.length < (length - text.length)) {
padtext += padstring;
}
text = padtext.substr(0, (length - text.length)) + text;
}
return text;
}
function insertNodeAtSelection(text) {
checkFocus();
var sel = editwin.getSelection();
var range = sel ? sel.getRangeAt(0) : editdoc.createRange();
sel.removeAllRanges();
range.deleteContents();
var node = range.startContainer;
var pos = range.startOffset;
switch(node.nodeType) {
case Node.ELEMENT_NODE:
if(text.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {
selNode = text.firstChild;
} else {
selNode = text;
}
node.insertBefore(text, node.childNodes[pos]);
add_range(selNode);
break;
case Node.TEXT_NODE:
if(text.nodeType == Node.TEXT_NODE) {
var text_length = pos + text.length;
node.insertData(pos, text.data);
range = editdoc.createRange();
range.setEnd(node, text_length);
range.setStart(node, text_length);
sel.addRange(range);
} else {
node = node.splitText(pos);
var selNode;
if(text.nodeType == Node.DOCUMENT_FRAGMENT_NODE) {
selNode = text.firstChild;
} else {
selNode = text;
}
node.parentNode.insertBefore(text, node);
add_range(selNode);
}
break;
}
}
function add_range(node) {
checkFocus();
var sel = editwin.getSelection();
var range = editdoc.createRange();
range.selectNodeContents(node);
sel.removeAllRanges();
sel.addRange(range);
}
function readNodes(root, toptag) {
var html = "";
var moz_check = /_moz/i;
switch(root.nodeType) {
case Node.ELEMENT_NODE:
case Node.DOCUMENT_FRAGMENT_NODE:
var closed;
if(toptag) {
closed = !root.hasChildNodes();
html = '<' + root.tagName.toLowerCase();
var attr = root.attributes;
for(var i = 0; i < attr.length; ++i) {
var a = attr.item(i);
if(!a.specified || a.name.match(moz_check) || a.value.match(moz_check)) {
continue;
}
html += " " + a.name.toLowerCase() + '="' + a.value + '"';
}
html += closed ? " />" : ">";
}
for(var i = root.firstChild; i; i = i.nextSibling) {
html += readNodes(i, true);
}
if(toptag && !closed) {
html += "</" + root.tagName.toLowerCase() + ">";
}
break;
case Node.TEXT_NODE:
html = htmlspecialchars(root.data);
break;
}
return html;
}
function moveCursor(increment) {
var test = cursor + increment;
if(test >= 0 && stack[test] != null && !isUndefined(stack[test])) {
cursor += increment;
}
}
function addSnapshot(str) {
if(stack[cursor] == str) {
return;
} else {
cursor++;
stack[cursor] = str;
if(!isUndefined(stack[cursor + 1])) {
stack[cursor + 1] = null;
}
}
}
function getSnapshot() {
if(!isUndefined(stack[cursor]) && stack[cursor] != null) {
return stack[cursor];
} else {
return false;
}
}
/**===========*/
function addslashes(str) {
return preg_replace(['\\\\', '\\\'', '\\\/', '\\\(', '\\\)', '\\\[', '\\\]', '\\\{', '\\\}', '\\\^', '\\\$', '\\\?', '\\\.', '\\\*', '\\\+', '\\\|'], ['\\\\', '\\\'', '\\/', '\\(', '\\)', '\\[', '\\]', '\\{', '\\}', '\\^', '\\$', '\\?', '\\.', '\\*', '\\+', '\\|'], str);
}
function atag(aoptions, text) {
if(Trim(text) == '') {
return '';
}
href = getoptionvalue('href', aoptions);
if(href.substr(0, 11) == 'javascript:') {
return Trim(recursion('a', text, 'atag'));
} else if(href.substr(0, 7) == 'mailto:') {
tag = 'email';
href = href.substr(7);
} else {
tag = 'url';
}
return '[' + tag + '=' + href + ']' + Trim(recursion('a', text, 'atag')) + '[/' + tag + ']';
}
function bbcode2html(str) {
str = Trim(str);
if(str == '') {
return '';
}
if(!fetchCheckbox('post_ubbflag') && allowbbcode) {
str= str.replace(/\s*\[code\]([\s\S]+?)\[\/code\]\s*/ig, function($1, $2) {return parsecode($2);});
}
if(!forumallowhtml && !(allowhtml && fetchCheckbox('post_htmlflag'))) {
str = str.replace(/</g, '<');
str = str.replace(/>/g, '>');
if(!fetchCheckbox('post_urlflag')) {
str = parseurl(str, 'html');
}
}
if(allowsmilies) {
for(var id=0; id<smilies.length;id++) {
re = new RegExp(addslashes(smilies[id]['code']), "g");
str = str.replace(re, '<img src="' + smilies[id]['url'] + '" border="0" smilieid="' + id + '" alt="' + smilies[id]['code'] + '" />');
}
}
if(!fetchCheckbox('post_ubbflag') && allowbbcode) {
str= str.replace(/\[url\]\s*(www.|https?:\/\/|ftp:\/\/|gopher:\/\/|news:\/\/|telnet:\/\/|rtsp:\/\/|mms:\/\/|callto:\/\/|bctp:\/\/|ed2k:\/\/){1}([^\[\"']+?)\s*\[\/url\]/ig, function($1, $2, $3) {return cuturl($2 + $3);});
str= str.replace(/\[url=www.([^\[\"']+?)\](.+?)\[\/url\]/ig, '<a href="http://www.$1" target="_blank">$2</a>');
str= str.replace(/\[url=(https?|ftp|gopher|news|telnet|rtsp|mms|callto|bctp|ed2k){1}:\/\/([^\[\"']+?)\]([\s\S]+?)\[\/url\]/ig, '<a href="$1://$2" target="_blank">$3</a>');
str= str.replace(/\[email\](.*?)\[\/email\]/ig, '<a href="mailto:$1">$1</a>');
str= str.replace(/\[email=(.[^\[]*)\](.*?)\[\/email\]/ig, '<a href="mailto:$1" target="_blank">$2</a>');
str = str.replace(/\[color=([^\[\<]+?)\]/ig, '<font color="$1">');
str = str.replace(/\[size=(\d+?)\]/ig, '<font size="$1">');
str = str.replace(/\[size=(\d+(\.\d+)?(px|pt|in|cm|mm|pc|em|ex|%)+?)\]/ig, '<font style="font-size: $1">');
str = str.replace(/\[font=([^\[\<]+?)\]/ig, '<font face="$1">');
str = str.replace(/\[face=([^\[\<]+?)\]/ig, '<font face="$1">');
str = str.replace(/\[align=([^\[\<]+?)\]/ig, '<p align="$1">');
str = str.replace(/\[float=([^\[\<]+?)\]/ig, '<br style="clear: both"><span style="float: $1;">');
re = /\[table(?:=(\d{1,4}%?)(?:,([\(\)%,#\w ]+))?)?\]\s*([\s\S]+?)\s*\[\/table\]/ig;
for (i = 0; i < 4; i++) {
str = str.replace(re, function($1, $2, $3, $4) {return parsetable($2, $3, $4);});
}
str = preg_replace([
'\\\[\\\/color\\\]', '\\\[\\\/size\\\]', '\\\[\\\/font\\\]','\\\[\\\/face\\\]', '\\\[\\\/align\\\]', '\\\[b\\\]', '\\\[\\\/b\\\]',
'\\\[i\\\]', '\\\[\\\/i\\\]', '\\\[u\\\]', '\\\[\\\/u\\\]', '\\\[ul\\\]', '\\\[\\\/ul\\\]', '\\\[ol\\\]',
'\\\[\\\/ol\\\]', '\\\[li\\\]', '\\\[\\\/li\\\]', '\\\[indent\\\]', '\\\[\\\/indent\\\]', '\\\[\\\/float\\\]','\\\[s\\\]', '\\\[\\\/s\\\]','\\\[hr\\\]','\\\[sub\\\]', '\\\[\\\/sub\\\]','\\\[sup\\\]', '\\\[\\\/sup\\\]'
], [
'</font>', '</font>', '</font>', '</font>', '</p>', '<b>', '</b>', '<i>',
'</i>', '<u>', '</u>', '<ul>', '</ul>', '<ol>',
'</ol>', '<li>', '</li>', '<blockquote>', '</blockquote>', '</span>', '<s>', '</s>','<hr>', '<sub>', '</sub>', '<sup>', '</sup>'
], str);
}
// if(!fetchCheckbox('post_ubbflag')) {
// if(allowimgcode) {
str = str.replace(/\[upload\]###资源(\d{1,4})###\[\/upload\]/ig,function ($1,$2) {var html = getUploadAttachImg($2);if(html) return html;if($('fileFullPath' + $2)){var src = $('fileFullPath' + $2).value; var info = getLocalAttachImg($2); if(src != '' && info !=''){return info}} return $1});
str = str.replace(/\[img\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ig, '<img src="$1" border="0" alt="" />');
str = str.replace(/\[img=(\d{1,4})[x|\,](\d{1,4})\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ig, '<img width="$1" height="$2" src="$3" border="0" alt="" />');
/* } else {
str = str.replace(/\[img\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ig, '<a href="$1" target="_blank">$1</a>');
str = str.replace(/\[img=(\d{1,4})[x|\,](\d{1,4})\]\s*([^\[\<\r\n]+?)\s*\[\/img\]/ig, '<a href="$1" target="_blank">$1</a>');
}
}
*/
for(var i = 0; i <= codecount; i++) {
str = str.replace("[\tEFORUM_CODE_" + i + "\t]", codehtml[i]);
}
if(!forumallowhtml && !(allowhtml && fetchCheckbox('post_htmlflag'))) {
str = preg_replace(['\t', ' ', ' ', '(\r\n|\n|\r)'], [' ', ' ', ' ', '<br />'], str);
}
return str;
}
function cuturl(url) {
var length = 65;
var urllink = '<a href="' + (url.toLowerCase().substr(0, 4) == 'www.' ? 'http://' + url : url) + '" target="_blank">';
if(url.length > length) {
url = url.substr(0, parseInt(length * 0.5)) + ' ... ' + url.substr(url.length - parseInt(length * 0.3));
}
urllink += url + '</a>';
return urllink;
}
function dpstag(options, text, tagname) {
if(Trim(text) == '') {
return '\n';
}
var pend = parsestyle(options, '', '');
var prepend = pend['prepend'];
var append = pend['append'];
if(in_array(tagname, ['div', 'p'])) {
align = getoptionvalue('align', options);
if(in_array(align, ['left', 'center', 'right'])) {
prepend = '[align=' + align + ']' + prepend;
append += '[/align]';
} else {
append += '\n';
}
}
return prepend + recursion(tagname, text, 'dpstag') + append;
}
function fetchoptionvalue(option, text) {
if((position = strpos(text, option)) !== false) {
delimiter = position + option.length;
if(text.charAt(delimiter) == '"') {
delimchar = '"';
} else if(text.charAt(delimiter) == '\'') {
delimchar = '\'';
} else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -