Etherpad: Как захватить выделенный текст с etherpad

#etherpad

Вопрос:

Я хочу захватить выделенный текст с Etherpad. Существуют доступные методы API /getText, которые вернут весь текст. Мое требование-получать только выделенный текст.

Заранее спасибо!

Ответ №1:

Если вы хотите использовать выделенный текст во внешней рамке, вы можете использовать систему почтовых отправлений.

 exports.postAceInit = (hookName, context) => {
  window.addEventListener('message', function receiver(e) {
    // Data of Request
    let data = e.data;
    // Origin URL of Request
    let origin = e.origin;

    if(data == 'GET_SELECTION'){
      context.ace.callWithAce((ace) => {
        // Read current selection
        let rep = ace.ace_getRep();
        
        // Start of the Selection [x,y]
        let selStart = rep.selStart;
        // End of the Selection [x,y]
        let selEnd = rep.selEnd;

        // Read Lines of Pad
        let lines = rep.lines;

        let retVal = '';

        // Run through Selection
        for(let idx = selStart[0]; idx < selEnd[0] 1; idx  ){
           retVal = retVal   lines.atIndex(idx).text;
        }
 
        // Send text to Receiver
        e.source.postMessage(retVal, origin);
      }, 'GET_SELECTION', true);
    }
  , false);
}
 

Сайт получателя и отправителя:

 <script type="text/javascript">
    function sendMessage(message) {
        document.getElementById('etherpad').contentWindow.postMessage(message, '_URL OF YOUR ETHERPAD INSTANCE_');
    }
    function receiver(e) {
        // Read Data of Request
        let data = e.data;
        // Origin URL of Request
        let origin = e.origin;

        alert("GOT: "   data   "nFROM: "   origin);

        e.source.postMessage('Thanks', origin);
    }

    // Listener gets Requests
    window.addEventListener('message', receiver, false);
</script>

<button type="button" onclick="sendMessage('GET_SELECTION')">GET SELECTION</button>
 

Этот код позволит вам получить целые строки текста из выделенного фрагмента. Если вы хотите получить символы exacts, вам понадобится второй цикл в цикле idx для-loop

Комментарии:

1. Привет @Zumpfiii, Есть ли способ заменить/изменить выделенный текст каким-либо другим текстом и сделать эту ссылку также?

2. Да, вам просто нужно использовать эту editorInfo.ace_replaceRange(start, end, text) функцию. Но будьте осторожны, начало и конец всегда являются массивами [x,y], как ссылка представителя SelStart на документацию: etherpad.org/doc/v1.8.14/…