Etherpad:如何从 etherpad 捕获选定的文本

Posted

技术标签:

【中文标题】Etherpad:如何从 etherpad 捕获选定的文本【英文标题】:Etherpad: How to capture selected text from etherpad 【发布时间】:2021-11-22 03:33:05 【问题描述】:

我想从 Etherpad 捕获选定的文本。有可用的 API 方法 /getText 将返回整个文本。 我的要求是只获取选定的文本。

提前致谢!

【问题讨论】:

【参考方案1】:

如果你想在外框使用选中的文本,你可以使用 postMessage 系统。

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>

此代码将从所选内容中获取整行文本。如果您想获得确切的字符,则需要在 idx for-loop 中进行第二个循环

【讨论】:

嗨@Zumpfiii,有没有办法用其他文本替换/修改选定的文本并建立链接? 是的,您只需要使用editorInfo.ace_replaceRange(start, end, text) 函数。但要小心,开始和结束总是数组 [x,y] 就像 rep.selStart 文档链接:etherpad.org/doc/v1.8.14/… 嘿,你把 etherpad 和 react 集成了吗?

以上是关于Etherpad:如何从 etherpad 捕获选定的文本的主要内容,如果未能解决你的问题,请参考以下文章

etherpad 如何识别作者颜色?

如何正确更新 etherpad-lite?

如何以编程方式获取 etherpad 的实时明文内容?

如何在 Sandstorm 上安装 Etherpad Lite 插件?

如何在插件的 padUpdate 钩子中获取 etherpad 的文本?

如何删除 etherpad-lite 中的焊盘