インデントやSmileアイコンの挿入といったHTMLareaのコマンドはHTMLArea.prototype.execCommand = function(cmdID, UI, param)でまとめて処理しています.
cmdIDはコマンドの種類を表すアルファベット小文字の文字列で,例えば"hilitecolor"や"unlink"など.いま例に挙げたのはHTMLarea内に実装された独自の命令で,それ以外の"indent"や"outdent"などのJavascriptで実行できるリッチテキスト編集用のコマンドは,
Switch (cmdID)のdefalut:で,default: this._doc.execCommand(cmdID, UI, param);のように,投げています.doc.execCommand()は各ブラウザのJavascriptが実行するようです.つまりIEやFirefoxで動作が異なる可能性があります.
(Mozzila)
http://www.mozilla-japan.org/editor/midas-spec.html
(IE)
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbafpw10/html/fpmthexecCommand.asp
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/Vbafpd11/html/fpmthexecCommand.asp
で,実際に動作が異なるのでしょう.
例えばindentする場合,Firefoxではカーソルのある行,あるいは選択されている複数行を<div style="margin-left: 40px;">で囲むことでindentを実現している.
それに対してIEのJavascriptでは,カーソルのあるブロックを<blockquote dir="ltr" style="margin-right: 0px">で囲む.もしカーソルのあるブロックが<p></p>で括られていなければ全体を<p></p>で囲む.
右寄せする場合,Firefoxならば,<div style="text-align: right;">で囲むのに対して,IEではカーソルのあるブロックを<p align="right">で囲む.もし<p></p>で括られていなければ全体を<p></p>で囲む.
このように同じexecCommand()に対して実装がブラウザによって異なること,特にIEでは<p></p>を自動挿入する機能が行単位(あるいは選択された行単位)ではない点に今回の問題はあります.
HTMLArea.prototype.execCommand = function(cmdID, UI, param)のswitch (cmdID)に対して,独自のcase "indent"を追加することで,互換性の違いを吸収することもできるのかも知れません.ちょっといまの私には手に余る感じです...不可能ではないと思うのですが.
リンクを解除する"unlink"は,
HTMLArea.prototype._removelink = function() {
var editor = this;
link = this.getParentElement();
editor.selectNodeContents(link);
this._doc.execCommand("unlink", false, null);
this.focusEditor();
};
という関数を使用しています.多分,カーソルのあるブロックを抽出する機能をもっているのではないでしょうか.この関数を参考にすればもしかしたら実装できるかも?
なお,ノードという考えをよく理解できていないのだが,IE, Firefoxではかなり異なるらしい.この辺りも関わっていそう.実際,上記コードを流用してindentモドキの実装を試みたところ,IEではカーソルの存在する行ではなく全文がノードとしてselectされてしまった.多分,Firefoxではカーソルのある一行(<br/>まで)をselectしてくれるのでしょうね.(unlinkの場合は<a>と</a>で囲まれているので,IEでもFirefoxでもこれを一つのノードと解釈してくれる,ということかな)
http://www.techdego.com/2007/01/dom.php