イベントを使用する必要がありますkeydown
(提案したものに近い):
var editor = CKEDITOR.instances.editor1;
editor.document.getBody().on('keydown', function(event) {
if (event.data.getKeystroke() === 65 /*a*/ && isFirstLetter()) {
// insert 'A' instead of 'a'
editor.insertText('A');
event.data.preventDefault();
}
});
今 - どのようisFirstLetter()
に見えるべきですか?
editor.getSelection().getRanges()
キャレットの位置を取得するには、開始する必要があります。
- コレクションの最初の範囲のみに関心があります。
- キャレットの前からテキスト コンテンツを抽出するには、小さなトリックを使用します。
- 範囲の先頭をドキュメントの先頭に移動:
range.setStartAt( editor.document.getBody(), CKEDITOR.POSITION_AFTER_START )
,
CKEDITOR.dom.walker
DOM ツリーをソース順にトラバースするために使用します。
- テキスト ノードを収集し、キャレットの前にあるものを見つけます (それは
/\. $/
ですか) - インライン タグをスキップし、ブロック タグで停止する必要があることに注意してください - ヒント: 関数から戻っfalse
てguard
トラバースを停止します。
walker
onの使用例range
:
var range, walker, node;
range = editor.getSelection().getRanges()[0];
range.setStartAt(editor.document.getBody(), CKEDITOR.POSITION_AFTER_START);
walker = new CKEDITOR.dom.walker(range);
walker.guard = function(node) {
console.log(node);
};
while (node = walker.previous()) {}
そして今、悲しいことはほとんどありません。
- 入力時に選択が空であると想定しましたが、そうである必要はありません。選択が折りたたまれていない (空である) 場合は、 を呼び出す前にそのコンテンツを手動で削除する必要があります
insertText
。これを行うために使用できますrange#deleteContents
。
- しかし、これだけではありません。範囲のコンテンツを削除した後、キャレットを正しい位置に配置する必要があります。これは簡単なことではありません。基本的には
range#select
( の後の範囲でdeleteContents
)使用できますが、場合によっては、段落間のようにキャレットを間違った場所に配置することがあります。これを修正することは... HTML+編集可能+挿入+その他についての深い知識がなければ実行できません:)。
- この解決策は完全ではありません -
paste
イベントを処理したり、コンテンツを削除したり (文頭から単語を削除することができます) などを行う必要があります。
- 私が考えもしなかった他のいくつかの問題があると思います:P.
したがって、このアプローチは現実的ではありません。それでもこの機能を実装したい場合は、タイマーを設定し、DOM をトラバースして (walker
ドキュメント全体または最近入力したテキスト (どこにあるかを見つけるのが難しい) を含む範囲で使用できます)、小文字から始まるすべての文を見つける必要があると思いますそしてそれらを修正します。