Some more editor.js updates. Font styles (colour and size) do now center the cursor between the tags when not used on a selection. This could need some cross browser testing. Confirmed working in IE6, FF, Opera.

Please report feedback to:
http://area51.phpbb.com/phpBB/viewtopic.php?f=3&t=25884


git-svn-id: file:///svn/phpbb/trunk@6634 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
Dominik Dröscher 2006-11-22 11:22:38 +00:00
parent 73d0f7f846
commit 2906dbdd8a
2 changed files with 189 additions and 62 deletions

View file

@ -64,32 +64,6 @@ function arraypop(thearray)
return retval; return retval;
} }
/**
* Insert emoticon
*/
function smiley(text)
{
text = ' ' + text + ' ';
if (document.forms[form_name].elements[text_name].createTextRange && document.forms[form_name].elements[text_name].caretPos)
{
var caretPos = document.forms[form_name].elements[text_name].caretPos;
caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
document.forms[form_name].elements[text_name].focus();
}
else
{
var selStart = document.forms[form_name].elements[text_name].selectionStart;
var selEnd = document.forms[form_name].elements[text_name].selectionEnd;
mozWrap(document.forms[form_name].elements[text_name], text, '')
document.forms[form_name].elements[text_name].focus();
document.forms[form_name].elements[text_name].selectionStart = selStart + text.length;
document.forms[form_name].elements[text_name].selectionEnd = selEnd + text.length;
}
}
/** /**
* Apply bbcodes * Apply bbcodes
*/ */
@ -136,34 +110,66 @@ function bbfontstyle(bbopen, bbclose)
// Open tag // Open tag
insert_text(bbopen + bbclose); insert_text(bbopen + bbclose);
// Center the cursor when we don't have a selection
var textarea = document.forms[form_name].elements[text_name];
var new_pos = getCaretPosition(textarea).start - bbclose.length;
// IE & Opera
if (document.selection)
{
var range = textarea.createTextRange();
range.move("character", new_pos);
range.select();
}
//Gecko
else if (!isNaN(textarea.selectionStart))
{
textarea.selectionStart = new_pos;
textarea.selectionEnd = new_pos;
}
document.forms[form_name].elements[text_name].focus(); document.forms[form_name].elements[text_name].focus();
storeCaret(document.forms[form_name].elements[text_name]); storeCaret(document.forms[form_name].elements[text_name]);
return; return;
} }
/** /**
* Insert text at position * Insert text at position
*/ */
function insert_text(text) function insert_text(text, spaces, popup)
{ {
if (document.forms[form_name].elements[text_name].createTextRange && document.forms[form_name].elements[text_name].caretPos) var textarea;
{
var caretPos = document.forms[form_name].elements[text_name].caretPos;
caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
}
else if (document.forms[form_name].elements[text_name].selectionStart)
{
var selStart = document.forms[form_name].elements[text_name].selectionStart;
var selEnd = document.forms[form_name].elements[text_name].selectionEnd;
mozWrap(document.forms[form_name].elements[text_name], text, '') if (!popup)
document.forms[form_name].elements[text_name].selectionStart = selStart + text.length; {
document.forms[form_name].elements[text_name].selectionEnd = selEnd + text.length; textarea = document.forms[form_name].elements[text_name];
} else
{
textarea = opener.document.forms[form_name].elements[text_name];
}
if (spaces)
{
text = ' ' + text + ' ';
}
if (textarea.createTextRange && textarea.caretPos)
{
var caret_pos = textarea.caretPos;
caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text;
}
else if (!isNaN(textarea.selectionStart))
{
var sel_start = textarea.selectionStart;
var sel_end = textarea.selectionEnd;
mozWrap(textarea, text, '')
textarea.selectionStart = sel_start + text.length;
textarea.selectionEnd = sel_end + text.length;
} }
else else
{ {
document.forms[form_name].elements[text_name].value = document.forms[form_name].elements[text_name].value + text; textarea.value = textarea.value + text;
} }
} }
@ -187,11 +193,11 @@ function addquote(post_id, username)
if (document.all) if (document.all)
{ {
eval('divarea = document.all.' + message_name + ';'); divarea = document.all[message_name];
} }
else else
{ {
eval("divarea = document.getElementById('" + message_name + "');"); divarea = document.getElementById(message_name);
} }
// Get text selection - not only the post content :( // Get text selection - not only the post content :(
@ -210,7 +216,15 @@ function addquote(post_id, username)
if (theSelection == '' || typeof theSelection == 'undefined' || theSelection == null) if (theSelection == '' || typeof theSelection == 'undefined' || theSelection == null)
{ {
if (document.all) if (divarea.innerHTML)
{
theSelection = divarea.innerHTML.replace(/<br>/ig, '\n');
theSelection = theSelection.replace(/<br\/>/ig, '\n');
theSelection = theSelection.replace(/&lt\;/ig, '<');
theSelection = theSelection.replace(/&gt\;/ig, '>');
theSelection = theSelection.replace(/&amp\;/ig, '&');
}
else if (document.all)
{ {
theSelection = divarea.innerText; theSelection = divarea.innerText;
} }
@ -249,11 +263,11 @@ function bbstyle(bbnumber)
{ {
butnumber = arraypop(bbcode) - 1; butnumber = arraypop(bbcode) - 1;
document.forms[form_name].elements[text_name].value += bbtags[butnumber + 1]; document.forms[form_name].elements[text_name].value += bbtags[butnumber + 1];
buttext = eval('document.forms[form_name].addbbcode' + butnumber + '.value'); buttext = document.forms[form_name]['addbbcode' + butnumber].value;
if (buttext != '[*]') if (buttext != '[*]')
{ {
eval('document.forms[form_name].addbbcode' + butnumber + '.value ="' + buttext.substr(0,(buttext.length - 1)) + '"'); document.forms[form_name]['addbbcode' + butnumber].value = buttext.substr(0,(buttext.length - 1));
} }
} }
@ -310,17 +324,17 @@ function bbstyle(bbnumber)
if (donotinsert) if (donotinsert)
{ {
document.forms[form_name].addbbcode12.value = 'List='; document.forms[form_name].addbbcode12.value = 'List=';
tmp_help = o_help; tmp_help = help_line['o'];
o_help = e_help; help_line['o'] = help_line['e'];
e_help = tmp_help; help_line['e'] = tmp_help;
bbtags[12] = '[list=]'; bbtags[12] = '[list=]';
} }
else else
{ {
document.forms[form_name].addbbcode12.value = '[*]'; document.forms[form_name].addbbcode12.value = '[*]';
tmp_help = o_help; tmp_help = help_line['o'];
o_help = e_help; help_line['o'] = help_line['e'];
e_help = tmp_help; help_line['e'] = tmp_help;
bbtags[12] = '[*]'; bbtags[12] = '[*]';
} }
} }
@ -330,17 +344,17 @@ function bbstyle(bbnumber)
if (donotinsert) if (donotinsert)
{ {
document.forms[form_name].addbbcode10.value = 'List'; document.forms[form_name].addbbcode10.value = 'List';
tmp_help = l_help; tmp_help = help_line['l'];
l_help = e_help; help_line['l'] = help_line['e'];
e_help = tmp_help; help_line['e'] = tmp_help;
bbtags[10] = '[list]'; bbtags[10] = '[list]';
} }
else else
{ {
document.forms[form_name].addbbcode10.value = '[*]'; document.forms[form_name].addbbcode10.value = '[*]';
tmp_help = l_help; tmp_help = help_line['l'];
l_help = e_help; help_line['l'] = help_line['e'];
e_help = tmp_help; help_line['e'] = tmp_help;
bbtags[10] = '[*]'; bbtags[10] = '[*]';
} }
} }
@ -361,11 +375,11 @@ function bbstyle(bbnumber)
insert_text(bbtags[butnumber]); insert_text(bbtags[butnumber]);
} }
buttext = eval('document.forms[form_name].addbbcode' + butnumber + '.value'); buttext = document.forms[form_name]['addbbcode' + butnumber].value;
if (bbtags[butnumber] != '[*]') if (bbtags[butnumber] != '[*]')
{ {
eval('document.forms[form_name].addbbcode' + butnumber + '.value ="' + buttext.substr(0,(buttext.length - 1)) + '"'); document.forms[form_name]['addbbcode' + butnumber].value = buttext.substr(0,(buttext.length - 1));
} }
imageTag = false; imageTag = false;
} }
@ -401,7 +415,7 @@ function bbstyle(bbnumber)
if (bbtags[bbnumber] != '[*]') if (bbtags[bbnumber] != '[*]')
{ {
arraypush(bbcode, bbnumber + 1); arraypush(bbcode, bbnumber + 1);
eval('document.forms[form_name].addbbcode'+bbnumber+'.value += "*"'); document.forms[form_name]['addbbcode' + bbnumber].value += "*";
} }
document.forms[form_name].elements[text_name].focus(); document.forms[form_name].elements[text_name].focus();
@ -440,7 +454,7 @@ function mozWrap(txtarea, open, close)
} }
/** /**
* Insert at Claret position. Code from * Insert at Caret position. Code from
* http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130 * http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130
*/ */
function storeCaret(textEl) function storeCaret(textEl)
@ -465,7 +479,7 @@ function colorPalette(dir, width, height)
numberList[3] = 'BF'; numberList[3] = 'BF';
numberList[4] = 'FF'; numberList[4] = 'FF';
document.write('<table cellspacing="1" cellpadding="0" border="0" class="type2">'); document.writeln('<table cellspacing="1" cellpadding="0" border="0">');
for (r = 0; r < 5; r++) for (r = 0; r < 5; r++)
{ {
@ -484,7 +498,7 @@ function colorPalette(dir, width, height)
for (b = 0; b < 5; b++) for (b = 0; b < 5; b++)
{ {
color = String(numberList[r]) + String(numberList[g]) + String(numberList[b]); color = String(numberList[r]) + String(numberList[g]) + String(numberList[b]);
document.write('<td style="line-height: ' + height + 'px; background-color:#' + color + '; width: ' + width + 'px; height: ' + height + 'px;">'); document.write('<td bgcolor="#' + color + '">');
document.write('<a href="#" onclick="bbfontstyle(\'[color=#' + color + ']\', \'[/color]\'); return false;" onmouseover="helpline(\'s\');"><img src="images/spacer.gif" width="' + width + '" height="' + height + '" alt="#' + color + '" title="#' + color + '" /></a>'); document.write('<a href="#" onclick="bbfontstyle(\'[color=#' + color + ']\', \'[/color]\'); return false;" onmouseover="helpline(\'s\');"><img src="images/spacer.gif" width="' + width + '" height="' + height + '" alt="#' + color + '" title="#' + color + '" /></a>');
document.writeln('</td>'); document.writeln('</td>');
} }
@ -502,3 +516,50 @@ function colorPalette(dir, width, height)
} }
document.writeln('</table>'); document.writeln('</table>');
} }
/**
* Caret Position object
*/
function caretPosition()
{
var start = null;
var end = null;
}
/**
* Get the caret position in an textarea
*/
function getCaretPosition(txtarea)
{
var caretPos = new caretPosition();
// dirty IE way
if(document.selection)
{
txtarea.focus();
//the current selection
var curr_sel = document.selection.createRange();
var curr_length = curr_sel.text.length;
// back to 0
curr_sel.moveStart ('character', -txtarea.value.length);
//start = selected text - original selection
caretPos.start = curr_sel.text.length - curr_length;
// end = selection length
caretPos.end = curr_sel.text.length;
}
// simple Gecko way
else if(!isNaN(txtarea.selectionStart))
{
caretPos.start = txtarea.selectionStart;
caretPos.end = txtarea.selectionEnd;
}
return (caretPos);
}

View file

@ -110,9 +110,28 @@ function bbfontstyle(bbopen, bbclose)
// Open tag // Open tag
insert_text(bbopen + bbclose); insert_text(bbopen + bbclose);
// Center the cursor when we don't have a selection
var textarea = document.forms[form_name].elements[text_name];
var new_pos = getCaretPosition(textarea).start - bbclose.length;
// IE & Opera
if (document.selection)
{
var range = textarea.createTextRange();
range.move("character", new_pos);
range.select();
}
//Gecko
else if (!isNaN(textarea.selectionStart))
{
textarea.selectionStart = new_pos;
textarea.selectionEnd = new_pos;
}
document.forms[form_name].elements[text_name].focus(); document.forms[form_name].elements[text_name].focus();
storeCaret(document.forms[form_name].elements[text_name]); storeCaret(document.forms[form_name].elements[text_name]);
return; return;
} }
@ -435,7 +454,7 @@ function mozWrap(txtarea, open, close)
} }
/** /**
* Insert at Claret position. Code from * Insert at Caret position. Code from
* http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130 * http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130
*/ */
function storeCaret(textEl) function storeCaret(textEl)
@ -497,3 +516,50 @@ function colorPalette(dir, width, height)
} }
document.writeln('</table>'); document.writeln('</table>');
} }
/**
* Caret Position object
*/
function caretPosition()
{
var start = null;
var end = null;
}
/**
* Get the caret position in an textarea
*/
function getCaretPosition(txtarea)
{
var caretPos = new caretPosition();
// dirty IE way
if(document.selection)
{
txtarea.focus();
//the current selection
var curr_sel = document.selection.createRange();
var curr_length = curr_sel.text.length;
// back to 0
curr_sel.moveStart ('character', -txtarea.value.length);
//start = selected text - original selection
caretPos.start = curr_sel.text.length - curr_length;
// end = selection length
caretPos.end = curr_sel.text.length;
}
// simple Gecko way
else if(!isNaN(txtarea.selectionStart))
{
caretPos.start = txtarea.selectionStart;
caretPos.end = txtarea.selectionEnd;
}
return (caretPos);
}