私は自動入力プラグインに取り組んでいます。私の要件は、スペースバーを押しながらカーソルの前の単語を選択して、選択したテキストを取得し、新しいテキストを入力または挿入できるようにすることです。
たとえば、「ck」の後にスペースを押すと、「ck」を「CKEditor」に置き換えます。
私がしたことは、スペースを押しながらカーソルの前の単語をキーとして取得し、キーが「ck」の場合、範囲で「ck」を選択し、新しい単語「CKEditor」を挿入して「CKEditor」に置き換えることです
if (e.data.keyCode == 32) {
var s = editor.getSelection();
var cursor = s._.cache.nativeSel.anchorOffset;
var data = s._.cache.nativeSel.focusNode.data;
var node = s._.cache.nativeSel.focusNode;
var selection = editor.getSelection();
data = data.substring(0,cursor)
var startIndex = data.lastIndexOf(" ");
if (startIndex==-1) {
startIndex=0;
} else {
startIndex=startIndex+1;
}
var key = data.substring(startIndex,data.length);
// HERE KEY IS THE WORD BEFORE CURSOR, THERE IS NO ISSUE IN IT.
key = key.trim();
if (key.trim() == 'ck') {
var ranges = [];
var range, text, index;
console.log(editor.getSelection().getStartElement());
var text = getTextNodes( editor.getSelection().getStartElement() ,key );
range = editor.createRange();
range.setStart( text, cursor - (key.length));
range.setEnd( text, cursor);
ranges.push( range );
selection.selectRanges( ranges );
editor.insertHtml('CKEditor');
}
// GETTING NODE OF THE KEY
function getTextNodes( element,key ) {
var children = element.getChildren();
var child;
for ( var i = children.count(); i--; ) {
child = children.getItem( i );
if ( child.type == CKEDITOR.NODE_ELEMENT )
getTextNodes( child );
else if ( child.type == CKEDITOR.NODE_TEXT ) {
if (child.$.data.indexOf(key)!=-1) {
var text = child;
return child;
}
}
}
99% 正常に動作しますが、改行の最初の単語が「ck」の場合は失敗します。