tinyMCE - получить содержимое до позиции курсора - PullRequest
2 голосов
/ 07 февраля 2012

Я создаю небольшой плагин для предсказания слов для tinyMCE, и мне нужно извлечь немного текста, а затем вставить текст из списка предсказанных слов. Вставка не должна быть проблемой, так как я знаю, где находится курсор, и могу использовать команду mceInsertContent. Получение текста для прогноза, однако ...

Мне нужно извлечь часть текста, заканчивающуюся буквой непосредственно перед позицией курсора и начинающуюся, ну, в общем, в начале текста. Я могу удалить теги HTML самостоятельно, если это необходимо, но я предпочитаю разрешить tinyMCE сделать это, если это возможно.

Я думал сделать это так:

  1. Вставить закладку в текущую позицию курсора, используя mceInsertContent
  2. Создание диапазона от начала текста до моей закладки.
  3. Получить содержимое диапазона.
  4. Удалить закладку.

Теперь, так как я не очень хорошо разбираюсь в tinyMCE, что оказалось для меня чем-то вроде вызова, так как же поступить так?

Код должен работать кросс-браузер.

Ответы [ 2 ]

5 голосов
/ 07 февраля 2012

Вы можете попробовать этот фрагмент кода (ed - объект редактора tinymce)

A. Вставить закладку в текущую позицию курсора, используя mceInsertContent

ed.execCommand('mceInsertContent', false,'<span class="marker">\ufeff</span>');

B. Создайте диапазон от начала текста до моей закладки.

var rng = ed.selection.getRng(1);
var rng2 = rng.cloneRange();

// set start of range to begin of forst paragraph
rng2.setStartBefore($(ed.getBody()).find('p:first').get(0));

rng2.setEndBefore($(ed.getBody()).find('span.marker').get(0));
ed.selection.setRng(rng2);

C. Получить содержание ассортимента.

// get content of selection (range)
var content = ed.selection.getContent({format: 'text'});

D. Удалить закладку.

$(ed.getBody()).find('span.marker').remove();

Обновление: Если вас беспокоит изменение выбора, вы можете сбросить исходный диапазон

ed.selection.setRng(rng);
0 голосов
/ 10 июля 2019

Вот мое решение для этого (при нажатии Ctrl слово отображается в консоли):

function isLetter(chr){
    if(chr.match(/[A-Za-z\u00C0-\u00D6\u00D8-\u00f6\u00f8-\u00ff]/i)){
        return true;
    }
    else{
        return false;
    }
}



var editor = tinymce.activeEditor;
var $edBody = $(editor.getBody());
editor.on('KeyUp', function(e){
    if(e.code == "ControlLeft"){
        var sel = editor.selection.getSel();
        var caretPos = sel.anchorOffset;
        var txtData = sel.anchorNode.data;
        var i = caretPos;
        var word = "";

        while(i > 0){
            if(isLetter(txtData.charAt(i))){
                word += txtData.charAt(i);
                i -= 1;
            }
            else{
                break;
            }
        }

        word = word.split("").reverse().join("");

        i = caretPos + 1;
        while(i < txtData.length){
            if(isLetter(txtData.charAt(i))){
                word += txtData.charAt(i);
                i += 1;
            }
            else{
                break;
            }
        }
        console.log(word);
    }
});

Может быть, есть более чистый или более элегантный способ решить эту проблему, если да, прокомментируйте, и давайте улучшим это решение.

...